Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: at91rm9200 - проблема ethernet+MMU
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
victorvolsky
Проблема у меня с этой связкой... Если делать без кеша данных и соответственно без 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();
}
sergeeff
Выдели буфера для EMAC в non-cachable регионе (например во внутренней SRAM или определи 1Мб от SDRAM).
aaarrr
Цитата(sergeeff @ Oct 9 2007, 13:41) *
Выдели буфера для EMAC в non-cachable регионе (например во внутренней SRAM или определи 1Мб от SDRAM).

Боюсь, что здесь что-то другое, хотя очень похоже:
Цитата(victorvolsky @ Oct 9 2007, 12:55) *
...даже если не включать кеш данных - только MMU


М.б. кеш все-таки был включен?
sergeeff
Да ничего тут нет другого. В описании процессора сказано, что пользователь должен сам решить проблему целостности кэша при использовании DMA. Самый простой и эффективный способ - DMA буффера объявить в некэшируемом регионе.
victorvolsky
Цитата(sergeeff @ Oct 9 2007, 12:41) *
Выдели буфера для EMAC в non-cachable регионе (например во внутренней SRAM или определи 1Мб от SDRAM).


УРА!!! Заработало!

Сделал под конец памяти 1 МБайт некешируемой, засунул туда EMACовские приемные буфера, все буфера на отдачу (т.е. всё, что проходит через DMA), включил все кешу и скорость отдачи с 1.5 МБайта скакнула до 2.6!
(если скорость кому кажется маленькой, то это не просто поток, а rpc-запросы по tcp)

Большой сенкс! beer.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.