MMU粗页代码

来源:互联网 发布:淘宝主图尺寸 2017 编辑:程序博客网 时间:2024/04/28 01:38
最近几天稍微打算再把MMU的一些粗页代码写下,这个代码和上一次的段页映射都一样,都是一一映射,其他的映射关系也一样,区别就是这边用了二级映射关系,页面全部换成粗页,1024*4096个large page我也是醉了,不过我打算之后再弄得更细点,而且结构层次这次也分得不好,整个汇编代码冗余度也很高,感觉自己用汇编写个通用的函数还是太累了,不想把时间花在一个实验例程上。

0x0000 0000 ->0x0000 0000
.......
0xf000 0000 -> 0xf000 0000

0xb000 0000 ->GPIO口  0x5600 0000
0xc000 0000 ->led程序入口 0x3200 0000 

////////////////////////////////////////////////
.equ    MMU_COARSE_DOMAIN,( (0) <<5 )
.equ    MMU_SPECIAL,      ( (1) <<4 )
.equ    MMU_COARSE_DESC,  0x01

.equ    MMU_COARSE_NORMAL,      ( MMU_COARSE_DOMAIN | MMU_SPECIAL  | MMU_COARSE_DESC )



.equ    COARSE_AP_0,    ( (3) <<4 )
.equ    COARSE_AP_1,    ( (3) <<6 )
.equ    COARSE_AP_2,    ( (3) <<8 )
.equ    COARSE_AP_3,    ( (3) <<10 )

.equ    COARSE_FULL_ACESS,      ( COARSE_AP_0 | COARSE_AP_1 | COARSE_AP_2 | COARSE_AP_3 )

.equ    COARSE_CACHE,   ( (1) << 3)
.equ    COARSE_BUFFER,  ( (1) << 2)
.equ    COARSE_DESC,    (0x01)

.equ    COARSE_NORMAL,  ( COARSE_FULL_ACESS | COARSE_DESC)    
.equ    COARSE_WB,      ( COARSE_NORMAL | COARSE_CACHE | COARSE_BUFFER)


.equ    MMU_BASE_ADDR,          0x30200000
.equ    COARSE_BASE_ADDR,       0x30200000+4096*4

.equ    PA,0X00
.equ    VA,0X00
.equ    ENDPA,0xf0000000

start:
        stmfd   sp!,{r0-r12,lr}

begin:
        mov     r3,#0
        ldr     r5,=ENDPA    
        lsr     r4,r5,#20
        ldr     r11,=MMU_BASE_ADDR
        ldr     r12,=COARSE_BASE_ADDR

       forLoopI:
                cmp     r4,r3
                bcc     NEXT

                mov     r1,#4
                mul     r2,r1,r3
                add     r2,r2,r11

                lsl     r1,r3,#10
                ldr     r9,=MMU_COARSE_NORMAL
                add     r1,r1,r12
                bic     r1,r1,#0x0300
                bic     r1,r1,#0x00f0
                bic     r1,r1,#0x000f
                orr     r10,r1,r9

                str     r10,[r2]

                J_begin:
                        mov     r5,#0
                        mov     r7,#16
                        mov     r8,#0

            forLoopJ:
                        cmp     r7,r5
                        bcc     END_R8

                        mov     r6,#4
                        mul     r9,r6,r5
                        add     r2,r1,r9
                        mov     r6,#64
                        mul     r9,r6,r8
                        add     r2,r2,r9

                        lsl     r6,r3,#20
                        mov     r10,r6
                        lsl     r6,r8,#16
                        add     r10,r10,r6
                        mov     r6,r10

                        ldr     r10,=COARSE_NORMAL
                        orr     r10,r6,r10

                        str     r10,[r2]

                        add     r5,r5,#1
                        b       forLoopJ
                END_R8:
                        cmp     r7,r8
                        bcc     END_I

                        mov     r5,#0
                        add     r8,r8,#1
                        b       forLoopJ
                END_I:
                        add     r3,r3,#1
                        b       forLoopI

NEXT:
        .equ    LED_ADR,0xb0000000
        .equ    LED_P_ADDR,0x56000000
        .equ    LED_BIN,0xc0000000
        .equ    LED_P_BIN,0x32000000

        ldr     r1,=LED_ADR
        ldr     r2,=LED_P_ADDR
        ldr     r3,=LED_BIN
        ldr     r4,=LED_P_BIN

        lsr     r5,r1,#20
        mov     r6,#4
        mul     r7,r6,r5
        add     r6,r7,r11

        ldr     r7,[r6]
        bic     r7,r7,#0x300
        bic     r7,r7,#0x0f0
        bic     r7,r7,#0x00f

        lsl     r5,r1,#22
        lsr     r5,r5,#24
        lsl     r5,r5,#2

        orr     r6,r7,r5

     ldr     r7,=LED_P_ADDR
        bic     r7,r7,#0xf000
        bic     r7,r7,#0x0f00
        bic     r7,r7,#0x00f0
        bic     r7,r7,#0x000f

        ldr     r8,=COARSE_NORMAL
        orr     r9,r7,r8
        str     r9,[r6]

BIN:
        lsr     r5,r3,#20
        mov     r6,#4
        mul     r7,r6,r5
        add     r6,r7,r11

        ldr     r7,[r6]
        bic     r7,r7,#0x300
        bic     r7,r7,#0x0f0
        bic     r7,r7,#0x00f

        lsl     r5,r3,#22
        lsr     r5,r5,#24
        lsl     r5,r5,#2

        orr     r6,r7,r5

        ldr     r7,=LED_P_BIN
        bic     r7,r7,#0xf000
        bic     r7,r7,#0x0f00
        bic     r7,r7,#0x00f0
        bic     r7,r7,#0x000f

      ldr     r8,=COARSE_NORMAL
        orr     r9,r7,r8
        str     r9,[r6]




START_MMU:
mov    r0, #0
mcr    p15, 0, r0, c7, c7, 0 
mcr    p15, 0, r0, c7, c10, 4
mcr    p15, 0, r0, c8, c7, 0
ldr    r4,=MMU_BASE_ADDR
mcr    p15, 0, r4, c2, c0, 0
mvn    r0, #0
mcr    p15, 0, r0, c3, c0, 0
mrc    p15, 0, r0, c1, c0, 0
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


return:
        ldmfd   sp!,{r0-r12,pc}
0 0
原创粉丝点击