前言
本文讲述了如何编译uboot并进行配置,对编译过程中遇到的问题进行解决,此外还对uboot的结构进行了简介
一、安装交叉编译器
网盘地址:
链接:https://pan.baidu.com/s/1ndgzG_aAMCbDgqYwh1yxfw
提取码:4gpo
国外用户:https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/
依次执行下面指令
1、wget https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz 2、tar xvf gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz 3、mv gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf /opt/ 4、vim ~/.bashrc # add: export PATH=$PATH:/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/bin 5、source ~/.bashrc 6、arm-linux-gnueabihf-gcc -v 7、sudo apt-get install device-tree-compiler
二、编译Uboot
1、依次执行下面指令
1、git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current #or git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-spi-experimental 2、cd u-boot 3、make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_800x480LCD_defconfig #or make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero480x272LCD_defconfig #or make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig 4、make ARCH=arm menuconfig 5、time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log
上述4、5步骤报错可参考 4、问题描述及解决办法
2、修改 include/configs/sun8i.h, 使u-boot可以直接从tf卡启动:
#define CONFIG_BOOTCOMMAND "setenv bootm_boot_mode sec; " \ "load mmc 0:1 0x41000000 zImage; " \ "load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock.dtb; " \ "bootz 0x41000000 - 0x41800000;" #define CONFIG_BOOTARGS "console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw vt.global_cursor_default=0"
3、编译完成后,在当前目录下生成了u-boot-sunxi-with-spl.bin,可以烧录到8K偏移处启动。
4、问题描述及解决办法:
问题①:
make ARCH=arm menuconfig 提示报错
解决方法:
安装libncurses5-dev, 运行:
sudo apt-get install libncurses5-dev
再次执行 make ARCH=arm menuconfig,出现下图配置界面
问题②:
time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log 编译Uboot报错
查看这个目录下,发现工具文件存在
解决方法:
1)、首先尝试以绝对路径编译
./tools/binman/binman u-boot-sunxi-with-spl.bin
2)、结果如下,应该是没有python解析器
3)、安装python解析器
sudo apt-get install python
4)、在Linux中安装python时,调用“sudo apt-get install python”命令出现以下问题:
5)、解决方法,改用下面的命令安装(我的ubuntn版本是22.04)
sudo apt-get install software-properties-common
安装完后想要利用“pip”查看安装列表,需要先安装pip
sudo apt-get install python-pip
有了pip之后,如果直接输入“pip list”会显示错误,还需要继续更新到pip3
输入命令
sudo apt install python3-pip
之后就可以直接利用“pip list”查看安装的包了
查看当前有哪些python版本
将 /usr/bin/python2.7 创建软连接为 /usr/bin/python
这点很重要
sudo ln -s /usr/bin/python2.7 /usr/bin/python
再次验证,运行time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log
编译通过
三、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_800x480LCD_defconfig
这样配置就生效了。
四、Uboot配置
1、Uboot配置命令
make ARCH=arm menuconfig
—按回车,即选择当前菜单
------- 按Y 代表该config选项选中
------- 按N 代表不选中该选项
-------- 按M
代表该驱动编译成.ko的方式,在系统起来之后,当驱动需要的时候加载
</>---------按/ 可以查找某个选项
---------退出
< > ----------按Y选中后的状态
这里面有几个常见的配置选项我们可以看下:
第一个Architecture select架构选择,不用质疑这个是ARM架构
第二个ARM architecture
这个选项比较重要,主要配置ARM框架下的常用的配置函数以及LCD等参数
2、DDR配置
··· Target select (Support sunxi (Allwinner) SoCs) #进去之后可以选择sunxi Soc系列芯片 ··· [*] Sunxi SoC Variant # 这个就是对芯片Soc 的选择,我们可以看到配置选择了`sun8i (Allwinner V3s) (360) sunxi dram clock speed # 配置dram的时钟速率 (14779) sunxi dram zq value # 配置dram的ZQ值,是用来动态加强DDR3的 -*- Board uses DDR2 DRAM # 使用DDR2 DRAM
3、LCD配置
[*] Enable graphical uboot console on HDMI, LCD or VGA 这个就是在显示设备上使能串口控制 [ ] VGA via LCD controller support 使能支持VGA通过LCD的控制器,就是LCD和VAG转换需要的控制器 (x:800,y:480,depth:18,pclk_khz:33000,le:87,ri:40,up:31,lo:13,hs:1,vs:1,sync:3,vmode:0) LCD pane > 该选项就是配置LCD的分辨率的配置选项可以看到x是800 y是480 等等一些关于LCD的配置内容,点击回车进去可以对其进行修改。 (1) LCD panel display clock phase 这个是LCD的显示时钟相位 () LCD panel power enable pin LCD的电源使能引脚 () LCD panel reset pin LCD的复位引脚 (PB4) LCD panel backlight pwm pin 背光PWN引脚 这个应该是调节亮度的引脚PB4 [*] LCD panel backlight pwm is inverted 反转PWN背光引脚 [ ] LCD panel needs to be configured via i2c LCD panel support (Generic parallel interface LCD panel) ---> 这个选择支持的LCDpanel (X) Generic parallel interface LCD panel 这里选择支持通用的并行的LCD接口 ( ) Generic lvds interface LCD panel 这个是LVDS接口 ( ) MIPI 4-lane, 513Mbps LCD panel via SSD2828 bridge chip ( ) eDP 4-lane, 1.62G LCD panel via ANX9804 bridge chip ( ) Hitachi tx18d42vm LCD panel ( ) tl059wv5c0 LCD panel (0) GMAC Transmit Clock Delay Chain
4、时钟频率配置
这里设置了CPU的时钟频率
Boot images —>(1008000000) CPU clock frequency
5、开机延时设置
这个是uboot开机的时候的一个等待时间的秒数,可以改大一点,默认是2s
delay in seconds before automatically booting
6、SPL配置
SPL / TPL ---> 这个就是SPL相关的配置了 [*] MMC raw mode: by sector 按扇区 (0x50) Address on the MMC to load U-Boot from mmc加载uboot的地址 [*] Support GPIO 支持GPIO [*] Support I2C 支持I2C [*] Support common libraries 支持通用lib [*] Support disk paritions 支持分区 [*] Support generic libraries 支持一般lib库 [*] Support MMC 支持MMC [*] Support power drivers 支持电源驱动 [*] Support serial 支持串口