为TI的 AM355移植uboot和linux内核

news2024/9/23 15:24:13

一、uboot移植

 在移植之前要先对uboot的源码结构有一定熟悉

1.uboot源码顶层目录下各源码文件夹的作用

2.编译后生成的uboot.xxx  各文件后缀含义

关于以上两点社区已经有很多前辈总结的很详细,这里不做赘述。

对于uboot源码分析韦东山老师b站上有免费的课程,时间富余的话推荐看一下,会对uboot源码有更深刻的认识。

准备交叉编译工具链

1. 下载交叉编译工具链

sudo apt-get install arm-linux-guneabihf-gcc 

    安装完后可以看一下安装的版本号对不对,我这里arm-linux-gcc安装的是4.9.4版本,我的uboot版本是2015年的(不同版本的uboot适用的编译器版本也不同,高版本的gcc编译器不一定兼容老的uboot源码,可能会导致编译失败)

arm-linux-gnueabihf-gcc -v

2. 导出编译工具路径,指定顶层Makefile中的CROSS_COMPILE = arm-linux-gnueabihf-

ARCH = arm
CROSS_COMPILE = arm-linux-gnueabihf-

3.在/home/xinje/crosscompile路径下,指定编译工具路径(这里是我自己的路径,具体路径视自己情况而定)

export PATH=$PATH:/home/xinje/crosscompile/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin

uboot配置

在控制台输入下面的命令,其中xxx_xxx_defconfig是配置文件,具体用什么配置文件取决于你的需要

make xxx_xxx_defconfig

题外话:xxx_defconfig文件从何而来呢 ?

最开始所有的配置文件 xxx_defconfig 都是不存在的,那我们拿到uboot源码后,要配置使用的话,只能通过 make menuconfig 进入图形化配置界面配置uboot后,再来编译,但这样每次都通过make menuconfig 来一个个打开开关的话过于麻烦,那能不能有一个命令可以把我们每次配置完后的配置情况记录下来呢,于是就有了make savedefconfig命令, 我们在配置完后,控制台输入make savedefconfig,这个命令便会保存我们在make menuconfig中选择的开关,并在顶层目录下生成一个配置文件defconfig,此时我们通过mv指令,mv defconfig ./configs/xxx_defconfig,源码顶层目录下的configs文件中的各种defconfig配置文件就是这样生成的。(以上是个人的一些推断,不对之处烦请指正)

 

注意:如果make xxx_defconfig之后,若还想要打开一些配置开关的话,可以再通过make menuconfig来进行配置,不过要注意要在make xxx_defconfig之后再make menuconfig,二者先后顺序不可颠倒,否则会清掉make menuconfig的配置。

uboot烧写

        烧录工具采用Uniflash_3.4.1.00012_win32版本,通过usb 串口(模拟网口)进行烧录

首先将u-boot-spl-restore.bin,u-boot-restore.img,MLO, u-boot.img四个文件放在同一文件夹中(前两个用usb版本的配置信息生成,后两个用debug版本的配置信息生成),为烧录软件配置好IP和文件路径,再将板子的拨码开关打到no(uboot从USB处启动),之后开始烧录,烧录软件会先将前两个文件烧录到ddram中运行,这时uboot已经在板子上跑起来,然后就可以使用uboot命令将MLO和u-boot.img烧录到nandflash中。

烧录的三个阶段:

第一阶段, 设置 AM335x 的 sysboot 管脚,使 AM335x 的启动项包含 USB 启动。(前人已做好)板子上电后从 USB 启动,芯片内部的固件会初始化 USB RNDIS 以太网络通信协议,AM335x通过 uniflash 自带的 dhcp 服务获取 IP 地址,然后再通过 uniflash 自带的 tftp 服务将用于程序烧写的 u-boot-spl-restore.bin 下载到 AM335x 的内部 RAM 并运行。

第二阶段, 用于程序烧写的 u-boot-spl-restore.bin 执行之后, 会再次初始化 USB RNDIS 以太网络通信协议,AM335x 再次通过 uniflash 自带的 dhcp 服务获取 IP 地址,然后再通过 uniflash 自带的 TFTP 服务将用于程序烧写的 u-boot.img 下载到 DDR 中并运行。

第三阶段,用于程序烧写的 u-boot-restore.img 执行之后, 在 u-boot 中通过 tftp 命令,

将 MLO和u-boot.img烧录到nandflash中。

板子断电,将拨码开关复位(uboot从nandflash启动),再次上电,查看串口信息,uboot成功从nandflash启动。

注意:

1.烧录软件 TI 官网上已经下载不到这个版本(实测新版本的是无法使用的)

