10083|50

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MMU地址映射问题 [复制链接]

各位大侠好!
小弟最近在调试wince5.0的bootloader时遇到了问题,是这样的:cpu是ATMEL9261(926ej-s),在startup.s中没有启用MMU之前程序运行很好!但是当执行完mcr      p15, 0, r1, c1, c0, 0 后,灯也没亮,程序就飞了,请大家赐教啊,谢谢!!
ACTIVATEMMU
    ; The 1st Level Section Descriptors are setup. Initialize the MMU and turn it on.
    ;
    mov     r1, #1
    mcr     p15, 0, r1, c3, c0, 0   ; Set up access to domain 0.
    mov            r0, #0                  ; ********I PLUS   
    mcr     p15, 0, r0, c8, c7, 0   ; Flush the instruction and data TLBs.
    mcr     p15, 0, r0, c7, c10, 4  ; Drain the write and fill buffers.********I MODIFY

    mov     r1, #0x78               ; Bits [6:3] must be written as 1's.
    orr     r1, r1, #0x1            ; Enable MMU.
    orr     r1, r1, #0x1000         ; Enable IC.
    orr     r1, r1, #0x0800         ; Enable BTB.
        ;orr     r1, r1, #0x50000         ;16,18bit SBO
    orr     r1, r1, #0x4            ; Enable DC.
    ldr     r2, =VirtualStart       ; Get virtual address of 'VirtualStart' label.
    cmp     r2, #0                  ; Make sure no stall on "mov pc,r2" below.
    beq                STALL2



    ; Enable the MMU.
    ;
    mrc     p15,0,r2,c1,c0,0
    orr     r1, r1, r2

    nop
    nop
    nop

    mcr      p15, 0, r1, c1, c0, 0   ; MMU ON:  All memory accesses are now virtual.
   
    nop  (此句程序跑飞)
    nop
    nop

   
        LDR      r3,=0x01000000   (此处是点灯,使用的是pio口的物理地址)
        LDR      r4,=0xFFFFF430
        STR      r3,[r4]

最新回复

好多牛人啊   详情 回复 发表于 2009-12-28 12:24
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
牛人啊!一般我只用芯片公司整好的BOOTLOADER!!!
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我也是从别人的bootloader上修改罢了.请问楼上还遇到过这个问题??
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用楼主 kkkcxf1981 的帖子:
LDR      r3,=0x01000000  (此处是点灯,使用的是pio口的物理地址)
LDR      r4,=0xFFFFF430
STR      r3,[r4]


MMU开了还能是物理地址吗?
如果开了MMU,再使用物理地址,再执行两条指令就会产生异常。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
没有,我没仔细整过BOOTLOADER!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 
可能和表有关,附上mmu地址影射表:
AT91SAM9261EK_VA_BASE_REG                                EQU                        0x9FF00000
AT91SAM9261EK_VA_BASE_LCD                                EQU                0x9FE00000     ;LCD
AT91SAM9261EK_VA_BASE_SRAM                                EQU                        0x9E700000
AT91SAM9261EK_VA_BASE_NOR_NK                                EQU                        0x84100000
AT91SAM9261EK_VA_BASE_NOR_bootloader                        EQU                        0x84000000
AT91SAM9261EK_VA_BASE_SDRAM                                EQU                        0x80000000

AT91SAM9261EK_BASE_SRAM                                        EQU                        0x00300000
AT91SAM9261EK_BASE_SDRAM                                EQU                        0x20000000
AT91SAM9261EK_BASE_LCD                                      EQU                        0x30000000
AT91SAM9261EK_BASE_NOR_NK                                EQU                        0x40000000
AT91SAM9261EK_BASE_NOR_bootloader                        EQU                        0x10000000
AT91SAM9261EK_BASE_REG                                        EQU                        0xFFF00000




;------------------------------------------------------------------------------
;
; TABLE FORMAT
;       cached address, physical address, size
;------------------------------------------------------------------------------

ALIGN
g_oalAddressTable

        DCD     AT91SAM9261EK_VA_BASE_REG,      AT91SAM9261EK_BASE_REG,     1       ; Internal registers.
        DCD     AT91SAM9261EK_VA_BASE_SRAM,     AT91SAM9261EK_BASE_SRAM,    1       ; INTERNAL SRAM (160KB).
        DCD     AT91SAM9261EK_VA_BASE_SDRAM,    AT91SAM9261EK_BASE_SDRAM,   64      ; AT91SAM9261EK SDRAM (64MB).
        DCD     AT91SAM9261EK_VA_BASE_LCD,      AT91SAM9261EK_BASE_LCD,     1       ; LCD registers.
        DCD        AT91SAM9261EK_VA_BASE_NOR_NK,   AT91SAM9261EK_BASE_NOR_NK,  64      ;  NOR
        DCD        AT91SAM9261EK_VA_BASE_NOR_bootloader, AT91SAM9261EK_BASE_NOR_bootloader, 1      ; NOR

        DCD     0x00000000, 0x00000000,  0      ; end of table
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢gooogleman 指教.
我在mcr      p15, 0, r1, c1, c0, 0  ;之后加了bl test,还是没有看到灯亮啊??有听说和地址影射表有关??
void test(void)
{
   AT91PS_PIO                        pioa                = (AT91PS_PIO) OALPAtoVA((DWORD) AT91C_BASE_PIOA, false);
   while(1)
   {
            //*(unsigned int *)0xFFFFF430 |=0x01000000;//PA24置1
           pioa->PIO_SODR |=0x01000000;
   }
}
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 
开启MMU之前要把内存映射表基址放到协处理器的寄存器上

的,这样CPU才能取到虚拟地址,你现在直接弄个开启MMU的命令是没有作用的。


你的开发板难道没有bootloader?那这个芯片要重新开发一个bootloader挺难的。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

9
 
你说的是这个吧:
; Set the TTB.
    ;
    ldr     r9, =AT91SAM9261EK_BASE_MMU_CFG         ; Physical address of the first-level table
    ldr     r0, =0xFFFFC000                   ;
    and     r9, r9, r0                        ; Mask off TTB[31:0] (must be 0's).
    mcr     p15, 0, r9, c2, c0, 0             ; Set the TTB.
我这个已经执行过了,而且我随意选了两个descriptor地址,在SRAM内存里看过descriptor值也是正确的
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
我的板子是自己搭建的,买来的bsp对应的硬件和我的也不一样
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 kkkcxf1981 的回复:
我的板子是自己搭建的,买来的bsp对应的硬件和我的也不一样


哦,那你可以把他的MMU的部分移植过来啊,
除非你把内存改大了,不然我觉得都是一样的,如果改大了内存就在那张表上添加即可。

我的本来就可以用的,所以我随便改动一下,就能实现自己想要的。

资料不多的芯片不敢用,找个人交流都难。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

12
 
试过在没有开启mmu情况下,程序是可以正确点灯的,应该就是开启出问题了,请gooogleman 大侠帮忙啊
 
 
 

回复

97

帖子

0

TA的资源

一粒金砂(中级)

13
 
试过在没有开启mmu情况下,程序是可以正确点灯的,应该就是开启出问题了,请gooogleman 大侠帮忙啊
——————————————————————————————————————————————

不敢,现在我自己忙的要死,不像去年了,现在要做公司的事情了。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

14
 
自己继续看看,希望有做过的朋友帮帮忙啊
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

15
 
需要在开启mmu后 用mov pc指令切换到虚地址


    ldr   r1, =VirtAddr
    mcr      p15, 0, r1, c1, c0, 0  ; MMU ON:  All memory accesses are now virtual.
   
    nop

    mov pc, r1

VirtAddr:


LDR      r3,=0x01000000  (此处是点灯,使用的是pio口的物理地址)
LDR      r4,=0xFFFFF430
STR      r3,[r4]

VirtAddr标号的值必须是虚地址
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
请问hhyh612 :
1:
ldr  r1, =VirtAddr
mcr      p15, 0, r1, c1, c0, 0  ; MMU ON:  All memory accesses are now virtual
怎么会把VirtAddr 值赋值给了cp15?
2:怎么能确保VirtAddr标号的值必须是虚地址??
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 15 楼 kkkcxf1981 的回复:

1:
ldr  r1, =VirtAddr
mcr      p15, 0, r1, c1, c0, 0  ; MMU ON:  All memory accesses are now virtual
怎么会把VirtAddr 值赋值给了cp15?

我估计这是hhyh612 老兄的笔误。不能这么弄的,你原来这样才行。
2:怎么能确保VirtAddr标号的值必须是虚地址??

这个问题问的真是好,这个eboot.bin打包是由eboot.bib控制了,这个eboot.bib里面使用 的是虚拟地址
这个VirtAddr标号如果没有强行定义为物理地址,那么默认就是虚拟地址的。
如果想使用物理地址那么一般使用这个方法
标号 EQU  物理地址
在以后这个标号就是物理地址

 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

18
 
哦,原来如此!多谢gooogleman指教,呵呵
我再试试hhyh612说的方法...
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

19
 
up
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

20
 
问题依旧.
请问:我的cpu寄存器的物理起始地址为:AT91SAM9261EK_BASE_REG EQU 0xFFF00000 ;对应的虚拟地址为
AT91SAM9261EK_VA_BASE_REG EQU 0x9FF00000 ,pioA的输出设置寄存器物理地址为0xFFFFF430,转换后的虚拟地址为0x9FFFF430,如果想在打开mmu后再点灯,是否可以这样直接对0x9FFFF430地址进行操作??
LDR      r3,=0x01000000  
LDR      r4,=0x9FFFF430
STR      r3,[r4]
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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