一. 准備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