一、编译
1、安装交叉编译环境
我是直接用的之前Linux-ARM开发的环境:
参考:arm-linux-gnueabihf 交叉编译工具链安装
2、获取uboot(不同版本uboot)
//普通
git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current
//支持spi flash
git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-spi-experimental
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常用的工具。
3、编译uboot
cd u-boot
//不同屏幕不同配置(配置文件在configs文件夹下)--------------------------------------
//默认
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig
//4.3寸屏
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_480x272LCD_defconfig
//5寸屏
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_800x480LCD_defconfig
//配置和编译-----------------------------------------------------------------------
make ARCH=arm menuconfig
time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log
在uboot顶层Makefile
的248行,添加默认编译器,就可以直接用make
编译了。
# set default to nothing for native builds
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-
KCONFIG_CONFIG ?= .config
export KCONFIG_CONFIG
编译成功:
【问题解决】报错:SyntaxError: Missing parentheses in call to ‘print‘. Did you mean print(result)?
【问题解决】报错:Your dtc is too old, please upgrade to dtc 1.4 or newer
二、烧录
1、进入 fel 模式使用 sunxi-fel
工具烧录
详细步骤参考:全志sunxi-tools烧录工具安装和使用
//检查是否可以探测到芯片信息:
sudo sunxi-fel -l
//确认是否成功进入fel模式:
sudo sunxi-fel ver
有两种方式进行程序下载:
- 烧录到RAM中去执行,以 uboot file-with-spl形式进行(单次运行,测试时个人推荐)
sudo sunxi-fel uboot u-boot-sunxi-with-spl.bin
//或者执行烧录地址
sudo sunxi-fel -p write 0x40000000 u-boot-sunxi-with-spl.bin
sudo sunxi-fel exec 0x40000000
- 烧录到 spi-flash (开机自启)
sunxi-fel -p spiflash-write 0 u-boot-sunxi-with-spl.bin
注意:如果烧录到 spi-flash ,需要修改 include/configs/sun8i.h
,从flash引导系统
uboot启动信息:
U-Boot SPL 2017.01-rc2-00057-g32ab1804cd (Jan 16 2021 - 12:28:54)
DRAM: 64 MiB
Trying to boot from FEL
U-Boot 2017.01-rc2-00057-g32ab1804cd (Jan 16 2021 - 12:28:54 +0800) Allwinner Technology
CPU: Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM: 64 MiB
MMC: SUNXI SD/MMC: 0
Card did not respond to voltage select!
*** Warning - MMC init failed, using default environment
In: serial@01c28000
Out: serial@01c28000
Err: serial@01c28000
Net: No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot: 0
Card did not respond to voltage select!
starting USB...
No controllers found
USB is stopped. Please issue 'usb start' first.
starting USB...
No controllers found
No ethernet found.
missing environment variable: pxeuuid
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/00000000
No ethernet found.
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/0000000
No ethernet found.
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/000000
No ethernet found.
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/00000
No ethernet found.
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/0000
No ethernet found.
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/000
No ethernet found.
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/00
No ethernet found.
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/0
No ethernet found.
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/default-arm-sunxi
No ethernet found.
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/default-arm
No ethernet found.
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/default
No ethernet found.
Config file not found
starting USB...
No controllers found
No ethernet found.
No ethernet found.
=>
2、烧录到TF/SD卡
TF卡中的系统镜像一般分为三个区:
boot区或者引导区
- 该部分没有文件系统而是直接将二进制的bootloader(uboot)文件直接写入。linux内核区
- fat文件系统,存放linux内核、内核参数文件还有设备数dtb文件。rootfs分区
- 用来存放根文件系统和用户数据等,一般是ext4文件分区格式。
//插入TF卡前后查询,确认设备名称
ls /dev/sd*
//删除TF/SD的分区信息
sudo dd if=/dev/zero of=/dev/sdb bs=512K count=1
//烧录到TF卡(`u-boot-sunxi-with-spl.bin`在uboot根目录下)
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
uboot启动信息:
U-Boot 2017.01-rc2-00057-g32ab1804cd-dirty (Jan 16 2021 - 22:48:52 +0800) Allwinner Technology
CPU: Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM: 64 MiB
MMC: SUNXI SD/MMC: 0
*** Warning - bad CRC, using default environment
Setting up a 480x272 lcd console (overscan 0x0)
dotclock: 10000kHz = 10000kHz: (1 * 3MHz * 20) / 6
In: serial@01c28000
Out: serial@01c28000
Err: serial@01c28000
Net: No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot: 0
** Invalid partition 1 **
** Invalid partition 1 **
=>
三、启动成功后显示界面:
1、直接烧录到RAM启动(USB):
2、烧录到TF启动:
注意TF卡要插在靠近USB的那个接口: