Lichee spi norflash启动
一. 准备sunxi-fel工具
1.1. 下载链接:https://github.com/Icenowy/sunxi-tools.git
1.1.1. git clone https://github.com/Icenowy/sunxi-tools.git
1.1.2. 查看分支并切换分支
2.2. 编译工具
a. sudo make
b. 编译如报上述错误,先安装sudo apt-get install libusb-1.0-0-dev
c. sudo sunxi-fel -l查看工具
二. uboot 配置
2.1. 开启spi驱动
如果使用的是16M以上的Flash,需要勾选SPI flash Bank/Extended address register support
,否则只能读取到16M
2.2. 修改include/configs/sun8i.h
#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"
环境命令解析:
sf probe 0; //初始化Flash设备
sf read 0x41800000 0x100000 0x10000; //从flash0x100000(1MB)位置读取dtb放到内存0x41800000偏移处。
sf read 0x41000000 0x110000 0x400000; //从flash0x110000(1MB+64KB)位置读取dtb放到内存0x41000000偏移处。
bootz 0x41000000 (内核地址)- 0x41800000(dtb地址) 启动内核
启动参数解析:
console=ttyS0,115200 earlyprintk panic=5 rootwait //在串口0上输出信息
mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) //spi32766.0时设备名,后面是分区大小、名字、读写属性。
root=31:03 rw rootfstype=jffs2 //通过root=31:03来告诉内核rootfs的位置mtdblock3;根文件系统格式为jffs2。
三. 内核配置
3.1. 执行make ARCH=arm menuconfig打开内核菜单配置,
进入到Device Drivers
<* > Memory Technology Device (MTD) support,确保选择上mtd的
<*> Command line partition table parsing支持,该项目用来解析uboot传递过来的flash分区信息,还有
<*> SPI-NOR device support
3.2. 添加spi节点配置:
四. 跟文件系统
4.1. Flash支持jffs2文件系统格式,所以需要使用此该rootfs制作jffs2文件系统镜像;
4.2. 下载jffs2文件系统制作工具
apt-get install mtd-utils
4.3. 制作文件系统镜像
mkdir rootfs sudo tar -xvf buildroot-2017.08/output/images/rootfs.tar -C rootfs/sudo mkfs.jffs2 -s 0x100 -e 0x10000 -p 0x1AF0000 -d rootfs/ -o jffs2.img #如果使用16M的flash mx25l128,则需要做一些修改: sudo mkfs.jffs2 -s 0x100 -e 0x10000 -p 0xAF0000 -d rootfs/ -o jffs2.img
- -p 指的是rootfs占据的总空间:16M-1M-64K-4M=0xAF0000 或者 32M-1M-64K-4M=0x1AF0000
- -s 页大小0x100 256字节
- -e 块大小0x10000 64k
- jffs2.img是生成的文件系统镜像。
五. 制作系统镜像
5.1. 最后将uboot,dtb,zImage,rootfs拷贝到一个文件
5.2. 编写制作镜像脚本
PS:我的flash是32M,按理上图中第一行中bs=16M应该为bs=32M,但我改为bs=32M时写到flash不成功,改为bs=16M时就可以,不知道为什么,但window版本的sunxi-fel.exe可以烧录32M,window版本使用参考末尾补充部分
第一步:生成一个空文件,大小是16MB
第二步:将uboot添加到文件开头
第三步:将dtb放到1M偏移处
第四步:将kernel放到1M+64K偏移处
第五步:将rootfs放到1M+64K+4M偏移处
偏移大小是seek,单位是KB。
5.3. 执行脚本完毕后生成镜像文件flashimg.bin
六. 烧录
6.1. Zero有一个usb下载模式称为fel模式,进入fel模式有下面几种方式:
6.1.1. TF卡和spi flash 同时没有可启动镜像,也就是说你不插SD卡,且焊接的是新的或者没有有效镜像的spi flash,那就上电自动进入fel下载模式
6.1.2. SD卡中有进入fel模式的特殊固件 fel-sdboot.sunxi
如果你的spiflash已经有了启动镜像,那么需要在TF卡中烧入一个sunxi提供的启动工具(dd if=fel-sdboot.sunxi of=/dev/sdb bs=1024 seek=8),那么插入该TF卡启动会进入fel模式;
6.1.3. 上电时SPI_CE接到GND
通常使用此方法最为方便。但切记,进入fel就要断开SPI_CE与GND的链接,不让不能读取norflash芯片
6.2. sunxi-fel的操作
6.2.1. 读取flash
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.
6.2.2. 执行如下命令烧入我们前边制作好的镜像文件
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
6.3. 最后上电重启即可
补充:
查看flash分区:
>cat /proc/mtd // 可以显示出所有挂载和未挂载的分区,但不显示文件系统类型。
>df -T // 只可以查看已经挂载的分区和文件系统类型。
>fdisk -l// 可以显示出所有挂载和未挂载的分区,但不显示文件系统类型。
>parted -l //可以查看未挂载的文件系统类型,以及哪些分区尚未格式化。
>lsblk -f //也可以查看未挂载的文件系统类型。
>df -h //只会列出已挂载的文件系统信息,对于没有挂载的文件系统是查看不到的,但不显示文件系统类型
windows 版sunxi-fel
1.1. 下载工具
下载链接:https://github.com/eperie/build-scripts/releases/download/v1.1/sunxi-fel.exe
1.2. 下载zadig工具来安装USB fel驱动
1.2.1. zadig工具链接:http://zadig.akeo.ie/
1.2.2. 安装usb fel驱动
a. Before launching it, make sure your Allwinner device is connected and in FEL mode
1.3. 使用sunxi-fel.exe
2.3.1. 进入win的命令窗口,使用方法和ubuntu版本一样
参考链接:https://blog.csdn.net/qq_40860568/article/details/100517132
参考链接:https://linux-sunxi.org/FEL/USBBoot