mini2440汇编实例--mmu

发布者:Tianyun2021最新更新时间:2022-05-18 来源: eefocus关键字:mini2440  mmu 手机看文章 扫描二维码
随时随地手机看文章

head.S

.text

.global _start

_start:

    ldr sp, =4096                       

    bl  disable_watch_dog               

    bl  memsetup                        

    bl  copy_2th_to_sdram               

    bl  create_page_table               

    bl  mmu_init                        

    ldr sp, =0xB4000000                 

    ldr pc, =0xB0004000                 

halt_loop:

    b   halt_loop


init.S

.equ WTCON, 0x53000000

.equ MEM_CTL_BASE, 0x48000000


.align 4

mem_cfg_value:

    .long 0x22011110     //BWSCON

    .long 0x00000700     //BANKCON0

    .long 0x00000700     //BANKCON1

    .long 0x00000700     //BANKCON2

    .long 0x00000700     //BANKCON3

    .long 0x00000700     //BANKCON4

    .long 0x00000700     //BANKCON5

    .long 0x00018005     //BANKCON6

    .long 0x00018005     //BANKCON7

    .long 0x008C07A3     //REFRESH

    .long 0x000000B1     //BANKSIZE

    .long 0x00000030     //MRSRB6

    .long 0x00000030     //MRSRB7

#define MMU_TLB_BASE        0x30000000

#define MMU_FULL_ACCESS     (3 << 10)   

#define MMU_DOMAIN          (0 << 5)    

#define MMU_SPECIAL         (1 << 4)    

#define MMU_CACHEABLE       (1 << 3)    

#define MMU_BUFFERABLE      (1 << 2)    

#define MMU_SECTION         (2)         

#define MMU_SECDESC         (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL | /

                             MMU_SECTION)

#define MMU_SECDESC_WB      (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL | /

                             MMU_CACHEABLE | MMU_BUFFERABLE | MMU_SECTION)

#define MMU_SECTION_SIZE    0x00100000

.global disable_watch_dog

.global memsetup

.global copy_2th_to_sdram

.global create_page_table

.global mmu_init

disable_watch_dog:

    ldr r1, =WTCON

    mov r2, #0x00000000

    str r2, [r1]

    mov pc, lr

memsetup:

    ldr  r1, =MEM_CTL_BASE

    adrl r2, mem_cfg_value

    mov  r3, #13

1:

    ldr r4, [r2], #4    //r4 = [r2], r2 += 4

    str r4, [r1], #4    //[r1] = r4, r1 += 4

    sub r3, r3, #1      //r3 -= 1

    cmp r3, #0x0

    bne 1b

    mov pc, lr

copy_2th_to_sdram:

    ldr r1, =2048

    ldr r2, =0x30004000

    ldr r3, =4096

1:

    ldr r4, [r1], #4    //r4 = [r1], r1 += 4

    str r4, [r2], #4    //[r2] = r4, r2 += 4

    cmp r1, r3

    bne 1b

    mov pc, lr

