0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

全志Tina Linux NOR Flash系统开发指南 最详细版本 支持所有全志芯片

嵌入式Linux那些事 来源:嵌入式Linux那些事 作者:嵌入式Linux那些事 2022-12-26 16:47 次阅读

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 体系结构如下图所示:

image-20221216110030034

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
  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 启动阶段,部分参数是从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 ---->

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-驱动配置
#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 内核不需要选择此项)

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 文件系统配置

进入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)具体选择哪一种需要根据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-2018drivers
├──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 源码目录

longankernellinux-4.9drivers├── 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:可以省略,默认读取整个分区文件

  1. sunxi_flash read [size] 读取flash 中的分区文件到内存中
    例:使用sunxi_flash read 命令将boot 分区读入到0x49000000 中,然后使用md 命令读取
    0x49000000 中的内容。

image-20221216112650227

验证方法:

  1. 0x49000000 读入前与读入后数据有没有发生变化
  2. 在out/pack_out 目录下找到对应的分区文件,使用hexdump -Cv boot.fex -n 500 命
    令输出分区文件的数据,对比一致即读入成功。

image-20221216112713299

  1. sunxi_flash write [size] 将内存中的数据,写入到分区中
    例:
    1)使用mm 命令修改内存内容

image-20221216112743939

2)使用sunxi_flash write 0x44000000 env 将内存中的数据写入env 分区

image-20221216112759532

3)重新将env 分区读入内存中,对比一致表示写入成功

image-20221216112809980  

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11292

    浏览量

    209328
  • MPU
    MPU
    +关注

    关注

    0

    文章

    357

    浏览量

    48775
  • Tina
    +关注

    关注

    2

    文章

    45

    浏览量

    16976
  • 全志芯片
    +关注

    关注

    2

    文章

    5

    浏览量

    2802
收藏 人收藏

    评论

    相关推荐

    8月芯片开源项目分享合集

    Linux内核驱动的源码。 linux-card 作者:syske 作者本人的第一块F1C200S的实验板,踩了很多坑,更新了六个版本
    发表于 09-02 10:25

    &OpenHarmony】三款支持OpenHarmony开发板在开放原子开源基金会OpenHarmony见面会实况分享

    成果,见面会在B站等多个平台进行了全程直播,累计观看人数超2W人。其中志在会上分享了3款支持OpenHarmony的芯片/开发板,分别是XR806、T507和D1。第一款是
    发表于 11-15 16:16

    &OpenHarmony】三款支持OpenHarmony开发板在开放原子开源基金会OpenHarmony见面会实况分享

    分享了3款支持OpenHarmony的芯片/开发板,分别是XR806、T507和D1。第一款是的D1
    发表于 11-15 16:48

    轻量系统开发套件介绍: XR806 开发套件

    XR806 开发套件是科技旗下子公司广州芯之联研发设计的一款支持WiFi和BLE的高集
    发表于 04-21 13:51

    全新Tina Linux v5.0释放!带来全新AIoT产品开发体验

    Tina Linux基于linux内核深度定制开发的AIoT
    发表于 07-12 18:25

    【免费试用04期】V853开发板试用活动

    】编译 Tina Linux部分之openWrt 编译【V853开发板试用】编译 Tina
    发表于 07-21 10:27

    V853开发板试用】开箱及初识之美

    , 同时支持供电和数据传输PMU:AXP2101板身大小:长 118mm宽 75mmPCB板层:4层板系统配置官方支持
    发表于 08-21 23:47

    Ubuntu官方发布适配D1-H哪吒开发板的镜像

    ,融入OS”为核心,建立起了丰富的Linux开发生态,目前开发板已经成功适配了自研Tina
    发表于 08-23 09:24

    V853开发板试用】V853开发板试用测评报告

    ,很好满足不同任务的场景。3.软件资源V853系统配置Tina Linux 5.0系统,基于
    发表于 08-29 02:09

    【开源硬件】芯片系列优秀开源工程分享

    。 YuzukiRuler Pro采用 D1-H为主控,最大支持2GB内存,256GB储存的全面屏Linux小尺子,RISCV64 指令集,板载UART和OTG,还将屏幕升级为一个
    发表于 09-14 09:49

    Tina_Linux_系统软件开发指南

    Tina_Linux_系统软件开发指南
    的头像 发表于 03-02 15:25 1822次阅读
    <b class='flag-5'>Tina_Linux</b>_<b class='flag-5'>系统软件开发指南</b>

    Tina Linux配置开发指南

    Tina Linux配置开发指南
    的头像 发表于 03-02 15:28 1.6w次阅读
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b>配置<b class='flag-5'>开发指南</b>

    Linux NOR开发指南

    Linux NOR开发指南
    的头像 发表于 03-06 09:55 958次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>NOR</b><b class='flag-5'>开发指南</b>

    h616和h6的区别

    h616和h6的区别 h616和
    的头像 发表于 08-16 11:01 9810次阅读

    AW_R329_Tina_Linux_开发入门_v0.5

    AW_R329_Tina_Linux_开发入门_v0.5
    发表于 10-19 15:11 3次下载