ARM9260EJ-S MMU初始化问题
我在初始化ARM9260EJ-S CPU(AT91SAM9260EJ-S)时遇到了一个问题,SDRAM 8M,按Section初始化,影射成8个块,每块1M,SDRAM的物理地址为0x20000000,未启动MMU时,SDRAM上的所有读写都正常,启动MMU之后,0x20500000开始的1M SDRAM读写就发现异常,MMU初始化的代码如下:
//*----------------------------------------------------------------------------
//* \fn AT91F_InitMMU
//* \brief Initialize MMU
//*----------------------------------------------------------------------------
void AT91_ARM_MMUInit(void)
{
int i;
unsigned int *pTranslationTable=(unsigned int *)_MMUTT_STARTADDRESS;
AT91_ARM_DisableDCache();
AT91_ARM_DisableICache();
AT91_ARM_CleanDCache();//
AT91_ARM_InvalidateICache();
AT91_ARM_DisableMMU();
AT91_ARM_InvalidateIDTLB();
// Program the TTB
AT91_ARM_WriteTTB(_MMUTT_STARTADDRESS);
// Program the domain access register
AT91_ARM_WriteDomain(0x55555555);
//能否访问将根据节或页描述符中的访问权限位确定
// Reset table entries
for (i = 0; i < 4096; ++i)
pTranslationTable[i] = 0;
// Program level 1 page table entry
pTranslationTable[0x0] =
(0x200 << 20) | // Physical Address(SDRAM-1ST)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain 15
1 << 4 | //
3 << 2 | // C=B=1
0x2; // Set as 1 Mbyte section
//
pTranslationTable[0x1] =
(0x001 << 20) | // Physical Address(INTROM)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain 15
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1 Mbyte section
pTranslationTable[0x2] =
(0x002 << 20) | // Physical Address(INTSRAM0)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain 15
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1 Mbyte section
pTranslationTable[0x3] =
(0x003 << 20) | // Physical Address(INTSRAM1)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain 15
(1 << 4) | //
(3 << 2) | // C=B=1
0x2; // Set as 1 Mbyte section
pTranslationTable[0x5] =
(0x005 << 20) | // Physical Address(UHP)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain 15
(1 << 4) | //
(0 << 2) | // C=B=0
0x2; // Set as 1 Mbyte section
//map extern rom (flash 4M)
pTranslationTable[0x100] =
(0x100 << 20) | // Physical Address(flash -1)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1 Mbyte section
pTranslationTable[0x101] =
(0x101 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1 Mbyte section
pTranslationTable[0x102] =
(0x102 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1 Mbyte section
pTranslationTable[0x103] =
(0x103 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1 Mbyte section
//map sdram (8M)
pTranslationTable[0x200] =
(0x200 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x201] =
(0x201 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x202] =
(0x202 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x203] =
(0x203 << 20) | // Physical Address
(3 << 10) | // Access in user mode
(15 << 5) | // Domain
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x204] =
(0x204 << 20) | // Physical Address
(3 << 10) | // Access in user mode
(15 << 5) | // Domain
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x205] =
(0x205 << 20) | // Physical Address
( 3 << 10) | // Access in user mode
( 15 << 5) | // Domain
( 1 << 4) | //
( 3 << 2) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x206] =
(0x206 << 20) | // Physical Address
( 3 << 10) | // Access in user mode
( 15 << 5) | // Domain
( 1 << 4) | //
( 3 << 2) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x207] =
(0x207 << 20) | // Physical Address
( 1 << 10) | // Access in supervisor mode
( 15 << 5) | // Domain
( 1 << 4) | //
( 3 << 2) | // C=B=1
0x2; // Set as 1M byte section
//map regiseter
pTranslationTable[0xFFF] =
(0xFFF << 20) | // Physical Address (REGISTER)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1M byte section
AT91_ARM_WriteFCSEPID(0);
AT91_ARM_EnableAlignFault();
// Enable the MMU
AT91_ARM_EnableMMU();
AT91_ARM_EnableICache();
AT91_ARM_EnableDCache();
}
//*----------------------------------------------------------------------------
//* \fn AT91F_InitMMU
//* \brief Initialize MMU
//*----------------------------------------------------------------------------
void AT91_ARM_MMUInit(void)
{
int i;
unsigned int *pTranslationTable=(unsigned int *)_MMUTT_STARTADDRESS;
AT91_ARM_DisableDCache();
AT91_ARM_DisableICache();
AT91_ARM_CleanDCache();//
AT91_ARM_InvalidateICache();
AT91_ARM_DisableMMU();
AT91_ARM_InvalidateIDTLB();
// Program the TTB
AT91_ARM_WriteTTB(_MMUTT_STARTADDRESS);
// Program the domain access register
AT91_ARM_WriteDomain(0x55555555);
//能否访问将根据节或页描述符中的访问权限位确定
// Reset table entries
for (i = 0; i < 4096; ++i)
pTranslationTable[i] = 0;
// Program level 1 page table entry
pTranslationTable[0x0] =
(0x200 << 20) | // Physical Address(SDRAM-1ST)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain 15
1 << 4 | //
3 << 2 | // C=B=1
0x2; // Set as 1 Mbyte section
//
pTranslationTable[0x1] =
(0x001 << 20) | // Physical Address(INTROM)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain 15
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1 Mbyte section
pTranslationTable[0x2] =
(0x002 << 20) | // Physical Address(INTSRAM0)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain 15
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1 Mbyte section
pTranslationTable[0x3] =
(0x003 << 20) | // Physical Address(INTSRAM1)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain 15
(1 << 4) | //
(3 << 2) | // C=B=1
0x2; // Set as 1 Mbyte section
pTranslationTable[0x5] =
(0x005 << 20) | // Physical Address(UHP)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain 15
(1 << 4) | //
(0 << 2) | // C=B=0
0x2; // Set as 1 Mbyte section
//map extern rom (flash 4M)
pTranslationTable[0x100] =
(0x100 << 20) | // Physical Address(flash -1)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1 Mbyte section
pTranslationTable[0x101] =
(0x101 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1 Mbyte section
pTranslationTable[0x102] =
(0x102 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1 Mbyte section
pTranslationTable[0x103] =
(0x103 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1 Mbyte section
//map sdram (8M)
pTranslationTable[0x200] =
(0x200 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x201] =
(0x201 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x202] =
(0x202 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x203] =
(0x203 << 20) | // Physical Address
(3 << 10) | // Access in user mode
(15 << 5) | // Domain
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x204] =
(0x204 << 20) | // Physical Address
(3 << 10) | // Access in user mode
(15 << 5) | // Domain
(1 << 4 ) | //
(3 << 2 ) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x205] =
(0x205 << 20) | // Physical Address
( 3 << 10) | // Access in user mode
( 15 << 5) | // Domain
( 1 << 4) | //
( 3 << 2) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x206] =
(0x206 << 20) | // Physical Address
( 3 << 10) | // Access in user mode
( 15 << 5) | // Domain
( 1 << 4) | //
( 3 << 2) | // C=B=1
0x2; // Set as 1M byte section
pTranslationTable[0x207] =
(0x207 << 20) | // Physical Address
( 1 << 10) | // Access in supervisor mode
( 15 << 5) | // Domain
( 1 << 4) | //
( 3 << 2) | // C=B=1
0x2; // Set as 1M byte section
//map regiseter
pTranslationTable[0xFFF] =
(0xFFF << 20) | // Physical Address (REGISTER)
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
(1 << 4 ) | //
(0 << 2 ) | // C=B=0
0x2; // Set as 1M byte section
AT91_ARM_WriteFCSEPID(0);
AT91_ARM_EnableAlignFault();
// Enable the MMU
AT91_ARM_EnableMMU();
AT91_ARM_EnableICache();
AT91_ARM_EnableDCache();
}
...全文
相关推荐
AT91sam9260_MiniGUI.zip_AT91SAM9260
AT91SAM9260是一款基于ARM926EJ-S内核的微处理器,由Atmel公司设计,常用于嵌入式系统。
AT91SAM9260微处理器的U-Boot开发与深入解析
AT91SAM9260是由Atmel公司开发的一款高性能32位微处理器,基于ARM926EJ-S核心,内置有DSP指令集和MMU(内存管理单元),适用于工业控制、通信及消费类电子产品。这款处理器以低功耗和高效能闻名,支持多种丰富的外设接口,使得它在嵌入式系统中有着广泛的应用。在嵌入式系统领域,引导加载程序(Bootloader)是系统启动过程中的关键组件,它负责初始化硬件设备、建立内存空间的映射图,从而为操作系统内核的加载和运行创造条件。
MMU_test.rar_AT91SAM9260_AT91SAM9260 MMU
AT91SAM9260是一款基于ARM926EJ-S内核的微处理器,由Atmel公司设计,常用于嵌入式系统。
at91sam9260中文数据手册
ARM926EJ-S 处理器的架构包括ARM9EJ-S 整核、存储器管理部件(MMU)、独立的指令和数据AMBATM AHB 总线接口、独立的指令和数据 TCM 接口等。
ARM9260datasheet
### ARM9260数据手册知识点总结#### 一、概览- **产品名称**:AT91SAM9260- **核心特点**:该芯片基于ARM926EJ-S™处理器,最高运行频率为180MHz,并集成了多种内存接口和丰富的外围设备


驱动开发/核心开发
