# 1. Uboot編譯配置
首先規劃flash分區,我測試用的flash大小為16M,型號為MX25L12873F,規劃如下:
~~~
[第一分區1MB存放spl和uboot] 0x000000000000-0x000000100000 : "uboot"
[第二分區64KB存放dtb文件] 0x000000100000-0x000000110000 : "dtb"
[第三分區4MB存放內核] 0x000000110000-0x000000510000 : "kernel"
[剩余空間存放根文件系統] 0x000000510000-0x000001000000 : "rootfs"
~~~
由于目前Uboot環境變量固定存放在1MB位置之內,所有留給uboot的空間固定到flash前1MB的位置不變。每個分區的大小必須是擦除塊大小的整數倍,MX25L12873F的擦除塊大小是64KB。
準備uboot
下載包含spi驅動的體驗版本uboot,該驅動目前尚未合并到主線
`git clone -b v3s-spi-experimental https://github.com/Lichee-Pi/u-boot.git`
執行`make ARCH=arm menuconfig`打開uboot菜單配置,進入到`Device Drivers > SPI Flash Support`
注意看一下自己flash的廠家名稱,例如選上Macronix SPI flash support用來支持我測試用的flash:MX25L12873F。
配置uboot默認環境變量,在文件`include/configs/sun8i.h`中添加默認bootcmd和bootargs的環境變量設置,注意添加的位置在“#include <configs/sunxi-common.h>”的前邊。

~~~
vi 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"
~~~
該環境變量通過在bootargs中增加mtdparts內核參數來告訴內核flash的分區設置信息,并通過root=31:03來告訴內核rootfs的位置。
sf read 0x41800000 0x100000 0x10000; //從flash0x100000(1MB)位置讀取dtb放到內存0x41800000偏移處。
sf read 0x41000000 0x110000 0x400000; //從flash0x110000(1MB+64KB)位置讀取dtb放到內存0x41000000偏移處。
bootz 0x41000000 (內核地址)- 0x41800000(dtb地址) 啟動內核
編譯uboot
`make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4`
# 2. linux內核編譯配置
linux內核基于github上的版本https://github.com/Lichee-Pi/linux.git
執行`make ARCH=arm menuconfig`打開內核菜單配置,進入到`Device Drivers > Memory Technology Device (MTD) support`,確保選擇上mtd的`<*> Command line partition table parsing`支持,該項目用來解析uboot傳遞過來的flash分區信息。

修改dts配置添加spi flash節點
` vi 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>;
};
};
~~~

添加對jffs2文件系統的支持,路徑在`File systems > Miscellaneous filesystems-> Journalling Flash File System v2 (JFFS2) support`

退出菜單配置并編譯內核和dts
~~~
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
~~~
# 3. 準備鏡像文件
首先選擇rootfs文件系統,我是用的是群朋提供的最小根文件系統rootfs-brmin.tar.gz,大小只有3M左右,下載地址在
~~~
https://pan.baidu.com/share/link?
shareid=1432204556&uk=3658413294#list/path=%2F
Lichee Zero>zero_imager.zip
~~~
Flash支持jffs2文件系統格式,所以需要使用此該rootfs制作jffs2文件系統鏡像、
下載jffs2文件系統制作工具
`apt-get install mtd-utils`
解壓 rootfs-brmin.tar.gz
`tar xzvf rootfs-brmin.tar.gz`
總空間是16M-1M-64K-4M=0xAF0000
`mkfs.jffs2 -s 0x100 -e 0x10000 -p 0xAF0000 -d rootfs/ -o jffs2.img`
頁大小0x100 256字節
塊大小0x10000 64k
jffs2分區總空間0xAF0000
jffs2.img是生成的文件系統鏡像。
最后將uboot,dtb,kernel,rootfs打包成一個系統鏡像,命令如下;
~~~
dd if=/dev/zero of=flashimg.bin bs=16M count=1
dd if=../ubootmainline/u-boot/u-boot-sunxi-with-spl.bin of=flashimg.bin bs=1K conv=notrunc
dd if=../zero41y/linux-zero-4.10.y/arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dtb of=flashimg.bin bs=1K seek=1024 conv=notrunc
dd if=../zero41y/linux-zero-4.10.y/arch/arm/boot/zImage of=flashimg.bin bs=1K seek=1088 conv=notrunc
dd if=../zero_imager/jffs2/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
# 4.燒寫鏡像
下載sunxiflash燒寫工具,
`git clone -b spi-rebase https://github.com/Icenowy/sunxi-tools.git`
注意是spi-rebase分支。
進入工具目錄執行make.
Zero有一個usb下載模式稱為fel模式。zero的啟動順序是先sd卡然后spiflash。如果sd卡啟動檢測失敗(沒有sd卡或者sd卡中沒有啟動ubootspl),然后spiflash也啟動檢測失敗(沒有spiflash或者spiflash中沒有啟動ubootspl),那么會自動進入fel模式。
所以當你的spiflash還沒有啟動鏡像的時候你拔掉sd上電會自動進入fel模式。
如果你的spiflash已經有了啟動鏡像,那么需要在sd卡中燒入一個sunxi提供的啟動工具(dd if=fel-sdboot.sunxi of=/dev/mmcblk0 bs=1024 seek=8),那么插入該sd卡啟動會進入fel模式;還有另一種方法,擦除spiflash內容上點也會進入fel模式。
進入fel模式后使用usb數據線連接pc和zero,進入sunxi-tool目錄
執行sudo ./sunxi-fel version會顯示硬件版本信息。
執行sudo ./sunxi-fel spiflash-info會顯示spi flash信息。
執行如下命令燒入我們前邊制作好的鏡像文件
`sudo ./sunxi-fel -p spiflash-write 0 ../bootimg/flashimg.bin`

