2410學習筆記 07 (未整理,但對新手肯定有用)

繼續

無意中看到一個4510B 的bootload介紹(作者杜雲海)寫的非常精彩。
在其中瞭解了一個東西,在編譯後生成的iamge裏, 如何確定RW的位置呢?
   因爲不管是用ADS還是用MDK,生成image都是有規則的,比如一定要按照順序 RO,RW,ZI,根據RO_BASE和RO_LENGTH,其實就可以知道RW_BASE in nand了。
在進行nandcopy時就知道copy的源地址啦。。。而RW的運行域地址,可以是在分散加載文件裏面指定的。就是這麼簡單?自己笨了好久。

    今天試了下 DNW , SFJ2410(這個挺好,不過只能在並口下玩),回頭可以研究一下這兩者的代碼。不知道sfj2410燒錄的時候,也沒有做壞塊管理,沒有做的話,可能會出問題的。比如提供的vivi(晚上回去用MDK燒錄工具試一下能否運行哈哈 ),大小爲85KB,滿打滿算的話需要14個左右的block來,這個既然能正確啓動linux內核,應該說明sfj2410燒錄nand時做了壞塊區分的,而後vivi本身也有壞塊的處理。兩者結合運行纔沒有問題。
    
    NND不能拖了,今晚回去必須首先看MMU(正在看的過程中,有難度啊,真的是博大精深)


NND,使用MDK下載bin文件,發現下載時工具只認axf文件。。。很奇怪,爲什麼不是直接下載bin的呢?那生成bin有什麼用???
不過暫時就不能驗證VIVI用MDK燒錄工具的燒錄運行情況了。。。(除非在MDK環境下編譯一把VIVI)

看來只好採用在ADS下加載bin文件的方式來做了。

2010/01/21 
1. 晚上回去試一下ADS下加載bin文件,直接在ADS或者MDK下無法用fopen等操作了(不知道MDK的腳本機制能不能load file到指定位置)

    嘗試1.把vivi改名爲vivi.axf放到out目錄下,不要編譯直接點擊download報錯,Erase Skipped,這說明原先正常生成的axf文件裏面有些特殊的信息會反饋給MDK中nandlash燒寫程式
              我現在直接裸把vivi改成vivi.axf,導致燒寫失敗;(這是MDK一個很搓的地方,不能指定燒寫bin或者hex的文件,只能按照默認的來)

    嘗試2.在flash download設置選項中,增加填上init file一項,添加了一個ini文件,裏面下LOAD VIVI.HEX發現仍然不行(全路徑也試了還是不行,報錯invalid absolute module)
                並且之前的MDK工程默認的axf文件依然會被加載進入,嘗試失敗

    嘗試3.在SDRAM調試運行環境下,把vivi改成vivi.o並放入out目錄下,在sct文件中添加一項用於裝載vivi的執行域。但是失敗,猜想可能是因爲編譯生成的link文件中沒有vivi.o這一項

    嘗試4.把vivi通過工具
BIN2C_WIN工具先轉換爲C數組,之後把這個C數據的文件link到整個工程中,再在sct中指定該數據的執行域。看能否正確加載,如果OK,則直接使用這些數組中的數據
              對nand編程。 
               實驗結果很意外,爲什麼這個數組加載不到SDRAM中來了???
                可以確vivi中的數組已經存在以axf文件中,
                已經找到原因,原來是因爲我的sct寫的有錯誤。混淆了LR 和ER 域。
                如下是正確的寫法
LREGION_ROM1 0x30000000   0x01000000
{  
    EREGION_ROM1 0x30000000 0x00100000
    {  
        *.o (Init, +First)
        .ANY (+RO)
    }    
    EREGION_RAM1 0x30100000   
    {  
        .ANY (+RW +ZI)
    }
}

LREGION_ROM2 0x30200000  0x00100000
{
     EREGION_VIVI 0x30200000   
    {  
        vivi.o (+RW)        
    }
}
      


2. 讀VIVI,改2410init.s, 增加badblock判斷。


