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
麻煩告訴小弟一聲,謝謝,謝謝了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章