Linux NOR 开发指南
Linux NOR 开发指南
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. android1. linux
Choice [linux]: 1
... //配置根据需求选择
All available flash: //flash类型,只区分nor和非nor方案,Android方案无此选项,默认非nor0. default1. 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 NOR 开发指南
Linux NOR 开发指南 1 简介 编写目的 此文档描述Sunxi NOR 模块的使用方法,为相关人员调试提供指导 适用范围 boot0: 适用于brandy-2.0u-boot: 适用于u-boot-2018kernel: 适用于linux-4.9/linux-5.4 内核 BSP 的开发人员、测试人员 2 模块介绍 2.1 模块功能…...
免费领取丨精算与金融建模行业解决方案白皮书,不要错过!
一、我国精算行业现状 精算学是对人类社会所面临的各种风险及其他客观事务进行量化分析和处理的一门科学。在保险、金融、投资和各类风险管理等许多领域得到广泛应用,尤其在保险和社会保障领域,已成为不可或缺的科学和技术,以保险公司为例&a…...
ideal创建maven项目
前置工作本机安装mavenIdea 设置使用本机maven 工具Settings--->Maven开始创建maven项目创建maven项目,勾选通过模板创建,选择 maven-archetype-webapp 模板GroupId: 公司名倒序ArtifactId: 项目名设置本地maven仓库配置项目文件显示名,和…...
ChatGPT是什么?为何会引爆国内算力需求?
过去十年中,通过“深度学习大算力”从而获得训练模型是实现人工智能的主流技术途径。由于深度学习、数据和算力这三个要素都已具备,全世界掀起了“大炼模型”的热潮,也催生了大批人工智能企业。大模型是人工智能的发展趋势和未来大模型&#…...
【Linux】进程间通信(万字详解)—— 匿名管道 | 命名管道 | System V | 共享内存
🌈欢迎来到Linux专栏~~进程通信 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤…...
【Database-02】达梦数据库 - DM Manager管理工具安装
1、简介 DM Manager是达梦数据库自带的图形化界面管理工具,在安装达梦数据库的时候就会自动安装。 Linux环境,默认安装路径为:达梦安装目录/tool/manager,如果Linux是安装GUI,那么就可以直接启动使用。 实际大部分使…...
剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和 难度:easy\color{Green}{easy}easy 题目描述 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums [-2,1,-3,4,-1,2,1,-5,4] 输…...
双指针 (C/C++)
1. 双指针 双指针算法的核心思想:将暴力解法的时间复杂度,通常是O(N*N),通过某种特殊的性质优化到O(N)。 做题思路:先想想暴力解法的思路,然后分析这道题的特殊性质,一般是单调性。然后得出双指针算法的思路…...
CVE-2023-23752 Joomla未授权访问漏洞分析
漏洞概要 Joomla 在海外使用较多,是一套使用 PHP 和 MySQL 开发的开源、跨平台的内容管理系统(CMS)。 Joomla 4.0.0 至 4.2.7 版本中的 ApiRouter.php#parseApiRoute 在处理用户的 Get 请求时未对请求参数有效过滤,导致攻击者可向 Joomla 服务端点发送包…...
单通道说话人语音分离——Conv-TasNet(Convolutional Time-domain audio separation Network)
单通道说话人语音分离——Conv-TasNet模型(Convolutional Time-domain audio separation Network) 参考文献:《Conv-TasNet: Surpassing Ideal Time-FrequencyMagnitude Masking for Speech Separation》 1.背景 在真实的声学环境中,鲁棒的语音处理通常…...
华为OD机试真题Python实现【环中最长子串】真题+解题思路+代码(20222023)
环中最长子串 题目 给你一个字符串s,首尾相连成一个环形, 请你在环中找出o字符出现了偶数次最长子字符串的长度. 备注: 1 <= s.lenth <= 5x10^5 s只包含小写英文字母 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 ## 输入 输入是…...
Netcat安装与使用(nc)
Netcat安装与使用1.Netcat简介1.1.Netcat安装1.1.1.安装整体流程1.1.1.1.安装依赖1.1.1.2.安装Netcat1.1.1.3.配置环境变量1.1.1.4.测试1.2.Netcat基本功能1.3.Netcat常用参数2.Netcat用法2.1.前期准备2.2.banner相关信息抓取2.3.端口扫描2.3.1.扫描指定端口2.3.2.扫描指定端口…...
蓝桥杯:聪明的猴子
题目链接:聪明的猴子https://www.lanqiao.cn/problems/862/learning/ 目录 题目描述 输入描述 输出描述 输入输出样例 运行限制 解题思路: 最小生成树 AC代码(Java): 课后练习: 题目描述 在一个热带雨林中生存…...
Spring Boot应用如何快速接入Prometheus监控
1. Micrometer简介Micrometer为Java平台上的性能数据收集提供了一个通用的API,它提供了多种度量指标类型(Timers、Guauges、Counters等),同时支持接入不同的监控系统,例如Influxdb、Graphite、Prometheus等。可以通过M…...
vscode远程调试python
目的 注意:这里我们想要实现的是:用vscode 使用remote ssh打开project,然后直接在project里面进行debug,而不需要 在本地vscode目录打开一样的project。 假设大家已经会使用remote ssh打开远程服务器的代码了,那么只…...
Spring Boot 框架 集成 Knife4j(内含源代码)
Spring Boot 框架 集成 Knife4j(内含源代码) 源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87480176 目录Spring Boot 框架 集成 Knife4j(内含源代码)源代码下载链接地址:[htt…...
什么蓝牙耳机适合打游戏?打游戏不延迟的蓝牙耳机
为了提升游戏体验,除了配置强悍的主机外,与之搭配蓝牙耳机等外设产品也尤为重要,今天就带大家来了解一下以下几款适合玩游戏,低延迟操作的蓝牙耳机。 第一款:南卡小音舱蓝牙耳机 参考价格:239元 推荐理由…...
【项目设计】高并发内存池(一)[项目介绍|内存池介绍|定长内存池的实现]
🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…...
初识MySQL下载与安装【快速掌握知识点】
目录 前言 MySQL版本 MySQL类型 MySQL官网有.zip和.msi两种安装形式; MySQL 下载 1、MySQL 属于 Oracle 旗下产品,进入Oracle官网下载 2、点击产品,找到MySQL 3、进入MySQL页面 4、点击Download(下载)&#x…...
如何终止一个线程
如何终止一个线程 是使用 thread.stop() 吗? public class ThreadDemo extends Thread{Overridepublic void run() {try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("this is demo thread :"Thre…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
