MTD问题解决

***求教使用MTD的问题***

1。我把bootloader和zImage放到了一个2M的NOR Flash上,现在想把自己做的根文件系统fs.jffs2放入另一块8M的NAND Flash上供kernel启动时使用。请问如果我想对NAND FLASH分区,是不是只需对/drivers/mtd/maps下对应的nand_flash.c文件中的"static struct mtd_partition"结构进行改动就可以了?
2。文件系统/dev下面的mtd0,mtd1...mtdblock0,mtdblock1...这些设备是要自己mknod还是会自动根据你的mtd_partition生成?
3。我要把fs.jffs2拷入mtd设备中还是mtdblock设备中呢?拷入之前还要对该设备进行格式化吗?

 
Re: ***求教使用MTD的问题***

1.不行,drivers/mtd/maps下的map文件是针对NOR flash的,nand flash在drivers/mtd/nand下
2.废话,当然是自己mknod
3.考入mtd设备和mtdblock设备都可以,mtd是字符设备而mtdblock是块设备,mtd2X对应mtdblockX,也就是说mtd2对应mtdblock1,mtd4对应mtdblok2,奇数次设备号的mtd设备是只读设备,所以跳过,对于你写入的区别在于在写入mtd之前不会erase,而mtdblock会erase。

在问问题之前,你可以:
1.查找相关网站,比如MTD和JFFS
2.在本版搜索相关话题
3.用Google,它并不总是被封着的

 
补充一点

写入时最好用dd命令, 用字符设备,写入前擦除,另外做映象文件时要注意CPU的字序。

 
Re: ***求教使用MTD的问题***

再nand flash 上可以考虑用yaffs
http://www.aleph1.co.uk/armlinux/projects/yaffs/

 
Re: ***求教使用MTD的问题***

非常感谢楼上的几位大侠,其实我在网上看了不少关于mtd、jffs2的资料,可是理不清头绪。还有疑问是:
1。比如说我驱动中是
static struct mtd_partition static_partitions[] =
{
{ name: "bootloader",
offset: 0,
size: 64 * 1024, /* 64 Kb */
mask_flags: MTD_WRITEABLE /* read-only */
},
{ name: "kernel",
offset: MTDPART_OFS_NXTBLK,
size: 768 *1024, /* 768 Kb */
},
{ name: "filesystem",
offset: MTDPART_OFS_NXTBLK,
size: MTDPART_SIZ_FULL,
}
};是不是说驱动就会自动把我的Flash分成3个区?
2。我做文件系统是在/dev下#mknod mtd0 c 90 0; mknod mtd1 c 90 2; mknod mtd2 c 90 4;
mknod mtdblock0 b 31 0; mknod mtdblock1 b 31 1; mknod mtdblock2 b 31 2;
这种情况下请问"冷风"大侠,mtd1是对应mtdblock1还是对应mtdblock2呢?因为我看到好多文章上类似于下面这样:
/var/tmp> mkfs.jffs2 -d jffs2 -o jffs2.img
/var/tmp> eraseall /dev/mtd2
/var/tmp> cp jffs2.img /dev/mtd2
/var/tmp> mount -t jffs2 /dev/mtdblock2 /mnt
然后对/mnt操作,这样看好像mtd2和mtdblock2是对应的,是这样吗?
3。我可不可以mount -t jffs2 -o loop jffs2.img /mnt/fs_directory然后进fs_directory中看文件系统的内容呀?
4。请问gpf大侠,您说的“做映象文件时要注意CPU的字序”是指什么?怎样注意?
小弟刚接触这个领域不久,看资料又有不解之处,所以有些问题挺无知的,还望见谅。



 
Re: ***求教使用MTD的问题***

1.是
2.是
3.可以

 
Re: ***求教使用MTD的问题***

不要称我大侠

字序就是CPU处理整数时, 是高位在前还是低位在前.如果CPU是大字序就用加 -b 参数, 这个是我作Image的命令:
mkfs.jffs2 -e 0x4000 -p -b -r $(ROMFSDIR) -o $(IMAGEDIR)

-e: 擦除的最小单元, 就是NAND的一个块的大小
-b: 大字序, x86不要
-p: 生成的文件补齐到整块的大小

这个是刚找到的mkfs.jffs2的用法说明,
http://www.buserror.org/~ebrown/sshf2001/download/utils/mkfs.jffs2.1.html



 
Re: ***求教使用MTD的问题***

