atheros之flash驅動程式分析

2021-06-15 03:18:38 字數 4222 閱讀 7625

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...