资料介绍
某些Intel的FLASH芯片(如StrataFlash系列)支持多分区,也就是各个分区可以同时进行操作。应该说这是不错的特性,但是也会带来些问题。记得当初移植Linux-2.4.21,挂JFFS2文件系统的时候,经常会报一些“Magic bitmask not found”之类的错误,跟进去发现FLASH读出来的都是些0x80之类的数据,查看资料发现该款FLASH有分区的特性,而Linux的FLASH驱动只用一个状态变量表示整个FLASH的状态,这就会造成某个分区的实际状态和系统记录的不符,从而导致读FLASH的时候该点实际上不处在读状态。当时的解决办法是,每次读的时候,不管记录的状态是什么,先进入读状态再说,当然这会带来性能的下降,具体损失多少个时钟周期就不算了。
话说进入Linux-2.6.x的时代(具体是2.6.13),除了Lock/Unlock(Linux在擦/写的时候不先Unlock,解决办法就是初始化的时候先全部Unlock)这个老问题外,竟然多分区的错误没有出现,惊讶之下决定好好研究下Linux的MTD/FLASH驱动。
说驱动之前,先明确几个编程要点:
1:读写,要按照总线位宽读写,注意不是FLASH芯片位宽(例如背靠背)。
2:寻址,程序要访问的地址和FLASH芯片地址引脚得到的值是不一样的,例如16位的FLASH芯片,对于CPU,0x00和0x01表示2个不同的字节,但是到了FLASH引脚得到的都是0,也就是都指向FLASH的第一个WORD。可以认为地址总线的bit0悬空,或者认为转换总线, bit0上实际输出的是bit1。这个解释了要点1。
3:芯片手册提到偏移量都是基于WORD的,而WORD的位宽取决于芯片的位宽,因此在下命令的时候,实际偏移=手册偏移*buswidth/8。
4:芯片手册提到的变量长度(典型如CFI信息)例如2,指的是,变量是个16bit数,但是读的时候,要读2个WORD,然后把每个WORD的低8位拼成1个16bit数。读WORD再拼凑确实挺麻烦,尤其是读取大结构的时候,不过参照cfi_util.c的cfi_read_pri函数的做法就简单了。
5:背靠背,也就是比方说2块16位的芯片一起接在32位的总线上。带来的就是寻址的问题,很显然,首先要按32位读写;其次就是下命令的地址,实际偏移=手册偏移*interleave*device_type/8,device_type=buswidth/interleave,而buswidth这个时候是32(总线位宽)。另外就是背靠背的时候,命令和返回的状态码是“双份的”,例如2块16位背靠背,读命令是0x00ff00ff。
如果不是想写像Linux那么灵活的代码(考虑各种接法/位宽/CFI获取信息等),那事情就简单很多,只要考虑要点1以及擦除块的大小就好了,当然如果是背靠背接法,擦除块的实际大小要乘个interleave。
进入Linux代码
关于CHIP/MAP/MTD之间绕来绕去的关系现在还糊涂着呢,因此下面只是简单的跟一下脉络和各个编程要点。
1:构造map_info结构,指定基址/位宽/大小等信息以及“cfi_probe”限定,然后调用do_map_probe()。
2:do_map_probe()根据名字“cfi_probe”找到芯片驱动“cfi_probe.c”直接调用cfi_probe()。
3:cfi_probe()直接调用mtd_do_chip_probe(),传入cfi_probe_chip()函数指针。
4:mtd_do_chip_probe()分2步,先调用genprobe_ident_chips()探测芯片信息,后调用check_cmd_set()获取和初始化芯片命令集(多分区初始化就在里面)。
5:genprobe_ident_chips()函数如果不考虑多芯片串连的情况,那只需看前面的genprobe_new_chip()调用,完成后cfi.chipshift=cfi.cfiq-》DevSize,2^chipshift=FLASH大小。
话说进入Linux-2.6.x的时代(具体是2.6.13),除了Lock/Unlock(Linux在擦/写的时候不先Unlock,解决办法就是初始化的时候先全部Unlock)这个老问题外,竟然多分区的错误没有出现,惊讶之下决定好好研究下Linux的MTD/FLASH驱动。
说驱动之前,先明确几个编程要点:
1:读写,要按照总线位宽读写,注意不是FLASH芯片位宽(例如背靠背)。
2:寻址,程序要访问的地址和FLASH芯片地址引脚得到的值是不一样的,例如16位的FLASH芯片,对于CPU,0x00和0x01表示2个不同的字节,但是到了FLASH引脚得到的都是0,也就是都指向FLASH的第一个WORD。可以认为地址总线的bit0悬空,或者认为转换总线, bit0上实际输出的是bit1。这个解释了要点1。
3:芯片手册提到偏移量都是基于WORD的,而WORD的位宽取决于芯片的位宽,因此在下命令的时候,实际偏移=手册偏移*buswidth/8。
4:芯片手册提到的变量长度(典型如CFI信息)例如2,指的是,变量是个16bit数,但是读的时候,要读2个WORD,然后把每个WORD的低8位拼成1个16bit数。读WORD再拼凑确实挺麻烦,尤其是读取大结构的时候,不过参照cfi_util.c的cfi_read_pri函数的做法就简单了。
5:背靠背,也就是比方说2块16位的芯片一起接在32位的总线上。带来的就是寻址的问题,很显然,首先要按32位读写;其次就是下命令的地址,实际偏移=手册偏移*interleave*device_type/8,device_type=buswidth/interleave,而buswidth这个时候是32(总线位宽)。另外就是背靠背的时候,命令和返回的状态码是“双份的”,例如2块16位背靠背,读命令是0x00ff00ff。
如果不是想写像Linux那么灵活的代码(考虑各种接法/位宽/CFI获取信息等),那事情就简单很多,只要考虑要点1以及擦除块的大小就好了,当然如果是背靠背接法,擦除块的实际大小要乘个interleave。
进入Linux代码
关于CHIP/MAP/MTD之间绕来绕去的关系现在还糊涂着呢,因此下面只是简单的跟一下脉络和各个编程要点。
1:构造map_info结构,指定基址/位宽/大小等信息以及“cfi_probe”限定,然后调用do_map_probe()。
2:do_map_probe()根据名字“cfi_probe”找到芯片驱动“cfi_probe.c”直接调用cfi_probe()。
3:cfi_probe()直接调用mtd_do_chip_probe(),传入cfi_probe_chip()函数指针。
4:mtd_do_chip_probe()分2步,先调用genprobe_ident_chips()探测芯片信息,后调用check_cmd_set()获取和初始化芯片命令集(多分区初始化就在里面)。
5:genprobe_ident_chips()函数如果不考虑多芯片串连的情况,那只需看前面的genprobe_new_chip()调用,完成后cfi.chipshift=cfi.cfiq-》DevSize,2^chipshift=FLASH大小。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- ARM11嵌入式系统Linux下LCD的驱动的设计
- 嵌入式Linux系统的驱动原理和使用ARM Linux实现SPI驱动程序的说明 11次下载
- LINUX系统教程之如何在Linux系统下进行编程 9次下载
- Linux操作系统实用教程之如何进行Linux系统下的编程管理 5次下载
- 基于MTD6505下的无传感器正弦控制三相直流无刷风扇电机驱动器
- 基于MTD6501C/MTD6501D正弦驱动模式下的电机驱动器
- Linux操作系统下C语言编程入门.pdf 96次下载
- Linux MTD下获取Nand flash 各个参数的过程的详细解析 7次下载
- 基于Linux内核输入子系统的驱动研究 23次下载
- 嵌入式Linux下NAND存储系统的设计 76次下载
- Linux MTD下获取Nand flash参数详解 40次下载
- Linux环境下USB的原理、驱动和配置
- 基于Linux操作系统的设备驱动程序开发
- 基于嵌入式Linux系统的LCD驱动实现Implementa
- 嵌入式Linux系统下NOR Flash的配置和使用
- 基于NXP MCXA153 MCU实现RT-Thread的MTD NOR Flash驱动 559次阅读
- Linux 驱动开发与应用开发,你知道多少? 871次阅读
- Linux操作系统中如何按下PCIe的复位键 1687次阅读
- Linux 下的make 工具和 Makefile 1208次阅读
- 从网络启动linux系统如何做调试 1761次阅读
- 如何在Linux系统下开启wifi 4551次阅读
- Linux设备驱动开发的基本知识 4393次阅读
- 米尔科技Linux设备驱动研究浅谈 2035次阅读
- Linux关于系统状态的命令简单介绍 2337次阅读
- 基于嵌入式Linux下的I2C设备驱动的总体思路与框架设计 3771次阅读
- linux环境下如何开发51单片机 基于codeblocks和SDCC 4606次阅读
- 搭建测试环境常用linux命令_linux下web测试环境的搭建 1.1w次阅读
- 基于zynq的Linux根文件系统生成 5841次阅读
- 关于Linux设备驱动中input子系统的介绍 2711次阅读
- Linux下ARM 和单片机的串口通信设计 3486次阅读
下载排行
本周
- 1PC3103 低功耗电流模式PWM控制器技术手册
- 1.23 MB | 3次下载 | 免费
- 2L7805CV TO-220三端稳压IC规格书
- 0.71 MB | 1次下载 | 免费
- 3LoRa2021 全频段无线通讯模块规格书
- 814.22 KB | 1次下载 | 免费
- 4L7812CV TO-220三端稳压IC规格书
- 1.35 MB | 次下载 | 免费
- 5L7815CV TO-220三端稳压IC规格书
- 1.48 MB | 次下载 | 免费
- 6N-12电子倾斜仪指南
- 0.24 MB | 次下载 | 10 积分
- 7基于CP500S扫描测头的三坐标测量系统:复杂曲面零件解决方案
- 0.35 MB | 次下载 | 免费
- 8STM32H747xI/G 英文数据手册
- 5.09 MB | 次下载 | 免费
本月
- 1PFC电路与BOOST电路设计实例分享
- 1.83 MB | 18次下载 | 4 积分
- 2电源测试报告-基于 国民技术 N32L406 和杰华特 JW3376+3330 的 BMS 方案
- 6.47 MB | 17次下载 | 免费
- 3世平基于灵动微 SPIN560C 的低压无刷电机应用方案
- 10.93 MB | 11次下载 | 免费
- 4900MHz全双工无线发射器参考设计原理图资料
- 0.40 MB | 6次下载 | 免费
- 5PWM控制器的控制方法
- 0.39 MB | 3次下载 | 4 积分
- 6900MHz全双工无线发射器参考设计
- 0.15 MB | 3次下载 | 1 积分
- 7美的电磁炉TM-S1-20B PN8124F+CHK S009资料图
- 0.28 MB | 3次下载 | 10 积分
- 8FS313B USB 的 PD和QC 快充协议电压诱骗控制器规格书
- 2.61 MB | 3次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935134次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420064次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233089次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191424次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183352次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81602次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73819次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65991次下载 | 10 积分
电子发烧友App






创作
发文章
发帖
提问
发资料
发视频
上传资料赚积分
评论