这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » [转帖]uclinux下JFFS2文件系统移植

共4条 1/1 1 跳转至

[转帖]uclinux下JFFS2文件系统移植

菜鸟
2003-07-24 17:05:21     打赏
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 -- 人生最大的痛苦就是 想买的芯片买不到 ※ 来源:·BBS 水木清华站 smth.org·[FROM: 61.48.10.167] [align=right][color=#000066][此贴子已经被作者于2003-7-24 9:11:45编辑过][/color][/align]



关键词: 转帖     uclinux     JFFS2     文件     系统     移植    

菜鸟
2003-07-24 17:10:00     打赏
2楼
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 ※ 来源:·BBS 水木清华站 smth.org·[FROM: 61.48.10.167]

菜鸟
2003-07-24 17:11:00     打赏
3楼
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! 待续

菜鸟
2004-08-13 18:25:00     打赏
4楼
兄弟,你真NB,我: 顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]