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…...

上岸!选择你的隐私计算导师!
开放隐私计算 开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号…...

go gin学习记录5
有了前面几节的学习,如果做个简单的web服务端已经可以完成了。 这节来做一下优化。 我们实验了3种SQL写入的方法,但是发现每一种都需要在方法中去做数据库链接的操作,有些重复了。 所以,我们把这部分提取出来,数据库链…...

PyQt5数据库开发2 5.1 QSqlQueryModel
目录 一、Qt窗体设计 1. 新建Qt项目 2. 拷贝4-3的部分组件过来 3. 添加资源文件 4. 创建Action 5. 添加工具栏 6. 创建菜单项 7. 关闭Action的实现 8. 调整布局 8.1 调整两个groupbox的布局 8.3 为窗体设置全局布局 二、代码拷贝和删除 1. 新建项目目录 2. 编译…...

MySQL-redo log和undo log
什么是事务 事务是由数据库中一系列的访问和更新组成的逻辑执行单元 事务的逻辑单元中可以是一条SQL语句,也可以是一段SQL逻辑,这段逻辑要么全部执行成功,要么全部执行失败 举个最常见的例子,你早上出去买早餐,支付…...

阿里云ECS TOP性能提升超20%!KeenTune助力倚天+Alinux3达成开机即用的全栈性能调优 | 龙蜥技术
文/KeenTune SIG01阿里云 ECS 上售卖页新增“应用加速”功能2023年1月12日 阿里云 ECS 的售卖页有了一些新的变化,在用户选择倚天 Alinux3 新建实例时,多了一个新的选项“应用加速”。这个功能是 阿里云 ECS 基于 KeenTune 提供典型云场景的开机即用的全…...

华为OD机试真题Python实现【快递业务站】真题+解题思路+代码(20222023)
快递业务站 题目 快递业务范围有 N 个站点,A 站点与 B 站点可以中转快递,则认为 A-B 站可达, 如果 A-B 可达,B-C 可达,则 A-C 可达。 现在给 N 个站点编号 0、1、…n-1,用 s[i][j]表示 i-j 是否可达, s[i][j] = 1表示 i-j可达,s[i][j] = 0表示 i-j 不可达。 现用二维…...

【c语言】预处理
🚀write in front🚀 📜所属专栏:> c语言学习 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是…...

嵌入式常用知识
12、并发和并行的区别? 最本质的区别就是:并发是轮流处理多个任务,并行是同时处理多个任务。 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。 你吃饭吃到一半&…...

和平精英五曜赐福返场,老款玛莎返场来了
和平精英五曜赐福返场,老款玛莎返场来了!新款如何选择! 关于返场的新消息,都说云南百收SEO解说消息不准,之前看过文章的应该会知道,全网只有云南百收SEO解说发了。玛莎返场,快喊你的阿姨来看&a…...

React从入门到精通二
React从入门到精通之购物车案例1. 购物车需求说明使用到的data list2. 项目code1. 购物车需求说明 list data展示到列表中每个item的通过按钮来控制购买的数据量删除按钮可以删除当前的itemTotal Price计算当前购物车的总的价格 使用到的data list const books [{id: 1,name…...