3. 做個試驗,在nand的操作時,增加壞塊判斷,看編程和擦出操作是否OK
!!!
   需要明確我開發板上面這個nandflash現在是不是有很多壞塊了,是不是還能用了
    整理下這個nandblockcheck程序檢測思路

    顯示方式:uart打印
    輸入方式:按鍵PC上鍵盤,通過串口接收
    控制流程:1. 強行從第二個block開始標記所有block爲valid block,對應API,ForceMark_AllBlockValid()
                 2. 從第一個塊開始執行對所有block的擦除操作,對應API,Erase_AllBlock(U32 mode)
                 3. 在擦除過程中可以發現擦除失敗,則把當前塊標記爲壞塊。
                 4. 在以上的操作結束後,纔可以確定哪些是好塊哪些是壞塊。
                 5. 再做boot的東西。
                                    


    API:      Get_BlockStatus---
                從第一個壞塊開始檢查,若當前塊爲壞塊,則串口打印出來信息"this is a bad block, handle it?"
                1. skip and go on.          
                2. mark as bad block and go on.

                調試運行後,出現功能選項
                1. Force mark all as valid block
                    force mark done.

                2. Erase nandflash all block
                    erase all done.

                3. Programe nandflash
                    enter the start block: ___
                    ......programming, pls wait.
                    ......program done.
                    Current nand programe statics:
                        start block:
                        finded bad block cnt:
                        used valid block cnt:
                        last used block index:

                 4. Report check statistics  

                 5. Exit
                
     OK,已經成功實現通過上述方式把bin文件下載到nand中運行。


2010/01/24
    開始測試2410的中斷模塊
        因爲現在還沒有外擴按鍵,所以可以先測試定時中斷效果。藉此把2410init.s改寫一下。

2010/01/25
    1. 繼續測試MDk自帶的nandflash燒錄工具問題
        思路:把測試程序生成bin文件,把bin文件加載到SDRAM中之後通過nand燒寫程序下載到nand看是是否有現象。
        如果仍然不行,則在nandboot部分nandcopy時增加blockcheck。

    2. 完成 2010/01/24 的事情,測試定時中斷,看中斷觸發後的PC跳轉。

    3. 批處理總算搞了一點點,語法很多,很不習慣。網上下載了個rename程序湊合着用了。
        瞭解到 在call xx.bat時需要關注到當前的路徑。
         

2010/01/26
    1.  經過昨晚試驗發現很多問題,vivi bin還是按照原來的方式下載到nand中竟然無法運行了。
    2.  加載時vivi image尺寸有問題 KKK(懷疑是由於在 iamge 數據前添加了 __Align(4)所致,但測試發現也不是,很奇怪
        早上來公司用sfj燒寫了一次後,就SDRAM加載又正常了)

    3.  決定好好做這個nandflash管理的問題(MDK下調試運行的程序)
         新增功能:print page in block
         bin文件的零頭如何處理?即bin中剩餘的數據已經不夠一個page大小,怎麼處理。
   
     4.  首先需要一個方法來驗證我這個調試工具的正確性。比如通過這個工具在特定page寫特定值,之後試用sfj2410的print功能打印看時候匹配
        現在的現象很詭異:用sfj燒好程序後可以正常加載運行,但是用我的工具燒錄後,nand中所有block的page都變成0xff了?

2010/01/26  傍晚
    1. 測試發現atoi函數無效,是不是因爲clib中此函數是個空殼,待查
    2. 在MDK下增加了page打印功能,現在發現一旦用上面的燒寫功能,nandflash中全部是0xff,這肯定有問題的。  問題定位到 Programe_Nandflash_Test() 
        已經解決,就是這個函數寫的有問題,改正過來就好了。

    3. 我把我自己編譯好的一個小程序bin文件中自己的工具燒錄進nand,無法運行,這說明不是壞塊的問題,而是2410init.s中的問題,問題定位於此。
    4. 又發現的一個奇怪的問題是:通過MDK自帶的nand燒錄工具則會把block2標記爲壞塊。並且表現爲0~22全部爲壞頁
        因爲這個自帶的燒錄工具很難跟蹤BUG,暫時先放棄它,用自己的方式來燒寫bin。

2010/01/26  23:32
    1. 經過仔細覈對2410init.s寫法發現很多不妥的地方。比如在nandcopy之後沒有爲pc給合理的值,導致無法跳轉到main函數。
        思路應該是在nandcopy之後,程序就應該在SDRAM中運行了,所以PC必須要知道SDRAM以0x30000000爲起始的某個地方。 這時候因爲SDRAM中有何SRAM種完全相同的一個image,所以pc並沒有指導     SDRAM的起始地方,而是指向在SRAM中nandcopy代碼後面的位置,記住這是一個相對位置,這裏就是相對於0x30000000的,這程序就無 縫的銜接起來了。
    
        接着以上部分還要強調一點,就是在運行nandcopy之前包括nandcopy本身的所有代碼,必須保證在燒錄到nandflash的前4KB以內。
        否則會出現程序無法運行,直接死掉,因爲找不到有效的指令或者數據。

(注意:此時我的2410init.s中nandcopy部分依然沒有增加badblockcheck)

      go on
                       


















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章