Zero u-boot编译和使用指南¶
- 概要:
本文主要介绍Uboot的结构,menuconfig里的常见配置选项,编译步骤等
1. Uboot的基本结构¶
下面来看看该uboot中的目录结构
├── api 存放uboot提供的API接口函数
├── arch 平台相关的部分我们只需要关心这个目录下的ARM文件夹
│ ├──arm
│ │ └──cpu
│ │ │ └──armv7
│ │ └──dts
│ │ │ └──*.dts 存放设备的dts,也就是设备配置相关的引脚信息
├── board 对于不同的平台的开发板对应的代码
├── cmd 顾名思义,大部分的命令的实现都在这个文件夹下面。
├── common 公共的代码
├── configs 各个板子的对应的配置文件都在里面,我们的Lichee配置也在里面
├── disk 对磁盘的一些操作都在这个文件夹里面,例如分区等。
├── doc 参考文档,这里面有很多跟平台等相关的使用文档。
├── drivers 各式各样的驱动文件都在这里面
├── dts 一种树形结构(device tree)这个应该是uboot新的语法
├── examples 官方给出的一些样例程序
├── fs 文件系统,uboot会用到的一些文件系统
├── include 头文件,所有的头文件都在这个文件夹下面
├── lib 一些常用的库文件在这个文件夹下面
├── Licenses 这个其实跟编译无关了,就是一些license的声明
├── net 网络相关的,需要用的小型网络协议栈
├── post 上电自检程序
├── scripts 编译脚本和Makefile文件
├── spl second program loader,即相当于二级uboot启动。
├── test 小型的单元测试程序。
└── tools 里面有很多uboot常用的工具。
了解了uboot的基本结构,我们可以知道一些相关的配置在什么地方了。
lichee的uboot配置文件放在confgs文件目录下面,名称为
LicheePi_Zero_480x272LCD_defconfig
LicheePi_Zero_800x480LCD_defconfig
LicheePi_Zero_defconfig
这3个配置是根据不同的Zero显示设备进行的配置,使用其中之一即可,可以在uboot目录下执行命令
make LicheePi_Zero_defconfig
这样配置就生效了。
关于设备的配置引脚信息可以在arch/arm/dts的设备树下面进行查找。
通过查看arch/arm/dts/Makefile我们看到下面这段关于v3s的代码:
dtb-$(CONFIG_MACH_SUN8I_V3S) += \
sun8i-v3s-licheepi-zero.dtb
我们基本可以找到对应的dtb文件就是sun8i-v3s-licheepi-zero.dtb
打开 sun8i-v3s-licheepi-zero.dts (dtb是object文件,相当于*.o, dts相当于*.c)文件
#include "sun8i-v3s.dtsi" //这个文件包含了sun8i-v3s系列的配置
#include "sunxi-common-regulators.dtsi"
/ {
model = "Lichee Pi Zero";
compatible = "licheepi,licheepi-zero", "allwinner,sun8i-v3s";
aliases {
serial0 = &uart0;
};
chosen {
stdout-path = "serial0:115200n8";
};
};
&mmc0 {
pinctrl-0 = <&mmc0_pins_a>;
pinctrl-names = "default";
broken-cd;
bus-width = <4>;
vmmc-supply = <®_vcc3v3>;
status = "okay";
};
&uart0 {
pinctrl-0 = <&uart0_pins_a>;
pinctrl-names = "default";
status = "okay";
};
&usb_otg {
dr_mode = "otg";
status = "okay";
};
&usbphy {
usb0_id_det-gpio = <&pio 5 6 GPIO_ACTIVE_HIGH>;
status = "okay";
};
从这个配置文件中可以看出,我们所用的stdout输出是用的uart0
波特率115200,mmc的配置, uart0的引脚采用的是uart0_pins_a 等。
如若需要修改对应的输出,可以在这个文件中修改。
3. 编译步骤¶
上面已经讲述了如何把配置文件进行生成.config文件。做好这两件事情之后就可以编译了。
官方git上给的命令是:
time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log
第一个time命令完全可以去掉,time主要为了计算该编译需要花费的时间
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
这个之前的config也说了,其实就是给变量ARCH赋值arm
给CROSS_COMPILE赋值arm-linux-gnueabihf-
也可以先省去,剩下的: make 2>&1 | tee build.log
tee 这个命令是把make生成的log写入到build.log文件中,这样编译之后的log文件可以保留存有备份,也可以省去。
make 2>&1
查了下资料 数字2对应stderr 数字1对应stdout
这里即将标准err输出 &作为连接符表示‘与’的意思,即标准输出和标准error输出都进行输出。
其实真正执行编译的是下面的命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
小伙伴可以试下,该命令是否可以编译出 u-boot-sunxi-with-spl.bin 文件,其他的命令都是辅助编译的命令,用于调试的时候开启。亲测直接 make CROSS_COMPILE=arm-linux-gnueabihf-
也是可以的。
FAQ:下面的内容可能其他章节会讲到,所以下面就大致讲下编译环境的搭建
本文所描述的uboot是基于Lichee_Pi/uboot.git的版本
先下载代码,执行下面的命令。
git clone https://github.com/Lichee-Pi/u-boot.git
git checkout -b v3s-current origin/v3s-current
export ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
make LicheePi_Zero_defconfig
先要配置好编译环境可以参照 开发环境搭建
操作系统官方默认是在Ubuntu 14.04 64bit的环境下编译的。
我试了下在Ubuntu16.04.1的ubuntu的版本下进行编译。
装好虚拟机操作系统之后,我们先安装一些依赖包
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev gcc-multilib x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils
sudo apt-get install gcc-arm-linux-gnueabihf
执行完这两条命令之后,如果安装成功,应该是可以编译的,当然我在尝试的时候最后mingw32会出现一些问题。
可能对于ubuntu16.04版本还要根据
git上 编译坑_Ubuntu16.04编译过程踩坑记录 来修改gcc的版本.然后呢根据
来修改部分的mingw32相关的编译选项,对了后面编译uboot的时候还会遇到dtc编译版本低的问题,所以在此还要执行 sudo apt-get install device-tree-compiler
的命令升级dtc。至此编译环境基本搭建好了。
这些都是楼主踩过的坑,感谢楼主,我们应该不需要踩了。还是挺有用的。
接着就可以下载uboot的源代码: https://github.com/Lichee-Pi/u-boot.git
执行这段命令uboot的源代码就下下来了。