1)SDRAM 256Мбит в EP9301
в DS сказано что после инициализации общая память в 32Мбайта разбросана кусками по сегменту в 256Мбайт следующим образом
0xN000_0000 - 0xN03F_FFFF
0xN100_0000 - 0xN13F_FFFF
0xN400_0000 - 0xN43F_FFFF
0xN500_0000 - 0xN53F_FFFF
0xN800_0000 - 0xN83F_FFFF
0xN900_0000 - 0xN93F_FFFF
0xNC00_0000 - 0xNC3F_FFFF
0xND00_0000 - 0xND3F_FFFF
где N - сегмент C,D,E,F(0)
мне почему-то казалось что память должна быть разбросана по адресам банков в 4-е блока по 8Мбайт.
2) Нужно ли инициализировать MMU, если да, то как (там разные типы таблиц) если я хочу потом запускать WinCE, при чем образ будет находится в RAM. Не будет ли конфликта ?
3) по MMU не совсем понятно, на EP9301 кастрированная дока, поэтому смотрю на аналогичное ядро, как я понял, необходимо создать таблицу из 4096 записей (по 4 байта/1слову каждая), где каждая запись описывает 1Мбайт виртуальной памяти, т.е. запись 0 - первый Мбайт, запись 1- второй итд...
Вот только просмотрев процедуры инициализации на два разных камня, я не нашел толком как там этот MMU инициализируют, в одном случае передают указатель на таблицу из записей
Код
EXPORT OEMAddressTable[DATA]
OEMAddressTable
;
; TODO - This needs to be changed.
;
;;;-------------------------------------------------------------
;;; Virt Addr Phys Addr MB
;;;-------------------------------------------------------------
DCD 0x80000000, 0xF0000000, 64 ; 64 MB DRAM
DCD 0x88000000, 0x00000000, 32 ; 32 Mb of Intel J3 flash
DCD 0x8A000000, 0x10000000, 16 ; 16 Mb of AMD flash
DCD 0x8B000000, 0x60000000, 1 ; 512K of battery backed SRAM.
DCD 0x90000000, 0x80000000, 16 ; 16 MB of System ASIC regs etc.
DCD 0x91000000, 0x40000000, 192; 192 Meg of PCMCIA space
DCD 0x00000000, 0x00000000, 0 ; End of Table (MB MUST BE ZERO!)
END
а в другом вообще ручками инициализируют
Код
void AT91F_InitMMU(unsigned int *pTranslationTable)
{
int i;
// Program the TTB
AT91F_ARM_WriteTTB((unsigned int) pTranslationTable);
// Program the domain access register
AT91F_ARM_WriteDomain(0xC0000000); // domain 15: access are not checked
// Reset table entries
for (i = 0; i < 4096; ++i)
pTranslationTable[i] = 0;
// Program level 1 page table entry
pTranslationTable[0x0] =
(0x0 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
1 << 4 |
0x2; // Set as 1 Mbyte section
pTranslationTable[0x100] =
(0x200 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
1 << 4 |
(1 << 3) | // Cachable
0x2; // Set as 1 Mbyte section
pTranslationTable[0x200] =
(0x200 << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
1 << 4 |
0x2; // Set as 1 Mbyte section
pTranslationTable[0xFFF] =
(0xFFF << 20) | // Physical Address
(1 << 10) | // Access in supervisor mode
(15 << 5) | // Domain
1 << 4 |
0x2; // Set as 1 Mbyte section
// Enable the MMU
AT91F_EnableMMU();
}
при чем зачем-то кусками и всего 4Мбайта.
пока читаю дальше, но четкой логики в документации по MMU не вижу.