create_page_table:

    //0 --> 0

    mov r1, #MMU_TLB_BASE

    ldr r2, =MMU_SECDESC_WB

    str r2, [r1]

    //0x56000000+1M-1 -->  0xA0000000+1M-1

    ldr r3, =(0xA0000000 >> 20)

    ldr r2, =((0x56000000 & 0xFFF00000) | MMU_SECDESC)

    str r2, [r1, r3, lsl #2]

    //0x30000000~0x33FFFFFF --> 0xB0000000~0xB3FFFFFF

    mov r2, #0xB0000000

    mov r3, #0x30000000

1:

    mov r4, r3

    orr r4, r4, #0xC10    

    add r4, r4, #0x0e              //r4 = (r3 & 0xFFF00000) | MMU_SECDESC_WB

  

    mov r3, r2, lsr #20            //r3 = r2 >> 20

    str r4, [r1, r3, lsl #2]       //[r1 + r3 << 2] = r4

    add r2, r2, #0x100000

    add r3, r3, #0x100000

    cmp r2, #0xB4000000

    bls 1b

    

    mov pc, lr

mmu_init:

    mov    r0, #0

    mcr    p15, 0, r0, c7, c7, 0     //disable ICaches and DCaches

    

    mcr    p15, 0, r0, c7, c10, 4

    mcr    p15, 0, r0, c8, c7, 0   

    

    mov    r4,  #MMU_TLB_BASE

    mcr    p15, 0, r4, c2, c0, 0    //tlb base

    

    mvn    r0, #0

    mcr    p15, 0, r0, c3, c0, 0

   

 

    mrc    p15, 0, r0, c1, c0, 0    //read

    

    bic    r0, r0, #0x3000

    bic    r0, r0, #0x0300

    bic    r0, r0, #0x0087

    orr    r0, r0, #0x0002

    orr    r0, r0, #0x0004

    orr    r0, r0, #0x1000

    orr    r0, r0, #0x0001

    

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

    

    mov    pc, lr


这里需要注意的是MMU通过Translation base和table index(即MVA的高12位)找到段描述符,从而找到物理地址,Translation base占[31:14],table index占[13:2],后两位是0,所以就有了str  r4,  [r1, r3, lsl #2]这种写法,其中r4为段描述符,r1为translation base,r3位MVA的高12位,而C语言里的写法是这样的 *(ttb_base + (virtaladdr >> 20)) = (physicaladdr & 0xFFF00000) | SEC,这里表面上看不到左移两位的操作,其实已经包含了移位的操作,ttb_base是unsigned long类型的,这样一个指针移动1个位置就是4个字节,就相当于左移了2位,*(ttb_base + 1)就相当于(unsigned char*)ttb_base + 1 << 2


关键字:mini2440  mmu 引用地址:mini2440汇编实例--mmu

上一篇:嵌入式学习-mini2440启动相关
下一篇:mini2440汇编实例--led

推荐阅读最新更新时间:2024-11-17 11:56

mini2440串口轮询实验
程序依然烧写在norflash上面 Makefile uart.bin : start.s function.c arm-linux-gcc -g -c -o start.o start.s arm-linux-gcc -g -c -o function.o function.c arm-linux-ld -Ttext 0x30000000 -g start.o function.o -o uart.elf arm-linux-objcopy -O binary -S uart.elf uart.bin arm-linux-objdump -D -m arm uart.elf uart.d
[单片机]
linux2.6.32.2 mini2440平台移植-- 串口驱动移植、I2C-EEPROM 驱动移植、看门狗驱动移植
1.7.1 把 UART2 改为普通串口驱动 S3C2440 芯片具有 3 个串口:UART0,1,2,我们下载的 Linux-2.6.32.2 已经具备完善的 UART0,1 的驱动,但对UART2 却用作了红外通讯(Irda),因此我们需要把 UART2 驱动稍微调整一下,以便作为普通串口来用。 先看看 S3C2440 串口部分寄存器的说明,如下图 接下来我们修改内核中关于 UART2 的配置,打开 mach-mini2440.c 文件,找到,如下红色代码为修改后的: static struct s3c2410_uartcfg mini2440_uartcfgs __initdata = { = {
[单片机]
linux2.6.32.2 <font color='red'>mini2440</font>平台移植-- 串口驱动移植、I2C-EEPROM 驱动移植、看门狗驱动移植
S3C6410之uboot回炉再造(4)使能MMU
在上一篇中讲完了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
[单片机]
mini2440 LED灯裸机硬件控制程序
查找mini2440的原理图,找到LED部分的原理图: 然后查找nLED_1到nLED_4分别连接的S3C2440的引脚: 由图可知: nLED_1---GPB5 nLED_2---GPB6 nLED_3---GPB7 nLED_4---GPB8 在S3C2440的引脚划分中,这四个引脚都属于Port B,因此可以通过配置Port B的控制寄存器对这四个引脚的功能进行配置 如果要让LED灯亮,nLED_1到nLED_4端需要低电平,因此GPB5到GPB8引脚需要: (1)输出:GPBCON 因此,GPBCON寄存器的11,13,15,17位要设置为0,而10,12,14,16位要设置为1,而且我们还知道GPBCON
[单片机]
<font color='red'>mini2440</font> LED灯裸机硬件控制程序
mini2440 LED驱动程序开发
一、源代码: /***********************mini2440_leds.c*********************** * * *******************************************************************/ #include linux/miscdevice.h #include linux/delay.h #include asm/irq.h #include mach/regs-gpio.h #include mach/hardware.h #include linux/kernel.h #include linux/modul
[单片机]
QT_MPlayer移植到mini2440
(一)首先要建立交叉编译环境 a) 首先搭建交叉编译环境 i. 将arm-linux-gcc-4.4.3.tar.gz解压到一个空文件夹中 #tar zvxf arm-linux-gcc-4.4.3.tar.gz –C / (C的后面有空格) 改变环境 #gedit /root/.bashrc 将路径改为/opt/FriendlyARM/toolschain/4.4.3/bin export PATH=$PATH:/ opt/FriendlyARM/toolschain/4.4.3/bin 上面两行是同一条命令! 保存退出之后,要重启一下机子命令如下 #reboot 重启之后
[单片机]
专题1-MMU-lesson3-MMU配置与使用
1、段方式MMU 利用虚拟地址然后找到物理地址,通过物理地址访问到led,其过程如下: 一个段的大小是 总共有1M的地址空间。 从上面可知对应GPIO的段物理基地址是0x7f000000.那么要在虚拟地址当中找一个段与之形成对应关系,那么这个段是多少呢,假如是0xa0000000这个段,把这两个段关联起来,那么通过页表来建立这个关系。那么这个页表存放在内存的起始地址0x50000000。接下来就要建立该页表的页表项,要建立页表项就要知道它在页表当中的位置,它的位置实际上就是页表的起始地址+虚拟地址的高12位, 找具体表项里面的内容看芯片手册 保存的段的物理基地址的高12位, should be zero固定为零。
[单片机]
专题1-<font color='red'>MMU</font>-lesson3-<font color='red'>MMU</font>配置与使用
uboot-2011.12移植到S3C2440(三序)——MMU Cache/TLB/etc on/off functions
R1_I EQU (1 12) ;//Cache分开时,1 使能指令Cache,0 禁止使能Cache R1_C EQU (1 2) ;//禁止/使能数据Cache或整个Cache,1使能 不含Cache返回0,不能禁止Cache返回1 R1_A EQU (1 1) ;//是否支持内存访问时地址对齐检查系统,1使能 R1_M EQU (1) ;//禁止/使能MMU 1使能 R1_iA EQU (1 31) R1_nF EQU (1 30) ;void MMU_EnableICache(void) EXPORT MMU_EnableICache MMU_EnableICache mr
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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