linux之NOR FLASH驅動程式

2021-07-11 02:06:26 字數 4434 閱讀 2564

使用uboot體驗nor flash的操作(開發板設為nor啟動,進入uboot)

先使用openjtag燒寫uboot到nor flash

1. 讀資料

md.b 0

2. 讀id

nor手冊上:

往位址555h寫aah

往位址2aah寫55h

往位址555h寫90h

讀0位址得到廠家id: c2h

讀1位址得到裝置id: 22dah或225bh

退出讀id狀態: 給任意位址寫f0h

2440的a1接到nor的a0,所以2440發出(555h<<1), nor才能收到555h這個位址

uboot怎麼操作?

往位址aaah寫aah mw.w aaa aa

往位址554寫55h mw.w 554 55

往位址aaah寫90h mw.w aaa 90

讀0位址得到廠家id: c2h md.w 0 1

讀2位址得到裝置id: 22dah或225bh md.w 2 1

退出讀id狀態: mw.w 0 f0

3. nor有兩種規範, jedec, cfi(common flash inte***ce)

讀取cfi資訊

nor手冊:

進入cfi模式 往55h寫入98h

讀資料: 讀10h得到0051

讀11h得到0052

讀12h得到0059

讀27h得到容量

2440的a1接到nor的a0,所以2440發出(555h<<1), nor才能收到555h這個位址

uboot怎麼操作?

進入cfi模式 往aah寫入98h mw.w aa 98

讀資料: 讀20h得到0051 md.w 20 1

讀22h得到0052 md.w 22 1

讀24h得到0059 md.w 24 1

讀4eh得到容量 md.w 4e 1

退出cfi模式 mw.w 0 f0

4. 寫資料: 在位址0x100000寫入0x1234

md.w 100000 1 // 得到ffff

mw.w 100000 1234

md.w 100000 1 // 還是ffff

nor手冊:

往位址555h寫aah

往位址2aah寫55h

往位址555h寫a0h

往位址pa寫pd

2440的a1接到nor的a0,所以2440發出(555h<<1), nor才能收到555h這個位址

uboot怎麼操作?

往位址aaah寫aah mw.w aaa aa

往位址554h寫55h mw.w 554 55

往位址aaah寫a0h mw.w aaa a0

往位址0x100000寫1234h mw.w 100000 1234

nor flash驅動程式框架

測試1:通過配置核心支援nor flash

1. make menuconfig

-> device drivers

-> memory technology device (mtd) support

cfi flash device in physical memory map

(2) bank width in octets (new) // 位寬

2. make modules

cp drivers/mtd/maps/physmap.ko /work/nfs_root/first_fs

3. 啟動開發板

ls /dev/mtd*

insmod physmap.ko

ls /dev/mtd*

cat /proc/mtd

測試2: 使用自己寫的驅動程式:

1. ls /dev/mtd*

2. insmod s3c_nor.ko

3. ls /dev/mtd*

4. 格式化: flash_eraseall -j /dev/mtd1

5. mount -t jffs2 /dev/mtdblock1 /mnt

在/mnt目錄下操作檔案

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);

// 和陣列比較

驅動程式原始碼:

/*

* 參考 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");

Linux作業系統簡單NOR FLASH驅動開發

首先,nor flash驅動作為塊裝置驅動,大部分的流程跟nand flash一樣,只是最底層的硬體操作層跟協議層有區別,如下 1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 incl...

嵌入式linux之NOR FLASH驅動

flash 儲存器介面還有兩個標準 cfi和jedec。cfi為公共flash介面 common flash inte ce 用來幫助程式從flash晶元中獲取操作方式資訊,而不用在程式中硬編碼flash的id。jedec用來幫助程式讀取flash的製造商id和裝置id,以確定flash的大小和演算...

塊裝置驅動之NOR FLASH驅動

一.硬體原理 從原理圖中我們能看到nor flash有位址線,有資料線,能向記憶體一樣讀,不能向記憶體一樣寫 要發出某些命令 這也使得nor的資料很可靠,所以一般用來儲存bootloader。當然如今手機上都僅僅有nand flash了。節約成本嘛。下節我會帶大家去分析nand flash驅動,並進...