類似的文章網(wǎng)上很多了,大都以軟件分析為主,從U-boot到kernel。很多文章的分析也是非常詳細以及精辟的。在這里,不想多說軟件的機制,那樣的機會留給大家吧。
本文引用地址:http://m.butianyuan.cn/article/201611/318976.htm 記得07-08年一次去華為面試,主考官問了一些nand flash的操作的事宜,也算還好,沒有太多刁難。面試結(jié)果還是沒有被錄取,這里有很多因素,有自己的,也有對方的。記得在面試的時候考官問了一個問題,flash的讀寫。還很詳細的指了nand的操作。后來快面試結(jié)束的時候我問了考官一個問題:軟件可以通過讀寫控制寄存器,或是把命令執(zhí)行在data-bus上來模擬控制命令(理論上可以執(zhí)行)。但是在還沒有任何初始化外設(shè)(SDRAM,DRAM,RAM)的情況下,哪里的代碼可以操作nand flash這樣的設(shè)備。應(yīng)為這樣的設(shè)備,是要使用命令來控制flash的行為的。這樣的狀態(tài)也就是上電那一剎那,到mpu的第一條指令的開始地方,是如何過渡的。(注意:nand,cf-card,usb-storage不是唯一的掉電非易失的存儲元器件,還有arm-xxx片內(nèi)的rom和ram)
帶著這樣的問題看了很多資料,不乏芯片手冊等等?,F(xiàn)在在omap的板子上終于找到答案來驗證自己的想法。所以想把它寫下來。
話說這樣的rom很不被人們重視,在開發(fā)過程中往往考慮兩種因素:成本,開發(fā)周期。
成本顯而易見,64M的換32M的,32M的換16M的,比起flash的操作,這里還是比較佩服broadcom的工程師居然可以把image控制在2M之內(nèi)。
開發(fā)周期更顯而易見,sdk包,解決方案全部采用ralink的。Demo板拿來直接調(diào)試就好了。很少有人會去關(guān)注上電之初flash的操作。那么,為什么沒有一個完整的文檔說明完成硬件拷貝的過程呢?我也不知道。
看了mpc860的用戶手冊,上面提及了一個概念HC。(HARDWARE COPY)。這樣的HC是硬件完成的,那么硬件的邏輯是否就是和軟件一樣呢?再去看看了fpga的設(shè)計叢書,答案完全可以。硬件完全可以模擬軟件的指令。這里有所不同的是軟件是開發(fā)人員,要求cpu這么去做的。但是硬件是什么角色?這個角色可以這樣認為:在軟件無法涉及的領(lǐng)域,代替了部分軟件(開發(fā)人員的邏輯)。這樣的邏輯往往是單一,簡潔的。說了半天,開始分析啟動過程。
第一:概念
Rom ram sdram flash這些概念大家都不陌生了。也不解釋相關(guān)的電器特性。只要知道相關(guān)操作特性:
ram可以通過地址直接訪問。讀寫像sdram,掉電易失。直接經(jīng)過行列地址譯碼。找到存儲單元。并且把存儲單元中的內(nèi)容返回在數(shù)據(jù)線上。地址和數(shù)據(jù)線可以復用。
但是flash這樣的設(shè)備,不是這樣,特別是spi和nand類型的。直接給出的地址無法作用到數(shù)據(jù)線上。想要得到設(shè)備上的具體數(shù)據(jù)必須通過命令的形式來完成:read +操作的設(shè)備地址;write + 操作設(shè)備的地址。數(shù)據(jù)線用于傳輸數(shù)據(jù),指令線用于傳輸數(shù)據(jù)。復用的地址線通過鎖存來表示讀或者是寫操作。
注意:這些設(shè)備的數(shù)據(jù)線和指令線是否復用,要看具體的datasheet。
第二:原因
CPU的行為只有兩種:1取指令2運算。那么保證在某一時刻cpu取得指令是正確的,這就是最重要的事情。保證在32位并行訪問時候得到的數(shù)據(jù)是正確的,并且這上電之初在設(shè)備(可以進行直接地址訪問)中的數(shù)據(jù)就是boot的代碼。
第三:解決
如果CPU在上電之初可以訪問片內(nèi)的ram。并且ram中的內(nèi)容就是存儲boot的代碼的設(shè)備中一部分內(nèi)容。這樣cpu就可以順利的執(zhí)行指令了。
那么是什么把flash的內(nèi)容拷貝到片內(nèi)的ram上呢?這就使上面提及的硬件代替了部分軟件的邏輯。這樣的邏輯往往是簡單的。就是從flash上拷貝。拷貝到哪里?片內(nèi)的ram。
在omap的芯片上片內(nèi)的ram位于0x40200000 ~ 0x4020ffff。Flash位于(GPMC)總線的接口上。在u-boot下使用簡單的命令來比較一下flash中第一個page中的二進制內(nèi)容,和ram中的內(nèi)容,是否一樣。
圖1中顯示的nand dump命令下page 0 offset 0的內(nèi)容
圖2中顯示的是x-load用UE打開始顯示的二進制內(nèi)容
圖3中顯示的是片內(nèi)的ram中偏移量為0x800地址開始的內(nèi)容
如上三圖所示flash,ram中的內(nèi)容是相同的。和ram中的內(nèi)容作比較出了字節(jié)序不一樣,其實內(nèi)容都一樣。那么為什么在偏移量的0x800的內(nèi)容開始時一樣的?這就是CPU上電以后的第一條指令了。要求在這個位置。這個位置和外設(shè)電路的(boot電路)安排相關(guān)。這個啟動地址可以選擇,但是開關(guān)的行為由外設(shè)電路決定。具體開發(fā)板要看具體的datasheet。軟件上也可以控制,在編譯的最后階段,有連接腳本中指出偏移量。再有l(wèi)d解析后組裝成可以運行的image。
這樣一來就可以看出來,上電后,并不是boot代碼在運行。而是有其他的機制保證了代碼出現(xiàn)在有效地上。而后CPU到事先按排好的地址去取指并執(zhí)行。這就使所謂的HC,硬件拷貝。在artmel系列的開發(fā)板上還有稱之為“step stone”的概念。就是存放flash里面前4k的代碼的ram。具體的記不太清楚了,曾經(jīng)有一次遇到過32M的flash。往往在較大容量的flash上,前面的4k或是64k的訪問方式上存在區(qū)別。有的遵循CFI標準,有的則是JEDC的標準。看芯片的設(shè)計而定。不光是軟件的設(shè)計按照這些標準,硬件的邏輯設(shè)計也要滿足這樣的標志。
其實上電指出還有cpu的clock也是很重要的因素。有機會再聊聊這個clock和PLL。
評論