S3C6410之uboot回炉再造(4)使能MMU

发布者:美丽的1号最新更新时间:2024-09-02 来源: cnblogs关键字:S3C6410  uboot 手机看文章 扫描二维码
随时随地手机看文章

在上一篇中讲完了lowlevel_init中对相应模式的设置、在最后对MMU进行了初始化。


那在这一篇就把使能MMU的过程描述了。

 

1、设置访问域


 1 after_copy:            //这里怎么就after了、我们可还没有copy呢

                    //剧透一下,后面会补充copy相关的代码,此处暂且跳过

 2 #ifdef CONFIG_ENABLE_MMU    //

 3 enable_mmu:

 4     /* enable domain access */

 5     ldr    r5, =0x0000ffff

 6     mcr    p15, 0, r5, c3, c0, 0    /* load domain access register */

        //又是协处理器、查表知:寄存器为 Domain Access Control Register

 7       //查位设置知道:此处将 D7 ~ D0 的位设置成允许管理,不再询问权限


2、设置TTB寄存器()


 8     /* Set the TTB register */

 9     ldr    r0, _mmu_table_base        //稍后解析

10     ldr    r1, =CONFIG_SYS_PHY_UBOOT_BASE  //第一篇已叙述,0x57e0_0000

11     ldr    r2, =0xfff00000           

12     bic    r0, r0, r2             //清楚段首偏移

13     orr    r1, r0, r1             //包含 r1 的段首偏移和 r0 的段内偏移

14     mcr    p15, 0, r1, c2, c0, 0       //查协处理器

        //Translation Table Base 转换表的基址

15 


这里的 _mmu_table_base 最终定义为


#ifdef CONFIG_ENABLE_MMU

_mmu_table_base:

    .word mmu_table

#endif

  mmu_table 就是我们在 lowlevel_init 中最后介绍的制表代码的头。


3、使能MMU的准备工作


16     /* Enable the MMU */

17     mrc    p15, 0, r0, c1, c0, 0  //Control Register

                 //见上一节、此时 r0 最低位为 0

18     orr    r0, r0, #1        /* Set CR_M to enable MMU */

                       //将 r0 最低位置 1

19 

20     /* Prepare to enable the MMU */

21     adr    r1, skip_hw_init     //小范围地址取值

22     and    r1, r1, #0x3fc      //保留段内偏移

23     ldr    r2, _TEXT_BASE      //保留代码段偏移

24     ldr    r3, =0xfff00000     

25     and    r2, r2, r3        //保留段首偏移

26     orr    r2, r2, r1        //r2 取到相应段内 skip_hw_init 偏移地址

27     b    mmu_enable         //就在下面

28 


4、使能MMU(ps:不要被上一段的英文注释迷惑了)


29     .align 5

30     /* Run in a single cache-line */

31 mmu_enable:

32            //r0 只需要知道最低位为 1 就好

33     mcr    p15, 0, r0, c1, c0, 0

                      //协处理器、查表

            //在下面贴出相应寄存器的最低位

34     nop

35     nop

36     mov    pc, r2  //跳转到 skip_hw_init 的位置

        //个人感觉不要也没有什么问题,和之前的 mmu_disable 差不多的方法

37 #endif


寄存器最低位控制信息


[0]    M bit  Banked    Enables the MMU.

               0 = MMU disabled, reset value.

               1 = MMU enabled.

  此时、MMU才真正使能了。


  在此处小回顾一下,之前的 NAND FLASH 和这里的 MMU 都是由协处理器使能的。


关键字:S3C6410  uboot 引用地址:S3C6410之uboot回炉再造(4)使能MMU

上一篇:S3C6410之uboot回炉再造(5)设置堆栈与跳转至C入口
下一篇:S3C6410之uboot回炉再造(3)lowlevle_init.S

推荐阅读最新更新时间:2026-03-20 12:32

s3c6410 uboot初步移植
对uboot主要是修改: 1、更改交叉编译器   CROSS_COMPILE ?= arm-linx- 2、对board项进行修改 3、include项修改 4、CPU项修改 5、根目录下Makefile修改 6、arm架构修改 7、nand_spl修改 此次 移植过程很成功,未报错,但是生成的*.bin文件在板子上运行未见效果。
[单片机]
S3C6410uboot回炉再造(3)lowlevle_init.S
  这一篇粗略讲一下lowlevel_init.S内部的模块。   1、_TEXT_BASE 1 #include config.h 2 #include version.h 3 4 #include asm/arch/s3c6400.h 5 6 #ifdef CONFIG_SERIAL1 7 #define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART0_OFFSET) 8 #elif defined(CONFIG_SERIAL2) 9 #define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE
[单片机]
S3C6410uboot回炉再造(7)C环境的入口
  上一部分讲到 uboot 跳转到 start_armboot 处执行(中间插了一篇 异常中断处理)。   这次主要是记录 start_armboot 的实现。   文件为 /lib_arm/board.c   1、参数声明 1 void start_armboot (void) 2 { 3 init_fnc_t **init_fnc_ptr;        //这里实际上是创建数组指针            //指向的数组为 start_armboot 之前的 init_sequence 数组 4 char *s; 5 #if defined(CONFIG_VFD) || defined(CO
[单片机]
制作属于自己的uboot基于S3C6410
Ok6410的硬件相比mini6410强大许多(同样的价钱),但是ok6410的uboot制作用起来不方便,需要输入很多命令才可以烧写完一个系统。我还是比较怀念在2440上方便、灵活的烧写方式。 下面我们就来修改出一个简单的uboot,实现快速更新系统。 一、首先简单的说明uboot的启动过程: 1)、从文件层面上看主要流程是在两个文件中:cpu/xxxx/start.s,lib_arm/board.c。 Start.s 在flash中执行的引导代码,也就是bootloader中的stage1,负责初始化硬件环境,把u-boot从flash加载到RAM中去,然后跳到lib_arm/board.c中的start_armboot
[单片机]
使uboot支撑 S3C6410的SD启动
这里运用 的uboot并非uboot官方揭晓的uboot代码,而是为三星定制的一个uboot版本s3c-u-boot-1.1.6,其代码作者就包含了三星的程序员与denx的员工。这个版本支撑 SD启动,不过默认是nand启动,使它支撑 uboot须要 做以下事情:   1、 虽然支撑 uboot启动,但是uboot代码里不叫SD启动形式,而是叫movinand启动形式 ,在incluede/configs/smdk6410.h中就有这个选项,所以在这个文件里关上 nand启动,打开movinand启动就能够 了:   //#define CONFIG_BOOT_NOR   //#define CONFIG_BOOT_NAND
[单片机]
S3C6410 SPI全双工读写流程分析(原创)
一、SPI控制器datasheet 1详细请参考:http://blog.csdn.net/hustyangju/article/details/20474659 2 SPI的所有寄存器都是映射到内核空间的,采用基地址+偏移地址的方式访问 static volatile void __iomem *spiregs; //global variable for mapping spiregister spiregs = (volatile)ioremap(0x7F00B000,0x30); //just request for the spi0 3 下文可能用到的偏移地址 #defi
[单片机]
【ARM】S3C6410芯片的启动流程
S3C6410芯片的启动流程 (1) 上电后首先运行iRom(BL0)内的代码,主要完成时钟和看门狗等外围器件的初始化。 (2) 拷贝SD卡或者NnadFlash中的前4k(BL1)代码到片内ram(垫脚石)去运行,主要工作是配置主存储器SDRAM。并将剩余的BL1和BL2加载到SDRAM上。 (3) 完成后将程序的入口跳转到SDRAM中的BL2继续运行。并将存储设备上的OS加载到SDRAM运行。 (4) 将程序的入口跳转到拷贝到SDRAM上的OS的入口进行运行。
[单片机]
【ARM】<font color='red'>S3C6410</font>芯片的启动流程
linux内核中S3C6410 timer相关代码理解
本文描述基于mini6410平台的time.c中的相关代码,主要描述下对部分代码的理解。 先贴上代码: 1 /* we use the shifted arithmetic to work out the ratio of timer ticks 2 * to usecs, as often the peripheral clock is not a nice even multiple 3 * of 1MHz. 4 * 5 * shift of 14 and 15 are too low for the 12MHz, 16 seems to be ok 6 * for the current HZ value
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved