转载

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.       L1 I/D cache

2.       关闭 MMU cache

3.       关闭看门狗

l   L1 I/D cache 失效

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 协处理器的寄存器的简介,我们仔细阅读其对所有寄存器的说明可以找到下面的表

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

那么怎么去设置这个寄存器呢,我们稍微看看文档就会发现下面东西

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

所以我们让 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 我们重点关注一下它的下面几个位

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

从上图我们可以看到,我们只要将这个寄存器的 0 2 12 、位设置为零就可以关闭我们的 cache MMU 了。

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

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

我们先要将里面的数据读出来,经过处理后在写入。所以就不难理解 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.        看门狗原理解析

我们在每个芯片的芯片手册中都可以找到下图:

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

1)         PCLK 经过预分频器以及选择器以后会产生看门狗时钟,然后通过计数逻辑模块,开始计数。

2)         WTDAT 是预先存放的计数初值, WTCNT 是减量计数模块,当 WTCNT WTDAT 的值减到 0 的时候,如果还没有更新 WTDAT ,则认为没有喂狗,系统死机。

3)         发出 reset  信号,强制系统重启

3.        为什么要关看门狗

1)         要一直喂狗麻烦

2)         普遍认为 bootloader 代码较少,不需要看门狗。

4.        怎么关闭看门狗

在芯片手册中我们可以轻松的找到 WTCON 寄存器

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

通过上面寄存器的介绍,我们可以知道向其最低位写入 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]

我也不知道为什么最近的博客老是被移除首页,希望看过的觉得有用的朋友帮我顶一下,十分感谢。

正文到此结束
Loading...