類似的文章網上很多了,大都以軟件分析為主,從U-boot到kernel。很多文章的分析也是非常詳細以及精辟的。在這里,不想多說軟件的機制,那樣的機會留給大家吧。
本文引用地址:http://www.104case.com/article/201611/318976.htm 記得07-08年一次去華為面試,主考官問了一些nand flash的操作的事宜,也算還好,沒有太多刁難。面試結果還是沒有被錄取,這里有很多因素,有自己的,也有對方的。記得在面試的時候考官問了一個問題,flash的讀寫。還很詳細的指了nand的操作。后來快面試結束的時候我問了考官一個問題:軟件可以通過讀寫控制寄存器,或是把命令執行在data-bus上來模擬控制命令(理論上可以執行)。但是在還沒有任何初始化外設(SDRAM,DRAM,RAM)的情況下,哪里的代碼可以操作nand flash這樣的設備。應為這樣的設備,是要使用命令來控制flash的行為的。這樣的狀態也就是上電那一剎那,到mpu的第一條指令的開始地方,是如何過渡的。(注意:nand,cf-card,usb-storage不是唯一的掉電非易失的存儲元器件,還有arm-xxx片內的rom和ram)
帶著這樣的問題看了很多資料,不乏芯片手冊等等。現在在omap的板子上終于找到答案來驗證自己的想法。所以想把它寫下來。
話說這樣的rom很不被人們重視,在開發過程中往往考慮兩種因素:成本,開發周期。
成本顯而易見,64M的換32M的,32M的換16M的,比起flash的操作,這里還是比較佩服broadcom的工程師居然可以把image控制在2M之內。
開發周期更顯而易見,sdk包,解決方案全部采用ralink的。Demo板拿來直接調試就好了。很少有人會去關注上電之初flash的操作。那么,為什么沒有一個完整的文檔說明完成硬件拷貝的過程呢?我也不知道。
看了mpc860的用戶手冊,上面提及了一個概念HC。(HARDWARE COPY)。這樣的HC是硬件完成的,那么硬件的邏輯是否就是和軟件一樣呢?再去看看了fpga的設計叢書,答案完全可以。硬件完全可以模擬軟件的指令。這里有所不同的是軟件是開發人員,要求cpu這么去做的。但是硬件是什么角色?這個角色可以這樣認為:在軟件無法涉及的領域,代替了部分軟件(開發人員的邏輯)。這樣的邏輯往往是單一,簡潔的。說了半天,開始分析啟動過程。
第一:概念
Rom ram sdram flash這些概念大家都不陌生了。也不解釋相關的電器特性。只要知道相關操作特性:
ram可以通過地址直接訪問。讀寫像sdram,掉電易失。直接經過行列地址譯碼。找到存儲單元。并且把存儲單元中的內容返回在數據線上。地址和數據線可以復用。
但是flash這樣的設備,不是這樣,特別是spi和nand類型的。直接給出的地址無法作用到數據線上。想要得到設備上的具體數據必須通過命令的形式來完成:read +操作的設備地址;write + 操作設備的地址。數據線用于傳輸數據,指令線用于傳輸數據。復用的地址線通過鎖存來表示讀或者是寫操作。
注意:這些設備的數據線和指令線是否復用,要看具體的datasheet。
第二:原因
CPU的行為只有兩種:1取指令2運算。那么保證在某一時刻cpu取得指令是正確的,這就是最重要的事情。保證在32位并行訪問時候得到的數據是正確的,并且這上電之初在設備(可以進行直接地址訪問)中的數據就是boot的代碼。
第三:解決
如果CPU在上電之初可以訪問片內的ram。并且ram中的內容就是存儲boot的代碼的設備中一部分內容。這樣cpu就可以順利的執行指令了。
那么是什么把flash的內容拷貝到片內的ram上呢?這就使上面提及的硬件代替了部分軟件的邏輯。這樣的邏輯往往是簡單的。就是從flash上拷貝。拷貝到哪里?片內的ram。
在omap的芯片上片內的ram位于0x40200000 ~ 0x4020ffff。Flash位于(GPMC)總線的接口上。在u-boot下使用簡單的命令來比較一下flash中第一個page中的二進制內容,和ram中的內容,是否一樣。
圖1中顯示的nand dump命令下page 0 offset 0的內容

圖2中顯示的是x-load用UE打開始顯示的二進制內容

圖3中顯示的是片內的ram中偏移量為0x800地址開始的內容

如上三圖所示flash,ram中的內容是相同的。和ram中的內容作比較出了字節序不一樣,其實內容都一樣。那么為什么在偏移量的0x800的內容開始時一樣的?這就是CPU上電以后的第一條指令了。要求在這個位置。這個位置和外設電路的(boot電路)安排相關。這個啟動地址可以選擇,但是開關的行為由外設電路決定。具體開發板要看具體的datasheet。軟件上也可以控制,在編譯的最后階段,有連接腳本中指出偏移量。再有ld解析后組裝成可以運行的image。
這樣一來就可以看出來,上電后,并不是boot代碼在運行。而是有其他的機制保證了代碼出現在有效地上。而后CPU到事先按排好的地址去取指并執行。這就使所謂的HC,硬件拷貝。在artmel系列的開發板上還有稱之為“step stone”的概念。就是存放flash里面前4k的代碼的ram。具體的記不太清楚了,曾經有一次遇到過32M的flash。往往在較大容量的flash上,前面的4k或是64k的訪問方式上存在區別。有的遵循CFI標準,有的則是JEDC的標準。看芯片的設計而定。不光是軟件的設計按照這些標準,硬件的邏輯設計也要滿足這樣的標志。
其實上電指出還有cpu的clock也是很重要的因素。有機會再聊聊這個clock和PLL。
評論