u-boot分析(五)----I/D cache失效|关闭MMU和cache|关闭看门狗

u-boot分析(五)spa

  上篇博文咱们按照210的启动流程,对u-boot启动中的设置异常向量表,设置SVC模式进行了分析,今天咱们继续按照u-boot的启动流程对如下内容进行分析。.net

今天咱们会用到的文档:3d

  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(个人不知道为何传不上去你们去百度搜吧)

 

今天咱们将会分析如下内容:code

1.      L1I/D cacheorm

2.      关闭MMUcacheblog

3.      关闭看门狗内存

 

l  L1I/D cache失效ci

1.       什么是cache文档

Cache 是位于 CPU与主存储器DRAM之间的少许超高速静态存储器 SRAMstatic RAM),其是为了解决 CPU 主存之间速度匹配问题而设置的。get

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]
相关文章
相关标签/搜索