分享

u-boot 分析(五)

 dwlinux_gs 2015-03-20

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   L1 I/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   关闭 MMU cache

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]

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多