mtdlinux
⑴ 在linux的MTD中,函數int add_mtd_device(struct mtd_info *mtd)函數調用了:down(&mtd_table_mutex);
沒弄過MTD,不過,mtd_table_mutex 從字面上看,這是一個鎖。
up和down的作用是,在這期間,只能有一個訪問。
保證一個互斥的作用。保護鎖之間的資源。
詳細,可以參考自旋鎖、互斥鎖等。
⑵ 在 LINUX/MTD 的驅動中,nand_chip *chip = mtd->priv
nand_chip結構體中包含了nand硬體相關的函數和變數。
「使用 MTD的原始設備結構體訪問 NAND的硬體設備」指的是通過調用mtd結構體中元素nand_chip所包含的硬體相關函數來操作nand(讀寫、校驗、壞塊標記等)。
那個priv指的是private,本MTD結構體轄下的nand_chip。
⑶ linux里,如果我要在應用里讀寫在mtd下已經配置好的norflash時,怎麼訪問啊使用fread(),fwrite()嗎
如果你的norflash分區沒有被系統中其他模塊使用,裸設備/dev/mtdx可以用fread()/fwrite()直接訪問。
⑷ 在linux裡面,如果在mtd里添加新的NorFlash驅動,那麼新的NorFlash驅動的名字mtdX,x怎麼確定,是動態的
add_mtd_partitions-->add_one_partition,這裡面創建的。
內核結構一般是先初始化nor,然後初始化nand,
如果nandflash和norflash都用mtd分區,比如nor是兩個,那就是mtd0和mtd1,
接著,是nand,依次增加。
⑸ 在Linux的MTD驅動程序中, 一個CFI的Flash具體是怎麼由MTD驅動程序驅動的啊具體過程是什麼啊
drivers/mtd/這個目錄是MTD驅動的源碼,結合書本看,
網上資料也有一些:http://www.cublog.cn/u/22617/showart_298745.html
⑹ linux mtd下已配置好nor flash,我在應用中怎麼對nor flash進行讀寫
linux下的操作都是對文件的的操作,系統啟動後通過掛載進行讀寫操作。如果在uboot階段可以直接寫地址的,
[email protected];
⑺ linux mtd 分區什麼意思
日常用語
英文縮寫:MTD
英文全稱:Month To Days
中文解釋:月初到今日
編程領域
MTD(memory technology device內存技術設備)是用於訪問memory設備(ROM、flash)的Linux的子系統。MTD的主要目的是為了使新的memory設備的驅動更加簡單,為此它在硬體和上層之間提供了一個抽象的介面。MTD的所有源代碼在/drivers/mtd子目錄下。我將CFI介面的MTD設備分為四層(從設備節點直到底層硬體驅動),這四層從上到下依次是:設備節點、MTD設備層、MTD原始設備層和硬體驅動層。
⑻ 嵌入式linux nand flash分區和mtd分區有什麼不同
你可以發flash分成2個分區,root文件系統放系統文件,usr文件系統放程序文件
⑼ linux 中mtd設備一般用來幹啥的 mtdblock呢,又是幹啥的
mtd是字元設備,mtdblock是塊設備
可以看看dd命令的實現,在busybox里有
補充:
/dev/mtd/* 或者 /dev/mtd* 這兩種表示方式一般表示的是字元設備/dev/mtdblock/* 或者 /dev/mtdblock* 這兩種是塊設備的表示方式mount 的一般都是塊設備貌似dd只對字元設備進行操作
舉例:
The mtd0 is char device of mtdblock0.
Create char mtd devices >
> mknod /dev/mtd0 c 90 0
> mknod /dev/mtd1 c 90 2
Linux系統中/dev/mtd與/dev/mtdblock的區別,即MTD字元設備和塊設備的區別
1. /dev/mtdN 是Linux 中的MTD架構中,系統自己實現的mtd分區所對應的字元設備,其裡面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。而mtd-util中的flash_eraseall等工具,就是以這些ioctl為基礎而實現的工具,實現一些關於Flash的操作。比如,mtd 工具中的 flash_eraseall中的:if (ioctl(fd, MEMGETINFO, &meminfo) != 0) { fprintf(stderr, "%s: %s: unable to get MTD device info\n", exe_name, mtd_device); return 1;}其中,MEMGETINFO,就是Linux MTD中的drivers/mtd/nand/mtdchar.c中的:static int mtd_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg){。。。。。case MEMGETINFO: info.type = mtd->type; info.flags = mtd->flags; info.size = mtd->size; info.erasesize = mtd->erasesize; info.writesize = mtd->writesize; info.oobsize = mtd->oobsize; /* The below fields are obsolete */ info.ecctype = -1; info.eccsize = 0; if (_to_user(argp, &info, sizeof(struct mtd_info_user))) return -EFAULT; break;。。。}而/dev/mtdblockN,是Nand Flash驅動中,驅動在用add_mtd_partitions()添加MTD設備分區,而生成的對應的塊設備。根據以上內容,也就更加明白,為什麼不能用nandwrite,flash_eraseall,flash_erase等工具去對/dev/mtdblockN去操作了。因為/dev/mtdblock中不包含對應的ioctl,不支持你這么操作。2. mtd char 設備的主設備號是90,而mtd block設備的主設備號是31:# ls /dev/mtd? -l crw-r----- 1 root root 90, 0 May 30 2007 /dev/mtd0crw-r----- 1 root root 90, 2 May 30 2007 /dev/mtd1crw-r----- 1 root root 90, 4 Jul 17 2009 /dev/mtd2crw-r----- 1 root root 90, 6 May 30 2007 /dev/mtd3crwxrwxrwx 1 root root 90, 8 May 30 2007 /dev/mtd4crwxrwxrwx 1 root root 90, 10 May 30 2007 /dev/mtd5crwxrwxrwx 1 root root 90, 12 May 30 2007 /dev/mtd6crwxrwxrwx 1 root root 90, 14 May 30 2007 /dev/mtd7crwxrwxrwx 1 root root 90, 16 May 30 2007 /dev/mtd8crwxrwxrwx 1 root root 90, 18 May 30 2007 /dev/mtd9# ls /dev/mtdblock? -lbrw-r----- 1 root root 31, 0 May 30 2007 /dev/mtdblock0brw-r----- 1 root root 31, 1 May 30 2007 /dev/mtdblock1brw-r----- 1 root root 31, 2 May 30 2007 /dev/mtdblock2brw-r----- 1 root root 31, 3 May 30 2007 /dev/mtdblock3brwxrwxrwx 1 root root 31, 4 May 30 2007 /dev/mtdblock4brwxrwxrwx 1 root root 31, 5 May 30 2007 /dev/mtdblock5brwxrwxrwx 1 root root 31, 6 May 30 2007 /dev/mtdblock6brwxrwxrwx 1 root root 31, 7 May 30 2007 /dev/mtdblock7brwxrwxrwx 1 root root 31, 8 May 30 2007 /dev/mtdblock8brwxrwxrwx 1 root root 31, 9 May 30 2007 /dev/mtdblock9此設備號,定義在/include/linux/mtd/mtd.h中 :#define MTD_CHAR_MAJOR 90#define MTD_BLOCK_MAJOR 313. 其中,mtd的塊設備的大小,可以通過查看分區信息獲得:# cat /proc/partitionsmajor minor #blocks name31 0 1024 mtdblock031 1 8192 mtdblock131 2 204800 mtdblock231 3 65536 mtdblock331 4 225280 mtdblock4上面中顯示的塊設備大小,是block的數目,每個block是1KB。而每個字元設備,其實就是對應著上面的每個塊設備。即/dev/mtd0對應/dev/mtdblock0,其他以此類推。換句話說,mtdblockN的一些屬性,也就是mtdN的屬性,比如大小。4。對每個mtd字元設備的操作,比如利用nandwrite去對/dev/mtd0寫數據,實際就是操作/dev/mtdblock0。而這些操作裡面涉及到的偏移量offset,都指的是此mtd 分區內的偏移。比如向/dev/mtd1的offset為0的位置寫入數據,實際操作的是物理偏移offset=/dev/mtd0的大小=1MB=0x100000。
⑽ 在linux下用C怎麼將「cat /proc/mtd」這條命令早終端列印出來,並執行該命令的結果。
根據你的意思,可以這樣
#include<stdio.h>
#include<stdlib.h>
int main(){
system("./`cat /proc/mtd`");
return 0;
}
system() 函數就是調用shell。
`cat /proc/mtd` 就是取得這個命令的執行結果
./`cat /proc/mtd` 就是執行這個結果。
但是 在我的系統中執行cat /proc/mtd ,
cat: /proc/mtd: 沒有那個文件或目錄
所以沒有辦法測試,但是這個方法是對的。如果cat /proc/mtd的結果是很多個的話,最好加上cut命令 來作為取捨