To gpf :非常感谢:)
又有几个疑问像请教:
1)比如说c 90 1或c 90 3这些奇数次设备号的mtd设备与mtdblockX有什么联系?或是根本就不用mknod它们?
2)既然mtdblockX这些设备都是在文件系统中自己创建的,那传给kernel启动参数(root=/dev/mtdblock2)时,kernel如何知道mtdblock2是什么设备?(文件系统还没有加载呢)
3)那里可以得到eraseall、erase工具呀,我用google、baidu、天网都找不到:(

 
Re: ***求教使用MTD的问题***

1): 他们最终操作的设备是一样的, 但是工作的方法不一样. 在/dev/mtdx 或/dev/mtdblockx都只是文件系统中的node, 当打开这些文件时, 文件系统可以自己判断这个node是什么类型的文件, 包括设备文件, 如果是字符设备或块设备的话就调用相应的设备驱动中指定的文件操作函数.我记得在mtd的字符设备驱动中, 次设备号/2就是相应的分区, 奇数的次设备号是只读的, 我觉得如果不操作他们的话不mknod也没关系.
2):这个问题我也不明白, 哪位熟悉内核的大侠指点一下.
3) 到MTD的官方网站下载呀.

 
Re: ***求教使用MTD的问题***

>比如说c 90 1或c 90 3这些奇数次设备号的mtd设备与mtdblockX有什么联系?或是根本就不用mknod它们?

只毒设备

>既然mtdblockX这些设备都是在文件系统中自己创建的,那传给kernel启动参数(root=/dev/mtdblock2)时,kernel如何知道mtdblock2是什么设备?(文件系统还没有加载呢)

哦?给设备号root=1f02吧,可以直接给路径?好像有点扯淡


 
Re: ***求教使用MTD的问题***

这个设备号,设备的问题你去看看Documentations/devices.txt就知道了

 
Re: ***求教使用MTD的问题***

终于在70多页的位置找到了coldwind前辈关于mtd设备号的贴子,喘口气先~~
按照
“如果是只读设备,mtdchar minor = 2 * mtdblock minor +1;
如果是可读写设备,mtdchar minor = 2 * mtdblock minor ”的要求,是不是说c 90 1和c 90 0一样对应着mtdblock0设备,c 90 3和c 90 2一样对应着mtdblock1设备,只不过它们两个是只读设备罢了,是这样吧?

 
Re: ***求教使用MTD的问题***

>哦?给设备号root=1f02吧,可以直接给路径?好像有点扯淡
传递给kernel的cmdline中的root参数不能给路径吗?PC机的linux中记得也是root=/dev/hdaX的情况,我板子现在用ramdisk时root=/dev/ram,这种情况和我说的不一样吗?请指教~~

 
Re: ***求教使用MTD的问题***

哦,对,刚才问了一下,是有个什么函数来解析名字->设备号
不过这个名字就得是默认的Documentations/devices.txt中的定义,而不是根据/dev/下的设备文件来转换

Sorry, man

 
Re: ***求教使用MTD的问题***

/var/tmp> mkfs.jffs2 -d jffs2 -o jffs2.img
/var/tmp> eraseall /dev/mtd2
/var/tmp> cp jffs2.img /dev/mtd2
/var/tmp> mount -t jffs2 /dev/mtdblock2 /mnt

我又不明白大家说的是什么东东了,请指点以上的过程是在单板运行的时候作的,还是在烧板前做的,
1:要是在单板上做的,jffs2.img文件在板子上哪里有啊,这个时候文件系统都没有出来,哪有文件,难道大家都是使用什么ramdisk的文件系统,吗???????
2:要是在开发机上做的,不就更晕了吗,/dev/mtdblock2都是开发机上上的啊,天啊,
老大门讨论的前提是什么啊?????

我的做法是,在开发机上,作出bootloader.bin,用mkfs.jffs2把开发机上交叉编译好的jffs目录做成jffs2.img,当然要有kernel,然后把他们cat成一个文件,最后用majic烧到单板上.运行板子,指定对应的命令行.kernel加载后就把文件系统mount上,一切都OK了.

大家的方法是什么啊,
/var/tmp> eraseall /dev/mtd2
/var/tmp> cp jffs2.img /dev/mtd2
/var/tmp> mount -t jffs2 /dev/mtdblock2 /mnt
这一擦不就完了吗,还有文件系统没有起来哪里有什么/dev/mtd2;/dev/mtdblock2
麻烦告诉小弟一声,谢谢,谢谢了.

你可能感兴趣的:(c,linux,struct,image,Google,Flash)