共3条
1/1 1 跳转至页
[转帖]在HCO5272-R1下实现jffs
by coldfire
去年3月份写的,mcf5272的那款,基本能实现jffs,只是后来一直没有再用了。
在HCO5272-R1下第二片flash芯片中实现jffs文件系统
1.目的:在华恒HHCO5272-R1下第二片flash芯片中实现jffs文件系统。
2.www.uClinux.org下载最新的2.4内核的for ColdFire的uClinux版本,其发布时间为2001年11月12日,2002年3月6日发布的也可以。将其中的flash.c文件代替华恒给的2.0.38内核的uClinux的flash.c文件。或者是到Axis Communications公司的网站去下载新的flash.c文件, Revision 1.2 2001/01/11 03:56:48 ,2000年8月11日发布的。
3. flash.c文件,使之于我们的开发板HHCO5272-R1上的flash相匹配,我们的flash芯片型号为AM29LV160BB,其修改如下:
①. 在文件开头定义宏的地方加入一句:
#include
在新的flash.c文件中,对flash芯片编程时延时用的是void udelay(int delay)函数,其包含在delay.h中,该函数表示延时delay微秒,在原来的flash.c文件中用的是void nop(void)函数,该函数大约延时10微秒,在uClinux的66M时钟的5272下。
②. 修改D5_MASK宏的定义,将其由
#define D5_MASK 0X2020 改为 #define D5_MASK 0X0020
在对flash芯片编程时,当读D5位时,D5为1,则表示编程超时,即可能是错误编程。对于我们具体的AM29LV160BB芯片来说,其值应该修改为0X0020,即高8位在编程时,读出的数据是不定的,将其屏蔽。
③. 修改getchip()函数
在getchip函数中找到 if (ptr >= chips[i].start
&& ptr < (chips[i].start + chips[i].size)) {
这句话,将其修改为:
if (ptr >= chips[i].start
&& ptr < (chips[i].start + chips[i].size-1)) {
因为在华恒开发板中,第二片flash芯片的起始地址为:0xFFE00000,即上面
语句中的chips[i]值,其大小为0x00200000,即chips[i]值,那么在上面中
chips[i].start + chips[i].size=0xFFE00000+0x00200000=0,因为chips[i].start
和chips[i].size都为32位的无符号数,因此须将其值减一。
相同的错误在flash.c中有好几出:
在do_flash_request函数中的
if(fptr + fsize > part->start + part->size) {
修改为 if(fptr + fsize > part->start + part->size-1) {
及 opsize = (fptr + fsize) > (chip->start + chip->size) ?
(chip->start + chip->size - fptr) : fsize;
修改为 opsize = (fptr + fsize) > (chip->start + chip->size-1) ?
(chip->start + chip->size - fptr) : fsize;
在flash_safe_read函数中的
if(fptr + count > part->start + part->size) {
修改为 if(fptr + count > part->start + part->size-1) {
在flash_safe_write函数中的
if(fptr + count > part->start + part->size) {
修改为 if(fptr + count > part->start + part->size-1) {
在flash_write函数中的
fsize = (ptr + size) > (chip->start + chip->size) ?
(chip->start + chip->size - ptr) : size;
修改为 fsize = (ptr + size) > (chip->start + chip->size-1) ?
(chip->start + chip->size - ptr) : size;
④.修改flash_probe函数
找到 #ifdef CONFIG_COLDFIRE
chips[0].start = (unsigned char *)(0x00200000);
修改为 #ifdef CONFIG_COLDFIRE
chips[0].start = (unsigned char *)(0xffe00000);
⑤.修改flash_init函数
在开头加入一句
flash_probe();
这句话是让程序自己找到关于flash芯片的信息,即bootblock信息,生产商,大小,扇区分布等。
4. 参照华恒的用户手册中关于加入应用程序的方法,把uClinux/usr/jffs-tools目录下的erase加入uClinux中的/bin目录中。
5. 加载设备flash,建立设备文件
进入uClinux/romfs/dev目录,
mknod flash0 b 60 16
mknod flash1 b 60 17
mknod flash2 b 60 18
在这里,flash0的地址为:0xFFE00000—>0xFFE1FFFF,大小为64k,目前不可写。
flash1的地址为:0xFFE20000—>0xFFE1AFFF,大小为1664k,已经实现jffs文件系统。
flash2的地址为:0xFFE20000—>0xFFE1AFFF,大小为320k,还没有jffs文件系统,jffs有点错误,修改起来太麻烦,要改的地方很多,要修改jffs
文件系统的代码,这一步不做了。
6.修改完上面的以后,在编译内核中选择flash block设备以及jffs文件系统,重编译内
核,烧进板子里面去。
7. 进入uClinux,当第一次用flash芯片时,先运行erase /dev/flash1,将flash1全部擦
除,将flash1 mount上去,就能作为jffs文件系统来用了,能够read/write/remove等文件操作。
参考资料:AM29LV160BB的flash芯片资料
《linux从入门到精通》
《unix环境高级编程》
华恒关于HHCO5272-R1技术手册
[align=right][color=#000066][此贴子已经被作者于2003-7-24 9:12:22编辑过][/color][/align]
关键词: 转帖 HCO5272-R1 实现 flash 文件
共3条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |