1 簡介
- 編寫目的
此文檔描述Sunxi NOR 模塊的使用方法,為相關(guān)人員調(diào)試提供指導(dǎo)
- 適用范圍
- boot0: 適用于brandy-2.0
- u-boot: 適用于u-boot-2018
- kernel: 適用于linux-4.9/linux-5.4 內(nèi)核
BSP 的開發(fā)人員、測試人員
2 模塊介紹
2.1 模塊功能介紹
Linux 中SPINOR 體系結(jié)構(gòu)如下圖所示:
SPI NOR Framework:這層主要是處理不同廠家的NOR 物理特色差異,初始化SPINOR的工作狀態(tài),如工作線寬(1 線、2 線、4 線、8 線)、有效地址位(16M 以上的NOR 需要使用4 地址模式),為上層MTD 提供讀寫擦接口。
對應(yīng)代碼目錄:drivers/mtd/spi-nor/spi-nor.c
M25P80(generic SPI NOR controller driver):這層主要對SPI NOR Framework
層傳下來的數(shù)據(jù)封裝成msg,傳遞給SPI framework 層。
對應(yīng)代碼目錄:drivers/mtd/devices/m25p80.c
SPI Framework:這層主要是將msg 加入ctl 的工作隊列中,啟動內(nèi)核線程隊列,處理隊列
中的msg。
對應(yīng)代碼目錄:drivers/spi/spi.c
SPI controller driver:這層初始化SPI 控制器頻率、時鐘模式、cs 有效電平、大小端等
配置,同時處理上層傳下來的msg,通過CPU/DMA 方式傳輸數(shù)據(jù)到FIFO,再傳輸給外設(shè)
SPINOR。
對應(yīng)代碼目錄:drivers/spi/spi-sunxi.c
2.2 相關(guān)術(shù)語介紹
術(shù)語 | 解釋說明 |
---|---|
Sunxi | 指Allwinner 的一系列SOC 硬件平臺 |
SPI | Serial Peripheral Interface,同步串行外設(shè)接口 |
NOR Flash | NOR Flash 是一種非易失閃存技術(shù),是Intel 在1988 年創(chuàng)建 |
MTD | MTD(memory technology device 內(nèi)存技術(shù)設(shè)備) 是用于訪問memory 設(shè)備(ROM、flash)的Linux 的子系統(tǒng) |
2.3 模塊配置介紹
2.3.1 longan 的配置和打包
./build.sh config
All available platform:
0. android
1. linux
Choice [linux]: 1
... //配置根據(jù)需求選擇
All available flash: //flash類型,只區(qū)分nor和非nor方案,Android方案無此選項,默認(rèn)非nor
0. default
1. nor
Choice [default]: 1
- 打包普通固件
#./build.sh clean
#./build.sh
#./build.sh pack
- 打包卡打印固件
#./build.sh clean
#./build.sh
#./build.sh pack_debug
在配置的過程中會把平臺目錄下的BoardConfig.mk 的信息拷貝到.buildconfig 中。
2.3.2 sys_config 配置
SPINOR 的boot0 啟動階段,部分參數(shù)是從boot0 頭部獲取的,而這些參數(shù)是我們在打包固件時,通過工具update_boot0 將sys_config.fex 中[spinor_para],更新到boot0 頭部的,sys_config.fex 的[spinor_para] 配置參數(shù)如下:
[spinor_para]
;readcmd =0x6b
;read_mode =4
;write_mode =4
;flash_size =16
;delay_cycle =1
;frequency =100000000
;erase_size =64
;lock_flag =0
;sample_delay =0
;sample_mode =2
spi_sclk = port:PC00<4><0><2><default>
spi_cs = port:PC01<4><1><2><default>
spi0_mosi = port:PC02<4><0><2><default>
spi0_miso = port:PC03<4><0><2><default>
spi0_wp = port:PC04<4><0><2><default>
spi0_hold = port:PC05<4><0><2><default>
其中:
readcmd:boot0 用于讀取數(shù)據(jù)的命令,不填默認(rèn)用uboot 傳遞過來的readcmd
read_mode、write_mode:boot0 的工作線寬(1、2、4),不填默認(rèn)更加readcmd 決
定線寬
flash_size:flash 的大小
delay_cycle:boot0 的采樣延時配置,大于60MHZ 配置為1,小于24MHZ 配置為2,
大于24MHZ 小于60HZ 配置為3
frequency:boot0 的SPI 工作頻率,不填使用默認(rèn)值50M
erase_size:boot0 的擦除單位
lock_flag:鎖功能是否打開
sample_delay:boot0 的細(xì)調(diào)采樣的采樣延時,uboot、kernel 也會用到,默認(rèn)不填等于
0xaaaaffff
sample_mode:boot0 的細(xì)調(diào)采樣的采樣模式,uboot、kernel 也會用到,默認(rèn)不填等于
0xaaaaffff
spi_sclk、spi_cs、spi0_mosi、spi0_miso、spi0_wp 和spi0_hold 用于配置相應(yīng)的GPIO。
2.3.3 UBOOT 配置
2.3.3.1 編譯和配置
#make clean
#make sun8iw19p1_nor_config ----啟動的uboot (#make sun8iw19p1_config----燒寫uboot)
#make -j32
2.3.3.2 Menuconfig 配置
#cd brandy/brandy-2.0/u-boot-2018
#make menuconfig
進(jìn)入Device Drivers
Device Drivers ---->
[*]SPI Suppport ---->
[*]Sunxi flash support ---->
進(jìn)入SPI Support
Device Drivers ---->
[*]SPI Suppport ---->
[*]Sunxi SPI driver
進(jìn)入sunxi_flash_support
Device Drivers ---->
[*]Sunxi flash support ---->
[*]Support sunxi spinor devices
2.3.4 KERNEL 配置
2.3.4.1 SPINOR-驅(qū)動配置
#cd kernel/liunx-4.9
#make ARCH=arm menuconfig
進(jìn)入Device Drivers
Device Drivers ---->
<*>Memory Technology Device (MTD) support ---->
[*]SPI support ---->
進(jìn)入Menory Technology Device(MTD) support
Device Drivers ---->
<*>Memory Technology Device (MTD) support ---->
<*>SUNXI partitioning support
<*>Direct char device access to MTD devices
<*>Caching block device access to MTD devices
Self-contained MTD device drivers ---->
SPI-NOR device support ---->
進(jìn)入Self-contained MTD device drivers(5.4 內(nèi)核不需要選擇此項)
Device Drivers ---->
<*>Memory Technology Device (MTD) support ---->
Self-contained MTD device drivers ---->
<*>Support most SPI Flash chips (AT16DF, M25P.....)
2.3.4.2 cmdline 方式選擇
Boot opttions ---->
進(jìn)入Boot options
Boot opttions ---->
Kernel command line type ---->
進(jìn)入kernel command line type
Boot opttions ---->
Kernel command line type ---->
(X)Use bootloade kernel arguments if available
2.3.4.3 文件系統(tǒng)配置
進(jìn)入File systems
File system ---->
[*]Miscellaneous filesystems ---->
? 進(jìn)入Miscellaneous filesystems
? Incluede support for ZLIB compressed file systems (NEW)
? Incluede support for LZ4 compressed file systems (NEW)
? Incluede support for LZO compressed file systems (NEW)
? Incluede support for XZ compressed file systems (NEW)
File system ---->
[*]Miscellaneous filesystems ---->
[*]Incluede support for XZ compressed file systems (NEW)(壓縮方式選擇如下)
以上的壓縮方式(ZLIB/LZ4/LZO/XZ)具體選擇哪一種需要根據(jù)longan/build/mkcmd.sh 中如下代碼使用的壓縮方式而定,如下代碼使用的是gzip 壓縮方式,則內(nèi)核File systems 中配置需選擇LZO 壓縮方式,若使用的是xz, 則需選擇XZ 壓縮方式。
${ROOTFS} ${LICHEE_PLAT_OUT}/rootfs.squashfs -root-owned -no-progress -comp gzip -noappend
2.4 源碼目錄介紹
2.4.1 UBOOT 源碼目錄
\\u-boot-2018drivers
├──sunxi_flash ---sunxi_flash的初始化/退出/讀/寫/擦除等flash接口
├─mmc ---mmc接口代碼
├─nand ---nand接口代碼
├─spinor ---spi nor接口代碼
├─sunxi_flash.c ---sunxi_flash操作接口
└──其他
├── spi --sunxi_spi的接口代碼
├─sunxi_spi.c ---具體代碼的實現(xiàn)
├──mtd
├─spi
├─sf_probe.c ---nand接口代碼
├─spinor ---spi nor接口代碼
├─sunxi_flash.c ---sunxi_flash
2.4.2 KERNEL 源碼目錄
longankernellinux-4.9drivers├── mtd
├─spi-nor
├─spi-nor.c ---spi nor驅(qū)動代碼
└──其他
├── spi --spi的接口代碼
└── makefile ---編譯文件
版
3 接口描述
3.1 驅(qū)動物理層接口
3.1.1 spi_nor_erase
static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr)
description:mtd erase interface
@mtd: MTD device structure
@instr: erase operation descrition structure
return:success return 0,fail return fail code**
3.1.2 spi_nor_read
static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len,
size_t *retlen, u_char *buf)
description:mtd read interface
@mtd:MTD device structure
@from: offset to read from MTD device
@len: data len
@retlen: had read data len
@buf: data buffer
return:success return max_bitflips,fail return fail code**
3.1.3 spi_nor_write
static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len,
size_t *retlen, const u_char *buf)
description:mtd write data interface
@to: offset to MTD device
@len: want write data len
@retlen:return the writen len
@buf: data buffer
return: success return 0, fail return code fail
3.1.4 spi_nor_lock
static int spi_nor_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
description:check block is badblock or not
@mtd:MTD device structure
@ofs: offset the mtd device start (align to simu block size)
@len:The length of the operating
return: success return 0, fail return code fail
3.1.5 spi_nor_unlock
static int spi_nor_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
description:check block is badblock or not
@mtd:MTD device structure
@ofs: offset the mtd device start (align to simu block size)
@len:The length of the operating
return: success return 0, fail return code fail
3.1.6 spi_nor_is_locked
static int spi_nor_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
description:check block is badblock or not
@mtd:MTD device structure
@ofs: offset the mtd device start (align to simu block size)
@len:The length of the operating
return: Is lock return 1, else return 0
3.1.7 spi_nor_has_lock_erase
static int spi_nor_has_lock_erase(struct mtd_info *mtd, struct erase_info *instr)
description:mtd has lock erase interface,F(xiàn)irst unlock to operate space, after the
completion of the flash lock up
@mtd: MTD device structure
@instr: erase operation descrition structure
return:success return 0,fail return fail code
3.1.8 spi_nor_has_lock_write
static int spi_nor_has_lock_write(struct mtd_info *mtd, loff_t to, size_t len,
size_t *retlen, const u_char *buf)
description:mtd has lock write data interface,F(xiàn)irst unlock to operate space, after
the completion of the flash lock up
@to: offset to MTD device
@len: want write data len
@retlen:return the writen len
@buf: data buffer
return: success return 0, fail return code fail
3.2 Uboot 應(yīng)用接口
3.2.1 sunxi_flash_spinor_probe
static int sunxi_flash_spinor_probe(void)
description:SPINOR initialization,Set the storage type。
return:zero on success, else a negative error code.
3.2.2 sunxi_flash_spinor_init
static int sunxi_flash_spinor_init(int boot_mode, int res)
description:SPINOR initialization。
@boot_mode:Working mode
@res:The default is 0
return:zero on success, else a negative error code.
3.2.3 sunxi_flash_spinor_exit
int sunxi_flash_spinor_exit(void)
description:Release registration is a resource for applications.
return:zero on success, else a negative error code.
3.2.4 sunxi_flash_spinor_write
static int sunxi_flash_spinor_write(uint start_block, uint nblock, void *buffer)
description:mtd write data interface.
@start_block:want write start sector
@nblock:want write sectorcount
@buffer:data buffer
return:zero on success, else a negative error code.
3.2.5 sunxi_flash_spinor_write
static int sunxi_flash_spinor_write(uint start_block, uint nblock, void *buffer)
description:mtd readdata interface.
@start_block:want read start sector
@nblock:want read sector count
@buffer:data buffer
return:zero on success, else a negative error code.
3.2.6 sunxi_flash_spinor_erase
static int sunxi_flash_spinor_erase(int erase, void *mbr_buffer)
description:erase boot || partition data.
@erase:erase flag
@buffer:The default is NULL
return:zero on success, else a negative error code.
3.2.7 sunxi_flash_spinor_force_erase
int sunxi_flash_spinor_force_erase(void)
description:erase boot & partition data.
return:zero on success, else a negative error code.
3.2.8 sunxi_flash_spinor_flush
int sunxi_flash_spinor_flush(void)
description:Flush physical cache data to flash.
return:zero on success, else a negative error code.
3.2.9 sunxi_flash_spinor_download_spl
static int sunxi_flash_spinor_download_spl(unsigned char *buf, int len, unsigned int ext)
description:write boot0.
@buf:boot0 data buffer
@len:boot0 data len
@ext:storage type
return:zero on success, else a negative error code.
3.2.10 sunxi_flash_spinor_download_toc
static int sunxi_flash_spinor_download_toc(unsigned char *buf, int len, unsigned int ext)
description:write uboot.
@buf:uboot data buffer
@len:uboot data len
@ext:storage type
return:zero on success, else a negative error code.
4 使用例子
4.1 uboot shell 使用
4.1.1 sunxi_flash
mem_addr:內(nèi)存地址,0x40000000 之后可以隨便選取如:0x45000000,0x46000000
part_name:分區(qū)文件名,boot-resource、env、boot、rootfs
size:可以省略,默認(rèn)讀取整個分區(qū)文件
- sunxi_flash read [size] 讀取flash 中的分區(qū)文件到內(nèi)存中
例:使用sunxi_flash read 命令將boot 分區(qū)讀入到0x49000000 中,然后使用md 命令讀取
0x49000000 中的內(nèi)容。
驗證方法:
- 0x49000000 讀入前與讀入后數(shù)據(jù)有沒有發(fā)生變化
- 在out/pack_out 目錄下找到對應(yīng)的分區(qū)文件,使用hexdump -Cv boot.fex -n 500 命
令輸出分區(qū)文件的數(shù)據(jù),對比一致即讀入成功。
- sunxi_flash write [size] 將內(nèi)存中的數(shù)據(jù),寫入到分區(qū)中
例:
1)使用mm 命令修改內(nèi)存內(nèi)容
2)使用sunxi_flash write 0x44000000 env 將內(nèi)存中的數(shù)據(jù)寫入env 分區(qū)
3)重新將env 分區(qū)讀入內(nèi)存中,對比一致表示寫入成功
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209536 -
MPU
+關(guān)注
關(guān)注
0文章
359瀏覽量
48804 -
Tina
+關(guān)注
關(guān)注
2文章
45瀏覽量
16986 -
全志芯片
+關(guān)注
關(guān)注
2文章
5瀏覽量
2809
發(fā)布評論請先 登錄
相關(guān)推薦
評論