日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

zero(全志V3S)-32MB Flash移植

發布時間:2023/12/8 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zero(全志V3S)-32MB Flash移植 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面
V3S 是塊好板子 開發潛力極大

本文提供32M移植 Flash為 GD25Q256 內核 Linux 5.2.0

Linux 5.2.0 編譯的鏡像大小為4.2MB 所以需要修改分區
修改好的分區如下

分區號分區大小分區地址
mtd01MB0x0000000-0x0100000 : “uboot”
mtd164KB0x0100000-0x0110000: “dtb”
mtd25MB0x0110000-0x0610000 : “kernel”
mtd3-10x0510000-0x2000000 : “rootfs”

編譯器

可參考設置路徑如下

export PATH=$PATH:/gcc_build/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/bin

Uboot部分

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的環境變量設置

#define CONFIG_BOOTCOMMAND "sf probe 0; sf read 0x41800000 0x100000 0x10000; sf read 0x41000000 0x110000 0x500000; bootz 0x41000000 - 0x41800000" #define CONFIG_BOOTARGS "console=ttyS0,115200 earlyprintk panic=5 rootwait mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,5M(kernel)ro,-(rootfs) root=31:03 rw rootfstype=jffs2"

文件 drivers/mtd/spi 的spi_flash_ids.c
添加 GD25Q256 的描述

#ifdef CONFIG_SPI_FLASH_GIGADEVICE /* GIGADEVICE */{"gd25q64b", INFO(0xc84017, 0x0, 64 * 1024, 128, SECT_4K) },{"gd25lq32", INFO(0xc86016, 0x0, 64 * 1024, 64, SECT_4K) },{"gd25q256", INFO(0xc84019, 0x0, 64 * 1024, 512, 0) }, #endif

編譯Uboot

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4

Kernel 部分

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
添加節點`

&spi0 {status ="okay";gd25q256:gd25q256@0 {compatible = "jedec,spi-nor";reg = <0x0>;spi-max-frequency = <50000000>;#address-cells = <1>;#size-cells = <1>;partitions {compatible = "fixed-partitions";#address-cells = <1>;#size-cells = <1>;partition@0 {label = "u-boot";reg = <0x000000 0x100000>;read-only;};partition@100000 {label = "dtb";reg = <0x100000 0x10000>;read-only;};partition@110000 {label = "kernel";reg = <0x110000 0x500000>;read-only;};partition@610000 {label = "rootfs";reg = <0x610000 0x19F0000>;};};};};

修改 drivers\mtd\devices\m25p80.c 文件
在 static const struct spi_device_id m25p_ids[] 的成員中添加 Flash描述
例如:

static const struct spi_device_id m25p_ids[] = {/** Allow non-DT platform devices to bind to the "spi-nor" modalias, and* hack around the fact that the SPI core does not provide uevent* matching for .of_match_table*/{"spi-nor"},......{"w25q80bl"}, {"w25q128"}, {"w25q256"},{"gd25q256"},

修改 drivers\mtd\spi-nor\spi-nor.c 文件 去除 SECT_4K
mkfs.jffs2 使用的最小擦除尺寸是8KB,而spi flash的扇區大小是4KB,所以按照扇區擦除的話,會無法使用,所以必須使用塊擦除 內核需要和文件系統的配置一致

{"gd25q256", INFO(0xc84019, 0, 64 * 1024, 512,SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB).quad_enable = macronix_quad_enable,},

以下函數需要添加特殊處理 打個補丁

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

git clone -b spi-rebase 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
是另一個分支
路徑如下

https://github.com/Icenowy/sunxi-tools/tree/v3s-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

sudo sunxi-tools/sunxi-fel -p spiflash-write 0 flashimg.bin


fel 模式描述: usb下載模式稱為fel模式,進入fel模式主要用下面2種情況:
1.TF卡和spi flash 同時沒有可啟動鏡像
2.上電時SPI_MISO拉低到GND
V3S Zero的板子 可以通過短接 +號按鍵上方的 SPI CS 和GND 實現進入fel 模式

//列出所有芯片的信息: sudo sunxi-fel -l//查看芯片信息: sudo sunxi-fel ver//加載并執行uboot的spl sudo sunxi-fel spl 文件名//顯示spiflash的信息 sudo sunxi-fel spiflash-info//調用指定地址的函數 sudo sunxi-fel exec 地址//把文件內容寫入內存指定地址(-p是顯示寫入進度) sudo sunxi-fel -p write 地址 文件名//讀取spiflash指定地址的數據并寫入到文件 sudo sunxi-fel spiflash-read 地址 長度 存放數據的文件路徑//寫入指定文件的指定長度的內容到spiflash的指定地址 sudo sunxi-fel spiflash-write 地址 長度 存放數據的文件路徑

總結

以上是生活随笔為你收集整理的zero(全志V3S)-32MB Flash移植的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。