等待大概5分鐘,燒寫完成,如果沒有意外重新上電zero那么就會進入linux系統了,賬號是root沒有密碼。

- 前言
- 荔枝派TODO任務領取
- linux使用小貼士
- 入門篇
- 板卡介紹
- 開箱指南
- 燒錄啟動系統
- 聯網方法
- 鏡像使用
- 鏡像說明
- buildroot系統使用
- debian系統使用
- 外設操作
- 外設操作概覽
- 低速外設
- GPIO
- GPIO模擬低速接口
- UART
- PWM
- I2C
- SPI
- 高速接口
- SDIO
- USB
- EtherNet
- DVP CSI
- MIPI CSI
- 模擬外設
- CODEC
- LRADC
- 常見設備驅動
- USB攝像頭
- USB 3G/4G 網卡
- 舵機
- 開發篇
- UBOOT適配
- UBOOT編譯
- UBOOT配置
- UBOOT配置屏幕分辨率
- UBOOT配置SPI啟動
- Linux內核開發
- Linux內核編譯
- BSP Linux內核編譯.md
- Linux內核選項
- 外設驅動與設備樹
- RTL8723BS驅動
- 根文件系統定制
- buildroot定制系統
- buildroot添加軟件包
- openwrt定制系統
- emdebian定制系統
- camdriod開發
- camdriod編譯
- 主線Uboot引導Camdriod
- 系統鏡像打包
- XBOOT適配
- 荔枝運行XBOOT
- 應用篇
- 游戲機-基于EmulationStation
- 游戲機-gnuboy
- 語音識別-科大訊飛云
- GUI-QT5
- 語音識別-離線關鍵詞識別
- 路由器-Lichee Zero
- 投稿文章
- 荔枝派Zero開箱指南
- Zero i2c oled使用指南
- zero SPI LCD使用指南
- Zero u-boot編譯和使用指南
- TF WiFi使用方法
- Zero Ethernet使用指南
- Zero 移植Qt5.4.1
- ZeroSpiNorFlash啟動系統制作指南
- Visio-uboot-sunxi流程
- lichee 編譯踩坑記錄(ilichee ZERO)
- lichee_zero_外設GPIO接口
- TF WIFI 小白編
- 從零開始LicheePi Zero的開發
- 認識Zero的硬件
- 搭建Zero的開發環境
- 主線Uboot
- 主線kernel
- BSP kernel
- BSP內核啟動
- bsp內核的攝像頭使用
- BSP內核中的保留內存
- uboot啟動BSP內核常見錯誤
- BSP內核 FBTFT移植
- BSP內核啟動錯誤及警告解決
- buildroot 根文件系統
- emdebian 根文件系統
- SPI Flash 系統編譯
- sunxi-fel增加對16M 以上flash的支持
- overlayfs的使用
- jffs2系統掛載不上的常見原因
- JFFS2 文件系統簡介
- uboot對spi flash的識別
- bsp內核的SPI flash啟動
- Docker開發環境
- Docker 命令速查
- 基礎ubuntu系統配置
- docker離線鏡像
- Zero系統燒錄
- dd鏡像燒錄
- 分區鏡像燒錄
- SPI Flash系統燒錄
- 一鍵鏡像燒錄
- Zero外設把玩
- I2C操作
- PWM輸出
- CODEC的使用
- 以太網使用指南
- GPIO操作
- 文件IO方式
- C語言接口(mmap)
- Python操作GPIO
- pinctrl-sunxi介紹
- UART操作
- 點屏
- 點屏之RGB屏
- 點屏之SPI屏 ili9341
- 點屏之SPI OLED
- 點屏之I2C OLED
- 點屏之SPI屏 ili9488
- 點屏之MCU屏
- 點屏之觸摸屏驅動
- 點屏之simple-framebuffer
- 點屏之屏幕時序
- 時鐘控制器CCM
- 攝像頭
- BSP DVP攝像頭
- BSP MIPI 攝像頭
- 主線DVP攝像頭
- 主線 MIPI攝像頭
- SPI 操作
- 應用層開發
- 開機自啟動
- Segment Fault調試
- Zero通過OTG共享PC網絡
- USB攝像頭使用
- 基于QT的GUI開發
- 移植tslib
- 移植QT5.9.1
- 移植QT4.8.7
- QtCreator使用
- Qt5.x移植到Qt4.8
- Qt字體相關
- Qt移植總結
- Qt裁剪
- Qt去除鼠標指針顯示
- zero_imager使用
- 驅動開發
- 設備樹簡介
- GPU/DRM 顯示驅動
- sys下設備樹查看
- atmel觸摸屏驅動分析
- atmel觸摸屏中斷改輪詢
- uboot下gpio操作
- helloworld驅動編譯演示
- FBTFT分析
- 內核模塊靜態加載的順序
- SPI驅動分析
- SPI 驅動編寫
- Uboot開發
- 開機logo
- 看門狗的使用
- 關于系統reboot
- 內核printk等級設置