支持百问网T113 D1-H D1s V853 V851s 等开发板 使用 Tina Linux NOR Flash文件系统 开发指南
此文章内容适用于 百问网T113 D1-H D1s V853 V851s 等开发板,开发板详情请访问 www.100ask.net 。
1 简介
- 编写目的
此文档描述Sunxi NOR 模块的使用方法,为相关人员调试提供指导
- 适用范围
- boot0: 适用于brandy-2.0
- u-boot: 适用于u-boot-2018
- kernel: 适用于linux-4.9/linux-5.4 内核
BSP 的开发人员、测试人员
2 模块介绍
2.1 模块功能介绍
Linux 中SPINOR 体系结构如下图所示:
SPI NOR Framework:这层主要是处理不同厂家的NOR 物理特色差异,初始化SPINOR的工作状态,如工作线宽(1 线、2 线、4 线、8 线)、有效地址位(16M 以上的NOR 需要使用4 地址模式),为上层MTD 提供读写擦接口。
对应代码目录:drivers/mtd/spi-nor/spi-nor.c
M25P80(generic SPI NOR controller driver):这层主要对SPI NOR Framework
层传下来的数据封装成msg,传递给SPI framework 层。
对应代码目录:drivers/mtd/devices/m25p80.c
SPI Framework:这层主要是将msg 加入ctl 的工作队列中,启动内核线程队列,处理队列
中的msg。
对应代码目录:drivers/spi/spi.c
SPI controller driver:这层初始化SPI 控制器频率、时钟模式、cs 有效电平、大小端等
配置,同时处理上层传下来的msg,通过CPU/DMA 方式传输数据到FIFO,再传输给外设
SPINOR。
对应代码目录:drivers/spi/spi-sunxi.c
2.2 相关术语介绍
术语 | 解释说明 |
---|---|
Sunxi | 指Allwinner 的一系列SOC 硬件平台 |
SPI | Serial Peripheral Interface,同步串行外设接口 |
NOR Flash | NOR Flash 是一种非易失闪存技术,是Intel 在1988 年创建 |
MTD | MTD(memory technology device 内存技术设备) 是用于访问memory 设备(ROM、flash)的Linux 的子系统 |
2.3 模块配置介绍
2.3.1 longan 的配置和打包
./build.sh config
All available platform:
0. android
1. linux
Choice [linux]: 1
... //配置根据需求选择
All available flash: //flash类型,只区分nor和非nor方案,Android方案无此选项,默认非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 启动阶段,部分参数是从boot0 头部获取的,而这些参数是我们在打包固件时,通过工具update_boot0 将sys_config.fex 中[spinor_para],更新到boot0 头部的,sys_config.fex 的[spinor_para] 配置参数如下:
[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 用于读取数据的命令,不填默认用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 的细调采样的采样延时,uboot、kernel 也会用到,默认不填等于
0xaaaaffff
sample_mode:boot0 的细调采样的采样模式,uboot、kernel 也会用到,默认不填等于
0xaaaaffff
spi_sclk、spi_cs、spi0_mosi、spi0_miso、spi0_wp 和spi0_hold 用于配置相应的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 ---->
进入SPI Support
Device Drivers ---->
[*]SPI Suppport ---->
[*]Sunxi SPI driver
进入sunxi_flash_support
Device Drivers ---->
[*]Sunxi flash support ---->
[*]Support sunxi spinor devices
2.3.4 KERNEL 配置
2.3.4.1 SPINOR-驱动配置
#cd kernel/liunx-4.9
#make ARCH=arm menuconfig
进入Device Drivers
Device Drivers ---->
<*>Memory Technology Device (MTD) support ---->
[*]SPI support ---->
进入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 ---->
进入Self-contained MTD device drivers(5.4 内核不需要选择此项)
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 ---->
进入Boot options
Boot opttions ---->
Kernel command line type ---->
进入kernel command line type
Boot opttions ---->
Kernel command line type ---->
(X)Use bootloade kernel arguments if available
2.3.4.3 文件系统配置
进入File systems
File system ---->
[*]Miscellaneous filesystems ---->
• 进入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)具体选择哪一种需要根据longan/build/mkcmd.sh 中如下代码使用的压缩方式而定,如下代码使用的是gzip 压缩方式,则内核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 ---具体代码的实现
├──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驱动代码
└──其他
├── spi --spi的接口代码
└── makefile ---编译文件
版
3 接口描述
3.1 驱动物理层接口
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,First 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,First 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 应用接口
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:内存地址,0x40000000 之后可以随便选取如:0x45000000,0x46000000 part_name:分区文件名,boot-resource、env、boot、rootfs size:可以省略,默认读取整个分区文件
- sunxi_flash read [size] 读取flash 中的分区文件到内存中 例:使用sunxi_flash read 命令将boot 分区读入到0x49000000 中,然后使用md 命令读取 0x49000000 中的内容。
验证方法:
- 0x49000000 读入前与读入后数据有没有发生变化
- 在out/pack_out 目录下找到对应的分区文件,使用hexdump -Cv boot.fex -n 500 命 令输出分区文件的数据,对比一致即读入成功。
- sunxi_flash write [size] 将内存中的数据,写入到分区中 例: 1)使用mm 命令修改内存内容
2)使用sunxi_flash write 0x44000000 env 将内存中的数据写入env 分区
3)重新将env 分区读入内存中,对比一致表示写入成功
相关文章
- 操作指南:如何修改Linux硬件时间(修改linux硬件时间)
- 安装实现基于Linux的嵌入式系统安装:U盘安装法(linux嵌入式u盘)
- 分析深入探究Linux字符设备驱动程序开发(linux字符设备驱动程序)
- 深入浅出:Linux下du命令的使用(linux的du命令详解)
- 命令行 Linux突破路由器极限,进入命令行(linux进入路由器)
- 系统升级使用Linux系统把PC机升级到最新版(pc机linux)
- 简单快速:在Linux系统下使用FTP工具(linux下ftp工具)
- 使用虚拟机Linux实现无线网络连接(虚拟机linux无线网卡)
- Linux系统下默认网关的设置(linux默认网关设置)
- 使用JD GUI在Linux中快速开发(jdguilinux)
- 项目Linux上编写前端项目:展示你的前瞻性(linux上开发前端)
- 关闭Linux系统的防火墙安全护卫(关闭linux的防火墙)
- Linux系统文件类型探究(linux文件的类型)
- Linux系统的分支:开放源码的多元化之路(linux的分支)
- Linux之父开发分支:基于源码编译系统建立(linux的分支)
- Linux之父兄弟连:分享开源大梦想(兄弟连linux书籍)
- 禁用Linux系统的防火墙保护(关闭linux的防火墙)
- Linux设备总线驱动:连接硬件与操作系统之桥(linux设备总线驱动)
- 25字中文文章标题: Linux如何使用sh脚本启动程序(linux启动sh脚本)
- Linux使用教程:轻松安装htop实现高效系统监控(linux安装htop)
- 如何使用 Linux 查看系统日志记录?(linux查看系统日志)
- 使用Linux串口模块进行简单通信(linux串口模块)
- 实现虚拟机上的Linux系统安装(虚拟机上装linux系统)
- 专业Linux讲师现身武汉,带你掌握系统开发技能!(linux讲师武汉)
- 如何使用Linux查询和安装软件包(linux查询安装包)
- 如何在 Linux 上使用汇编语言?(汇编语言linux)
- 使用Linux Tar压缩参数简化文件处理(linux tar 参数)
- Linux下使用USB转串口的方法(usb转串口linux)
- 操控Linux世界:无线遥控器带你上路(linux 遥控器)
- Linux TTY终端:乐在其中(linux tty终端)
- Linux挂载Samba:极大拓展文件存储空间(linux挂载samba)
- Linux内核代码,一探究竟!(linux内核代码怎么看)