参考:http://zero.lichee.pro/系统开发/SPI_flash_build.html#linux
本文以型号为MX25L12805、MX25L25635F为例,flash大小分别为16M、32M。
首先规划flash分区,规划如下:
分区序号 | 分区大小 | 分区作用 | 地址空间及分区名 |
---|---|---|---|
mtd0 | 1MB | spl+uboot | 0x0000000-0x0100000 : “uboot” |
mtd1 | 64KB | dtb文件 | 0x0100000-0x0110000: “dtb” |
mtd2 | 4MB | 内核 | 0x0110000-0x0510000 : “kernel” |
mtd3 | 剩余 | 根文件系统 | 0x0510000-0x2000000 : “rootfs” |
下载包含spi驱动的体验版本uboot,该驱动目前尚未合并到主线
git clone -b v3s-spi-experimental https://github.com/Lichee-Pi/u-boot.git
如果下载速度较慢的话,可以下载我上传的资源文件:https://download.csdn.net/download/qq_40860568/11655959
执行
make ARCH=arm menuconfig
进入uboot 菜单配置,然后进入到Device Drivers > SPI Flash Support
注意看一下自己flash的厂家名称,这里我选上Macronix SPI flash support
,用来支持我测试用的flash:MX25L12805和MX25L25635。
如果使用的是16M以上的Flash,需要勾选SPI flash Bank/Extended address register support
,否则只能读取到16M。
执行gedit include/configs/sun8i.h
在文件include/configs/sun8i.h中添加默认bootcmd和bootargs的环境变量设置,注意添加的位置在“#include
#define CONFIG_BOOTCOMMAND "sf probe 0; " \
"sf read 0x41800000 0x100000 0x10000; " \
"sf read 0x41000000 0x110000 0x400000; " \
"bootz 0x41000000 - 0x41800000"
#define CONFIG_BOOTARGS "console=ttyS0,115200 earlyprintk panic=5 rootwait " \
"mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) root=31:03 rw rootfstype=jffs2"
环境命令解析:
启动参数解析:
编译:time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log
https://download.csdn.net/download/qq_40860568/11656018
如果去github上下载的话,记得一定下载4.13。
执行make ARCH=arm menuconfig
打开内核菜单配置,进入到Device Drivers > Memory Technology Device (MTD) support
,确保选择上mtd的<*> Command line partition table parsing
支持,该项目用来解析uboot传递过来的flash分区信息,还有<*> SPI-NOR device support
。
然后添加对jffs2文件系统的支持,路径在
File systems > Miscellaneous filesystems-> Journalling Flash File System v2 (JFFS2) support
修改dts配置添加spi flash节点:
gedit arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts
添加spi节点配置:
&spi0 {
status ="okay";
mx25l12805d:mx25l12805d@0 {
compatible = "jedec,spi-nor";
reg = <0x0>;
spi-max-frequency = <50000000>;
#address-cells = <1>;
#size-cells = <1>;
};
};
如果是32M,就改为mx25l25635e。
退出菜单配置并编译内核和dts
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j32
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
选择rootfs文件系统,用最小根文件系统rootfs-brmin.tar.gz,大小只有3M左右,下载地址在:https://download.csdn.net/download/qq_40860568/11656090
Flash支持jffs2文件系统格式,所以需要使用此该rootfs制作jffs2文件系统镜像、
下载jffs2文件系统制作工具
sudo apt-get install mtd-utils
制作文件系统镜像:
mkdir rootfs
sudo tar xzvf rootfs-brmin.tar.gz -C rootfs
sudo mkfs.jffs2 -s 0x100 -e 0x10000 -p 0xAF0000 -d rootfs/ -o jffs2.img
#如果使用32M的flash mx25l25635,则需要做一些修改:
sudo mkfs.jffs2 -s 0x100 -e 0x10000 -p 0x1AF0000 -d rootfs/ -o jffs2.img
最后将uboot,dtb,kernel,rootfs打包成一个系统镜像,命令如下:
dd if=/dev/zero of=flashimg.bin bs=16M count=1
dd if=u-boot/u-boot-sunxi-with-spl.bin of=flashimg.bin bs=1K conv=notrunc
dd if=linux-zero-4.13.y/arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dtb of=flashimg.bin bs=1K seek=1024 conv=notrunc
dd if=linux-zero-4.13.y/arch/arm/boot/zImage of=flashimg.bin bs=1K seek=1088 conv=notrunc
dd if=jffs2.img of=flashimg.bin bs=1K seek=5184 conv=notrunc
第一步:生成一个空文件,大小是16MB
第二步:将uboot添加到文件开头
第三步:将dtb放到1M偏移处
第四步:将kernel放到1M+64K偏移处
第五步:将rootfs放到1M+64K+4M偏移处
偏移大小是seek,单位是KB。
执行完毕后生成镜像文件flashimg.bin
一键生成镜像文件参考:https://blog.csdn.net/qq_40860568/article/details/100153681
下载sunxiflash烧写工具,安装与下载参考:https://blog.csdn.net/qq_40860568/article/details/100519832
进入fel模式
Zero有一个usb下载模式称为fel模式,进入fel模式有下面几种方式:
TF卡和spi flash 同时没有可启动镜像
也就是说你不插SD卡,且焊接的是新的或者没有有效镜像的spi flash,那就上电自动进入fel下载模式
SD卡中有进入fel模式的特殊固件 fel-sdboot.sunxi
如果你的spiflash已经有了启动镜像,那么需要在TF卡中烧入一个sunxi提供的启动工具(dd if=fel-sdboot.sunxi of=/dev/mmcblk0 bs=1024 seek=8),那么插入该TF卡启动会进入fel模式;
上电时SPI_MISO拉低到GND
通常使用此方法最为方便。该引脚为boot引脚,上电时出于低电平即会进入fel下载模式。
sunxi-fel的操作
进入fel模式后使用usb数据线连接pc和zero,即可进行操作。
sudo sunxi-fel version #查看连接的cpu信息
AWUSBFEX soc=00001681(V3s) 00000001 ver=0001 44 08 scratchpad=00007e00 00000000 00000000
sudo sunxi-fel spiflash-info #显示flash信息
Manufacturer: Unknown (C2h), model: 20h, size: 33554432 bytes.
执行如下命令烧入我们前边制作好的镜像文件
sudo sunxi-fel -p spiflash-write 0 flashimg.bin
# -p 显示进度条
# spiflash-info Retrieves basic information
# spiflash-hex[dump] addr length Dumps SPI flash region in hex
# spiflash-read addr length file Write SPI flash contents into file
# spiflash-write addr file Store file contents into SPI flash
SPI flash下载速度约50KB/s,等待5分钟(16MB)或者10分钟(32MB),烧写完成,如果一切顺利,重新上电zero那么就会进入linux系统了,账号是root没有密码。