|
|
 |
Ответов
|
Oct 11 2015, 11:43
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 9-06-06
Из: Saint-Petersburg
Пользователь №: 17 924

|
Цитата(doom13 @ Oct 10 2015, 10:35)  В моём случае нормально работает: закончились дескрипторы - DMA остановился (состояние IDLE), добавили новые дескрипторы - работает дальше (использую свой драйвер). Подскажите плз какие прерывания разрешаете в регистре DMACR, все 3 (ERR_IrqEn, Dly_IrqEn, IOC_IrqEn) ?
|
|
|
|
|
Oct 13 2015, 12:00
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 9-06-06
Из: Saint-Petersburg
Пользователь №: 17 924

|
Немного уточню вопрос после поисков проблемы. Суть в том, что DMA загружает ранее уже обработанные дескрипторы (в которых я не очистил флаг CMP). Из-за этого возникает ошибка SGIntErr. Т.е. DMA по дескрипторной цепочке возвращается к началу. Возникает вопрос по регистрам S2MM_CURDESC и S2MM_TAILDESC: Допустим выделил 2 дескриптора, установил регистры CURDESC = adr, TAILDESC = adr + 64. После прихода первого пакета CURDESC = TAILDESC = adr+64. После прихода второго пакета регистры вновь CURDESC = adr, TAILDESC = adr + 64. Хотя в ДШ пишут: "The tail pointer is initialized by software to point to the end of the descriptor chain. This becomes the pause point for hardware. When hardware begins running, it fetches and processes each descriptor in the chain until it reaches the tail pointer. The AXI DMA then pauses descriptor processing." Т.е. когда указатели CURDESC и TAILDESC сравняются DMA должно остановиться, а не продолжать загружать дескрипторы. А я вижу противоположное. Что-то я не так видимо понимаю...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|