norflash驅動編寫

2021-06-09 19:01:03 字數 2767 閱讀 3562

首先我們來看**:

/*

*參考drivers\mtd\maps\physmap.c

*/#include #include #include #include #include #include #include #include #include #include #include #include static struct map_info *s3c_nor_map;

static struct mtd_info *s3c_nor_mtd;

static struct mtd_partition s3c_nor_parts = ,

[1] =

};static int __init nor_init(void)

if (!s3c_nor_mtd)

/* 新增分割槽 */

add_mtd_partitions(s3c_nor_mtd, s3c_nor_parts, 2);

return 0;

}static void __exit nor_exit(void)

module_init(nor_init);

module_exit(nor_exit);

module_license("gpl");

注釋1:

nor flash識別過程:

do_map_probe("cfi_probe", s3c_nor_map);

drv = get_mtd_chip_driver(name)

ret = drv->probe(map); // cfi_probe.c

cfi_probe

mtd_do_chip_probe(map, &cfi_chip_probe);

cfi = genprobe_ident_chips(map, cp);

genprobe_new_chip(map, cp, &cfi)

cp->probe_chip(map, 0, null, cfi)

cfi_probe_chip

// 進入cfi模式

cfi_send_gen_cmd(0x98, 0x55, base, map, cfi, cfi->device_type, null);

// 看是否能讀出"qry"

qry_present(map,base,cfi)

.....

do_map_probe("jedec_probe", s3c_nor_map);

drv = get_mtd_chip_driver(name)

ret = drv->probe(map); // jedec_probe

jedec_probe

mtd_do_chip_probe(map, &jedec_chip_probe);

genprobe_ident_chips(map, cp);

genprobe_new_chip(map, cp, &cfi)

cp->probe_chip(map, 0, null, cfi)

jedec_probe_chip

// 解鎖

cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, null);

cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, null);

// 讀id命令

cfi_send_gen_cmd(0x90, cfi->addr_unlock1, base, map, cfi, cfi->device_type, null);

// 得到廠家id,裝置id

cfi->mfr = jedec_read_mfr(map, base, cfi);

cfi->id = jedec_read_id(map, base, cfi);

// 和陣列比較

jedec_table

分析:

我們先來看一下norflash塊裝置的整體框架圖

塊裝置驅動主要是做一些優化工作

norflash協議層知道往某位址寫某資料來實現識別、擦除和燒寫等

norflash硬體操作就是用來實現一些硬體資訊的設定,比如設定要位址、位寬什麼的?以及設定讀寫函式。而我們寫驅動程式要做的,就是實現這些最小的硬體差異,我們總結出來寫norflash驅動程式的步驟:

(2)設定讀寫函式,用預設函式即可

(3)呼叫nor flash協議層提供的函式來識別:do_map_probe

(4)新增分割槽:add_mtd_partitions

順便我們也來說一下nandflash的情況:

nandflash協議知道發什麼來讀寫擦除,讀寫,識別

nandflash硬體操作知道怎麼發位址命令/位址

也就是說在硬體層裡面我們把協議層裡面的讀寫擦除的條件準備好。而我們要做的就是在硬體操作裡面準備好這些條件:

(1)分配nand_chip結構體,並設定它:這裡面就是設定一些晶元引數

(3)使用nand_scan:來掃瞄並且設定讀,寫函式,這些函式是核心實現好的,屬於協議層

(4)add_mtd_partitions:新增分割槽

norflash驅動編寫

首先我們來看 參考drivers mtd maps physmap.c include include include include include include include include include include include include static struct map ...

norflash驅動編寫

首先我們來看 參考drivers mtd maps physmap.c include include include include include include include include include include include include static struct map ...

2 6核心NorFlash驅動

2.6核心中norflash的驅動基本和2.4中的一樣 隨便在maps中找乙個都可以拿來改改用的,不過方便一點還是提供乙份原始碼好了 這個驅動是 for intel e28f128j3a 150 on s2c2410 的,不同的晶元就需修改一些引數了 修改maps makefile 新增 obj c...