新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于u-boot移植時的NAND FLASH問題

        關于u-boot移植時的NAND FLASH問題

        作者: 時間:2016-11-25 來源:網絡 收藏
        在移植U-BOOT的時候,大部分時間都是卡在nand flash里,因為我的nand flash容量比較大,512M的,網上的一般都是256M的吧,然后我就蛋疼蛋疼的搞了好久好久。。。

        遇到的問題是這樣:u-boot無法對nand flash正常讀寫,總是識別出各種壞塊,幾乎把整塊nand都當作壞塊了,最明顯的就是保存環境變量時,使用saveenv命令,提示擦除時遇到壞塊。

        本文引用地址:http://www.104case.com/article/201611/321273.htm

        各種找原因,剛開始以為是底層驅動函數沒有寫好,然后就研究底層驅動開始,一點一點的理解。。。

        在這里普及一下NAND的基本知識吧,剛開始我也稀里糊涂的。

        NAND flash以頁為單位讀寫數據,而以塊為單位擦除數據。按照這樣的組織方式可以形成所謂的三類地址:
          Column Address:Starting Address of the Register. 翻成中文為列地址,地址的低8位
          Page Address :頁地址
          Block Address :塊地址
          對于NAND Flash來講,地址和命令只能在I/O[7:0]上傳遞,數據寬度是8位。

        我的用吧,一頁有2112Bytes(2048byte(Main Area)+64byte(Spare Area)),每64個page形成一個Block,然后具體有多少個塊,就視你的nand容量大小嘍。。。(注意NAND FLASH在出廠時就別允許具有少量壞塊)

        基本知識搞定,然后是寫代碼。。。根據電路原理圖,寫吖寫,這里就不寫出來了。

        可悲的是發現沒有任何問題。。。

        裸奔程序能完美的操作NAND FLASH讀寫擦除各種HIGH。。。

        最后,只能回歸研究u-boot代碼了。。。

        再然后的然后,我知道了。。。

        在drivers/nand目錄下的nand_ids.c文件里,列出了各種NAND的屬性列表。。。然后把

        {"NAND 512MiB 3,3V 8-bit", 0xDC, 512, 512, 0x4000, 0},
        改為

        {"NAND 512MiB 3,3V 8-bit",0xDC, 0, 512, 0, 0},

        就這樣改一句就把我糾結那么久的問題解決了。。。識別俺的NAND出問題了。。。

        在看代碼的過程中,注意到了一點,就是每當程序運行到nand初始化的時候,都要花費非常久的時間,這直接導致u-boot啟動時間大大延長,這就和我們的電腦一樣,如果BIOS在引導windows時花費了很長時間,任誰都抓狂。

        剛開始我以為這些時間是花費在檢測NAND的容量上,但是通過讀代碼,最終發現,在nand_base.c里有個函數為nand_scan(),其最后為

        return this->scan_bbt (mtd);

        就是這個scan_bbt(mtd),占用了這么長時間。。。然后百度了一下BBT,記錄壞塊的一個東東,然后我就把他拋棄了,然后這個返回變為return 0;....呱呱,啟動只需一瞬間,或許我的電腦啟動那么慢也是做很多無聊的事吧。。。呵呵,開個玩笑,建立BBT是非常有好處滴,自己百度吧。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 多伦县| 醴陵市| 巨鹿县| 阜平县| 金昌市| 兰西县| 嘉义县| 常熟市| 赤水市| 沙雅县| 扶沟县| 江永县| 陇南市| 澳门| 宜君县| 岳西县| 濮阳县| 和政县| 靖远县| 安康市| 南木林县| 西充县| 唐河县| 绥滨县| 甘孜| 玉林市| 莱芜市| 彩票| 云南省| 通榆县| 当雄县| 青岛市| 余庆县| 龙井市| 太康县| 赤城县| 平顺县| 栾川县| 榆林市| 紫云| 高邑县|