資料介紹
某些Intel的FLASH芯片(如StrataFlash系列)支持多分區(qū),也就是各個(gè)分區(qū)可以同時(shí)進(jìn)行操作。應(yīng)該說(shuō)這是不錯(cuò)的特性,但是也會(huì)帶來(lái)些問(wèn)題。記得當(dāng)初移植Linux-2.4.21,掛JFFS2文件系統(tǒng)的時(shí)候,經(jīng)常會(huì)報(bào)一些“Magic bitmask not found”之類的錯(cuò)誤,跟進(jìn)去發(fā)現(xiàn)FLASH讀出來(lái)的都是些0x80之類的數(shù)據(jù),查看資料發(fā)現(xiàn)該款FLASH有分區(qū)的特性,而Linux的FLASH驅(qū)動(dòng)只用一個(gè)狀態(tài)變量表示整個(gè)FLASH的狀態(tài),這就會(huì)造成某個(gè)分區(qū)的實(shí)際狀態(tài)和系統(tǒng)記錄的不符,從而導(dǎo)致讀FLASH的時(shí)候該點(diǎn)實(shí)際上不處在讀狀態(tài)。當(dāng)時(shí)的解決辦法是,每次讀的時(shí)候,不管記錄的狀態(tài)是什么,先進(jìn)入讀狀態(tài)再說(shuō),當(dāng)然這會(huì)帶來(lái)性能的下降,具體損失多少個(gè)時(shí)鐘周期就不算了。
話說(shuō)進(jìn)入Linux-2.6.x的時(shí)代(具體是2.6.13),除了Lock/Unlock(Linux在擦/寫的時(shí)候不先Unlock,解決辦法就是初始化的時(shí)候先全部Unlock)這個(gè)老問(wèn)題外,竟然多分區(qū)的錯(cuò)誤沒有出現(xiàn),驚訝之下決定好好研究下Linux的MTD/FLASH驅(qū)動(dòng)。
說(shuō)驅(qū)動(dòng)之前,先明確幾個(gè)編程要點(diǎn):
1:讀寫,要按照總線位寬讀寫,注意不是FLASH芯片位寬(例如背靠背)。
2:尋址,程序要訪問(wèn)的地址和FLASH芯片地址引腳得到的值是不一樣的,例如16位的FLASH芯片,對(duì)于CPU,0x00和0x01表示2個(gè)不同的字節(jié),但是到了FLASH引腳得到的都是0,也就是都指向FLASH的第一個(gè)WORD。可以認(rèn)為地址總線的bit0懸空,或者認(rèn)為轉(zhuǎn)換總線, bit0上實(shí)際輸出的是bit1。這個(gè)解釋了要點(diǎn)1。
3:芯片手冊(cè)提到偏移量都是基于WORD的,而WORD的位寬取決于芯片的位寬,因此在下命令的時(shí)候,實(shí)際偏移=手冊(cè)偏移*buswidth/8。
4:芯片手冊(cè)提到的變量長(zhǎng)度(典型如CFI信息)例如2,指的是,變量是個(gè)16bit數(shù),但是讀的時(shí)候,要讀2個(gè)WORD,然后把每個(gè)WORD的低8位拼成1個(gè)16bit數(shù)。讀WORD再拼湊確實(shí)挺麻煩,尤其是讀取大結(jié)構(gòu)的時(shí)候,不過(guò)參照cfi_util.c的cfi_read_pri函數(shù)的做法就簡(jiǎn)單了。
5:背靠背,也就是比方說(shuō)2塊16位的芯片一起接在32位的總線上。帶來(lái)的就是尋址的問(wèn)題,很顯然,首先要按32位讀寫;其次就是下命令的地址,實(shí)際偏移=手冊(cè)偏移*interleave*device_type/8,device_type=buswidth/interleave,而buswidth這個(gè)時(shí)候是32(總線位寬)。另外就是背靠背的時(shí)候,命令和返回的狀態(tài)碼是“雙份的”,例如2塊16位背靠背,讀命令是0x00ff00ff。
如果不是想寫像Linux那么靈活的代碼(考慮各種接法/位寬/CFI獲取信息等),那事情就簡(jiǎn)單很多,只要考慮要點(diǎn)1以及擦除塊的大小就好了,當(dāng)然如果是背靠背接法,擦除塊的實(shí)際大小要乘個(gè)interleave。
進(jìn)入Linux代碼
關(guān)于CHIP/MAP/MTD之間繞來(lái)繞去的關(guān)系現(xiàn)在還糊涂著呢,因此下面只是簡(jiǎn)單的跟一下脈絡(luò)和各個(gè)編程要點(diǎn)。
1:構(gòu)造map_info結(jié)構(gòu),指定基址/位寬/大小等信息以及“cfi_probe”限定,然后調(diào)用do_map_probe()。
2:do_map_probe()根據(jù)名字“cfi_probe”找到芯片驅(qū)動(dòng)“cfi_probe.c”直接調(diào)用cfi_probe()。
3:cfi_probe()直接調(diào)用mtd_do_chip_probe(),傳入cfi_probe_chip()函數(shù)指針。
4:mtd_do_chip_probe()分2步,先調(diào)用genprobe_ident_chips()探測(cè)芯片信息,后調(diào)用check_cmd_set()獲取和初始化芯片命令集(多分區(qū)初始化就在里面)。
5:genprobe_ident_chips()函數(shù)如果不考慮多芯片串連的情況,那只需看前面的genprobe_new_chip()調(diào)用,完成后cfi.chipshift=cfi.cfiq-》DevSize,2^chipshift=FLASH大小。
?
話說(shuō)進(jìn)入Linux-2.6.x的時(shí)代(具體是2.6.13),除了Lock/Unlock(Linux在擦/寫的時(shí)候不先Unlock,解決辦法就是初始化的時(shí)候先全部Unlock)這個(gè)老問(wèn)題外,竟然多分區(qū)的錯(cuò)誤沒有出現(xiàn),驚訝之下決定好好研究下Linux的MTD/FLASH驅(qū)動(dòng)。
說(shuō)驅(qū)動(dòng)之前,先明確幾個(gè)編程要點(diǎn):
1:讀寫,要按照總線位寬讀寫,注意不是FLASH芯片位寬(例如背靠背)。
2:尋址,程序要訪問(wèn)的地址和FLASH芯片地址引腳得到的值是不一樣的,例如16位的FLASH芯片,對(duì)于CPU,0x00和0x01表示2個(gè)不同的字節(jié),但是到了FLASH引腳得到的都是0,也就是都指向FLASH的第一個(gè)WORD。可以認(rèn)為地址總線的bit0懸空,或者認(rèn)為轉(zhuǎn)換總線, bit0上實(shí)際輸出的是bit1。這個(gè)解釋了要點(diǎn)1。
3:芯片手冊(cè)提到偏移量都是基于WORD的,而WORD的位寬取決于芯片的位寬,因此在下命令的時(shí)候,實(shí)際偏移=手冊(cè)偏移*buswidth/8。
4:芯片手冊(cè)提到的變量長(zhǎng)度(典型如CFI信息)例如2,指的是,變量是個(gè)16bit數(shù),但是讀的時(shí)候,要讀2個(gè)WORD,然后把每個(gè)WORD的低8位拼成1個(gè)16bit數(shù)。讀WORD再拼湊確實(shí)挺麻煩,尤其是讀取大結(jié)構(gòu)的時(shí)候,不過(guò)參照cfi_util.c的cfi_read_pri函數(shù)的做法就簡(jiǎn)單了。
5:背靠背,也就是比方說(shuō)2塊16位的芯片一起接在32位的總線上。帶來(lái)的就是尋址的問(wèn)題,很顯然,首先要按32位讀寫;其次就是下命令的地址,實(shí)際偏移=手冊(cè)偏移*interleave*device_type/8,device_type=buswidth/interleave,而buswidth這個(gè)時(shí)候是32(總線位寬)。另外就是背靠背的時(shí)候,命令和返回的狀態(tài)碼是“雙份的”,例如2塊16位背靠背,讀命令是0x00ff00ff。
如果不是想寫像Linux那么靈活的代碼(考慮各種接法/位寬/CFI獲取信息等),那事情就簡(jiǎn)單很多,只要考慮要點(diǎn)1以及擦除塊的大小就好了,當(dāng)然如果是背靠背接法,擦除塊的實(shí)際大小要乘個(gè)interleave。
進(jìn)入Linux代碼
關(guān)于CHIP/MAP/MTD之間繞來(lái)繞去的關(guān)系現(xiàn)在還糊涂著呢,因此下面只是簡(jiǎn)單的跟一下脈絡(luò)和各個(gè)編程要點(diǎn)。
1:構(gòu)造map_info結(jié)構(gòu),指定基址/位寬/大小等信息以及“cfi_probe”限定,然后調(diào)用do_map_probe()。
2:do_map_probe()根據(jù)名字“cfi_probe”找到芯片驅(qū)動(dòng)“cfi_probe.c”直接調(diào)用cfi_probe()。
3:cfi_probe()直接調(diào)用mtd_do_chip_probe(),傳入cfi_probe_chip()函數(shù)指針。
4:mtd_do_chip_probe()分2步,先調(diào)用genprobe_ident_chips()探測(cè)芯片信息,后調(diào)用check_cmd_set()獲取和初始化芯片命令集(多分區(qū)初始化就在里面)。
5:genprobe_ident_chips()函數(shù)如果不考慮多芯片串連的情況,那只需看前面的genprobe_new_chip()調(diào)用,完成后cfi.chipshift=cfi.cfiq-》DevSize,2^chipshift=FLASH大小。
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- ARM11嵌入式系統(tǒng)Linux下LCD的驅(qū)動(dòng)的設(shè)計(jì)
- 嵌入式Linux系統(tǒng)的驅(qū)動(dòng)原理和使用ARM Linux實(shí)現(xiàn)SPI驅(qū)動(dòng)程序的說(shuō)明 11次下載
- LINUX系統(tǒng)教程之如何在Linux系統(tǒng)下進(jìn)行編程 9次下載
- Linux操作系統(tǒng)實(shí)用教程之如何進(jìn)行Linux系統(tǒng)下的編程管理 5次下載
- 基于MTD6505下的無(wú)傳感器正弦控制三相直流無(wú)刷風(fēng)扇電機(jī)驅(qū)動(dòng)器
- 基于MTD6501C/MTD6501D正弦驅(qū)動(dòng)模式下的電機(jī)驅(qū)動(dòng)器
- Linux操作系統(tǒng)下C語(yǔ)言編程入門.pdf 96次下載
- Linux MTD下獲取Nand flash 各個(gè)參數(shù)的過(guò)程的詳細(xì)解析 7次下載
- 基于Linux內(nèi)核輸入子系統(tǒng)的驅(qū)動(dòng)研究 23次下載
- 嵌入式Linux下NAND存儲(chǔ)系統(tǒng)的設(shè)計(jì) 76次下載
- Linux MTD下獲取Nand flash參數(shù)詳解 40次下載
- Linux環(huán)境下USB的原理、驅(qū)動(dòng)和配置
- 基于Linux操作系統(tǒng)的設(shè)備驅(qū)動(dòng)程序開發(fā)
- 基于嵌入式Linux系統(tǒng)的LCD驅(qū)動(dòng)實(shí)現(xiàn)Implementa
- 嵌入式Linux系統(tǒng)下NOR Flash的配置和使用
- 基于NXP MCXA153 MCU實(shí)現(xiàn)RT-Thread的MTD NOR Flash驅(qū)動(dòng) 559次閱讀
- Linux 驅(qū)動(dòng)開發(fā)與應(yīng)用開發(fā),你知道多少? 871次閱讀
- Linux操作系統(tǒng)中如何按下PCIe的復(fù)位鍵 1687次閱讀
- Linux 下的make 工具和 Makefile 1208次閱讀
- 從網(wǎng)絡(luò)啟動(dòng)linux系統(tǒng)如何做調(diào)試 1761次閱讀
- 如何在Linux系統(tǒng)下開啟wifi 4551次閱讀
- Linux設(shè)備驅(qū)動(dòng)開發(fā)的基本知識(shí) 4393次閱讀
- 米爾科技Linux設(shè)備驅(qū)動(dòng)研究淺談 2035次閱讀
- Linux關(guān)于系統(tǒng)狀態(tài)的命令簡(jiǎn)單介紹 2337次閱讀
- 基于嵌入式Linux下的I2C設(shè)備驅(qū)動(dòng)的總體思路與框架設(shè)計(jì) 3771次閱讀
- linux環(huán)境下如何開發(fā)51單片機(jī) 基于codeblocks和SDCC 4606次閱讀
- 搭建測(cè)試環(huán)境常用linux命令_linux下web測(cè)試環(huán)境的搭建 1.1w次閱讀
- 基于zynq的Linux根文件系統(tǒng)生成 5841次閱讀
- 關(guān)于Linux設(shè)備驅(qū)動(dòng)中input子系統(tǒng)的介紹 2711次閱讀
- Linux下ARM 和單片機(jī)的串口通信設(shè)計(jì) 3486次閱讀
下載排行
本周
- 1索尼333ESL電路圖資料
- 10.11 MB | 2次下載 | 免費(fèi)
- 2TINA-TI 模擬電路設(shè)計(jì)、仿真和分析軟件中文教程
- 3.83 MB | 0次下載 | 5 積分
- 3SS6548D40V 直流有刷電機(jī)驅(qū)動(dòng)芯片中文資料
- 1.55 MB | 次下載 | 1 積分
- 4SS6235M 4A 33V性價(jià)比超高電機(jī)驅(qū)動(dòng)芯片中文資料
- 1.26 MB | 次下載 | 免費(fèi)
- 5FP7195-中文應(yīng)用說(shuō)明書
- 0.93 MB | 次下載 | 免費(fèi)
- 6VSA101-G250T01-I 電壓傳感器產(chǎn)品使用手冊(cè)
- 0.72 MB | 次下載 | 免費(fèi)
- 7FS4056E系列單節(jié)線線充電IC
- 2.41 MB | 次下載 | 免費(fèi)
- 8FS5281E(5V USB輸入雙節(jié)鋰電池串聯(lián)應(yīng)用升壓充電管理IC)
- 3.30 MB | 次下載 | 免費(fèi)
本月
- 148V到5KW無(wú)橋LLC雙向逆變器的電路原理圖免費(fèi)下載
- 0.26 MB | 157次下載 | 10 積分
- 22KW逆變側(cè)功率管的損耗如何進(jìn)行計(jì)算詳細(xì)公式免費(fèi)下載
- 0.40 MB | 33次下載 | 2 積分
- 3高功率密度碳化硅MOSFET軟開關(guān)三相逆變器損耗分析
- 2.27 MB | 33次下載 | 5 積分
- 4STM32F10x參考手冊(cè)資料
- 13.64 MB | 12次下載 | 1 積分
- 5光伏并網(wǎng)逆變器原理
- 7.31 MB | 7次下載 | 2 積分
- 6SW5099規(guī)格書
- 1.37 MB | 6次下載 | 1 積分
- 7星火6J3-1交直流二波段收音機(jī)電路圖資料
- 1.86 MB | 6次下載 | 免費(fèi)
- 8S7-200 可編程序控制器系統(tǒng)手冊(cè)
- 12.81 MB | 5次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935134次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191422次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183352次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81600次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73818次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
評(píng)論