2.烧录软件的网络配置视自己情况而定

题外话:uboot从nandflash处启动流程的一些个人分析

一般来说,编译好的uboot镜像文件有两个:

MLO:也称 SPL ,是uboot启动的一阶段映像,作用是初始化必要的引导设备,如nandflash、IIC、DDR等

u-boot.img:是uboot启动的二阶段映像,作用是初始化其他所有的设备,如计时器、时钟等

不禁要问,为什么uboot的镜像文件要分两个呢,内核的镜像文件从来都是一个?

首先,镜像文件的本质是什么,是一段二进制可执行程序而已,既然是可执行程序,那一定得有一个能运行这段程序的一块内存空间。要知道uboot的工作是初始化板子的各个外设,在uboot运行之前可没程序为他初始化好内存(DDR),那他在哪里跑呢。

为了解决这个问题,在SOC设计之初,就将CPU和一小块片内内存SRAM和片内外存BOOTROM都集成到SOC内部,BOOTROM不同于nandflash(块设备,出厂时没有地址编码,只能固定操作512字节,使用时必须依赖一个外部nandflash控制器,而这个控制器要靠uboot来初始化)BOOTROM内部有地址编码,CPU可以直接利用地址编码来进行寻址,无须初始化,但问题是因为要集成到SOC内部,BOOTROM和SRAM受限于成本只能做的很小,一般小的几十k,大一点的也就一两百k,这点空间可不够存储和运行uboot镜像,而且烧写到这也不方便。

于是BOOTROM中只放一个永远不动的固件,这段程序只负责将uboot的一阶段映MLO像拷贝到SRAM中运行,再由MLO初始化好必要的外设后(DDR、nandflash控制器),将二阶段映像拷贝到DDR中运行,最后由二阶段映像完成所有的外设初始化。

调试过程中遇到的一些问题:

       Uboot选择从usb处启动,uboot镜像文件版本为debug版本,但上电后(理论上会先把要烧写的文件先下载到ddr然后烧写到nand中,以上执行完后停在uboot菜单)不会停在uboot菜单,而是直接去启动linux内核。

       Print bootcmd后发现,执行了bootnand脚本,print bootnand后发现确实去启动内核了。这和debug版本的bootcmd不符合,原因是uboot会优先从nand中拿环境变量,而nand中上一次刚好烧录了relies版本的uboot,导致uboot直接用了nand中上次的环境变量。

       用env default -a命令清除nand中上次的环境变量,然后saveenv,让uboot使用本次烧录的ddr中的环境变量。再次上电问题得到解决。

二、linux内核移植

Linux源码结构熟悉:

  1. linux各源码文件夹的作用
  2. zImage .xxx各文件后缀含义

linux配置:

make xxx_defconfig

linux编译:

       编译内核镜像:make zImage

       编译设备树:make ts3_7.dtb

linux内核和设备树文件更新:

       由于需要将内核镜像和是设备树文件打包为ubi文件(比较复杂),换一种内核更新的方式,先将已有的打包好的ubi文件通过usb的方式烧录到板子上,之后再通过tftp单独更新/boot文件夹下的zImage文件和dtb设备树文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT中Charts基本用法

QT中Charts基本用法 第一步:创建工程,添加Charts库 第二步:添加charts视图 注意要打上对钩 第三步:添加所需成员 第四步:编写初始化函数 第五步:添加测试数据

C++学习笔记之算法模板

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、双指针1.1 有序数组的合并1.2 快慢指针/删除有序数组中的重复项1.3 求和 二、动态规划2.1 自底向上和自顶向下(带备忘录)2.2 带有当前状…

浅谈哈希长度扩展攻击

