荔枝派Zero(V3s)SPI Flash 启动

参考: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”

1、U-Boot编译配置

1.1 准备uboot源码

下载包含spi驱动的体验版本uboot,该驱动目前尚未合并到主线

git clone -b v3s-spi-experimental https://github.com/Lichee-Pi/u-boot.git

如果下载速度较慢的话,可以下载我上传的资源文件:https://download.csdn.net/download/qq_40860568/11655959

1.2 配置

执行

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 ”的前边。
荔枝派Zero(V3s)SPI Flash 启动_第1张图片

#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。

编译:time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log

2 Linux内核编译配置

2.1 下载内核源码:

https://download.csdn.net/download/qq_40860568/11656018
如果去github上下载的话,记得一定下载4.13。

2.2 内核菜单配置

执行make ARCH=arm menuconfig打开内核菜单配置,进入到Device Drivers > Memory Technology Device (MTD) support,确保选择上mtd的<*> Command line partition table parsing支持,该项目用来解析uboot传递过来的flash分区信息,还有<*> SPI-NOR device support
荔枝派Zero(V3s)SPI Flash 启动_第2张图片

然后添加对jffs2文件系统的支持,路径在
File systems > Miscellaneous filesystems-> Journalling Flash File System v2 (JFFS2) support
荔枝派Zero(V3s)SPI Flash 启动_第3张图片
修改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

3 根文件系统

选择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
  • -p 指的是rootfs占据的总空间:16M-1M-64K-4M=0xAF0000 或者 32M-1M-64K-4M=0x1AF0000
  • -s 页大小0x100 256字节
  • -e 块大小0x10000 64k
  • jffs2.img是生成的文件系统镜像。

4 制作系统镜像

最后将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

5 烧写镜像

下载sunxiflash烧写工具,安装与下载参考:https://blog.csdn.net/qq_40860568/article/details/100519832

进入fel模式

Zero有一个usb下载模式称为fel模式,进入fel模式有下面几种方式:

  1. TF卡和spi flash 同时没有可启动镜像

    也就是说你不插SD卡,且焊接的是新的或者没有有效镜像的spi flash,那就上电自动进入fel下载模式

  2. SD卡中有进入fel模式的特殊固件 fel-sdboot.sunxi

    如果你的spiflash已经有了启动镜像,那么需要在TF卡中烧入一个sunxi提供的启动工具(dd if=fel-sdboot.sunxi of=/dev/mmcblk0 bs=1024 seek=8),那么插入该TF卡启动会进入fel模式;

  3. 上电时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没有密码。

你可能感兴趣的:(荔枝派,Linux)