1:uboot中的引數mtkparts
在uboot的bootargs的引數設定如下:其中mtdparts=「」的內容會傳遞給核心進行解析。
即:在linux核心檔案cmdlinepart.c開啟除錯資訊:即:
/* debug macro */
#if 1 //更改為1,將開啟除錯資訊
#define dbg(x) do while(0)
#else
#define dbg(x) printk(x)
#endif
同時此檔案中有如下的定義:
static int mtdpart_setup(char *s)
__setup("mtdparts=", mtdpart_setup);
上面的__setup()函式就是將"mtdparts="傳遞給mtdpart_setup()函式來進行處理。
系統啟動時的列印資訊為:
定**析器cmdline_parser,其解析的字串物件為:"cmdlinepart"
static struct mtd_part_parser cmdline_parser = ;
static int __init cmdline_parser_init(void)
上面為:將定義的cmdline_parser新增到系統中。
2:ar7240_flash.c檔案分析
/** sets up flash_info and returns size of flash (bytes)
*/static int __init ar7240_flash_init(void)
memset(mtd, 0, sizeof(struct mtd_info));
mtd->name = ar7240_flash_name;
mtd->type = mtd_norflash;
mtd->flags = mtd_cap_norflash | mtd_writeable;
mtd->size = geom->size;
mtd->erasesize= geom->sector_size;
mtd->numeraseregions= 0;
mtd->eraseregions= null;
mtd->owner = this_module;
mtd->erase = ar7240_flash_erase;
mtd->read = ar7240_flash_read;
mtd->write = ar7240_flash_write;
mtd->writesize= 1;
np = parse_mtd_partitions(mtd, part_probes, &mtd_parts, 0);
if (np > 0) else
}return 0;
}在上面的函式中:主要是解析mtdparts引數,將解析的每乙個mtd_parts新增到系統中去。其中
mtd->erase = ar7240_flash_erase;
mtd->read = ar7240_flash_read;
mtd->write = ar7240_flash_write;
為nor flash的讀寫和察除函式。同時part_probes定義為:
static const char *part_probes __initdata = ;
其中"cmdlinepart"和前面定義的便利cmdline_parser中的.name欄位的定義相同。
函式parse_mtd_partitions()定義如下:
int parse_mtd_partitions(struct mtd_info *master, const char **types,
struct mtd_partition **pparts, unsigned long origin)
//其中 (*parser->parse_fn)就是前面定義的cmdline_parser變數中的parse_cmdline_partitions函式。
ret = (*parser->parse_fn)(master, pparts, origin);
if (ret > 0)
put_partition_parser(parser);
}return ret;
}函式add_mtd_partitions()定義如下:
int add_mtd_partitions(struct mtd_info *master,const struct mtd_partition *parts,int nbparts)
return 0;
}在執行上面的函式時的列印資訊如下:可以看出在使用add_one_partition()函式新增分割槽。
6 cmdlinepart partitions found on mtd device ar7240-nor0
creating 6 mtd partitions on "ar7240-nor0":
0x000000000000-0x000000040000 : "u-boot"
mtd:----- mtd0ro
mtd: giving out device 0 to u-boot
0x000000040000-0x000000050000 : "u-boot-env"
mtd:----- mtd1ro
mtd: giving out device 1 to u-boot-env
0x000000050000-0x000000160000 : "uimage"
mtd:----- mtd2ro
mtd: giving out device 2 to uimage
0x000000160000-0x000000f60000 : "rootfs"
mtd:----- mtd3ro
mtd: giving out device 3 to rootfs
0x000000f60000-0x000000fa0000 : "nvram"
mtd:----- mtd4ro
mtd: giving out device 4 to nvram
0x000000fa0000-0x000000fe0000 : "art"
mtd:----- mtd5ro
mtd: giving out device 5 to art
同時在看看/dev目錄下面的裝置:
上面的顯示中視乎少了一些主裝置號為:90的mtd裝置。主要是因為在atheros的sdk是手動建立的
dev裝置而不是根據sys檔案系統來自動生成的。其手動建立使用的指令碼為:
但是可以看看mini2440板子上面的mtd裝置
3:總結:
跟mini2440相比,上面的flash初始化過程相對來說簡單明瞭。
主要主城如下:
a:定義變數struct mtd_info *mtd,struct mtd_partition *mtd_parts;
b:對mtd的主要成員函式定義賦值,包括:read,wirte,earse。
c:解析uboot中定義的變數:mtdparts=ar7240-nor0:256k(u-boot),64k(u-boot-env),1088k(uimage),14336k(rootfs),256k(nvram),256k(art)
d:將解析的變數從放到定義的mtd_parts變數中。
e:呼叫函式add_mtd_partitions()新增各個分割槽。
順便記錄乙個linux核心dug()函式的定義:
static void dbg(const char *fmt, ...)
Atheros 如何在驅動中禁用ACK
禁用ack主要分為三部分 1.在傳送端設定不等待ack回來就繼續傳送 2.在接收端設定收到資料幀之後不返回ack 3.可選 有些地方針對不等待ack的情況會有warn等處理措施,把它們去掉。下面分別來看,首先在傳送端設定不等待ack就繼續傳送,開啟net mac80211 tx.c,在ieee802...
Flash裝置驅動
今天又看了一遍flash驅動,以下是一些總結。flash 裝置驅動 一 mtd linux系統中,用了mtd系統來建立flash對linux的介面。mtd memory technology device,記憶體技術裝置。mtd可以分為四個層 1,硬體驅動層 最底層,負責flash硬體裝置的讀 寫 ...
第19章 Flash裝置驅動
本文摘自 偶有較小改動 linux 裝置驅動開發詳解 宋寶華 編著 人民郵電出版社 留作紀念。living park 第19章 flash裝置驅動 19.1 linux flash驅動結構 19.1.1 linux mtd系統層次 在linux系統中,提供了mtd memory technology...