上篇博文我們按照210的啟動流程,對u-boot啟動中的設置異常向量表,設置SVC模式進行了分析,今天我們繼續按照u-boot的啟動流程對以下內容進行分析。
今天我們會用到的文檔:
- Arm9內核手冊:http://download.csdn.net/detail/wrjvszq/8358867
- Arm11內核手冊:http://download.csdn.net/detail/wrjvszq/8358877
- Arm a8內核手冊:http://download.csdn.net/detail/wrjvszq/8358893
- 2440芯片手冊:http://download.csdn.net/detail/wrjvszq/8358949
- 6410芯片手冊:http://download.csdn.net/detail/wrjvszq/8358965
- 210芯片手冊:S5PV210_UM_REV1.1(我的不知道為什么傳不上去大家去百度搜吧)
今天我們將會分析以下內容:
2. 關閉MMU和cache
3. 關閉看門狗
1. 什么是cache
Cache 是位於 CPU與主存儲器DRAM之間的少量超高速靜態存儲器 SRAM(static RAM),其是為了解決 CPU 與主存之間速度匹配問題而設置的。
Cache又分為I-cache(用來存指令)和D-cache(用來存數據)
2. 為什么要讓cache失效
我們在使用cache的時候要經過一系列的配置,在沒配置之前是不能使用的。所以我們要關閉cache,但是在關閉cache之前cache里面可能已經有數據了,為了不影響我們的代碼,所以要先讓其失效,在進行關閉。
3. 怎么讓cache失效
根據A8內核手冊中的3.2.1Register allocation一節我們找到了其對CP15協處理器的寄存器的簡介,我們仔細閱讀其對所有寄存器的說明可以找到下面的表
那么怎么去設置這個寄存器呢,我們稍微看看文檔就會發現下面東西
所以我們讓cache失效的代碼就很簡單了,通過下面的指令就可以讓cache失效了。
1 mcr p15, 0, r0, c7, c5, 0//讓cache失效
注:在u-boot中這一部分代碼還失效了別的東西,我們這里就不關注了。
l 關閉MMU和cache
1. 什么是MMU:
MMU就是負責虛擬地址(virtual address)轉化成物理地址(physical address)。
在這里肯定有人跟我一樣的疑惑,既然有物理地址我們訪問的時候訪問物理地址不就完事了嗎?為什么要有虛擬地址的存在,然后還要加個專門的硬件去轉換,這就是多此一舉嗎?
其實加入了虛擬地址后有下面兩個作用
1) 虛擬內存:有了虛擬內存,可以在處理器上運行比實際物理內存大的應用程序。
2) 內存保護:根據需要對特定的內存區塊的訪問進行保護,通過這一功能,我們可以將特定的內存塊設置成只讀、只寫或是可同時讀寫。
2. 為什要關閉MMU
跟cache的原因一樣,在使用MMU之前要進行一系列的初始化,並且過程比較復雜,現在用不到所以要關閉它。
3. 怎么關閉MMU
同樣在剛才的寄存器列表中我們可以找到一個Control Register 我們重點關注一下它的下面幾個位
從上圖我們可以看到,我們只要將這個寄存器的0、2、12、位設置為零就可以關閉我們的cache和MMU了。
那么如何設置呢,我們稍微往下找找就可以找到
我們先要將里面的數據讀出來,經過處理后在寫入。所以就不難理解u-boot的代碼了
1 mrc p15, 0, r0, c1, c0, 0 2 3 bic r0, r0, #0x00002000 @ clear bits 13 (--V-) 4 5 bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM) 6 7 orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align 8 9 orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB 10 11 #ifdef CONFIG_SYS_ICACHE_OFF 12 13 bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache 14 15 #else 16 17 orr r0, r0, #0x00001000 @ set bit 12 (I) I-cache 18 19 #endif 20 21 mcr p15, 0, r0, c1, c0, 0
注:我們重點關注我們剛才提到的幾個是不是為零即可
接着流程往下,我們應該是檢查reset狀態和恢復IO引腳為默認值了,由於這兩部分不是很重要的初始化,所以我們在此就跳過了,在往下就應該到關閉看門狗了
l 關閉看門狗
看門狗的用途是使微控制器在進入錯誤狀態后(死機)的一定時間內復位。當看門狗使能時,如果用戶程序沒有在周期時間內喂狗(重裝),看門狗會產生一個系統復位。
2. 看門狗原理解析
我們在每個芯片的芯片手冊中都可以找到下圖:
1) PCLK經過預分頻器以及選擇器以后會產生看門狗時鍾,然后通過計數邏輯模塊,開始計數。
2) WTDAT是預先存放的計數初值,WTCNT是減量計數模塊,當WTCNT從WTDAT的值減到0的時候,如果還沒有更新WTDAT,則認為沒有喂狗,系統死機。
3) 發出reset 信號,強制系統重啟
3. 為什么要關看門狗
1) 要一直喂狗麻煩
2) 普遍認為bootloader代碼較少,不需要看門狗。
4. 怎么關閉看門狗
在芯片手冊中我們可以輕松的找到WTCON寄存器
通過上面寄存器的介紹,我們可以知道向其最低位寫入0可關閉,其復位,想第二位寫入0可關閉中斷,索性我們之間寫入0就完事,所以也就不難理解u-boot中的代碼了
1 /* Disable Watchdog */ 2 3 4 5 ldr r0, =ELFIN_WATCHDOG_BASE /* 0xE2700000 */ 6 7 mov r1, #0 8 9 str r1, [r0]