реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> at91rm9200 - проблема ethernet+MMU
victorvolsky
сообщение Oct 9 2007, 08:55
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 1-03-06
Пользователь №: 14 830



Проблема у меня с этой связкой... Если делать без кеша данных и соответственно без 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();
}
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 9 2007, 09:41
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Выдели буфера для EMAC в non-cachable регионе (например во внутренней SRAM или определи 1Мб от SDRAM).
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 9 2007, 10:53
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sergeeff @ Oct 9 2007, 13:41) *
Выдели буфера для EMAC в non-cachable регионе (например во внутренней SRAM или определи 1Мб от SDRAM).

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


М.б. кеш все-таки был включен?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 9 2007, 11:09
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Да ничего тут нет другого. В описании процессора сказано, что пользователь должен сам решить проблему целостности кэша при использовании DMA. Самый простой и эффективный способ - DMA буффера объявить в некэшируемом регионе.
Go to the top of the page
 
+Quote Post
victorvolsky
сообщение Oct 9 2007, 12:34
Сообщение #5





Группа: Новичок
Сообщений: 2
Регистрация: 1-03-06
Пользователь №: 14 830



Цитата(sergeeff @ Oct 9 2007, 12:41) *
Выдели буфера для EMAC в non-cachable регионе (например во внутренней SRAM или определи 1Мб от SDRAM).


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

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

Большой сенкс! beer.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016