【野火Linux移植篇】1-uboot初识与编译/烧录步骤

 

首先,要说野火的linux驱动的pdf做得不是很好,代码内容匆匆略过。

后来才发现野火有专门的网页,这是驱动部分的章节 : https://doc.embedfire.com/lubancat/build_and_deploy/zh/latest/index.html

代码都可以下载!!!

预备:下载安装编译器arm-none-eabigcc

由于学习原子用的编译器都是 arm-linux-eabihf-gcc ,而野火用的是arm-none-eabigcc

因此首先要做的就是下载安装编译器。

①添加交叉工具链后立即生效:修改/etc/profile

添加交叉工具链,需要修改/etc/profile

修改完成后,需要立即生效(不需要重启),可以使用如下命令:

source /etc/profile

 ②折腾:缺少32位库文件问题

如果遇到环境变量配置以后,能够找到版本(也就是说 输入 命令的开头按tab以后能够出现补全),如果还有问题,这是因为64位下运行32编译器缺少相应的库文件,所以运行时会报错

那么只需要添加对于 32 位的环境即可:

sudo apt-get install lib32ncurses5  lib32z1

 ③学习:查看磁盘情况命令:

使用df

df命令是用来查看文件系统中硬盘的使用状况的,也可以用来列出系统中挂载的硬盘,使用-h选项可以以人类可读的格式输出硬盘使用状况:

④折腾:E: Unable to locate package lib32ncurses5最新解决方案(无法定位软件包)

原因:
从上面这个报错其实也知道原因了,就是在“更新源地址平台上”找不到相应的“lib32ncurses5”软件包。找不到软件包通常是软件包名输入错误,或者说,没有这个软件包了,有些软件包可能会被移除或被其它的软件包替代了等等。

解决方法:
将apt-get install lib32ncurses5改为apt-get install lib32ncurses5-dev

总结:
这是由于不同版本的Kali Linux,它的源软件包名字会发生一些局部的变化,这都是很正常的。
低版本的Kali Linux(基于Debian)通常是用第一个命令是没任何问题的。
高版本的Kali Linux(基于Debian)就必须得用第二个命令了,否则就会报“E: 无法定位软件包 lib32ncurses5”这个错误。
未来可能这个软件包名字还会发生其它的变化,大家一定要学会灵活运用。
这里在几个报错的安装命令后加-dev就可以解决,亲测有效。分别是
*apt-get install lib32ncurses5-dev​ 和 apt-get install lib32z1​-dev*

转载链接https://www.fujieace.com/kali-linux/lib32ncurses5.html

⑤、②④的最终解决

 经过上面的尝试,

arm-none-eabigcc: not found

问题都没解决。

最终通过直接在库中下载解决的,输入以下命令:

sudo apt install  gcc-arm-none-eabi

 

 

1. Linux系统构成简单介绍

1. 一个完整的linux系统,通常包含了Uboot、kernel、设备树以及根文件系统。

2.  Uboot的全称 Universal Boot Loader。主要作用是用来启动操作系统内核,它分为两个阶段,即boot + loader, boot阶段启动系统,初始化硬件设备,建立内存空间映射图,将系统的软硬件带到一个合适的状态, loader阶段将操作系统内核文件加载至内存,之后跳转到内核所在地址运行。

3. 设备树是一种描述硬件的数据结构,它把这些硬件设备的信息, 而这个文件,就是Device Tree(设备树),设备树包括设备树源码(Device Tree Source,DTS)文件、 设备树编译工具(Device Tree Compiler,DTC)与二进制格式设备树(Device Tree Blob,DTB), DTS包含的头文件格式为DTSI,其关系如下图所示:

 

 Uboot和Linux不能直接识别DTS文件, 而DTB可以被内核与BootLoader识别解析,通常在制作NAND Flash、SD Card启动镜像时, 通常会为DTB文件留下一部分存储区域以存储DTB,在BootLoader启动内核时,会先读取DTB到内存,再提供给内核使用。
 
4. 根文件系统(rootfs)是linux在初始化时加载的第一个文件系统, 根文件系统包括根目录和真实文件系统,它包含系统引导和使其他文件系统得以挂载(mount)所必要的文件。
 

2. Uboot的介绍

1. BootLoader是一段小程序,它在系统上电时执行,通过这段小程序可以将硬件 设备进行初始化,如CPU、SDRAM、Flash、串口、网络等,初始化完毕后调用操作系统内核。
2. uboot 命令:可使用 tab 自动补全命令。
当需要具体使用哪个命令时,可使用 “help 命令” 或 “? 命令” 的方式查看具体命令的使用说明。
3. uboot 启动内核过程:
bootcmd与bootargs可以说是uboot最重要的两个环境参数, uboot执行完毕之后,如果没有按下回车,则会自动执行bootcmd命环境参数里的内容, 而bootargs则是传递给内核的启动参数。
使用 printenv bootcmd 可查看bootcmd的内容。
 => printenv bootcmd
 bootcmd=run distro_bootcmd

3. Uboot的编译

 1. git 查看所有分支命令:

git branch -a

 选择/切换分支命令

git checkout ebf_v2020_10_imx(上一个命令打印出的一个分支名)

2. uboot 编译的命令如下:

1   sudo make distclean #清除上次生成的编译环境
2   sudo make ARCH=arm CROSS_COMPILE=arm-none-eabi- mx6ull_fire_mmc_defconfig #加载板级配置文件
4   sudo make ARCH=arm CROSS_COMPILE=arm-none-eabi-  #编译uboot

3. 编译生成的u-boot-dtb.imx文件就是我们想要文件。

4. Uboot的烧录

方式一:使用SD卡烧录

1. 使用lsblk命令插件磁盘设备,产生形如下面的代码.

embedfire@embedfire-VirtualBox:~$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0    91M  1 loop /snap/core/6350
loop1    7:1    0   2.3M  1 loop /snap/gnome-calculator/260
loop2    7:2    0    13M  1 loop /snap/gnome-characters/139
loop3    7:3    0 140.7M  1 loop /snap/gnome-3-26-1604/74
loop4    7:4    0   3.7M  1 loop /snap/gnome-system-monitor/57
loop5    7:5    0  34.6M  1 loop /snap/gtk-common-themes/818
loop6    7:6    0  14.5M  1 loop /snap/gnome-logs/45
sda      8:0    0   100G  0 disk
└─sda1   8:1    0   100G  0 part /
sdb      8:16   1  14.9G  0 disk    //sdb是我们想要烧录的对象.
sr0     11:0    1  58.3M  0 rom  /media/embedfire/VBox_GAs_6.1.18

2. 使用dd命令进行烧录

sudo dd iflag=dsync oflag=dsync if=u-boot-dtb.imx of=/dev/sdb seek=2

5. Uboot的移植

1.bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH, SD, MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。

2. 有很多现成的 bootloader 软件可以使用,比如 U-Boot、 vivi、 RedBoot 等等,其中以 U-Boot 使用最为广泛。

posted @ 2023-05-13 15:50  FBshark  阅读(816)  评论(0编辑  收藏  举报