攻击原理: 我们首先需要了解一下Message Authentication codes (MACs) ,称为消息验证码,一般用于服务器验证消息的真实性。服务器把密钥和消息连接起来,用摘要算法获取摘要,对于H(secret data&#xff09…

RabbitMq的基本理解

MQ概念及同步异步: 同步调用: 是一种编程模型,其中调用者发送请求并等待响应。在同步调用中,调用者会阻塞,直到被调用的方法返回结果。 异步调用: 是一种编程模型,其中调用者发送请求后立即返回&#x…

09结构型设计模式——组合模式

一、组合模式的简介 组合模式(Composite Pattern)是一种结构型设计模式,主要用于处理树形结构中的对象组合问题。它允许你将对象组合成树形结构,以表示部分-整体层次结构。组合模式使得客户端能够统一地对待单个对象和对象组合&a…

SEREN MC2电源匹配器控制器Matching Network Controller手侧

SEREN MC2电源匹配器控制器Matching Network Controller手侧

NC 反转链表

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 给定一个单链…

亲测解决Bundler HTTPError Could not fetch specs from

这个问题源于ruby的网站连接不上&#xff0c;解决方法是修改网页地址或者网络配置。 环境 win11 ruby 问题原文 Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/ due to underlying error <IO::TimeoutEr…

C# 将Dll嵌入exe中发布

一、制作模版Dll 二、在exe工程中添加Dll 1、添加上述“创建Dll”&#xff0c;并修改属性为&#xff1a;不复制到输出目录的嵌入资源 2、引用“Resource”中的dll文件&#xff0c;并修改属性&#xff1a;不复制到本地 三、添加重载Dll代码 1、添加以下代码 class DependentFi…

Modbus 通信协议详解

目录 一、概述二、Modbus 的作用三、Modbus 的工作原理1、四种数据类型2、三种工作模式3、三类功能码3.1 标志功能码3.2 Modbus 封装接口3.3 异常 4、Modbus 协议层4.1 协议数据单元4.2 访问数据4.3 数据模型寻址4.3.1 数据寻址范围4.3.2 数据地址起始值 4.4 大数据类型4.4.1 位…

频率检测计

前言 频率计是一种用于测量信号频率的仪器。它可以准确地确定电子信号的频率&#xff0c;广泛应用于电子设备的测试和维护中。频率计的工作原理通常包括对输入信号进行采样&#xff0c;并通过内部电路计算信号的周期&#xff0c;从而得到频率值。现代频率计通常具有高精度、高稳…

无线通信代码搬运/复现系列(1) : 重新审视具有每天线功率约束的 MIMO 容量:固定点迭代和交替优化

无线通信代码搬运/复现系列(1) “Revisiting the MIMO Capacity with Per-antenna Power Constraint: Fixed-point Iteration and Alternating Optimization,” IEEE Trans. Wireless Commun., vol. 18, no. 1, pp. 388-401, Jan. 2019 by T. M. Pham, R. Farrell, and L.-N. …

C++入门——05STL

STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;是C标准库的重要组成部分&#xff0c;是一个通用的数据结构和算法库。STL提供了一组经过精心设计的模板类和函数&#xff0c;用于处理各种常见的数据结构&#xff08;如容器&#xff09;和算法&…

六. 部署分类器-preprocess-speed-compare

目录 前言0. 简述1. 案例运行2. 代码分析2.1 main.cpp2.2 preprocess.cpp 3. 补充说明结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第六章—部署分类器&…

嵌入式面经篇八——进程线程

文章目录 前言一、进程&线程1、异步 IO 和同步 IO 区别&#xff1f;2、进程间通信方式&#xff1f;3、进程的地址空间模型&#xff1f;4、进程的五种状态分别是?5、子进程从父进程继承的资源有哪些&#xff1f;6、什么是进程上下文、中断上下文&#xff1f;7、如何防止僵尸…

写了一个分页 sql,因为粗心出了 bug 造成了 OOM!

大家好&#xff0c;我是君哥。 最近上完线后&#xff0c;凌晨收到一个生产告警&#xff0c;一个 OOM 异常导致了服务重启。今天来分享一下这个事故。 1.事故现场 事故的代码逻辑并不复杂&#xff0c;从一个大概有 8 万数据的表里面查出数据&#xff0c;汇总后对数据做处理。…

高校宣讲会管理系统--论文pf

TOC springboot370高校宣讲会管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的…

【myz_tools】Python库 myz_tools:Python算法及文档自动化生成工具 - 0.2.0版更新

文章目录 0.2.0 更新内容如下函数generate_2d_combinations_iter函数generate_row_permutations函数calculate_total_permutations函数display_combinations函数evaluate_list_similarity函数check_unique 写在前面关于库库使用库内所有函数目录文件名称: common_maths.py函数部…

ZooKeeper分布式协调系统介绍

1. ZooKeeper概述 1.1 ZooKeeper介绍 ZooKeeper 是 Apache 软件基金会的一个项目&#xff0c;它确实提供了一种非常有用的服务&#xff0c;用于维护分布式系统中的配置信息、命名、提供分布式同步和提供组服务等。它的核心是原子广播和大约一致性模型&#xff0c;这使得它能够…

CCF-GESP五级考级——初等数论,全网最精简的求最大公约数gcd和最小公倍数lcm方法(100%好使)

&#x1f451;一、约数和因数的区别 约数必须在整除的前提下才存在&#xff0c;而因数是从乘积的角度来提出的。如果数与数相乘的积是数&#xff0c;是的因数。 1.约数只能对在整数范围内而言&#xff0c;而因数就不限于整数的范围。 举个栗子&#xff1a;。2和8是16的…