orangepi one H3 u-boot/kernel编译
目录
1. 相关文件下载链接
交叉编译工具链:https://github.com/orangepi-xunlong/toolchain
uboot:https://github.com/orangepi-xunlong/toolchain
kernel:https://github.com/orangepi-xunlong/linux-orangepi
编译环境:
基于ubuntu20.04的vmwarea虚拟机:
用户名密码:work/work、root/root
虚拟机静态IP:192.168.5.239/255.255.0.0/桥接
虚拟机安装的服务服务有:
1)ssh,用于远程登录
2)samba,用于windows直接访问虚拟机目录(无密码登录,输入 \\192.168.5.239\home)
3) vmware-tools,用于在虚拟机里面访问windows目录
2. 安装toolchain
如上图解压后,运行如下命令,让编译工具链生效:
export PATH=$PATH:/home/work/orangepi_one/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export CROSS=arm-linux-gnueabihf-
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export AR=arm-linux-gnueabihf-ar
export RANLIB=arm-linux-gnueabihf-ranlib
export STRIP=arm-linux-gnueabihf-strip
export LD=arm-linux-gnueabihf-ld
3. 编译u-boot
cd u-boot-orangepi-2020.04
# 清除编译过程文件
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
# 生成OrangePi One的默认配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- orangepi_one_defconfig
# 编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
备注:
ARCH = ? CPU的架构
CROSS_COMPILE = ? 使用的编译工具链头
配置uboot功能(一般不用)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
在u-boot-orangepi-2020.04目录下添加了一个编译脚本build_orange_one.sh,内容如下:
#!/bin/sh
echo ""
echo "build orangepi one u-boot......"
echo ""
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- orangepi_one_defconfig
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
cp config_orangepi_one .config
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
if [ $? -eq 0 ]; then
echo "build orangepi one u-boot success"
else
echo "build orangepi one u-boot fail"
fi
编译出来的文件是:u-boot-sunxi-with-spl.bin
4. 烧录u-boot
将开发板上的SD卡通过读卡器接入到虚拟机中,进入u-boot目录,执行如下命令:
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
备注:我的是/dev/sdb,有可能是sdc等,根据实际情况修改。
5. 运行u-bot情况
板和电脑的连接如下:
串口只用连接RX、TX、GND三根线。
运行后串口看到如下信息,说明u-boot烧录成功:
6. 编译kernel
tar -zxvf linux.tar.gz
编译确认toolchain已经配置好。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
# 生成内核的板级配置,对应于arch/arm/configs/sunxi_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sunxi_defconfig
# 编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
备注:
# 配置内核功能
make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
在linux-orangepi-orange-pi-5.4目录下添加了一个编译脚本build_orange_one.sh,内容如下:
#!/bin/sh
echo ""
echo "build orangepi one kernel......"
echo ""
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sunxi_defconfig
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
cp config_orangepi_one .config
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
if [ $? -eq 0 ]; then
echo "build orangepi one kernel success"
else
echo "build orangepi one kernel fail"
fi
生成的内核和设备树路径是:
arch/arm/boot/zImage
arch/arm/boot/dts/sun8i-h3-orangepi-pc.dtb
7 kernel烧录、运行
烧录:
将TF卡接入PC电脑,直接将生成的zImage和sun8i-h3-orangepi-pc.dtb放到TF止顶层目录,我这里没有将TF卡分区
修改uboot环境变量:
setenv bootcmd 'load mmc 0:1 0x43000000 sun8i-h3-orangepi-pc.dtb; load mmc 0:1 0x42000000 zImage; bootz 0x42000000 - 0x43000000';saveenv
如下图,跑到文件系统会卡住,因为没有烧录文件系统。
8 编译过程中遇到的问题
问题1:libz.so.1: cannot open shared object file: No such file or directory
解决:apt-get install lib32z1
问题2:dtc: command not found
解决:apt install device-tree-compiler
问题3:mkimage: command not found
解决:apt install u-boot-tools
问题4:/usr/bin/env: ‘python2’: No such file or directory
解决:sudo apt-get install python2
问题5:/bin/sh: 1: bison: not found
解决:sudo apt-get install bison -y
问题6:/bin/sh: 1: flex: not found
解决:sudo apt-get install flex -y
问题7:ModuleNotFoundError: No module named 'distutils.core'
解决:sudo apt-get install python3-pip
问题8:unable to execute 'swig': No such file or directory
解决:sudo apt install swig
安装的其它包:
sudo apt-get install libncurses5-dev
问题9:u-boot运行时报错,Loading Environment from FAT... *** Warning - bad CRC, using default environment
解决:在u-boot命令行运行saveenv