一.硬體原理
從原理圖中我們能看到nor flash有位址線,有資料線,能向記憶體一樣讀,不能向記憶體一樣寫(要發出某些命令)。
這也使得nor的資料很可靠,所以一般用來儲存bootloader。當然如今手機上都僅僅有nand flash了。節約成本嘛。下節我會帶大家去分析nand flash驅動,並進行總結。
二.驅動程式
/*
* 參考 drivers\mtd\maps\physmap.c
*/#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 s3c_nor_init(void) //入口函式
/*假設仍然沒事別就釋放掉。返回錯誤*/
if (!s3c_nor_mtd)
/* 4. add_mtd_partitions (加入分割槽)*/
add_mtd_partitions(s3c_nor_mtd, s3c_nor_parts, 2);
return 0;
}static void s3c_nor_exit(void) //出口函式
module_init(s3c_nor_init);
module_exit(s3c_nor_exit);
module_license("gpl");
三.驅動分析
1. 分配map_info結構體
2. 設定: 物理基位址(phys), 大小(size), 位寬(bankwidth), 虛擬基位址(virt)
3. 使用: 呼叫nor flash協議層提供的函式來識別
4. add_mtd_partitions (加入分割槽)
事實上我們的這個驅動。主要把硬體上的差異性寫出來就能夠了,大部分的工作核心已經幫我們做了。如今我主要來分析第三步。cfi和jedec,這裡主要分析cfi
/*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)
我們進行的操作事實上在協議層已經幫我們寫好了。我們須要提供的事實上就是硬體上的差異。由於全部的nor都是支援這套協議的。 驅動程式之 2 塊裝置 5 Nor Flash 3
nor flash的驅動框架與nand flash類似,協議層基本一樣,都是分配乙個mtd info結構體,主要區別在於硬體層,nor flash和nand flash的位址 匯流排位寬不同 nor flash可以像記憶體一樣讀,但不能像記憶體一樣寫,寫操作類似nand flash,協議層提供讀寫介...
linux驅動之塊裝置驅動
塊裝置驅動的系統架構 塊裝置註冊過程 1,註冊裝置塊驅動程式 register blkdev 2,初始化請求佇列 blk init queue 3,指明扇區的大小 blk queue logical block size dev queue,sect size 4,申請乙個gendisk結構,初始化...
塊裝置驅動
若塊裝置驅動程式也按以下字元裝置驅動程式的簡單思想來寫 1.硬碟 磁碟的讀寫其實非常快,慢在機械結構讀寫裝置的定位上面,從乙個 磁頭 的某 柱面 某 扇區 讀到資料後 步驟 r0 跳到另乙個 磁頭 的某 柱面 的某 扇區 去寫 步驟 w 接著再跳回原 磁頭 相同柱面的下乙個 扇區 去讀 步驟r1 慢...