一片Norflash上建立bootrom和TFFS文件系统
修改NORFlash分区和JFFS2文件系统支持
修改NORFlash分区和JFFS2文件系统支持修改NOR Flash分区和JFFS2文件系统支持仇洁婷,陈儒军本系统的NOR Flash用于存放启动代码、Linux内核、用户程序等,因此需要在Linux-2.6.21内核中对它进行配置和分区。
NOR Flash的驱动程序都集中的/drivers/mtd/maps里面。
通过make menuconfig对Linux2.6.21内核增加MTD和相应的文件系统的支持。
选择配置有:Devices Drivers --->Memory Technology Devices (MTD) ---><*> Memory Technology Device (MTD) support<*> MTD partitioning support<*> Direct char device access to MTD devices<*> Caching block device access to MTD devicesRAM/ROM/Flash chip drivers ---><*> Detect flash chips by Common Flash Interface (CFI) probe<*> Support for Intel/Sharp flash chipsMapping drivers for chip access ---><*> CFI Flash device mapped on AT91RM9200 由于系统采用电池供电,必须要确保在读取文件时,如果系统突然掉电,其文件的可靠性不受到影响。
JFFS2文件系统正是为这种类型的嵌入式设备创建的,它具有崩溃/掉电安全保护这一功能。
因此,本文将根文件系统挂载分区设置为JFFS2(Journalling Flash File System Version 2,闪存日志文件系统第2版)文件系统形式。
Nand Flash文件系统解决方案
Nand Flash文件系统解决方案一.Nand Flash结构及特性NAND Flash的结构如图1所示:图1 NAND Flash结构NAND Flash 由块(block)组成,每块又由若干页(page)组成,每页由数据区和冗余区(spare area)组成。
页是数据写入的基础单元,块是擦除的基础单元。
在对NAND Flash 进行写操作(页编程)时,只能把相应的位由“1”写为“0”,只有对块进行擦除操作时,才能把该块内所有位由“0”写为“1”。
因此,在写入数据时,如果该页内已存有数据,必须先擦除该块。
SLC(Single-Level Cell)小容量的NAND Flash页一般为(512+16)Bytes(数据区512Bytes,冗余区16Bytes),大容量的NAND Flash页为(2048+64)Bytes。
为降低Flash的制造成本,半导体制造商先后推出了MLC(Multi-Level Cell)和TLC(Trinary-Level Cell)技术,即在一个Flash 存储单元内存储更多的位信息,其原理如图2 所示。
与SLC 相比,MLC和TLC 的存储密度更高,成本也相对降低,但管理难度更大:其传输速度、耗电量、擦写次数等方面的性能都要比前者差。
因此在工业应用场合,存储空间要求不是特别大的情况下,SLC仍然得到广泛的应用。
图2 SLC 和TCL区别1. 块擦除次数有限NAND Flash的块擦除次数是有限的。
SLC一般不超过10万次,而MLC擦除次数仅有1万次左右,具体数据以所使用的NAND Flash 的产品手册为准。
如果频繁擦除某块最终导致超过擦除次数限制,该块内的数据将变得不可靠,进而影响整个存储器的使用,所以需要采用损耗均衡算法使各个块近似均衡使用。
2. 异位更新(Non-In-Place Update)由于 NAND Flash先擦后写的物理特性,如果将文件存储在固定的块内,会面临掉电数据丢失及占用较大RAM 等问题。
linux系统Nor Flash芯片初始化及驱动
//将名为”cfi_probe”的驱动器添加到芯片驱动链表中 register_mtd_chip_driver(&cfi_chipdrv); return 0; } register_mtd_chip_driver()定义在 drivers/mtd/chips/chipreg.c void register_mtd_chip_driver(struct mtd_chip_driver *drv) { spin_lock(0x%08llx\n", flash_map.size >> 20, flash_map.phys); simple_map_init(&flash_map);
//调用名为 cfi_probe 的驱动, 说明该 CPU 支持 CFI 标准的 flash 操作 mymtd = do_map_probe("cfi_probe", &flash_map); if (mymtd) {
mtd = check_cmd_set(map, 1); /* First the primary cmdset */ if (!mtd)
mtd = check_cmd_set(map, 0); /* Then the secondary */
if (mtd) { if (mtd->size > map->size) { printk(KERN_WARNING "Reducing visibility of %ldKiB chip to %ldKiB\n", (unsigned long)mtd->size >> 10, (unsigned long)map->size >> 10); mtd->size = map->size; } return mtd;
关于嵌入式Linux系统flash分区设计及文件系统格式选择的一些浅见
关于嵌⼊式Linux系统flash分区设计及⽂件系统格式选择的⼀些浅见嵌⼊式系统应⽤程序升级是⽐较频繁的,这就需要将flash进⾏合理的划分,⼀般情况,flash 的基本分区都有这⼏部分:1.uboot分区2.kernel分区3.rootfs分区这三部分是最基本的,⼀般都有。
如果只是这样分区,然后应⽤程序和⽂件系统放在⼀起,这样的话会导致应⽤程序升级的时候⽐较⿇烦,因为应⽤程序与⽂件系统放在了⼀起,每次升级的时候都要将⽂件系统重新擦除、写⼊,这样升级浪费时间,⽽且风险很⼤,如果正在擦除flash或者正在写⼊映像⽂件时突然断电了,就会导致设备⽆法启动了(⽂件系统损坏)!这样还必须从uboot重新下载⽂件系统,给升级带来了很⼤的⿇烦。
在嵌⼊式系统设计的时候⼀般都会将⽂件系统与经常更新的应⽤程序分离开来,放在不同的flash分区⾥,这样升级的时候只需要对应⽤程序分区进⾏擦除重新即可,这样即使升级过程中断电,也不会导致⽂件系统的损坏,系统依然可以启动。
可以将升级程序与⽂件系统放在⼀起,这样设备重新启动以后还可以对设备进⾏升级。
还有⼀种做法是在Uboot中实现升级,这样也⽆法避免断电带来的问题,其实最主要的是不能将应⽤程序与⽂件系统放在⼀起。
还有⼈在flash中做⼀个“安全模式”分区,系统如果损坏,导致设备⽆法正常启动,这时可以从安全模式启动,安全模式只提供最基本的功能,⽐如:升级,⽹络等,这些基本功能可以帮助你重新做系统。
这个也类似于windows的win PE。
总之,以升级整个⽂件系统来实现更新应⽤程序是最不可取的⽅法。
下⾯介绍⼀下嵌⼊式系统的⼏种常⽤的⽂件系统格式其实嵌⼊式根⽂件系统的格式⼤家都知道,常⽤的有jffs2,cramfs,ramdisk,以及yaffs等,他们各⾃的特点就不详细介绍了,百度、⾕歌讲的很详细了。
这⾥说⼀下我当初学习时⼀些问题和疑惑的地⽅。
1.flash分区格式刚开始总是以为flash的分区要对应⼀种格式,对这很是疑惑,不懂,别⼈问我你的根⽂件系统什么格式?都不知道怎么回答,后来发现这个flash分区是没有具体的格式的,你下载什么格式的⽂件系统,它就是什么格式的,并不是像windows下C 盘、D盘那样有FAT32格式、NTFS格式,windows下的这些格式也是格式化后才具有的格式,这个格式化的过程也相当于给这个盘⾥装了⼀个基本的⽂件系统。
移植笔记从Norflash启动的uboot
移植笔记从Norflash启动的uboot uboot移植记录之一uboot整个移植过程我们可以分为三个阶段:一,移植可以从Nor flash启动的uboot这个阶段是移植一个最简单的uboot,可以烧在Nor flash内运行.二,移植支持Nand flash驱动的uboot加入Nand flash驱动的支持,可以在uboot命令行下操作Nand flash.但还未能从Nand flash启动,只能在Nor flash内运行.三,移植可以从Nor flash启动的uboot可以烧录在Nand flash,并设置从Nand flash启动运行uboot.分三个阶段进行移植,可以对整个uboot的移植过程及原理更加清晰明了,同时降低了发现问题时解决问题的困难度和解决范围.首先介绍移植可以从Nor flash启动的uboot. 这个阶段相对简单一点,是移植一个最简单的uboot,可以烧在Nor flash内运行.不需要修改太多的东西。
步骤如下: 测试一下默认的smdk2410_config配置能否在你的板子上正常运行 1.编译uboot1.1.4#make smdk2410_config#make ARCH=arm注:编译针对arm的平台时,uboot默认使用arm-linux-gcc编译,若交叉编译器名字不一样,需要自行在Makefile里修改。
会出现两个错误.错误信息一:cc1: Invalid option `abi=apcs-gnu'make[1]: *** [hello_world.o] Error 1make[1]: Leaving directory `/root/u-boot-1.1.4/examples'make: *** [examples] Error 2解决办法:出错的文件是/cpu/arm920t/下的config.mk:将PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) 改成: PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,$(callcc-option,-mabi=apcs-gnu,))错误信息二:make[1]: *** No rule to make target `hello_world.srec', needed by`all'. Stop. make[1]: Leaving directory `/work/src/u-boot-1.1.4/examples' 解决方法:打开 examples/Makefile把example文件夹下的Makefile中的第126行%.srec: % 改成 %.srec: %.o第129行的%.bin: % 改成 %.bin: %.o2.若编译成功,则会在uboot源码下产生u-boot.bin文件。
norflash原理
norflash原理NorFlash,全称为“非易失性闪存”(Non-volatile Flash Memory),是一种基于闪存技术的非易失性存储设备。
它是存储芯片中的一种存储单元,主要用于嵌入式系统和智能手机等设备中,用于存储和读取数据。
NorFlash可以保持数据的稳定存储状态,并且读写速度较快,寿命较长,是目前使用最广泛的一种闪存技术之一NorFlash的工作原理主要包括存储单元、地址索引和控制电路。
存储单元是NorFlash的核心,由一系列的存储晶体管组成。
每个存储晶体管可以存储一个比特的数据。
每个存储单元都能够通过一个唯一的地址进行寻址,通过读取和写入操作来访问数据。
NorFlash中的数据是按字节顺序存储的,每个字节都有一个相应的地址。
这些地址存储在芯片内部的索引寄存器中。
当读取数据时,控制电路根据给定的地址,找到相应的索引,然后将存储单元对应位置的数据读取出来。
同样,当写入数据时,控制电路也会根据地址找到相应的索引,然后将数据写入到存储单元对应的位置上。
NorFlash主要的特点有以下几点:1. 非易失性:NorFlash可以在没有电源的情况下保持数据的稳定存储状态。
这使得它可以作为主存储器之外的一个辅助存储器,用来存储即使在断电后也需要保留的重要数据,比如操作系统、BIOS等。
2. 读写速度较快:NorFlash的读取速度通常比其他存储器技术更快。
这使得它在需要频繁读取数据的应用中表现出色,比如系统启动时的固件加载等。
3. 高可靠性:NorFlash拥有较长的寿命,可以进行大量的擦写操作而不会影响数据的稳定性。
这使得它适用于需要频繁更新数据的应用场景,比如智能手机上的应用程序。
4. 低功耗:NorFlash的工作电压较低,功耗较小。
这使得它在移动设备中的应用更具吸引力,因为它可以延长电池的使用寿命。
5. 密集度高:NorFlash具有较高的存储密度,可以在相对较小的物理空间中存储大量的数据。
NandFlash建tffs文件系统问题小结
Nand Flash k9f2808u0c建立tffs文件系统问题小结Searcher caiyang一.环境介绍目的:在nand flash k9f2808u0c上建立tffs文件系统硬件环境:44B0, bank0 接2M nor flash,bank1接16M nand flash k9f2808U0c二.进展程度1. bootRom编译无误,通过在启动到cmdLoop中加入’Z’调用tffsDevFormat()函数,实现tffs的格式化。
2. bootRom编译无误,通过在启动到cmdLoop中加入’Y’调用sysTffsFormat()函数,实现tffs的代参格式化。
3. bootRom编译无误,通过在启动到cmdLoop中加入’X’调用usrTffsConfig()函数,实现tffs的挂接。
4. 通过验证,单独的读,写,擦除函数均可正确执行,而在进行tffs文件系统的建立,综合调用这几个函数时,出现错误。
调用顺序xxIdentify()->xxErase()->xxRead()->xxWrite()。
三.问题小结1. 调试输出信息不一致问题问题描述:通过加载vxWorks调试tffs文件系统与通过bootrom调试输出信息不一致,详细描述如下:1)通过网络加载包含tffs信息的vxWorks启动加载后,在shell中调用tffsDevFormat输出相应的格式化信息2)烧写bootrom.hex到flash中启动后,回车输入'Z'(在bootconfig.c,调用了tffsDevFormat())后,出现相应的打印信息问题:二者输出的信息(调用tffsDevFormat()后的打印信息)不一致:其中bootrom.hex和vxWorks是在同一个工程中编译生成的。
2. nandMap()函数的调用关系问题问题描述:在调用tffsDevFormat()函数进行格式化擦除过程中,调用eraseBlock 操作顺利完成后进入nandMap() 函数。
nor flash program原理
nor flash program原理NORFlash芯片是一种非易失性存储器,它可以在电源正常的情况下保持数据,并且在掉电后数据也不会丢失。
NORFlash广泛应用于嵌入式系统中,用于存储操作系统、应用程序和配置信息等重要数据。
本文将介绍NORFlash的编程原理。
一、NORFlash存储单元NORFlash芯片的存储单元通常采用浮栅晶体管结构,其基本单元包括一个浮栅晶体管和一个电荷存储单元。
浮栅晶体管将电荷存储在存储单元中,从而控制数据的写入和擦除操作。
NORFlash芯片的存储单元具有较高的数据密度和较低的功耗,但擦除操作需要消耗较多的时间和能量。
二、NORFlash编程原理NORFlash的编程通常采用Flash编程标准协议,如IAP(In-ApplicationProgramming)协议或SFDP(Single-ByteFlashDataProtocol)。
在进行编程时,需要通过专门的编程设备(如编程器或主机控制器)将数据写入NORFlash芯片中。
NORFlash编程原理如下:1.初始化阶段:首先需要与NORFlash芯片建立通信连接,并进行初始化设置。
2.写入数据阶段:将需要写入的数据通过编程设备传输到NORFlash芯片中。
由于NORFlash芯片具有较高的读取速度和较低的功耗,因此适合进行数据写入操作。
3.擦除操作阶段:在进行数据写入之前,需要先对存储单元进行擦除操作。
擦除操作通常采用全块擦除方式,即将整个芯片或部分芯片进行擦除。
4.校验阶段:在完成数据写入和擦除操作后,需要进行校验和验证,以确保数据正确性。
NORFlash编程过程涉及到许多细节和注意事项,例如选择合适的编程协议、设置适当的擦除块大小、避免损坏芯片等。
在进行编程时,需要根据具体情况选择合适的工具和方法,并确保数据的准确性和完整性。
三、NORFlash编程步骤以下是一般的NORFlash编程步骤:1.连接NORFlash芯片与编程设备,并进行初始化设置。
用NOR Flash建立VxWorks TrueFFS文件系统
种 存 储 容 量 为 2 MB的 NOR ls 应 用 程 序 可 以 直 接 F ah,
在 芯 片 内部 运 行 , 必 再 把 代 码 读 到 系 统 RAM 中 。 N0R 不
的传 输 效 率 很 高 , 嵌 入 式 系 统 中得 到 广 泛 的 应 用 。 在
存 储 设 备 的读 写 可 以像 对 拥 有 MS—D OS文 件 系 统 的 磁
引 言
Vx r s是 美 国 Wid Rie wo k n v r公 司 于 1 8 9 3年 开 发 的
碟设 备 的操 作 一样 。Tr e F u F S文 件 系统 由 4个 层 次 组 成 :
NOR F a h驱 动 上 挂 接 Vx r sDOS文件 系统 , 进 行 了 简单 的 测 试 。 ls Wo k 并
关 键 词 :Vx o k ; u F S F ah; TD 层 ; o k t W r s Tr e F ; ls M S c e 层
中 图分 类号 : 3 6 2 TP 1 .
事 、 空 、 天 等 高 精 尖 技 术 及 实 时 性 要 求 极 高 的领 域 中 , 航 航 如 弹道 制 导 、 机 导 航 等 。 飞 ]
DS 系 }_ 心 0 件 统-_ 层I 文 . 1核
l 译 l l翻 层 I
Fah 为 一种 非 易 失 性 的 固 态 存 储 设 备 , 有 可 靠 ls 作 具 性 高 、 积 小 、 耗 低 等 特 点 , 常 适 合 移 动 设 备 、 持 设 体 功 非 手
核 心 层 : 接 其 他 几 个 功 能 层 , 时 也 进 行 碎 片 回 收 连 同 及 定 时 器 和 其 他 系 统 资 源 的 维 护 。该 层 以 二 进 制 形 式
在NAND FLASH上建立TFFS文件系统小结
在NAND FLASH上建立TFFS文件系统小结by minuetfrom EDW经过一个星期的摸索,终于在NAND FLASH上建立了TFFS文件系统,今天拿出来和大家分享一下!相信大家对NAND FLASH的特点和与NOR FLASH的区别都有所了解,有关这方面的文章坛子里有,我就不在赘述了。
下面我以三星的K9F6408U0C为例(它是8M x 8 Bit NAND Flash Memory),详细说明建立过程。
环境:tornado2.0 for arm一、硬件连接主要是CLE和ALE的连接,可以用I/O口控制,也可以直接与地址线相连。
我选择后者,因为这种方*既方便,访问速度也比I/O口控制快。
我是让CLE接在A20上,ALE接在A21上。
还要注意/WP(写保护)这个脚,使其上拉。
我在工作过程中曾忽略了对它的控制(浮空),导致写保护有效,擦写都无效。
希望大家不要犯同样的错误。
/CE这个脚我是接在CPU的BANK1片选上,即界于0x1000000~0x1ffffff的16M地址都是指向此flash设备,当然我们只要选择一个地址表示即可,简单起见选0x1000000。
R//B接在CPU的一个输入I/O上,通过读此I/O判断设备是忙还是准备好。
有的片子要求在片子忙状态时,/CE要是低电平,所以建议R//B与/CE连接在一起。
综上所述,可以如此定义:#define WRITE_COMMAND(val) (*(volatile char *)0x1100000 = (char)(val)) /* CLE = A20 */#define WRITE_ADDRESS(val) (*(volatile char *)0x1200000 = (char)(val)) /* ALE = A21 */#define WRITE_DATA(val) (*(volatile char *)0x1000000 = (char)(val)) /* CE = 0 CLE = 0 ALE = 0 */#define READ_DATA(val) ((char)(val) = *(volatile char *)0x1000000) /* CE = 0 CLE = 0 ALE = 0 */#define READ_REG(val) ((int)(val) = *(volatile int *)0x60061C) /* PI3寄存器地址*/上班时间到了,先写到这。
用NOR Flash建立VxWorks TrueFFS文件系统
用NOR Flash建立VxWorks TrueFFS文件系统邵富杰;徐云宽【摘要】This paper describes the method to establish the TrueFFS file system of embedded real-time operating system VxWorks, takingSST39VF1601 NOR Flash as an example. Firstly, DOS file system is configured, including the TrueFFS core component and the translation layer according to the technology used by SST39VF1601. Secondly, MTD layer and Socket layer Drivers are written. Lastly, the VxWorks DOS file system is mounted on a TrueFFS Flash drive, and simple test is carried out.%详细说明了嵌入式系统中常用的NOR Flash存储器建立Vxworks TrueFFS文件系统的方法。
首先配置完整的DOS文件系统支持,包含核心TrueFFS组件和翻译层组件;然后编写MTD层和Socket层驱动程序;最后在TrueFFS的NOR Flash驱动上挂接VxWorksDOS文件系统,并进行了简单的测试。
【期刊名称】《单片机与嵌入式系统应用》【年(卷),期】2012(012)004【总页数】4页(P19-21,28)【关键词】VxWorks;TrueFFS;Flash;MTD层;Socket层【作者】邵富杰;徐云宽【作者单位】北京跟踪与通信技术研究所,100094;北京跟踪与通信技术研究所,100094【正文语种】中文【中图分类】TP316.2引言VxWorks是美国Wind River公司于1983年开发的高模块化、高性能的32位嵌入式实时多任务操作系统,以其良好的可靠性和卓越的实时性而被广泛应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如弹道制导、飞机导航等[1]。
norflash启动,nandflash启动,SDRAM总结
Nandflash启动,norflash启动,SDRAM总结S3C2440的启动时读取的第一条指令是在0x00上,分为成nand flash和nor flash上启动。
nand flash:适合大容量数据存储,类似硬盘;nor flash:适合小容量的程序或数据存储,类似小硬盘;sdram:主要用于程序执行时的程序存储、执行或计算,类似内存。
Nor flash的有自己的地址线和数据线,可以采用类似于memory的随机访问方式,在nor flash上可以直接运行程序,所以nor flash可以直接用来做boot,采用nor flash启动的时候会把地址映射到0x00上。
Nand flash是IO设备,数据、地址、控制线都是共用的,需要软件区控制读取时序,所以不能像nor flash、内存一样随机访问,不能EIP(片上运行),因此不能直接作为boot。
NANDFlash启动: NANDFlash控制器自动把nandflash存储器的前4K载到Steppingstone (内部SRAM缓冲器),并把0x00000000S设置为内部SRAM的起始地址,cpu从内部SRAM的0x00000000开始启动,这个过程不需要程序干涉。
(cpu会自动从NAND flash中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。
cpu是从0x00000000开始执行,也就是NAND flash里的前4KB内容。
因为NAND FLASH连地址线都没有,不能直接把NAND映射到0x00000000,只好使用片内SRAM做一个载体。
通过这个载体把nandflash 中大代码复制到RAM(一般是SDRAM)中去执行)。
程序员要完成的工作是把最核心的代码放在nandflash的前4K中。
4K代码要完成S3C2440的核心配置以及启动代码(U-boot)的剩余部分拷贝到SDRAM中。
在Nand Flash上构建FAT文件系统
在Nand Flash上构建FAT文件系统摘要:本文介绍了Nand Flash存储器的结构,介绍了Fat文件系统的结构,介绍了Nand Flash 基础上实现Fat文件系统的初步构想,分析了工作中的难点。
是对之前阅读FA T文件系统资料工作的总结。
目录1Nand Flash的结构 (3)1.1Nand Flash一般结构 (3)1.2Nand Flash数据完整性 (4)1.3建立在Flash上的文件系统的要求 (4)2FA T文件系统 (5)2.1FA T文件系统简介 (5)2.2FA T文件系统的组成 (5)2.2.1引导扇区 (5)2.2.2保留扇区 (7)2.2.3FA T表和数据的存储原则 (7)3Nand Flash上的文件系统 (13)4工作分析 (14)5参考文献: (15)1Nand Flash的结构1.1Nand Flash一般结构Flash是一种非易失性的存储器,允许用户进行电擦除和电写入。
NOR和NAND是现在市场上两种主要的非易失闪存技术。
NOR的特点是芯片内执行(XIP, eXecute In Place),应用程序可直接在flash闪存内运行,传输效率很高,很低的写入和擦除速度。
NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。
应用NAND的困难在于flash的管理和需要特殊的系统接口。
K9F2808U0C是Sunsang公司的一块16MB 的Nand Flash芯片,其结构图如图1.1所示,Flash按照结构分为,区(Partion),块(Block),扇区(Sector)。
该Flash芯片的列地址被分为3种,A区(0-255byte),B区(256-511byte),C区(512-527byte)图1.1 K9F2808U0C结构图Flash设备的编程只允许从1写到0,而不能将某位数据从0写到1,只能通过擦除的方式将一整块的数据写为1,如图1.2所示。
FLASH烧录程序说明
NOR FLASH烧录程序说明本文主要介绍怎样使用nor flash烧录程序来烧录代码到nor flash 中,烧录的目标程序是bootloader.dat(启动代码)和asixos.axf(系统代码)。
调试软件的环境是ARM Developer Suit v1.2。
在路径burn kernel or mp3\A FLASH DOWNLOAD\FLASH DOWNLOAD\下打开工程文件FLASH DOWNLOAD.mcp。
打开main.c文件,可以看见烧录代码主程序如下图图1 烧录主程序图中第一步temp = NorFlash_unlock(0x20000000 )为FLASH解锁,如果FLASH的状态为“关”状态,则无法对NOR FLASH进行操作;第二步是擦除NOR FLASH,FLASH只有在擦除之后才能进行写操作。
其擦除是以块为单位,现在Garfield开发板的擦除块大小为ERASESIZE(=0x40000)。
第三步便是加载bootloader到内存中,然后将bootloader从内存中烧录到NOR FLASH中;其中,bootloader放在内存中地址为0x31000000,将其烧录到NOR FLASH地址为0x20000000,大小为0x400;第四步的方法与第三步相同,只是内容不同,是将aisxos.axf加载到内存中,然后将aisxos.axf从内存中烧录到NOR FLASH中;其中,aisxos.axf放在内存中地址为0x31000000,将其烧录到NOR FLASH地址为0x20001000,大小为0x140000。
第五步则是将NOR FLASH置为NORMAL状态,这样可以像访问内存一样访问NOR FLASH。
烧录步骤如下:1. 在ARM AXD窗口点击“File”菜单,如下图所示;图2 Load Memory From File 菜单2. 选择“Load Memory From File…”,将出现下面的对话筐:图3 Load Memory From File 菜单对话框选择所要烧录的文件,即bootload.dat文件或者asixos.axf文件,然后在Address 栏中填入所需的地址(本例中必须填写为0x31000000),最后按“打开”。
建立基于NOR FLASH的JFFS2根文件系统步骤
建立基于NOR FLASH的JFFS2根文件系统的步骤mafaqing, 2010-6-3文档约定:Host - 为虚拟机系统命令行环境EVM - 为U-Boot命令行环境Target - 为终端linux命令行环境1.把rootfs.jffs2和uImage_nor_jffs2上传到HOST的/opt/tftp目录下2.在HOST下执行下面的命令host # xinetd3.启动板子,并在U-BOOT环境下执行下面命令格式化NOR FLASH的内核和根文件系统分区EVM # protect off 0x02060000 0x03000000EVM # erase 0x02060000 0x03000000注: (1).切不要格式化其他分区(2).0x02040000 ~ 0x03000000为内核和文件系统存放的开始地址及结束地址4.下载新内核uImage_nor_jffs2到内存EVM # tftp 0x80700000 uImage_nor_jffs25.烧写新的内核到FLASH分区(内核)上EVM # cp.b 0x80700000 0x02060000 0x1600006.下载JFFS2文件系统镜像文件到内存EVM # tftp 0x80700000 rootfs.jffs27.烧写JFFS2文件系统镜像到FLASH分区(根文件系统)上EVM # cp.b 0x80700000 0x02240000 0x8da2fc8.修改内核启动参数,使系统使用FLASH上的JFFS2根文件系统,并保存参数EVM # setenv bootargs 'console=ttyS0,115200n8video=dm64xxfb:interface=composite:mode=pal:output=pal noinitrd rw ip=offroot=/dev/mtdblock3 rootfstype=jffs2 rw noinitrd mem=120M'EVM # saveenv9.手动断电复位板子,重新启动系统注: 首次启动系统时因为要对FLASH分区进行一些初始化,因些首次启动系统时需要等待一段时间.10.通过SSH客户端连接板子,把程序上传到FLASH系统下的/opt(不要上传到其他目录),并进行测试IP:192.168.1.33用户名:root密码:dm6446注: (1).测试程序时,在执行完loadmodules.sh后,需要再执行下面的命令target # /sbin/mdev -s(2).上传测试程序时,要注意FLASH的可用空间,如果空间不够时请删掉到/opt目录下的一些不用的程序可使用下面的命令查看当时FLASH的空间的使用情况target # /bin/df -ahFilesystem Size Used Available Use% Mounted onrootfs 13.8M 9.4M 4.4M 68% //dev/root 13.8M 9.4M 4.4M 68% /proc 0 0 0 0% /procsysfs 0 0 0 0% /systmpfs 46.1M 0 46.1M 0% /tmpmdev 64.0k 0 64.0k 0% /devdevpts 0 0 0 0% /dev/ptstmpfs 46.1M 0 46.1M 0% /dev/shmusbdevfs 0 0 0 0% /proc/bus/usbnone 46.1M 8.0k 46.1M 0% /var/runnone 46.1M 0 46.1M 0% /tmp其中 rootfs即为当前FLASH根文件系统分区的使用情况。
什么是nor flash方式打开电源 浅谈nor flash原理及应用
什么是nor flash方式打开电源浅谈nor flash原理及应用本文主要是关于nor flash的相关介绍,并着重对nor flash打开电源方式及原理应用进行了详尽的阐述。
nor flashnor flash是现在市场上两种主要的非易失闪存技术之一。
Intel于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Erasable Programmable Read-Only-Memory 电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。
紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。
NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。
NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。
NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。
应用NAND 的困难在于Flash的管理需要特殊的系统接口。
通常读取NOR的速度比NAND稍快一些,而NAND的写入速度比NOR快很多,在设计中应该考虑这些情况。
flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。
任何flash 器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。
NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。
由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。
NOR Flash读写原理及驱动
NOR Flash擦写和原理分析1. NOR FLASH 的简单介绍NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存储在NOR FLASH上的程序不需要复制到RAM就可以直接运行).这点和NAND FLASH不一样.因此,在嵌入式系统中,NOR FLASH很适合作为启动程序的存储介质.NOR FLASH的读取和RAM很类似(只要能够提供数据的地址,数据总线就能够正确的给出数据),但不可以直接进行写操作.对NOR FLASH的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作.从支持的最小访问单元来看,NOR FLASH一般分为8 位的和16位的(当然,也有很多NOR FLASH芯片同时支持8位模式和是16 位模式,具体的工作模式通过特定的管脚进行选择).对8位的NOR FLASH芯片,或是工作在8-BIT模式的芯片来说,一个地址对应一个BYTE(8-BIT)的数据.例如一块8-BIT的NOR FLASH,假设容量为4个BYTE.那芯片应该有8个数据信号D7-D0 和2个地址信号,A1-A0.地址0x0对应第0个BYTE,地址0x1对应于1BYTE,地址0x2对应于第2个BYTE,而地址0x3则对应于第3 个BYTE.对16位的NOR FLASH芯片,或是工作在16-BIT模式的芯片来说,一个地址对应于一个HALF-WORD(16-BIT)的数据.例如,一块16-BIT的NOR FLASH,假设其容量为4个BYTE.那芯片应该有16 个数据信号线D15-D0 和1个地址信号A0.地址0x0对应于芯片内部的第0个HALF-WORD,地址0x1对应于芯片内部的第1个HALF-WORDFLASH一般都分为很多个SECTOR,每个SECTOR包括一定数量的存储单元.对有些大容量的FLASH,还分为不同的BANK,每个BANK包括一定数目的SECTOR.FLASH的擦除操作一般都是以SECTOR,BANK 或是整片FLASH为单位的.在对FLASH进行写操作的时候,每个BIT可以通过编程由1变为0,但不可以有0修改为1.为了保证写操作的正确性,在执行写操作前,都要执行擦除操作.擦除操作会把FLASH的一个SECTOR,一个BANK或是整片FLASH的值全修改为0xFF.这样,写操作就可以正确完成了.由于NOR FLASH没有本地坏区管理,所以一旦存储区块发生毁损,软件或驱动程序必须接手这个问题,否则可能会导致设备发生异常. 在解锁、抹除或写入NOR FLASH区块时,特殊的指令会先写入已绘测的记忆区的第一页(Page).接着快闪记忆芯片会提供可用的指令清单给实体驱动程序,而这些指令是由一般性闪存接口(CommON FLASH memory Interface, CFI)所界定的. 与用于随机存取的ROM不同,NOR FLASH 也可以用在存储设备上;不过与NAND FLASH相比,NOR FLASH的写入速度一般来说会慢很多.2. NOR Flash的烧写方式以下内容,如无特别说明,处理器指的是ARM 处理器,FLASH 指的都是NOR FLASH.另外,BYTE指的是8-BIT的数据单元,HALF-WORD代表的是16-BIT的数据单元,而WORD 则代表了32-BIT的数据单元.2.1 处理器寻址ARM 可以说是目前最流行的32位嵌进式处理器.在这里只提一下ARM处理器的寻址,为后面做个展垫.从处理器的角度来看,系统中每个地址对应的是一个BYTE的数据单元.这和很多别的处理器都是一样的. 2.2 处理器和NOR FLASH的硬件连接从前面的先容,我们知道从处理器的角度来看,每个地址对应的是一个BYTE 的数据单元.而,NOR FLASH 的每个地址有可能对应的是一个BYTE的数据单元,也有可能对应的是一个HALF-WORD的数据单元.所以在硬件设计中,连接ARM处理器和NOR FLASH时,必须根据实际情况对地址信号做特别的处理.假如ARM处理器外部扩展的是8-BIT的NOR FLASH, 数据线和地址线的连接应该如图1所示. 从图中我们可以看到,处理器的数据信号D0-D7和FLASH的数据信号D0-D7是逐一对应连接的,处理器的地址信号A0-An和NOR FLASH的地址信号A0-An 也是逐一对应连接的.假如ARM处理器外部扩展的是16-BIT的NOR FLASH, 地址线必须要错位连接. 图2给了一个ARM处理器和16-BIT NOR FLASH的连接示意图.如图2所示,ARM处理器的数据信号D0-D15和FLASH 的数据信号D0-D15是逐一对应的.而ARM处理器的地址信号和NOR FLASH 的地址信号是错位连接的,ARM的A0悬空,ARM 的A1 连接FLASH 的A0,ARM 的A2连接FLASH的A1,依次类推.需要错位连接的原因是:ARM处理器的每个地址对应的是一个BYTE 的数据单元,而16-BIT 的FLASH 的每个地址对应的是一个HALF-WORD(16-BIT)的数据单元.为了保持匹配,所以必须错位连接.这样,从ARM处理器发送出来的地址信号的最低位A0对16-BIT FLASH来说就被屏蔽掉了.补充说明:∙一般来说,ARM处理器内部要设置相应的寄存器,告诉处理器外部扩展的FLASH的位宽(8-BIT/16-BIT/32-BIT) .这样,处理器才知道在访问的时候如何从FLASH正确的读取数据;∙有些ARM处理器内部可以设置地址的错位.对于支持软件选择地址错位的处理器,在连接16-BIT FLASH 的时候,硬件上可以不需要把地址线错位.读者设计的时候,请参考MCU的数据手册,以手册为准,以免造成不必要的麻烦;∙假如处理器支持内部设置地址错位,在实际访问的时候,送出的地址实际上是在MCU内部做了错位处理,其作用是等效于硬件连接上的错位的.上面的描述可能比较抽象,下面让我们来看2个ARM处理器访问16-BIT FLASH的例子:例子1:ARM处理器需要从地址0x0读取一个BYTEa.ARM处理器在地址线An-A0上送出信号0x0;b.16-BIT FLASH在自己的地址信号An-A0上看到的地址是0x0,然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;c.ARM处理器知道访问的是16-BIT的FLASH,从D7-D0上读取所需要的一个BYTE的数据.例子2:ARM处理器需要从地址0x1读取一个BYTEa.ARM处理器在地址线An-A0上送出信号0x1;b.16-BIT FLASH在自己的地址信号An-A0上看到的地址依然是0x0, 然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;c.ARM处理器知道访问的是16-BIT的FLASH,从D15-D8 上读取所需要的一个BYTE 的数据.2.3 从软件角度来看ARM 处理器和NOR FLASH 的连接从软件的角度来理解ARM处理器和FLASH的连接.对于8-BIT的FLASH的连接,很好理解,由于ARM处理器和8-BIT FLASH的每个地址对应的都是一个BYTE 的数据单元.所以地址连接毫无疑问是逐一对应的.假如ARM 处理器连接的是16-BIT 的处理器,由于ARM 处理器的每个地址对应的是一个BYTE的数据单元,而16-BIT FLASH 的每个地址对应的是一个HALF-WORD 的16-BIT的数据单元.所以,也毫无疑问,ARM处理器访问16-BIT处理器的时候,地址肯定是要错开一位的.在写FLASH驱动的时候,我们不需要知道地址错位是由硬件实现的,还是是通过设置ARM处理器内部的寄存器来实现的,只需要记住2点:a.ARM处理器访问8-BIT FLASH的时候,地址是逐一对应的;b.ARM处理器访问16-BIT FLASH的时候,地址肯定是错位的.2.4 8-BIT FLASH 烧写驱动实例- HY29F040HY29F040是现代公司的一款8-BIT的NOR FLASH.在这个小节里,我们以这个芯片为例子,讲述如何对8-BIT NOR FLASH进行操作.HY29F040的容量为512K-BYTE,总共包括8 个SECTOR,每个SECTOR 的容量是64K-BYTE.该芯片支持SECTOR擦除,整片擦除和以BYTE 为基本单位的写操纵.HY29F040的命令定义如表-1所示.下面,我们来看看如何实现基本的擦除和编程操作.在本节后面的描述中,我们使用了下面的2 个定义:U32 sysbase; //该变量用来表示 FLASH 的起始地址#define SysAddr8(sysbase, offset) ((volatile U8*)(sysbase)+(offset)) //用来方便对指定的 FALSH 地址进行操作宏SysAddr8定义了一个BYTE(8-BIT)指针,其地址为(sysbase + offset).假设FLASH的起始地址为0x10000000,假如要将0xAB写到FLASH的第一个BYTE中往,可以用下面的代码:*SysAddr8(0x10000000, 0x1) = 0xAB;注意:在本节后面的描述中,sysbase代表的是FLASH的起始地址,而SysAddr8中的offset则代表了相对于FLASH起始地址的BYTE偏移量.offset也是8-BIT FLASH在自己的地址信号An-A0上看到的地址.a. 整片擦除操作整片擦除操纵共需要6个周期的总线写操作:i.将0xAA写到FLASH 地址0x5555;ii.将0x55 写到FLASH 地址0x2AAA;iii.将0x80 写到FLASH 地址0x5555;iv.将0xAA写到FLASH 地址0x5555;v.将0x55 写到FLASH 地址0x2AAA;vi.将0x10 写到FLASH 地址0x5555.对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA; //将值 0xAA写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0x80; //将值 0x80 写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x5555) = 0xAA; //将值 0xAA写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0x10; //将值 0x10 写到 FLASH 地址 0x5555b. SECTOR擦除操作SECTOR的擦除操纵共需要6个周期的总线写操作:i.将0xAA写到FLASH 地址0x5555;ii.将0x55 写到FLASH 地址0x2AAA;iii.将0x80 写到FLASH 地址0x5555;iv.将0xAA写到FLASH 地址0x5555;v.将0x55 写到FLASH 地址0x2AAA;vi.将0x30 写到要擦除的SECTOR 对应的地址.对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA; //将值 0xAA写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0x80; //将值 0x80 写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x5555) = 0xAA; //将值 0xAA写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, addr) = 0x30; //将值 0x30 写到要擦除的 SECTOR 对应的地址c. BYTE擦除操作写一个BYTE 的数据到FLASH中往,需要4个周期的总线写操作:i.将0xAA写到FLASH 地址0x5555;ii.将0x55 写到FLASH 地址0x2AAA;iii.将0xA0 写到FLASH 地址0x5555;iv.将编程数据(BYTE)写到对应的编程地址上.对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA; //将值 0xAA写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0xA0; //将值 0xA0 写到 FLASH 地址 0x5555*SysAddr8(sysbase, addr) = data; //将一个 BYTE的数据写到期看的地址2.5 16-BIT FLASH 烧写驱动实例- SST39VF160SST39VF160是SST公司的一款16-BIT的NOR FLASH. 在这个小节里, 我们以SST39VF160为例子, 讲述如何对16-BIT NOR FLASH进行操作.对8-BIT FLASH的操作很好理解,但对16-BIT FLASH 的操作理解起来要晦涩很多.我尽力描述得清楚些.SST39VF160的容量为2M-BYTE , 总共包括512个SECTOR, 每个SECTOR 的容量是4K-BYTE. 该芯片支持SECTOR擦除,整片擦除和以HALF-WORD 为基本单位的写操纵.SST39VF160 的命令定义如表-2 所示.在表2 中,由于所有命令都是从FLASH的角度来定义的. 所以, 所有的地址都是HALF-WORD地址, 指的是16-BIT FLASH在自己的地址信号An-A0上看到的地址.在本节后面的描述中,我们使用了下面的2个定义:U32 sysbase; //该变量用来表示 FLASH 的起始地址#define SysAddr16(sysbase, offset) ((volatile U16*)(sysbase)+(offset)) //用来方便对指定的 FALSH 地址进行操作SysAddr16(sysbase, offset)首先定义了一个16-BIT HALF-WORD的指针,指针的地址为sysbase,然后根据offset做个偏移操纵. 由于HALF-WORD指针的地址是2个BYTE对齐的, 所以每个偏移操纵会使得地址加2. 终极, SysAddr16 (sysbase, offset)相当于定义了一个HALF-WORD的指针,其终极地址为(sysbase + 2offset) .在使用SysAddr16的时候,将sysbase设置成FLASH 的起始地址,offset 则可以理解为相对于FLASH 起始地址的HALF-WORD 偏移量或是偏移地址.假设FLASH 的起始地址为0x10000000,SysAddr16(0x10000000, 0)指向16-BIT FLASH 的第0 个HALF-WORD, SysAddr16(0x10000000, 1指向16-BIT FLASH的第1个HALF-WORD.依次类推.假如要将0xABCD分别写到FLASH 的第0个和第1个HALF-WORD 中往,可以用下面的代码:*SysAddr16(0x10000000, 0x0) = 0xABCD;*SysAddr16(0x10000000, 0x1) = 0xABCD;接下来,我们分别从ARM处理器的角度和FLASH的角度来具体分析一下.从ARM 的角度来看:假设FLASH 的起始地址为0x10000000,由于ARM 处理器知道FLASH 的地址空间为0x10000000 ~ (0x10000000 +FLASH容量–1),所以在对这个地址空间进行访问的时候,会设置好FLASH的片选信号,并将低位的地址输出到地址信号上.以*SysAddr16(0x10000000, 0x1) =0xABCD 为例.从ARM 处理器的角度来看,该操纵是把0xABCD写到地址0x10000002上往.所以ARM 处理器终极会在它的地址信号An-A0输出地址0x2,同时会在D15-D0 上输出0xABCD.从FLASH 的角度来看:还是以*SysAddr16(0x10000000, 0x1) = 0xABCD 为例,FLASH看到的地址是多少呢?接着分析.ARM 处理器在执行操纵的时候,会设置好相应的FLASH片选使能信号,并在ARM的地址信号An-A0上输出0x2.由于ARM和16-BIT FLASH的地址信号的连接是错开一位的, 所以, FLASH终极在自己的地址An-A0上看到的信号是0x1, 相当于将ARM处理器输出的地址往右做了一个移位操纵,恰好对应的是FLASH的第1 个HALF-WORD.同时,FLASH会在自己的D15-D0上看到数据0xABCD.通过上面的分析,我们知道SysAddr16 中指定的offset 的值就是16-BIT FLASH 在自己的地址An-A0 上看到的值.所以,我们可以很方便的通过SysAddr16(sysbase, offset) 对FLASH 进行操纵,其中sysbase 代表FLASH 起始地址,offset 则代表了FLASH 的第几个HALF-WORD(HALF-WORD 偏移量或偏移地址)注意:a.在本节后面的描述中,SysAddr16中的SYSBASE代表的是FLASH的起始地址,而SysAddr16中的OFFSET则代表了相对于FLASH起始地址的HALF-WORD 偏移量或偏移地址.OFFSET 的值也是16-BIT FLASH在自己的地址信号An-A0上看到的值;b.在SST39VF160的命令定义中,所有的地址都是针对FLASH的HALF-WORD地址,指的是在FLASH自己的地址信号An-A0上看到的地址.整片擦除操作整片擦除操纵共需要6个周期的总线写操作:a.将0x00AA写到FLASH HALF-WORD 地址0x5555;b.将0x0055 写到FLASH HALF-WORD地址0x2AAA;c.将0x0080 写到FLASH HALF-WORD地址0x5555;d.将0x00AA写到FLASH HALF-WORD 地址0x5555;e.将0x0055 写到FLASH HALF-WORD地址0x2AAA;f.将0x0010 写到FLASH HALF-WORD地址0x5555.对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 0x00AA 写到 FLASH HALF-WORD地址0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值 0x0055 写到 FLASH HALF-WORD地址0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0080; //将值 0x0080 写到 FLASH HALF-WORD地址0x5555*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 0x00AA 写到 FLASH HALF-WORD地址0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值 0x0055 写到 FLASH HALF-WORD地址0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0010; //将值 0x0010 写到 FLASH HALF-WORD地址0x5555SECTOR擦除操作SECTOR的擦除操纵共需要6个周期的总线写操作:a.将0x00AA写到FLASH HALF-WORD 地址0x5555;b.将0x0055 写到FLASH HALF-WORD地址0x2AAA;c.将0x0080 写到FLASH HALF-WORD地址0x5555;d.将0x00AA写到FLASH HALF-WORD 地址0x5555;e.将0x0055 写到FLASH HALF-WORD地址0x2AAA;f.将0x0030 写到要擦除的SECTOR 对应的HALF-WORD地址.对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 0x00AA 写到 FLASH HALF-WORD地址0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值 0x0055 写到 FLASH HALF-WORD地址0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0080; //将值 0x0080 写到 FLASH HALF-WORD地址0x5555*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 0x00AA 写到 FLASH HALF-WORD地址0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值 0x0055 写到 FLASH HALF-WORD地址0x2AAA*SysAddr16(sysbase, addr >> 1) = 0x0030; //将值 0x0030 写到要擦除的 SECTOR 对应的HALF-WORD地址注意:上面的代码中第6个操纵周期中的ADDR 是从ARM处理器的角度来看的BYTE地址,由于在擦除的时候,用户希看指定的是从ARM 的角度看到的地址,这样更方便和更直观.而在SysAddr16 的宏定义中,OFFSET 表示的是相对于FLASH起始地址的HALF-WORD 偏移量,或是FLASH在自己的地址信号An-A0上看到的地址.所以需要执行一个右移操作,把ADDR转换成HALF-WORD 地址.举例说明,SST39VF160 每个SECTOR 的大小是4K-BYTE.从ARM 处器的角度和用户的角度来看,SECTOR-0 相对于FLASH起始地址的BYTE地址是0x0;从FLASH来看SECTOR-0 的HALF-WORD地址是0x0.从ARM处理器的角度和用户的角度来看, FLASH SECTOR-1相对于FLASH 起始地址的BYTE地址0x1000; 从FLASH来看, SECTOR-1的HALF-WORD地址应该是(0x1000 >> 1) = 0x800.假如要擦除SECTOR-0,上面代码的第6条指令应该是:*SysAddr16(sysbase, 0x0 >> 1) = 0x0030;假如要擦除SECTOR-1,上面代码的第6条指令应该是:*SysAddr16(sysbase, 0x1000 >> 1) = 0x0030;HALF-WORD 编程操作写一个HALF-WORD的数据到FLASH中往,需要4个周期的总线写操作:a.将0x00AA写到FLASH HALF-WORD 地址0x5555;b.将0x0055 写到FLASH HALF-WORD地址0x2AAA;c.将0x00A0 写到FLASH HALF-WORD 地址0x5555;d.将编程数据(HALF-WORD)写到对应的HALF-WORD地址.对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 0x00AA 写到 FLASH 地址 0x5555 *SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值 0x0055 写到 FLASH 地址 0x2AAA *SysAddr16(sysbase, 0x5555) = 0x00A0; //将值 0x00A0 写到 FLASH 地址 0x5555 *SysAddr16(sysbase, addr >> 1) = data; //将数据写到对应的 HALF-WORD 地址注意:上面的代码中第4个操作周期中的ADDR是从ARM处理器的角度来看的BYTE地址, 由于在执行写操作的时候,用户希看指定的是从ARM 的角度看到的地址,这样会更方便和更直观.而在SysAddr16 的宏定义中,OFFSET表示的是相对于FLASH起始地址的HALF-WORD偏移量. 所以需要执行一个右移操纵, 把它转换成HALF-WORD地址.例如要将数据0x0123 写到地址0x0处,对应的是FLASH 的第0 个HAFL-WORD,对应的HALF-WORD 地址应该是0x0,上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x0 >> 1) = 0x0123;又如要将数据0x4567写到地址0x2处, 对应的是FLASH的第1个HALF-WORD, 对应的HALF-WORD地址应该是0x1, 上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x2 >> 1) = 0x4567;再如要将数据0x89AB写到地址0x4处, 对应的是FLASH的第2个HALF-WORD, 对应的HALF-WORD 地址应该是0x2,上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x4 >> 1) = 0x89AB;还如要将数据0xCDEF 写到地址0x6处,对应的是FLASH 的第3 个HALF-WORD,对应的HALF-WORD 地址应该是0x3,上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x6 >> 1) = 0xCDEF;2.6 结束语以上简单介绍了NOR FLASH原理,以及如何对NOR FLASH进行操作, 但没有包括状态查询, 保护等其他操纵. 对于更复杂的多片FLASH并联的情况也没有讨论,如有需要者,可自行分析.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式资源免费分享区
一片Norflash上建立bootrom和TFFS文件系统
开发环境:2410+AM29LV160DB(前 0.5m 存放 bootrom,后 1.5m 建立 TFFS) NorFLash 挂接 bank0 由网络上 sst39vf160 源代码修改而来 主要修改了文件名、命令字序列、加入屏蔽中断、mmu 映射,其他部分改动很少 ①关键问题描述与解决措施 问题描述:在 wshell 中调用 tffsDevFormat -> tffsDevFormat Identify AM29LV160 media.0x2249 shine**********identify ok shine**********lv160MTDErase routine(进入擦除命令后停止) shine**********ret is 100000,call by lv160MTDMap0(此处是我在 map 函数中 增加的打印) Exception number 12: Task: 0x33e18b98 (t17) Instruction prefetch abort Program Counter: 0x200000 Status Register: 0x20000097 value = 0 = 0x0 结果系统进入异常 解 决措施:需要在擦除和写操作中屏蔽中断,因为 Flash 在擦除、写和读 ID 状态时,不能正常读取 Flash 中数据。
而 VxWorks 的异常入口位于 Flash 存储 器的开始处,异常发生时不能得到正常的入口指令,会导致系统跑飞。
解决这个 问题的最好方法是添加第 2 片 Flash 存储器, 专门用于文件系 统。
(摘自 Amine 的 44B0 调试笔记) ②在 lv160mtd.c 中(把文件名 sst39vf160 改为 lv160mtd.c) 增加如下头文件 # include "intLib.h" /* include intLock() and intUnlock() */ 屏蔽中断函数使用示例: 代码: int Eint_lock_key; int_lock_key = intLock (); /* disable interrupts*/ intUnlock (int_lock_key); /* restore interrupt enable setting*/ 代码:
嵌入式资源免费分享区
#define #define #define #define #define #define #define #define #define #define
SETUP_ERASE 0x80 SETUP_WRITE 0xa0 READ_ID 0x90 SECTOR_ERASE 0x30 BLOCK_ERASE 0x50 READ_ARRAY 0xf0 UNLOCK_1 0xaa UNLOCK_2 0x55 UNLOCK_ADDR1 0x555 UNLOCK_ADDR2 0x2aa+ /*设备 ID*/
#define AM29LV160_DEID 0x2249 ③在 Makefile 中 加入 代码: MACH_EXTRA= lv160mtd.o
④在 sysTffs.c 中 #undef INCLUDE_TFFS_BOOT_IMAGE 这里我们不用 sysTffsFormat 函数, 直接指定地址, tffsDevFormat 函数即可。
用 ⑤在 sysLib.c 中 修改如下映射 代码: { (void *) (ROM_BASE_ADRS), (void *) (ROM_BASE_ADRS), ROUND_UP (ROM_SIZE_TOTAL, PAGE_SIZE), VM_STATE_MASK_VALID|VM_STATE_MASK_WRITABLE| VM_STATE_MASK_CACHEABLE, VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT }, 其中 ROM_BASE_ADRS 为 0x00000000 ROM_SIZE_TOTAL 为 0x00200000(2m) 调试中的经验总结: ①在没加入屏蔽中断时调用 lv160MTDIdentify 显示如下: Data abort Exception address: 0x200000
嵌入式资源免费分享区
Current Processor Status Register: 0x20000097 定位到 flSetWindowBusWidth 函数,这个定位误导使我走错误的方向,花了一 个星期才走出这个错误 ②mmu 映射 如果出现 printf ("%d: **** communication failed with error %d ****\n",) 形式的输出 则表示 mmu 映射不正确。
如果 shell 启动不了,也有可能是 mmu 映射的问题 ③调试时要在函数的入口加入该函数的打印 如:shine**********lv160MTDErase routine 表示进入到 lv160MTDErase 函数
。