天天看點

OK6410 tftp下載下傳核心、檔案系統以及nand flash位址相關整理、總結

     飛淩官方提供了一鍵下載下傳燒寫linux的方式,相對來說比較友善,但是對于開發來說不夠靈活,是以這篇文章把tftp相關的點介紹一下,整理下其中遇到的一些問題。

         一鍵燒寫本質上是啟動位于SD卡中的Uboot,通過uboot讀取sd卡中的檔案到SRAM最後通過nand指令實作一鍵燒寫,這一塊可以參考飛淩提供的uboot源碼中include\configs 中的smdk6410.h 的529行,代碼如下:

代碼1:

<a></a>

        從這段代碼代碼可以看出,uboot中通過宏定義的方式,當定義為FORLINX_BOOT_SD 式通過對相應配置相應的環境變量完成特定的操作,其中定義CONFIG_BOOTCOMMAND 後就可以自動進行nand的查處,從sd卡加載uboot等,這段代碼内容稍後繼續分析。

下面說一下tftp和位址相關的知識總結

        tftp是指通過tftp協定通過網絡的方式進行檔案傳輸,需要說明的是ok6410的出廠uboot是不支援網絡的,這也就意味着nfs根檔案系統以及通過tftp下載下傳核心等都無法操作,其實解決這個問題也很簡單,隻需要替換網卡相關的檔案就可以了,改動不是很大,這個可以找到很多資料,這裡不再贅述。不過飛淩在12年9月的更新CD光牒中已經做了更新,uboot已經支援網絡操作了,查一下源碼也就是改了那幾個檔案,是以可以下載下傳燒寫最新版uboot。

        在進行tftp的操作時最開始可能容易搞混的就是燒寫核心啥的應該燒寫到哪一個位址去,最開始也有點混,比如有人的部落格裡是tftp c0008000 zImage 這個位址是c0008000,國嵌的視訊教程中是c0800000,各不相同,沒看到具體的叙述,而在通過usb等方式中通過usb傳送的位址是50008000,是以可能會存在混亂,是以覺得有必要在部落格中總結一下。關于位址空間的配置設定首先還需要看一下晶片手冊。晶片手冊中關于位址空間的安排如圖所示。

OK6410 tftp下載下傳核心、檔案系統以及nand flash位址相關整理、總結

        有一點需要說明的是,圖中的位址空間是針對通過位址總線與資料總線進行操作的裝置的,通過不同的片選信号來确定對應的位址,是以可以通過圖中查表可以确定ok6410的256M RAM的位址範圍為0x50000000-0x5FFFFFFF 256M的位址空間,是以通過tftp下載下傳到0x50008000也就是加載到RAM中(向後偏移了32K的位址,稍後在介紹)。到這兒對于0x50008000這個位址的由來就初步了解了。

再來看看很多資料中都提到的0xc0008000這個位址,smdk6410.h這個檔案的501行可以找到這部配置設定置:

代碼2

        這部分定義了nand flash的位址空間劃分和啟動的位址:bootm 0xc0008000,也就是說是從記憶體中的這個位址啟動核心的,但問題是在上圖的位址劃分中位址最大值也隻到0x6FFFFFFF,0xc0008000這個位址是什麼地方呢?一樣從源碼入手,繼續找!

同樣從smdk6410.h這個檔案的452行可以找到這部配置設定置。

代碼3

        看了這段代碼就明白了,在使能了MMU之後,這段代碼相當于對位址做了一個重映射,經過(MEMORY_BASE_ADDRESS + (TEXT_BASE - 0xC0000000))計算後,因為MEMORY_BASE_ADDRESS  為0x50000000(可以在檔案開始找到定義)是以經過這樣的一個計算,0xc0008000就是0x5000c000。而0xc0008000是核心啟動的起始虛拟位址,是以需要做這樣的一個映射來和核心對應。

        到這兒可能很多人和我當初有一樣的疑惑,那就是如果tftp燒寫檔案系統應該燒寫到哪一個位址去呢?在回到上面的位址圖表,在最開始我就說過,這個表是針對使用位址總線與資料總線操作的裝置而言,是以對于NOR flash、SRAM、DRAM等都是可以直接尋址讀寫的,而對于Nand Flash,可以參考下電路圖,使用的是8個IO進行操作,右Nand控制器彎沉相關的操作,是以是沒有一個絕對的位址的。需喲啊注意圖表中的黃色框部分,One Nand并不是普通Nand Flash,差別就在于這種Nand是和NOR、SRAM一樣的通過位址總線、資料總線進行操作的方式,是以它是有位址的,對于闆子所用的Nand Flash來說隻有偏移位址,沒有絕對位址。

        到這裡,對于tftp下載下傳核心、檔案系統的相關操作應該清楚了,具體位址其實看看uboot源碼就清楚了,可以參考代碼1中的這部分:

如果通過sd卡啟動時跳過自動操作進入手動選擇操作的話就應該有印象,可以單獨選擇燒寫某一個檔案,例如單獨燒寫檔案系統,操作如下圖所示:

OK6410 tftp下載下傳核心、檔案系統以及nand flash位址相關整理、總結

那麼通過找到對應的指令源碼也是可以的,源碼位于common/mian.c 343行:

通過tftp單獨燒寫核心或者檔案系統時隻需要參考一鍵燒寫的指令燒寫到對應的nand 偏移位址即可。

 本文轉自emouse部落格園部落格,原文連結:http://www.cnblogs.com/emouse/archive/2013/01/19/2868014.html,如需轉載請自行聯系原作者

繼續閱讀