Проблема у меня с этой связкой... Если делать без кеша данных и соответственно без MMU - всё работает без проблем. Но хочется скорости, поэтому пытаюсь включить MMU и кеш данных. Для MMU делаю таблицу просто отображающую всё по своим местам без перемещения адресов. После этого DMA EMAC-а перестает нормально работать (даже если не включать кеш данных - только MMU), а именно: 1) не всегда устанавливает бит OWNED в списке, не всегда прописывает размер принятого, хотя регистр RBFP видно, как идет по списку.
2) пробовал ориентироваться не на бит OWNED, а на перемещение регистра RBFP, он оказывается и данные во фреймах корруптит...
Но ведь на этом проце Linux без проблем работает и с MMU и с EMAC-ом! Значит есть какая-то тонкость?
Может кто сталкивался, подскажет?
Вот собственно мой InitMMU (не помню, откуда утащил):
Код
void AT91F_InitMMU(unsigned int *pTranslationTable)
{
unsigned int i;
unsigned int *p = pTranslationTable;
// Установка базового адреса TTB
AT91F_ARM_WriteTTB((unsigned int)pTranslationTable);
// Установка прав доступа к домену
AT91F_ARM_WriteDomain(0xC0000000); // domain 15: access are not checked
// Reset table entries
i = 4096; do { *p++ = 0; } while(--i);
// Program level 1 page table entry
// Internal SRAM at 0x00000000
SetRegionParams(pTranslationTable, 0x00000000, 0x00100000, PAGE_CACHE_WB);
// Internal ROM at 0x00100000
SetRegionParams(pTranslationTable, 0x00100000, 0x00200000, PAGE_CACHE_NO);
// Internal SRAM at 0x00200000
SetRegionParams(pTranslationTable, 0x00200000, 0x00300000, PAGE_CACHE_WB);
// Flash Memory at 0x10000000 - 0x08000000
SetRegionParams(pTranslationTable, 0x10000000, 0x10800000, PAGE_CACHE_NO);
// External Devices at 0x30000000 - 0x60000000
SetRegionParams(pTranslationTable, 0x30000000, 0x60000000, PAGE_CACHE_NO);
// Peripherals at 0xF0000000
SetRegionParams(pTranslationTable, 0xF0000000, 0x00000000, PAGE_CACHE_NO);
// SDRAM at 0x20000000
SetRegionParams(pTranslationTable, 0x20000000, 0x28000000, PAGE_CACHE_WB);
// Enable the MMU
AT91F_EnableMMU();
}