|
Несколько вопросов, EP9301, SDRAM, MMU, WinCE |
|
|
|
Jul 11 2005, 12:24
|
Частый гость
 
Группа: Новичок
Сообщений: 111
Регистрация: 23-06-04
Пользователь №: 141

|
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 не вижу.
|
|
|
|
|
Jul 11 2005, 20:08
|
Частый гость
 
Группа: Новичок
Сообщений: 111
Регистрация: 23-06-04
Пользователь №: 141

|
Цитата(aaarrr @ Jul 11 2005, 21:11) 1. Для 16 бит шины, похоже, действительно так. Вообще, советую читать одновременно три даташита: ep9301, ep9312 и ep9315 - сильно выручает. 2-3. По поводу WinCE ничего не скажу, не работал. Подробное описание работы с MMU можно найти в ARM920 TRM на сайте ARM. 1) криво как-то сделали, ну да ладно... с MMU разобраюсь, с битами кэширования в дескрипторах не совсем все ясно, нет описания их назначения. Доку взял с атмеловского АРМа AT91RM9200 надо было его сразу за основу взять, там и срам есть, но начальство как всегда ищет где подешевле, а он тогда был немного дороже цируса.
|
|
|
|
|
Jul 29 2005, 12:11
|
Частый гость
 
Группа: Новичок
Сообщений: 111
Регистрация: 23-06-04
Пользователь №: 141

|
Если стек находится в SDRAM то программа зависает при вызове sub_123 причем sub_1234 выполняется, т.е. символ на UART выводится. Если же стек находится в SRAM Ethernet-а то все ОК. Хотя сама программа выполняется из SDRAM. Ее загрузку контролирую, т.е. сначала записываю, потом полностью считываю что записалось и только если все ОК передаю управление. Прочитал в Errata что надо все 4 банка инициализировать, проинициализирова и бодбанки и основные банки одинаково, результат тот же, висим. Хотя стек может находится даже в том же подбанке что и код, ничего не меняется. Шина ~35МГц CPU ~20МГц почему глючит понять не могу. Код sub_123: MOV R12, SP STMFD SP!, {R0} STMFD SP!, {R12,LR} LDRB R0, [SP,#8] BL sub_1234 LDMFD SP, {SP,LR} BX LR ;========================== sub_1234 MOV R12, SP STMFD SP!, {R0} STMFD SP!, {R12,LR} loc_028D9B4 ; CODE XREF: sub_8028D9A8+20j LDR R0, =0x808C0018 LDR R1, [R0] AND R2, R1, #0x80 CMP R2, #0x80 BEQ loc_028D9CC B loc_028D9B4 loc_028D9CC ; CODE XREF: sub_8028D9A8+1Cj LDRB R1, [SP,#8] MOV R2, #0x80000000 ORR R0, R2, #0x8C0000 STR R1, [R0] LDMFD SP, {SP,LR} BX LR Еще чуть не забыл, если второй вызов замаскировать, т.е. вложенную процедуру не вызывать, то зависания не происходит.
|
|
|
|
|
Jul 29 2005, 12:58
|
Частый гость
 
Группа: Новичок
Сообщений: 111
Регистрация: 23-06-04
Пользователь №: 141

|
Цитата(aaarrr @ Jul 29 2005, 16:51) А суровый тест SDRAM памяти пробовали? Лучше всего заполнение псевдослучайной последовательностью, а потом считывание и проверка. нет не пробовал, т.к. полином лень на асме писать. хотя грузил программы на Си в IAR скомпилированные, они работали. Там правда вложенных вызовов не было. Да и что мне этот тест даст ? убедиться лишний раз что SDRAM глючит. Пробовал 2метра писать и потом все полностью читать, по UART, все было ОК. Это был код.
|
|
|
|
|
Aug 4 2005, 07:09
|
Частый гость
 
Группа: Новичок
Сообщений: 111
Регистрация: 23-06-04
Пользователь №: 141

|
я сделал проще, запихиваю в стек 8 регистров одной командой, потом забираю, и если они восстановились правильно, то считаю что память правильно инициализировалась и процедура инициализации возвращает ОК.
Тут вопросик возник, в связи с тем что пишу свой бутлоадер по Ethernet: непонятно назначение MACFIFO , что туда можно помещать и можно ли вообще? куда можно помещать указатели дескрипторного процессора ? самих дескрипторов, дескрипторов статуса и буфера ? И не понятно, зачем разделены статус и дескрипторы, какой в этом большой смысл, при чем половина инфы там продублирована. Наворотил Cirrus по моему через чур.
чуть не забыл, указывать ему надо на физ память или на виртуальную в случае вкл MMU ?
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|