Обмен по порту uart на базовой скорости 115200 идёт без ошибок. По постоянному запросу возвращается блок данных в размере около 1000 байт. Однако, при увеличении скорости обмена (более 1 Мбита) при постоянном запросе в какой-то момент часть данных блока в 1000 байт почему-то теряется, а затем снова большую часть времени приём идёт нормально. В imx6 такого не наблюдалось. Может, есть какие-то особенности настройки порта uart для A40i? Помогите, пожалуйста.
в imx6 драйвер уарта был с dma - на a40i тоже есть, не знаю почему не прописаны каналы в dtsi процессора. Попробуйте дописать для нужного порта в dts своей платы, например uart3
Строчки добавил. Как результат, имеем ещё одну строку при загрузке:
[ 1.545824] sun4i-pinctrl 1c20800.pinctrl: pin-198 (1c28c00.serial) status -517
[ 1.563577] dw-apb-uart 1c28c00.serial: Error applying setting, reverse things back
[ 2.780057] dw-apb-uart 1c28000.serial: forbid DMA for kernel console
После первой загрузки и запуска обмена полетело ядро:
Скрытый текст виден только зарегистрированным пользователям.
Потом сбоев ядра не наблюдал, однако нового ничего не произошло. Принимаемые данные всё ещё пропадают.
Посмотрел регистры:
DMA_CUR_SRC_REG 0x0100+0x10+N*0x40(N=0~15) DMA Channel Current Source Register
0x01C02110 имеет значение 0x4228B284
0x01C02150 имеет значение 0x4228B247
DMA_CUR_DEST_REG 0x0100+0x14+N*0x40(N=0~15) DMA Channel Current Destination Registe
0x01C02114 имеет значение 0x01C28C00
0x01C02154 имеет значение 0x01C28C00
DMA_CFG_REG 0x0100+0x0C+N*0x40(N=0~15) DMA Channel Configuration Register
0x01C0210C имеет значение 0x00EB0481
0x01C0214C имеет значение 0x00EB0481
Может, эти значения что-то пояснят?
Исходя из регистра конфигурации, такое ощущение, что запись идёт только в одном направлении (DMA_SRC_DRQ_TYPE (DMA Source DRQ Type) =порт 0001, DMA_DEST_DRQ_TYPE (DMA Destination DRQ Type) = порт 1011). Нам же нужна запись из приёмного регистра в память.
чуть выше места, где делали правку, доступ DMA не включается автоматически? Видимо, значение p->fifosize неверное.
/* If we have a valid fifosize, try hooking up DMA */ if (p->fifosize) {
data->data.dma.rxconf.src_maxburst = p->fifosize / 4;
data->data.dma.txconf.dst_maxburst = p->fifosize / 4;
up->dma = &data->data.dma;
}
Безусловно, принудительный код помог, стали писаться регистры DMA, но по факту DMA по регистрам присутcтвтует только для одного канала передачи, а для канала приёма не работает совсем или работает неправильно. По идее должны работать два канала DMA (на приём и на передачу), поддерживает ли это контроллер? Возможно ли хотя бы включить DMA только на приём? И подскажите, что тут не доработано в ядре? DMA так и не заработает на приём?
И подскажите, что тут не доработано в ядре? DMA так и не заработает на приём?
там наверно много что недоработано - я сомневаюсь что у когото dma работает на этих uart 8250, тут на глаз невозможно сказать - с spi у меня на тестах dma подключался - это было видно по уменьшению прерываний от spi на порядки если посылки длинные.