zero(全志V3S)-32MB Flash移植
寫在前面
V3S 是塊好板子 開發潛力極大
本文提供32M移植 Flash為 GD25Q256 內核 Linux 5.2.0
Linux 5.2.0 編譯的鏡像大小為4.2MB 所以需要修改分區
修改好的分區如下
| mtd0 | 1MB | 0x0000000-0x0100000 : “uboot” |
| mtd1 | 64KB | 0x0100000-0x0110000: “dtb” |
| mtd2 | 5MB | 0x0110000-0x0610000 : “kernel” |
| mtd3 | -1 | 0x0510000-0x2000000 : “rootfs” |
編譯器
可參考設置路徑如下
export PATH=$PATH:/gcc_build/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/binUboot部分
https://github.com/Lichee-Pi/u-boot.git
git clone -b v3s-spi-experimental https://github.com/Lichee-Pi/u-boot.git下載好之后,進入主目錄
第一步make LicheePi_Zero_defconfig
第二步make ARCH=arm menuconfig
選上SPI flash Bank/Extended address register support支持 否則只能讀取到16M
修改Flash驅動項
下面開始修改代碼段
文件 include/configs/sun8i.h
添加默認bootcmd和bootargs的環境變量設置
文件 drivers/mtd/spi 的spi_flash_ids.c
添加 GD25Q256 的描述
編譯Uboot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4Kernel 部分
https://github.com/Lichee-Pi/linux/tree/zero-5.2.y
Github 下載可能有時候比較慢 可以多嘗試一下或者找代理
下載好之后
進入主目錄
執行 make ARCH=arm licheepi_zero_defconfig
執行 make ARCH=arm menuconfig
內核添加JFFS2支持 如下即可
進入 Device Drivers > Memory Technology Device (MTD) support
選中 Command line partition table parsing
用于解析Uboot參數
SPI-FLASH部分
5.2的版本默認配置 支持 m25p80的驅動 這部分就不需要修改了
修改設備樹描述文件
路徑 arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts
添加節點`
修改 drivers\mtd\devices\m25p80.c 文件
在 static const struct spi_device_id m25p_ids[] 的成員中添加 Flash描述
例如:
修改 drivers\mtd\spi-nor\spi-nor.c 文件 去除 SECT_4K
mkfs.jffs2 使用的最小擦除尺寸是8KB,而spi flash的扇區大小是4KB,所以按照扇區擦除的話,會無法使用,所以必須使用塊擦除 內核需要和文件系統的配置一致
以下函數需要添加特殊處理 打個補丁
int spi_nor_scan(struct spi_nor *nor, const char *name,const struct spi_nor_hwcaps *hwcaps) {........if (info->flags & SPI_NOR_4B_OPCODES ||(JEDEC_MFR(info) == SNOR_MFR_SPANSION && mtd->size > SZ_16M))nor->flags |= SNOR_F_4B_OPCODES;// 添加以下代碼段if (info->flags & SPI_NOR_4B_OPCODES ||(JEDEC_MFR(nor->info) == SNOR_MFR_GIGADEVICE && mtd->size > SZ_16M)){nor->mtd.erasesize = nor->info->sector_size;}if (nor->addr_width == 4 && nor->flags & SNOR_F_4B_OPCODES &&!(nor->flags & SNOR_F_HAS_4BAIT))spi_nor_set_4byte_opcodes(nor); .......編譯內核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
文件 路徑 linux-zero-5.2.y/arch/arm/boot
dtb 文件需要使用 sun8i-v3s-licheepi-zero-dock.dtb
文件系統制作
使用JFFS2去制作文件系統
可以使用Busybox 等工具 制作出一個文件系統 這邊就不展開了
使用mkfs.jffs2 打包成文件系統鏡像
若沒有 mkfs.jffs2 可以執行
sudo apt-get install mtd-utils我使用的打包命令
mkfs.jffs2 -n -l -s 0x100 -e 0x10000 --pad=0x19F0000 -r ./system/ -o ./system.jffs2-p 指的是rootfs占據的總空間: 32M-1M-64K-4M=0x1AF0000
-s 頁大小0x100 256字節
-e 塊大小0x10000 64k
jffs2.img是生成的文件系統鏡像。
燒錄
燒錄工具
https://github.com/Icenowy/sunxi-tools.git
工具 修改針對 32M Falsh的支持
需要檢查下代碼
原文:
#define CMD_WRITE_ENABLE 0x06 #define SPI_FLASH_16MB_BOUN 0x1000000 # define CMD_BANKADDR_BRWR 0x17 //only SPANSION flash use it # define CMD_BANKADDR_BRRD 0x16 # define CMD_EXTNADDR_WREAR 0xC5 # define CMD_EXTNADDR_RDEAR 0xC8 size_t bank_curr = 0;void aw_fel_spiflash_write_helper(feldev_handle *dev,uint32_t offset, void *buf, size_t len,size_t erase_size, uint8_t erase_cmd,size_t program_size, uint8_t program_cmd) {uint8_t *buf8 = (uint8_t *)buf;size_t max_chunk_size = dev->soc_info->scratch_addr - dev->soc_info->spl_addr;size_t cmd_idx, bank_sel;if (max_chunk_size > 0x1000)max_chunk_size = 0x1000;uint8_t *cmdbuf = malloc(max_chunk_size);cmd_idx = 0;prepare_spi_batch_data_transfer(dev, dev->soc_info->spl_addr);//add bank support{cmd_idx = 0;bank_sel = offset /SPI_FLASH_16MB_BOUN;if (bank_sel == bank_curr)goto bar_end;/* Emit write enable command */cmdbuf[cmd_idx++] = 0;cmdbuf[cmd_idx++] = 1;cmdbuf[cmd_idx++] = CMD_WRITE_ENABLE;/* Emit write bank */cmdbuf[cmd_idx++] = 0;cmdbuf[cmd_idx++] = 2;cmdbuf[cmd_idx++] = CMD_EXTNADDR_WREAR;cmdbuf[cmd_idx++] = offset >> 24;/* Emit wait for completion */cmdbuf[cmd_idx++] = 0xFF;cmdbuf[cmd_idx++] = 0xFF;/* Emit the end marker */cmdbuf[cmd_idx++] = 0;cmdbuf[cmd_idx++] = 0;aw_fel_write(dev, cmdbuf, dev->soc_info->spl_addr, cmd_idx);aw_fel_remotefunc_execute(dev, NULL);bar_end:bank_curr = bank_sel;}cmd_idx = 0;這里附帶另一下載工具
sunxi-tools-3s-spi
是另一個分支
路徑如下
USB燒錄需要使用 打包 后進行下載
可以使用如下腳本
dd if=/dev/zero of=flashimg.bin bs=32M count=1 dd if=u-boot/u-boot-sunxi-with-spl.bin of=flashimg.bin bs=1K conv=notrunc dd if=dts/sun8i-v3s-licheepi-zero-dock.dtb of=flashimg.bin bs=1K seek=1024 conv=notrunc dd if=kernel/zImage of=flashimg.bin bs=1K seek=1088 conv=notrunc dd if=rootfs/system.jffs2 of=flashimg.bin bs=1K seek=6208 conv=notrunc第一步:生成一個空文件,大小是32MB
第二步:將uboot添加到文件開頭
第三步:將dtb放到1M偏移處
第四步:將kernel放到1M+64K偏移處
第五步:將rootfs放到1M+64K+5M偏移處
偏移大小是seek,單位是KB。
執行完畢后生成鏡像文件flashimg.bin
附
fel 模式描述: usb下載模式稱為fel模式,進入fel模式主要用下面2種情況:
1.TF卡和spi flash 同時沒有可啟動鏡像
2.上電時SPI_MISO拉低到GND
V3S Zero的板子 可以通過短接 +號按鍵上方的 SPI CS 和GND 實現進入fel 模式
總結
以上是生活随笔為你收集整理的zero(全志V3S)-32MB Flash移植的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日志分析---携来百侣曾游,忆往昔峥嵘岁
- 下一篇: 忆往昔