一片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芯片与编程设备,并进行初始化设置。
- 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 函数
。