① 智能座艙之存儲篇第二篇---FLASH有趣的介紹
智能座艙存儲探索:深入揭秘FLASH的魅力
在智能座艙的世界裡,存儲技術是其精密運作的關鍵組件。今天,我們將聚焦於其中的主角——FLASH,一種在車載應用中發揮重要作用的非易失性存儲器。讓我們一起揭開其神秘面紗,探索EEPROM與NOR/NAND Flash的巧妙合作。
EEPROM與穩定性的守護者
EEPROM,因其低功耗和百萬次擦寫的能力,常被用於液晶儀表的里程數顯示和娛樂中控的記憶功能。在高頻率寫入場景中,如液晶儀表的實時更新,它能經受住千萬次的擦寫考驗,確保數據的持久保存。
NOR/NAND Flash:性能與容量的完美平衡
NOR Flash以其穩定性和少量代碼存儲的優勢,通常與NAND Flash搭檔,確保啟動代碼的正確執行。NAND Flash則以容量大、成本低的特點,承擔起存儲linux內核、根文件系統和大量數據的重任。其中,Floating Gate技術的巧妙運用,使得數據通過控制電荷數量來表示,SLC、MLC和TLC的不同層級提供了靈活的存儲選擇。
圖書館般的NAND Flash結構
想像一下,NAND Flash就像一座擁有1024層的圖書館,每層64個房間,每個房間存儲2K+64位元組的數據。E-H區的校驗值就像是房間的登記本,確保數據的完整性和准確性。然而,NAND Flash的讀寫規則要求順序進行,不能像硬碟那樣隨機訪問,這也是其與NOR Flash的主要區別。
硬體限制與操作特性
NAND Flash的特點是讀取時必須一次性獲取整個頁,不能直接執行程序。而NOR Flash則以其快速的位讀取能力,支持XIP(執行就地)操作。NAND的寫入需要先擦除再寫入,雖然過程復雜但速度較快。擦除時,1變為0理論上可行,但在實際操作中需要額外步驟,成本不菲。
壞塊管理與Linux策略
NAND Flash中的壞塊管理是確保數據安全的重要環節。Linux通過壞塊管理(BBM)跟蹤好塊和壞塊信息,通過BBT表記錄不同類型(出廠或使用中損壞)的壞塊。當驅動載入時,會主動掃描以建立BBT,確保啟動時有可用的好塊。
最後,每一塊NAND Flash都經過精心設計,如頁寄存器的存在,是為了臨時存儲數據並進行二次確認,防止數據丟失。在下期內容中,我們將深入解析NAND FLASH的操作文檔,幫助你更好地理解和應用這一關鍵存儲技術。
② 嵌入式Linux jz 2440的nand flash的問題
出現壞快的原因有很多,需要一項項排除:
1、假壞,記住壞塊位置,在boot中scrub一下,擦掉壞塊標記,再燒一遍隨開發板帶的image,看還有沒有壞塊,位置變了沒有。
2、如果壞塊和原來一樣,檢查nand的型號是否正確,對比nand的datasheet和燒寫軟體的nand參數配置是否一致。
3、如果參數沒問題,檢查nand的焊接。
4、都沒問題,那nand可能是真那麼多壞塊,當然也可以懷疑驅動本身有問題。
只要好塊數量足夠,使用是沒問題的。
③ linux重啟時怎麼修改bootargs和bootcmd
u-boot的環境參數中有兩個和內核啟動相關的,它們是bootcmd和bootargs
1.u-boot中和環境參數有悉侍關的命令
printenv:列印當前環境參數
setenv param_name "value":設置環境參數
saveenv:保存環境參數到FLASH
2.bootcmd:
這個參數包含了一些命令,這些命令將在u-boot進入主循環後執行
示例:
bootcmd=boot_logo;nand read 10000003c0000 300000;bootm 1000000
意思是啟動u-boot後,執行boot_logo顯示logo信息,然後從nand flash中讀內核映像到內存,然後啟動內核。
3.bootargs
這個參數設置要傳遞給內核的信息,主要用來告訴內核分區信睜陪吵息和根文件系統所在的分區。
示例:
root=/dev/mtdblock5 rootfstype=jffs2console=ttyS0,115200 mem=35M mtdparts=nand.0:3840k(u-boot),4096k(kernel),123136k(filesystem)
其中:
root=/dev/mtdblock5 表示根文件系統在第五分區
rootfstype=jffs2 表示根文件系統的類型是jffs2
console=ttyS0,115200 表示終端為ttyS0,串口波特率為115200
mem=35M 表示內存大小為35M
mtdparts告訴內核MTD分區情況,它在內核目錄/drivers/mtd/cmdlinepart.c文件中有介紹:
* The format for the command line is as follows:
*
* mtdparts=<mtddef>[;<mtddef]
* <mtddef> := <mtd-id>:<partdef>[,<partdef>]
* where <mtd-id> is the name from the "cat /proc/mtd" command
* <partdef> := <size>[@offset][<name>亂此][ro][lk]
* <mtd-id> := unique name used in mapping driver/device (mtd->name)
* <size> := standard linux memsize OR "-" to denote all remaining space
* <name> := '(' NAME ')'
*
* Examples:
*
* 1 NOR Flash, with 1 single writable partition:
* edb7312-nor:-
*
* 1 NOR Flash with 2 partitions, 1 NAND with one
* edb7312-nor:256k(ARMboot)ro,-(root);edb7312-nand:-(home)
*/
關於mtd-id,每個FLASH都不一樣,實際上我覺得和當前FLASH的驅動有關系,在內核啟動後會列印相關的分區信息,裡面會有相關FLASH的mtd-id。
需要解決更多linux問題,詳情請看 http://www.linuxprobe.com/chapter-00.html
望採納