lichee nano开发大致需要如下环境:
一般使用虚拟机安装linux发行版,具体安装步骤网上很多,这里不再赘述。
另外,建议使用VMWare Player,因为目前windows的虚拟机只有VMWare对USB支持较好,用Player版本是因为对个人开发者免费,支持正版!
linux发行版我使用的是Ubuntu18.04,lichee官方推荐的是Ubuntu16.04。
以下安装步骤摘自官方文档:
# 此处为获取7.2.1版本,您可获取其他版本或者通过链接直接下载
wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
tar -vxJf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
sudo cp -r ./gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi /opt/
sudo vim /etc/bash.bashrc
# 在文件末尾 添加以下内容
PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"
# 添加完毕
# 使路径生效
source /etc/bash.bashrc
此时可用 arm-linux-gnueabi-gcc -v 进行测试;若普通用户状态下没有成功,通过 sudo su 切换到root用户再尝试。
以下安装步骤摘自官方文档:
# 下载
git clone -b f1c100s-spiflash https://github.com/Icenowy/sunxi-tools.git
cd sunxi-tools
# 编译安装
make && sudo make install
如果出现:fel_lib.c: 26: 20: fatal error: libusb.h: No such file or directory,那需要安装libusb:
sudo apt-get install libusb-1.0-0-dev
烧录工具基本使用命令:
# 确认lichee nano是否进入fel模式
sudo sunxi-fel ver
# 以 uboot file-with-spl形式进行(单次运行,测试时推荐)
sudo sunxi-fel uboot u-boot-sunxi-with-spl.bin # 请自行修改到本机地址
# 烧录进 spi-flash (开机自启)
sudo sunxi-fel -p spiflash-write 0 u-boot-sunxi-with-spl.bin
# 将filename烧录进spi-flash的addr地址为起始的若干字节(文件大小)空间中
sudo sunxi-fel -p spiflash-write addr filename
git clone https://github.com/Lichee-Pi/u-boot.git
cd u-boot
# 查看分支
git branch -a
# 切换到 Nano 分支
git checkout nano-v2018.01
# 此处告知make采用arm-linux-gnueabi下的所有交叉编译工具,目标架构为Arm,设定各项默认配置为 nano 的spiflash支持版
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig
# 若不带spi-flash的板子,请换成 licheepi_nano_defconfig
# 进行可视化配置
make ARCH=arm menuconfig
# 开始编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8
(注意:编译过程中可能会提示缺少环境或者文件,请按照log提示安装对应的库;也可能会报莫名其妙的错误,在官方文件中有部份错误,在后续u-boot编译的文章中会详细讲到)
./u-boot-sunxi-with-spl.bin
摘自官方文档:
git clone https://github.com/Icenowy/linux.git
git拉取有时速度很慢,建议做如下配置:
sudo vim /etc/hosts
# 添加下面两行
192.30.253.112 github.com
151.101.73.194 github.global.ssl.fastly.net
# 添加完成
# 可自行通过dns检测网站检测github.global.ssl.fastly.net,更换为更快的ip地址
完整拉取linux极大,建议只拉取单层分支,减少等待时间:
git clone --depth=1 -b f1c100s-480272lcd-test https://github.com/Icenowy/linux.git
获取官方提供的.config文件,放入内核源码目录下,注意文件需命名为 .config
# 配置
make ARCH=arm menuconfig
# 编译
# 为了加快编译速度,请自行更改线程数
# 编译内核,生成zImage
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
# 编译dts,生成dtb文件
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs -j4
# 编译内核模块,并输出到out目录
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=out modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=out modules_install
(注意:编译过程中可能会提示缺少环境或者文件,请按照log提示安装对应的库;也可能会报莫名其妙的错误,在官方文件中有部份错误,在后续内核编译的文章中会详细讲到)
./arch/arm/boot/zImage
./arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb
./out/lib/modules
摘自官方文档:
首先安装一些依赖,比如linux头文件:
apt-get install linux-headers-$(uname -r)
然后下载安装:
wget https://buildroot.org/downloads/buildroot-2017.08.tar.gz
tar xvf buildroot-2017.08.tar.gz
cd buildroot-2017.08/
make menuconfig
摘自官方文档:
此处为免去另外配置工具链的步骤,使用了 buildroot 自动下载工具链执行的选项;
同内核编译一样,请下载 buildroot 的.config 文件,重命名为 .config 后放到 buildroot目录下;
若编译时,buildroot下载软件包速度太慢,请下载dl.zip ,将其中的软件包解压至 buildroot ‣ dl 下。
使用:
make menuconfig
进行配置,添加或删除指定的软件包;
编译:
make
./output/images/rootfs.tar
使用官方提供的打包脚本打包,我自己这里有些许改动:
#!/bin/bash
curPath=$(readlink -f "$(dirname "$0")")
_IMG_FILE=firmware.bin
_UBOOT_FILE=$curPath/u-boot/u-boot-sunxi-with-spl.bin
_DTB_FILE=$curPath/linux/arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb
_KERNEL_FILE=$curPath/linux/arch/arm/boot/zImage
_ROOTFS_FILE=$curPath/rootfs-spi-flash.tar.gz
_MOD_FILE=$curPath/linux/out/lib/modules
if [ -f $_IMG_FILE ] ; then
echo "Image exist,rename it to .old"
mv $_IMG_FILE $_IMG_FILE.old -f
echo "Creating new an Image"
fi
rm -rf ./_temp
mkdir _temp &&\
cd _temp &&\
echo "Generate bin..."
dd if=/dev/zero of=flashimg.bin bs=1M count=16 &&\
echo "Packing Uboot..."
dd if=$_UBOOT_FILE of=flashimg.bin bs=1K conv=notrunc &&\
echo "Packing dtb..."
dd if=$_DTB_FILE of=flashimg.bin bs=1K seek=1024 conv=notrunc &&\
echo "Packing zImage..."
cp $_KERNEL_FILE ./zImage &&\
dd if=./zImage of=flashimg.bin bs=1K seek=1088 conv=notrunc &&\
mkdir rootfs
echo "Packing rootfs..."
tar -zxvf $_ROOTFS_FILE -C ./rootfs >/dev/null &&\
cp -r $_MOD_FILE rootfs/lib/modules/ &&\
mkfs.jffs2 -s 0x100 -e 0x10000 --pad=0xAF0000 -d rootfs/ -o jffs2.img &&\
dd if=jffs2.img of=flashimg.bin bs=1K seek=5184 conv=notrunc &&\
mv ./flashimg.bin ../$_IMG_FILE &&\
echo "Bin update done!"
echo $(pwd)
cd .. &&\
rm -rf ./_temp
exit
使用该脚本时,文件目录组织如下:
.
├── linux
├── pack_flash_img.sh
├── rootfs-spi-flash.tar.gz
└── u-boot
由于自己编译出来的跟文件系统太大,无法放到spi-flash中,因此这里使用的是官方提供的根文件系统rootfs-spi-flash.tar
执行镜像打包脚本:
sudo ./pack_flash_img.sh
会在当前目录下生成一个firmware.bin文件,使用烧录工具将该文件烧写到spi-flash的0地址即可完成固件更新。
如果按照本文档操作,到这里烧写成功后,开机只能看到u-boot的日志,需要进入系统的话,还需要修改源码,后续文章中会讲到。