資料介紹
某些Intel的FLASH芯片(如StrataFlash系列)支持多分區,也就是各個分區可以同時進行操作。應該說這是不錯的特性,但是也會帶來些問題。記得當初移植Linux-2.4.21,掛JFFS2文件系統的時候,經常會報一些“Magic bitmask not found”之類的錯誤,跟進去發現FLASH讀出來的都是些0x80之類的數據,查看資料發現該款FLASH有分區的特性,而Linux的FLASH驅動只用一個狀態變量表示整個FLASH的狀態,這就會造成某個分區的實際狀態和系統記錄的不符,從而導致讀FLASH的時候該點實際上不處在讀狀態。當時的解決辦法是,每次讀的時候,不管記錄的狀態是什么,先進入讀狀態再說,當然這會帶來性能的下降,具體損失多少個時鐘周期就不算了。
話說進入Linux-2.6.x的時代(具體是2.6.13),除了Lock/Unlock(Linux在擦/寫的時候不先Unlock,解決辦法就是初始化的時候先全部Unlock)這個老問題外,竟然多分區的錯誤沒有出現,驚訝之下決定好好研究下Linux的MTD/FLASH驅動。
說驅動之前,先明確幾個編程要點:
1:讀寫,要按照總線位寬讀寫,注意不是FLASH芯片位寬(例如背靠背)。
2:尋址,程序要訪問的地址和FLASH芯片地址引腳得到的值是不一樣的,例如16位的FLASH芯片,對于CPU,0x00和0x01表示2個不同的字節,但是到了FLASH引腳得到的都是0,也就是都指向FLASH的第一個WORD。可以認為地址總線的bit0懸空,或者認為轉換總線, bit0上實際輸出的是bit1。這個解釋了要點1。
3:芯片手冊提到偏移量都是基于WORD的,而WORD的位寬取決于芯片的位寬,因此在下命令的時候,實際偏移=手冊偏移*buswidth/8。
4:芯片手冊提到的變量長度(典型如CFI信息)例如2,指的是,變量是個16bit數,但是讀的時候,要讀2個WORD,然后把每個WORD的低8位拼成1個16bit數。讀WORD再拼湊確實挺麻煩,尤其是讀取大結構的時候,不過參照cfi_util.c的cfi_read_pri函數的做法就簡單了。
5:背靠背,也就是比方說2塊16位的芯片一起接在32位的總線上。帶來的就是尋址的問題,很顯然,首先要按32位讀寫;其次就是下命令的地址,實際偏移=手冊偏移*interleave*device_type/8,device_type=buswidth/interleave,而buswidth這個時候是32(總線位寬)。另外就是背靠背的時候,命令和返回的狀態碼是“雙份的”,例如2塊16位背靠背,讀命令是0x00ff00ff。
如果不是想寫像Linux那么靈活的代碼(考慮各種接法/位寬/CFI獲取信息等),那事情就簡單很多,只要考慮要點1以及擦除塊的大小就好了,當然如果是背靠背接法,擦除塊的實際大小要乘個interleave。
進入Linux代碼
關于CHIP/MAP/MTD之間繞來繞去的關系現在還糊涂著呢,因此下面只是簡單的跟一下脈絡和各個編程要點。
1:構造map_info結構,指定基址/位寬/大小等信息以及“cfi_probe”限定,然后調用do_map_probe()。
2:do_map_probe()根據名字“cfi_probe”找到芯片驅動“cfi_probe.c”直接調用cfi_probe()。
3:cfi_probe()直接調用mtd_do_chip_probe(),傳入cfi_probe_chip()函數指針。
4:mtd_do_chip_probe()分2步,先調用genprobe_ident_chips()探測芯片信息,后調用check_cmd_set()獲取和初始化芯片命令集(多分區初始化就在里面)。
5:genprobe_ident_chips()函數如果不考慮多芯片串連的情況,那只需看前面的genprobe_new_chip()調用,完成后cfi.chipshift=cfi.cfiq-》DevSize,2^chipshift=FLASH大小。
?
話說進入Linux-2.6.x的時代(具體是2.6.13),除了Lock/Unlock(Linux在擦/寫的時候不先Unlock,解決辦法就是初始化的時候先全部Unlock)這個老問題外,竟然多分區的錯誤沒有出現,驚訝之下決定好好研究下Linux的MTD/FLASH驅動。
說驅動之前,先明確幾個編程要點:
1:讀寫,要按照總線位寬讀寫,注意不是FLASH芯片位寬(例如背靠背)。
2:尋址,程序要訪問的地址和FLASH芯片地址引腳得到的值是不一樣的,例如16位的FLASH芯片,對于CPU,0x00和0x01表示2個不同的字節,但是到了FLASH引腳得到的都是0,也就是都指向FLASH的第一個WORD。可以認為地址總線的bit0懸空,或者認為轉換總線, bit0上實際輸出的是bit1。這個解釋了要點1。
3:芯片手冊提到偏移量都是基于WORD的,而WORD的位寬取決于芯片的位寬,因此在下命令的時候,實際偏移=手冊偏移*buswidth/8。
4:芯片手冊提到的變量長度(典型如CFI信息)例如2,指的是,變量是個16bit數,但是讀的時候,要讀2個WORD,然后把每個WORD的低8位拼成1個16bit數。讀WORD再拼湊確實挺麻煩,尤其是讀取大結構的時候,不過參照cfi_util.c的cfi_read_pri函數的做法就簡單了。
5:背靠背,也就是比方說2塊16位的芯片一起接在32位的總線上。帶來的就是尋址的問題,很顯然,首先要按32位讀寫;其次就是下命令的地址,實際偏移=手冊偏移*interleave*device_type/8,device_type=buswidth/interleave,而buswidth這個時候是32(總線位寬)。另外就是背靠背的時候,命令和返回的狀態碼是“雙份的”,例如2塊16位背靠背,讀命令是0x00ff00ff。
如果不是想寫像Linux那么靈活的代碼(考慮各種接法/位寬/CFI獲取信息等),那事情就簡單很多,只要考慮要點1以及擦除塊的大小就好了,當然如果是背靠背接法,擦除塊的實際大小要乘個interleave。
進入Linux代碼
關于CHIP/MAP/MTD之間繞來繞去的關系現在還糊涂著呢,因此下面只是簡單的跟一下脈絡和各個編程要點。
1:構造map_info結構,指定基址/位寬/大小等信息以及“cfi_probe”限定,然后調用do_map_probe()。
2:do_map_probe()根據名字“cfi_probe”找到芯片驅動“cfi_probe.c”直接調用cfi_probe()。
3:cfi_probe()直接調用mtd_do_chip_probe(),傳入cfi_probe_chip()函數指針。
4:mtd_do_chip_probe()分2步,先調用genprobe_ident_chips()探測芯片信息,后調用check_cmd_set()獲取和初始化芯片命令集(多分區初始化就在里面)。
5:genprobe_ident_chips()函數如果不考慮多芯片串連的情況,那只需看前面的genprobe_new_chip()調用,完成后cfi.chipshift=cfi.cfiq-》DevSize,2^chipshift=FLASH大小。
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- ARM11嵌入式系統Linux下LCD的驅動的設計
- 嵌入式Linux系統的驅動原理和使用ARM Linux實現SPI驅動程序的說明 11次下載
- LINUX系統教程之如何在Linux系統下進行編程 9次下載
- Linux操作系統實用教程之如何進行Linux系統下的編程管理 5次下載
- 基于MTD6505下的無傳感器正弦控制三相直流無刷風扇電機驅動器
- 基于MTD6501C/MTD6501D正弦驅動模式下的電機驅動器
- Linux操作系統下C語言編程入門.pdf 96次下載
- Linux MTD下獲取Nand flash 各個參數的過程的詳細解析 7次下載
- 基于Linux內核輸入子系統的驅動研究 23次下載
- 嵌入式Linux下NAND存儲系統的設計 76次下載
- Linux MTD下獲取Nand flash參數詳解 40次下載
- Linux環境下USB的原理、驅動和配置
- 基于Linux操作系統的設備驅動程序開發
- 基于嵌入式Linux系統的LCD驅動實現Implementa
- 嵌入式Linux系統下NOR Flash的配置和使用
- 基于NXP MCXA153 MCU實現RT-Thread的MTD NOR Flash驅動 559次閱讀
- Linux 驅動開發與應用開發,你知道多少? 871次閱讀
- Linux操作系統中如何按下PCIe的復位鍵 1687次閱讀
- Linux 下的make 工具和 Makefile 1208次閱讀
- 從網絡啟動linux系統如何做調試 1761次閱讀
- 如何在Linux系統下開啟wifi 4551次閱讀
- Linux設備驅動開發的基本知識 4393次閱讀
- 米爾科技Linux設備驅動研究淺談 2035次閱讀
- Linux關于系統狀態的命令簡單介紹 2337次閱讀
- 基于嵌入式Linux下的I2C設備驅動的總體思路與框架設計 3771次閱讀
- linux環境下如何開發51單片機 基于codeblocks和SDCC 4606次閱讀
- 搭建測試環境常用linux命令_linux下web測試環境的搭建 1.1w次閱讀
- 基于zynq的Linux根文件系統生成 5841次閱讀
- 關于Linux設備驅動中input子系統的介紹 2711次閱讀
- Linux下ARM 和單片機的串口通信設計 3486次閱讀
下載排行
本周
- 1相關協議信號總結
- 0.94 MB | 4次下載 | 免費
- 2DS-CS3A P00-CN-V3
- 618.05 KB | 1次下載 | 免費
- 3常用電子元器件介紹
- 3.21 MB | 1次下載 | 免費
- 4運算放大器基本電路中文資料
- 1.30 MB | 1次下載 | 免費
- 5ZP-WTU-PNMD02規格書
- 637.49 KB | 次下載 | 免費
- 6multisim的基本界面與操作方法
- 9.12 MB | 次下載 | 免費
- 7FS312A USB的PD快充協議電壓誘騙控制器中文手冊
- 1.51 MB | 次下載 | 免費
- 8FVT-2SVCTCXO電氣規格與應用:10~52MHz剪切正弦波在GPS、物聯網和移動設備中的使用
- 394.16 KB | 次下載 | 免費
本月
- 1涂鴉各WiFi模塊原理圖加PCB封裝
- 11.75 MB | 89次下載 | 1 積分
- 2錦銳科技CA51F2 SDK開發包
- 24.06 MB | 43次下載 | 1 積分
- 3錦銳CA51F005 SDK開發包
- 19.47 MB | 19次下載 | 1 積分
- 4PCB的EMC設計指南
- 2.47 MB | 16次下載 | 1 積分
- 5HC05藍牙原理圖加PCB
- 15.76 MB | 13次下載 | 1 積分
- 6蘋果iphone 11電路原理圖
- 4.98 MB | 7次下載 | 2 積分
- 7基礎模擬電子電路
- 3.80 MB | 5次下載 | 1 積分
- 8STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4編程手冊
- 3.32 MB | 5次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191390次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183342次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81591次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73815次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65989次下載 | 10 積分
評論