最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

全志系列芯片之Tina Linux NOR Flash 開發(fā)指南

2022-12-26 16:39 作者:韋東山  | 我要投稿

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)如下圖所示:

image-20221216110030034

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 硬件平臺SPISerial Peripheral Interface,同步串行外設(shè)接口NOR FlashNOR Flash 是一種非易失閃存技術(shù),是Intel 在1988 年創(chuàng)建MTDMTD(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方案無此選項,默認非nor
0. default
1. nor
Choice [default]: 1

  1. 打包普通固件

#./build.sh clean
#./build.sh
#./build.sh pack

  1. 打包卡打印固件

#./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ù)的命令,不填默認用uboot 傳遞過來的readcmd
read_mode、write_mode:boot0 的工作線寬(1、2、4),不填默認更加readcmd 決
定線寬
flash_size:flash 的大小
delay_cycle:boot0 的采樣延時配置,大于60MHZ 配置為1,小于24MHZ 配置為2,
大于24MHZ 小于60HZ 配置為3
frequency:boot0 的SPI 工作頻率,不填使用默認值50M
erase_size:boot0 的擦除單位
lock_flag:鎖功能是否打開
sample_delay:boot0 的細調(diào)采樣的采樣延時,uboot、kernel 也會用到,默認不填等于
0xaaaaffff
sample_mode:boot0 的細調(diào)采樣的采樣模式,uboot、kernel 也會用到,默認不填等于
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

進入Device Drivers

Device Drivers ---->
[*]SPI Suppport ---->
[*]Sunxi flash support ---->

image-20221216110954138

進入SPI Support

Device Drivers ---->
[*]SPI Suppport ---->
[*]Sunxi SPI driver

image-20221216111017858

進入sunxi_flash_support

Device Drivers ---->
[*]Sunxi flash support ---->
[*]Support sunxi spinor devices

image-20221216111039312

2.3.4 KERNEL 配置

2.3.4.1 SPINOR-驅(qū)動配置

#cd kernel/liunx-4.9
#make ARCH=arm menuconfig

進入Device Drivers

Device Drivers ---->
<*>Memory Technology Device (MTD) support ---->
[*]SPI support ---->

image-20221216111201111

進入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 ---->

image-20221216111231797

進入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.....)

image-20221216111301751

2.3.4.2 cmdline 方式選擇

Boot opttions ---->

image-20221216111354759

進入Boot options

Boot opttions ---->
Kernel command line type ---->

image-20221216111427021

進入kernel command line type

Boot opttions ---->
Kernel command line type ---->
(X)Use bootloade kernel arguments if available

image-20221216111454068

2.3.4.3 文件系統(tǒng)配置

進入File systems

File system ---->
[*]Miscellaneous filesystems ---->

image-20221216111527624

? 進入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)(壓縮方式選擇如下)

image-20221216111604498

以上的壓縮方式(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-2018\drivers
├──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 源碼目錄

\longan\kernel\linux-4.9\drivers\
├── 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:可以省略,默認讀取整個分區(qū)文件

  1. sunxi_flash read [size] 讀取flash 中的分區(qū)文件到內(nèi)存中 例:使用sunxi_flash read 命令將boot 分區(qū)讀入到0x49000000 中,然后使用md 命令讀取 0x49000000 中的內(nèi)容。

image-20221216112650227

驗證方法:

  1. 0x49000000 讀入前與讀入后數(shù)據(jù)有沒有發(fā)生變化

  2. 在out/pack_out 目錄下找到對應(yīng)的分區(qū)文件,使用hexdump -Cv boot.fex -n 500 命 令輸出分區(qū)文件的數(shù)據(jù),對比一致即讀入成功。

image-20221216112713299
  1. sunxi_flash write [size] 將內(nèi)存中的數(shù)據(jù),寫入到分區(qū)中 例: 1)使用mm 命令修改內(nèi)存內(nèi)容

image-20221216112743939

2)使用sunxi_flash write 0x44000000 env 將內(nèi)存中的數(shù)據(jù)寫入env 分區(qū)

image-20221216112759532

3)重新將env 分區(qū)讀入內(nèi)存中,對比一致表示寫入成功



全志系列芯片之Tina Linux NOR Flash 開發(fā)指南的評論 (共 條)

分享到微博請遵守國家法律
墨竹工卡县| 都安| 黔江区| 新蔡县| 逊克县| 镇巴县| 铁岭县| 昌都县| 平陆县| 凤山县| 广南县| 陆川县| 乐至县| 翁源县| 措勤县| 榆中县| 辉南县| 西贡区| 桑植县| 双峰县| 大悟县| 马鞍山市| 钟祥市| 建始县| 邹平县| 连城县| 将乐县| 靖宇县| 淮北市| 稷山县| 乌拉特后旗| 通山县| 河北省| 临猗县| 南阳市| 五寨县| 凉山| 泰兴市| 万全县| 莲花县| 紫云|