目录

0 前言

一 安装交叉编译器

二 u-boot

三 linux内核

四 根文件系统


2022/04月,搞了块荔枝nano板子

所需工具:

荔枝nano板*1、usb转ttl*1(板子上面没有转ttl芯片,故需要自己准备)、tf卡*1、Ubuntu虚拟机版本具体没啥要求*1

0 前言

首先,先说一下大概情况。

到手的nano板是不够的,自己准备tf卡、读卡器、转串口工具,还需要电烙铁,因为你得把排针焊上去。有的nano板子上自带flash,里面有代码,开盒通电就可以使用,里面还有demo,需要屏幕才能展示。屏幕涨价太快了,故本文没有涉及到屏幕的开发内容。

然后,说明一下大体的流程

以下各部分均可以分块完成,本流程中方法操作不对,也可以参考别人的流程

一 安装交叉编译器

在虚拟机中,首先为了编译器准备个文件夹,

# 创建文件夹
sudo mkdir /usr/local/arm 

#进入目录
cd /usr/local/arm

然后得到软件包,

#从网上得到交叉编译器的压缩包(也可以在别的网址get)
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 nano /etc/profile

# 把它添加在最后保存退出
export PATH=$PATH:/usr/local/arm/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin

# 安装相关库
sudo apt-get install lsb-core lib32stdc++6

# 重启,验证
arm-linux-gnueabi-gcc -v

完成后,会有一大串信息被打印出来,最后一行:

emmc镜像烧录 nand烧录镜像制作_linux

(下载+修改环境=ok)

二 u-boot

其实u-boot、linux内核、rootfs是三个一定程度上互相独立的,可以分别制作,组合起来,可以自己做一些,用别人的一些。三者都可以分别看作一个软件包,每一步的操作都需要在对应的软件包文件目录下进行。(这三者都是要先获得软件包,然后进行配置,之后进行编译)

安装

# 安装工具,接着走一遍,如果报错,就去百度,肯定是有包没安装,在继续apt-get
sudo apt install gcc python swig python-dev bc device-tree-compiler

# 获取u-boot
git clone https://github.com/Lichee-Pi/u-boot.git -b nano-v2018.01

配置并编译

# 进入目录设置编译前的默认配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_defconfig

#有了这个才可以可视化配置
sudo apt-get install libncurses5-dev
# 进行可视化配置
make ARCH=arm menuconfig

# 开始编译 -j是cpu线程数
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8

由于该处的makefile文件默认的不是上边下载的编译器,故需要修改

sudo nano Makefile
# 添加
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabi-

大概在248行左右,添加进入。 

emmc镜像烧录 nand烧录镜像制作_linux_02

编译完成后会得到 u-boot-sunxi-with-spl.bin 文件,这个就是我们需要的,只要把它放在tf卡相应位置即可。

通过在终端里输入df命令可以查看sdb1和sdb2的信息(如果看不到,那就多插拔几次u盘,实在不行拔下来,静置5分钟才多插几次)

emmc镜像烧录 nand烧录镜像制作_ubuntu_03

分区完之后

烧写操作:写进tf卡(dd复制操作),具体分区操作请见专栏里 tf分区操作。

# 找到内存卡,我的是/dev/sdb,
# 为啥不是sdb1和sdb2,而是sdb,我感觉其实sdb也占了sdb1的位置。
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8

其实这里还有额外一步,因为u-boot需要引导进入内核,所以需要增加如下修改(如果不改就会卡在 进入内核 这一步骤)(借鉴自参考文献2)

/* bootcmd 保存着 uboot 默认命令, uboot 倒计时结束以后就会执行 bootcmd 中的命令 */
/* bootargs 保存着 uboot 传递给 Linux 内核的参数*/
sudo nano /include/configs/suniv.h

/* 添加以下代码(mmc 0为TF卡,1是第一分区,文件系统为fat32,把zImage和dtb文件拷入DRAM)*/
#define CONFIG_BOOTCOMMAND	"fatload mmc 0:1 0x80800000 zImage; "  \
                            "fatload mmc 0:1 0x83000000 suniv-f1c100s-licheepi-nano.dtb; " \
                            "bootz 0x80800000 - 0x83000000;"

/* 继续添加(linux将使用uart0进行交互,死机5s重启,根文件系统在mmc0(tf卡)第二分区(EXT4),等待 mmc 设备初始化完成以后再挂载,开启读写权限) */
#define CONFIG_BOOTARGS   "console=ttyS0,115200 panic=5 root=/dev/mmcblk0p2 rootwait rw "


/* 回到u-boot目录进行编译 */
make ARCH=arm menuconfig
/* 取消勾选 [] Enable a default value for bootcmd */
/* 勾选 [v] Enable boot arguments;*/

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j12

 将生成的u-boot-sunxi-with-spl.bin文件再烧录到TF卡(sdb的那一步)

三 linux内核

 获取

/* 获取Linux内核 */
git clone https://github.com/Lichee-Pi/linux.git --depth=1 -b nano-4.14-exp

/* 下载配置文件 */
wget http://nano.lichee.pro/_static/step_by_step/lichee_nano_linux.config

配置并编译

/* 修改下载的配置文件名为.config */ 
mv lichee_nano_linux.config .config

/* 可视化配置 */
make ARCH=arm menuconfig

/* 编译,出错的话百度然后apt install安装 */
sudo apt-get install libssl-dev
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8

在这一步会生成两个文件:设备树文件dtb镜像压缩文件zImage文件。

生成的zImage在 ./arch/arm/boot/zImage,拷贝到TF卡第一分区
生成的dtb文件在 ./arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb,拷贝到TF卡第一分区

#在linux目录下执行该命令,注意改成自己的分区1

cp arch/arm/boot/zImage /media/ice/CDE5-CBCF -d

cp arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb /media/ice/CDE5-CBCF -d

 完事之后sdb1分区:

emmc镜像烧录 nand烧录镜像制作_linux_04

四 根文件系统

该步骤也是下载文件包,配置,编译,因为编译时间实在是太长了,我直接用来官方提供的rootfs.tar镜像。这也就是我一开始说的可以随意组合。

将rootfs.tar镜像解压都放到sdb2分区:

emmc镜像烧录 nand烧录镜像制作_emmc镜像烧录_05

到此为止就可以插卡启动了。

参考资料:

1.分区操作http:// https://whycan.cn/t_547.html

emmc镜像烧录 nand烧录镜像制作_linux_06