共4条
1/1 1 跳转至页
[转帖]uclinux下JFFS2文件系统移植
uclinux下Nand Flash的JFFS2文件系统的移植1
发信人: threewater (吃饱了混天黑), 信区: Circuit
标 题: uclinux下Nand Flash的JFFS2文件系统的移植(1)
发信站: BBS 水木清华站 (Wed Jul 2 05:03:51 2003), 转信
uclinux下Nand Flash的JFFS2文件系统的移植(1)
继续上一篇《uClinux下移植Ne2000兼容的网卡驱动程序》中介绍的平台和操作系统,开
始写JFF2的感想。虽然JFFS2的移植弄出来有一段时间了,但是,前一段时间忙着期末考
试,无心写心得。昨天总算考完了,我就继续罗嗦那段时期的经历吧,希望把我遇到的
问题和解决的方法和大家共享。错误之处也请不吝指出。
我使用的uClinux的硬件平台还是44B0那个板子具体的情况参见《uClinux下移植Ne2000
兼容的网卡驱动程序》中的介绍。Flash我用的是三星公司的K9F2808--16MByte的Nand
Flash。
开始,先看看有没有其他人的经验或者文章什么。用uclinux和jffs2关键词google了一
下,找到了很多乱七八糟的东西,感觉唯一有用的也就是《The Linux MTD, JFFS
HOWTO》,这篇文章写的比较细,我就是看这个逐渐地入了门。
首先,make menuconfig,把mtd打开。可是,发现我拿到的内核中,没有这个mtd选项。
比较一下,发现uClinux-dist-20030305里面,编译4510的时候,就有mtd这个选项。比
较郁闷,不过还是不甘心,仔细看看arch/armnommu/config.in文件,发现如下:
if [ "$CONFIG_ALIGNMENT_TRAP" = "y" ]; then
source drivers/mtd/Config.in
fi
这就是问题了。不过还是不清楚这个CONFIG_ALIGNMENT_TRAP是干什么的。从字面上猜测
可能是处理非对齐异常的。不过,如果我在前面定义了CONFIG_ALIGNMENT_TRAP,那么我
的内核就不能正常的运行,看了半天源码,也没看懂,算了,索性把这个就给注释掉了
(因为uClinux-dist-20030305里面就没有这个if)。这样,mtd就可以使用了。
接下来就是定制内核,在MTD中,开启CONFIG_MTD_PARTITIONS、CONFIG_MTD_CHAR、CONF
IG_MTD_BLOCK,选中NAND Device Support中的全部选项(因为我用的是Nand Flash)。
再到File system中选重JFFS2文件系统。
系统是怎么加载底层的Flash设备呢,很容易在/drivers/mtd/nand/目录下找到相关的代
码。先看看Makefile,有如下一行:
obj-$(CONFIG_MTD_NAND_SPIA) += spia.o
看来只有编译的时候定义了CONFIG_MTD_NAND_SPIA,spia.c才可以被编译。spia.c是一
个关键的问题,Nand Flash的驱动程序就是从这里加载的。我不想改spia.c中的东西,
就照着spia.c复制了一个文件arm_nand.c,在/drivers/mtd/nand/Makefile中添加
obj-$(CONFIG_MTD_NAND_ARM) +=arm_nand.o
并修改drivers/mtd/nand/config.in文件,添加如下内容:
if [ "$CONFIG_ARM" = "y" ]; then
dep_tristate 'NAND Flash device on ARM board' CONFIG_MTD_NAND_ARM
$CONFIG_MTD_NAND
fi
这样,在定制内核的时候,只要是ARM的开发平台就可以使用我的这个arm_nand.c驱动程
序了。这个arm_nand.c代码(原来的spia.c),很容易读懂,就是不熟悉Nand Flash的
人,对照着芯片的Datasheet也很快就能看明白,需要改的就是你的板子上的Nand
Flash几个控制信号线(主要是ALE、CLE、CE)的地址,输入输出的地址等等。我为了以
后方便,把这些地址都通过宏定义放到了config.in中。
然后,在arm_nand.c代码中,最关键的就是partition_info的定义,我改成如下:
const static struct mtd_partition partition_info[] = {
/* { name: "SPIA flash partition 1",
offset: 0,
size: 2*1024*1024 },*/
#ifdef CONFIG_ARCH_S3C44B0
#ifdef CONFIG_ARCH_S3C44B0
{ name: "Nand flash partition",
offset: 2*1024*1024,
size: 14*1024*1024 }
#endif
};
#define NUM_PARTITIONS 1
很容易理解,因为我的nand flash中,前2M的空间,用于存放uclinux的kernel和romdis
k,启动的时候通过bootloader加载到内存中。所以,这个空间是不能用的。剩下的14MB
,就是划分成一个Flash盘准备上JFFS2了。
这样,似乎就可以了。编译内核,然后运行,
结果有如下错误:
readb called, but not implemented<2>kernel BUG at traps.c
--
人生最大的痛苦就是
想买的芯片买不到
[m[1;34m※ 来源:·BBS 水木清华站 smth.org·[FROM: 61.48.10.167][m
[align=right][color=#000066][此贴子已经被作者于2003-7-24 9:11:45编辑过][/color][/align]
关键词: 转帖 uclinux JFFS2 文件 系统 移植
uclinux下Nand Flash的JFFS2文件系统的移植2
发信人: threewater (吃饱了混天黑), 信区: Circuit
标 题: uclinux下Nand Flash的JFFS2文件系统的移植(2)
发信站: BBS 水木清华站 (Wed Jul 2 12:23:20 2003), 转信
uclinux下Nand Flash的JFFS2文件系统的移植(2)
readb的这个问题其实很简单,用SourceInsight跟踪基层调用就知道,是因为在我的44b
0的这个移植版本中根本就没有readb的定义,在include/asm-armnommu/arch-s3c44b0/i
o.h文件中添加:
#define readb(b) __arch_getb(b)
#define readw(b) __arch_getw(b)
#define readl(b) __arch_getl(b)
#define writeb(v,b) __arch_putb(v,b)
#define writew(v,b) __arch_putw(v,b)
#define writel(v,b) __arch_putl(v,b)
其中__arch_xxx也是在这个文件中定义,或者可以干脆直接(*(volatile unsigned xxx
*)(xxx))。好了,系统启动,果然,找到Nand Flash:
NAND device: Manufacture ID: 0xec, Chip ID: 0x73 (Samsung KM29U128T)
Creating 1 MTD partitions on "Samsung KM29U128T":
0x00200000-0x01000000 : "Nand flash partition"
mtd: Giving out device 0 to Nand flash partition
系统启动以后,用cat /proc/mtd,可以显示如下信息。
dev: size erasesize name
mtd0: 00e00000 00004000 "Nand flash partition"
没错了,Nand Flash的信息,容量,还有擦除的block的大小都没有问题。
然后,按照《The Linux MTD, JFFS HOWTO》所说,编译mtd工具,我是从网上下的mtd-s
napshot-20030508,用mkfs.jffs2生成jffs2的映象文件(jffs2.img),这个和genromf
s差不多。然后,在交叉编译mtd-snapshot-20030508,主要是用erase来擦除Flash。
接着,编辑romdisk,在/dev目录下,建立创建文件@mtd0,c,90,0、@mtdblock0,b,31,0
。这就是用来访问的设备了。前者是字符设备类型,后者是block类型。
下面就可以用在目标板上
cp /var/mnt/jffs2.img /dev/mtd0
把前面生成的jffs2格式的映象复制到mtd0设备中就是我们的Nand Flash了。
结果,发现系统死掉了。5555555555
te_ecc中死掉了。用printk继续定位,把结果锁定在了下面的调用
wake_up (&this->wq);
因为我对系统内核不了解,当时连这个wake_up的函数是干什么的都不知道:(,用Source
Insight跟踪了好几天都没有头绪,最后,干脆放弃了,整天上课的时候捧着一本《Linu
x内核源码情景分析》来看(主要是上册),感觉写得不错,几天下来,收获颇丰。不过
,感还是不能解决前面的问题……
待续
--
欢迎访问北航bbs电路与系统版(CirucitSystem)
北航的bbs:202.112.137.7
[m[1;35m※ 来源:·BBS 水木清华站 smth.org·[FROM: 61.48.10.167][m
uclinux下Nand Flash的JFFS2文件系统的移植3
发信人: threewater (吃饱了混天黑), 信区: Circuit
标 题: uclinux下Nand Flash的JFFS2文件系统的移植(3)
发信站: BBS 水木清华站 (Sat Jul 5 06:47:47 2003), 转信
uclinux下Nand Flash的JFFS2文件系统的移植(3)
拖拖拉拉的这个问题困扰了我很长时间,终于《Linux内核源码情景分析》中找到了wake
_up及其相关调用的详细代码分析,看上去这里似乎不会出什么问题,那么,问题就只能
在所传递的参数&this->wq上了。继续SourceInsight,发现参数this应该是在我前面照
抄的驱动程序drivers/mtd/nand/arm_nand.c中初始化的,是不是this->wq没有初始化?
可是,这个代码是照着人家的抄的啊,怎么可能出问题?不过,现在看来只能去仔细的
读一读了。
按照《Linux内核源码情景分析》中的分析,很容易的知道了this->wq是一个链表结构,
看来就是因为他没有初始化了。毫不犹豫地在arm_nand.c中加上:
INIT_LIST_HEAD(&this->wq.task_list);
(关于linux中链表的使用请参考《Linux内核源码情景分析》中的说明)
这样,试了一下,果然系统不死了。
接下来执行erase擦除一下(因为前面测试的时候我知道,虽然系统死了,但是,Nand
Flash的第一个扇区还是写进去数了,所以,先Erase试试),结果有如下错误:
nand_erase: start = 0x0026c000, len = 16384
Erase at 0x0026c000 finished, but state != MTD_ERASE_DONE. State is 0x0
instead
查找代码,定位错误地方,发现在drivers/mtd/nand.c的nand_erase函数中,
nand_deselect ();
/* Do call back function */
if (instr->callback)
instr->callback (instr);
就是在这里(其中,指针函数callback指向fs/jffs2/Erase.c中的jffs2_erase_callbac
k),系统通过callback来判断instr->state的状态,来决定是不是已经成功擦除。所以
,改写成:
/* Do call back function */
instr->state=MTD_ERASE_DONE; file://add by threewater
if (instr->callback)
instr->callback (instr);
问题解决,擦除成功。
然后,就可以
cp /var/mnt/jffs2.img /dev/mtd0
也没有问题,接着就是
mount -t jffs2 /var/jffs2 /dev/mtdblock0
好了,文件系统成功的mount上了,也可以看到文件和目录了。高兴之余,再继续测试文
件系统的读写:
[/var/jffs2]cp /root/hello .
nand_read_ecc: from = 0x002006e4, len = 16
nand_writev: to = 0x002006e4, len = 68
Write of 68 bytes at 0x000006e4 failed. returned 0, retlen 69
cp: unable to open `./hello': Input/output error[/var/jffs2]cp /root/hello .
还是有问题。Sigh!
待续
兄弟,你真NB,我:
顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!
共4条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 | |
【换取逻辑分析仪】rtthread添加RRH62000传感器驱动-基于野火启明6M5被打赏48分 | |
换逻辑分析仪+Verilog多输入门被打赏27分 |