u-boot分析(五)----I/D cache失效|關閉MMU和cache|關閉看門狗


u-boot分析(五)

  上篇博文我們按照210的啟動流程,對u-boot啟動中的設置異常向量表,設置SVC模式進行了分析,今天我們繼續按照u-boot的啟動流程對以下內容進行分析。

今天我們會用到的文檔:

  1. Arm9內核手冊:http://download.csdn.net/detail/wrjvszq/8358867
  2. Arm11內核手冊:http://download.csdn.net/detail/wrjvszq/8358877
  3. Arm a8內核手冊:http://download.csdn.net/detail/wrjvszq/8358893
  4. 2440芯片手冊:http://download.csdn.net/detail/wrjvszq/8358949
  5. 6410芯片手冊:http://download.csdn.net/detail/wrjvszq/8358965
  6. 210芯片手冊:S5PV210_UM_REV1.1(我的不知道為什么傳不上去大家去百度搜吧)

 

今天我們將會分析以下內容:

1.      L1I/D cache

2.      關閉MMUcache

3.      關閉看門狗

 

l  L1I/D cache失效

1.       什么是cache

Cache 是位於 CPU與主存儲器DRAM之間的少量超高速靜態存儲器 SRAMstatic 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  關閉MMUcache

1.       什么是MMU

MMU就是負責虛擬地址(virtual address)轉化成物理地址(physical address)。

在這里肯定有人跟我一樣的疑惑,既然有物理地址我們訪問的時候訪問物理地址不就完事了嗎?為什么要有虛擬地址的存在,然后還要加個專門的硬件去轉換,這就是多此一舉嗎?

其實加入了虛擬地址后有下面兩個作用

1)        虛擬內存:有了虛擬內存,可以在處理器上運行比實際物理內存大的應用程序。

2)        內存保護:根據需要對特定的內存區塊的訪問進行保護,通過這一功能,我們可以將特定的內存塊設置成只讀、只寫或是可同時讀寫。

2.       為什要關閉MMU

cache的原因一樣,在使用MMU之前要進行一系列的初始化,並且過程比較復雜,現在用不到所以要關閉它。

3.       怎么關閉MMU

同樣在剛才的寄存器列表中我們可以找到一個Control Register 我們重點關注一下它的下面幾個位

從上圖我們可以看到,我們只要將這個寄存器的0212、位設置為零就可以關閉我們的cacheMMU了。

那么如何設置呢,我們稍微往下找找就可以找到

我們先要將里面的數據讀出來,經過處理后在寫入。所以就不難理解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  關閉看門狗

1.       什么是看門狗

看門狗的用途是使微控制器在進入錯誤狀態后(死機)的一定時間內復位。當看門狗使能時,如果用戶程序沒有在周期時間內喂狗(重裝),看門狗會產生一個系統復位。

2.       看門狗原理解析

我們在每個芯片的芯片手冊中都可以找到下圖:

1)        PCLK經過預分頻器以及選擇器以后會產生看門狗時鍾,然后通過計數邏輯模塊,開始計數。

2)        WTDAT是預先存放的計數初值,WTCNT是減量計數模塊,當WTCNTWTDAT的值減到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]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM