主题 : 我tiny4412的板子,现在做MMU映射GPIO寄存器实验,遇到问题了,求助啊 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 98770
精华: 0
发帖: 13
金钱: 65 两
威望: 13 点
贡献值: 0 点
综合积分: 26 分
注册时间: 2013-12-06
最后登录: 2018-02-25
楼主  发表于: 2015-04-20 20:22

 我tiny4412的板子,现在做MMU映射GPIO寄存器实验,遇到问题了,求助啊

#include "regs.h"

#define GPM4CON  (*(volatile unsigned long*) 0x110002E1)
#define GPM4DAT  (*(volatile unsigned long*) 0x110002E2)

void (*printf)(char *, ...) = 0x43e11f3c;

void init_ttb(unsigned long *ttb_base);
void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa);
void memset(char *buf, char ch, int size);
void led_on(void);
void led_off(void);

void main(void)
{    
    unsigned long c1_flags, ttb = 0x73000000;
    volatile int *p;// = 0x52345678;

//    *p = 0x52300000;    

    init_ttb(ttb);
    mmap(ttb,0x110002E1,0x110002E0);
    mmap(ttb,0x110002E2,0x110002E4);
    mmap(ttb, 0x12345678, 0x52345678);
//    printf("*p = 0x%08x\n",*p);
    c1_flags = 1 | (1 << 3) | ( 1 << 11) | (1 << 28);
//    printf("*p = 0x%08x\n", *p);
    __asm__ __volatile__ (
        "mvn r0, #0 \n"            
        "mcr p15, 0, r0, c3, c0, 0\n"

        "mcr p15, 0, %1, c2, c0, 0\n" //configure ttb

        "mrc p15, 0, r0, c1, c0, 0\n"
        "orr %0, r0, %0\n"
        "mcr p15, 0, %0, c1, c0, 0\n" //enable mmu
        :
        : "r" (c1_flags), "r" (ttb)
        : "r0"
    );
//    mmap(ttb,0x12345678,0x52345678);
    p = 0x12345678;
    printf("*p = 0x%08x\n",  *p);
    led_off();
}

void led_off(void)
{
    GPM4CON &= ~0xffff;
    GPM4CON |=  0x1111;
    GPM4DAT |=  0xf;    
}
void led_on(void)
{
    GPM4CON &= ~0xffff;
    GPM4CON |=  0x1111;
    GPM4DAT &= ~0xf;
}

void init_ttb(unsigned long *ttb_base)
{
    unsigned long va, pa;

    memset(ttb_base, 0x00, 16 * 1024 );        

    for (va = 0x00000000; va < 0x10000000; va += 0x100000) { //Others
        pa = va;
        ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;    
    }

    for (va = 0x10000000; va < 0x14000000; va += 0x100000) { //SFR
        pa = va;
        ttb_base[ va >> 20] = (pa & 0xfff00000) |  2;    
    }

    for (va = 0x40000000; va < 0x80000000; va += 0x100000) { //DRAM
        pa = va;
        ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;    
    }
    
}


void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa)
{
    ttb_base[ va >> 20] = (pa & 0xfff00000) |  2;    
}

void memset(char *buf, char ch, int size)
{
    int i;
    for (i = 0; i < size; i ++)
        buf = ch;
}


以上代码我发现mmap函数映射的没有效果,怎么回事,代码明明是友善提供的,谁能帮忙说说怎么解决啊?