Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Процессорные модули » SK-A40i-SODIMM
Настройка порта uart
incredi
Добавлено 14.12.2023 14:29
0
Сообщение: 1
incredi
0

Пункты: 3192
Регистрация: 11.12.2014
Обмен по порту uart на базовой скорости 115200 идёт без ошибок. По постоянному запросу возвращается блок данных в размере около 1000 байт. Однако, при увеличении скорости обмена (более 1 Мбита) при постоянном запросе в какой-то момент часть данных блока в 1000 байт почему-то теряется, а затем снова большую часть времени приём идёт нормально. В imx6 такого не наблюдалось. Может, есть какие-то особенности настройки порта uart для A40i? Помогите, пожалуйста.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 14.12.2023 17:01 Сообщение: 2
sasamy
4.71

Пункты: 83558
Регистрация: 14.08.2009
Цитата
Однако, при увеличении скорости обмена (более 1 Мбита)


а ethernet нельзя использовать ?

Цитата

Может, есть какие-то особенности настройки порта uart для A40i?


попробовать привязать обработчик прерывания от этого уарта к определенному ядру как это делают для сетевых устройств

http://www.starterkit.ru/html/index.php?name=forum&op=view&id=29599&last#29606

других мыслей у меня нет
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 14.12.2023 21:14 Сообщение: 3
sasamy
4.71

Пункты: 83558
Регистрация: 14.08.2009
Цитата
В imx6 такого не наблюдалось.


в imx6 драйвер уарта был с dma - на a40i тоже есть, не знаю почему не прописаны каналы в dtsi процессора. Попробуйте дописать для нужного порта в dts своей платы, например uart3

buildroot-2022.08.3-sk-a40i/output/build/linux-custom/arch/arm/boot/dts/sun8i-a40i-sodimm-hdmi-sk.dts

Цитата

&uart3 {
pinctrl-names = "default";
pinctrl-0 = <&uart3_pg_pins>;

dmas = <&dma 11>, <&dma 11>;
dma-names = "rx", "tx";

status = "okay";
};


каналы взял из даташита на процессор

Цитата

uart0 dma 8
uart1 dma 9
uart2 dma 10
uart3 dma 11
uart4 dma 12
uart5 dma 13
uart6 dma 14
uart7 dma 15


где-то была тема на форуме про spi dma на этом процессоре - для него тоже не прописаны каналы, пробовал у себя дописать - работало
Спуститься к концу Подняться к началу
Персональная информация
incredi
Добавлено 18.12.2023 15:49 Сообщение: 4
incredi
0

Пункты: 3192
Регистрация: 11.12.2014
Цитата

dmas = <&dma 11>, <&dma 11>;
dma-names = "rx", "tx";


Прописал, но всё осталось без изменений, не работает.
При загрузке видим только одно сообщение, но оно было и ранее:
Цитата

[ 1.565793] dw-apb-uart 1c28c00.serial: Error applying setting, reverse things back
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 19.12.2023 01:39 Сообщение: 5
sasamy
4.71

Пункты: 83558
Регистрация: 14.08.2009
Цитата
Цитата

dmas = <&dma 11>, <&dma 11>;
dma-names = "rx", "tx";


Прописал, но всё осталось без изменений, не работает.
При загрузке видим только одно сообщение, но оно было и ранее:
Цитата

[ 1.565793] dw-apb-uart 1c28c00.serial: Error applying setting, reverse things back


попробуйте дополнительно к исправлению в DT подправить файл

buildroot-2022.08.x-sk-a40i/output/build/linux-custom/drivers/tty/serial/8250/8250_dw.c

добавить там выделенные строки

Цитата

if (of_device_is_compatible(dev->of_node, "allwinner,sun8i-uart")) {
p->flags = UPF_SHARE_IRQ | UPF_FIXED_TYPE | UPF_FIXED_PORT;
up->capabilities = UART_CAP_FIFO | UART_CAP_NOTEMT;
p->type = PORT_U6_16550A;

data->data.dma.rxconf.src_maxburst = 64 / 4;
data->data.dma.txconf.dst_maxburst = 64 / 4;
up->dma = &data->data.dma;

}


Патч на всякий случай

https://disk.yandex.ru/d/SdBtFEbY-E51Hg
Спуститься к концу Подняться к началу
Персональная информация
incredi
Добавлено 19.12.2023 18:48 Сообщение: 6
incredi
0

Пункты: 3192
Регистрация: 11.12.2014
Цитата

data->data.dma.rxconf.src_maxburst = 64 / 4;
data->data.dma.txconf.dst_maxburst = 64 / 4;
up->dma = &data->data.dma;


Строчки добавил. Как результат, имеем ещё одну строку при загрузке:
Цитата

[ 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). Нам же нужна запись из приёмного регистра в память.
Спуститься к концу Подняться к началу
Персональная информация
incredi
Добавлено 21.12.2023 00:03 Сообщение: 7
incredi
0

Пункты: 3192
Регистрация: 11.12.2014
Интересно, почему в этом файле
Цитата
buildroot-2022.08.x-sk-a40i/output/build/linux-custom/drivers/tty/serial/8250/8250_dw.c

чуть выше места, где делали правку, доступ 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;
}

if (of_device_is_compatible(dev->of_node, "allwinner,sun8i-uart")) {
p->flags = UPF_SHARE_IRQ | UPF_FIXED_TYPE | UPF_FIXED_PORT;
up->capabilities = UART_CAP_FIFO | UART_CAP_NOTEMT;
p->type = PORT_U6_16550A;
}

Безусловно, принудительный код помог, стали писаться регистры DMA, но по факту DMA по регистрам присутcтвтует только для одного канала передачи, а для канала приёма не работает совсем или работает неправильно. По идее должны работать два канала DMA (на приём и на передачу), поддерживает ли это контроллер? Возможно ли хотя бы включить DMA только на приём? И подскажите, что тут не доработано в ядре? DMA так и не заработает на приём?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 21.12.2023 00:11 Сообщение: 8
sasamy
4.71

Пункты: 83558
Регистрация: 14.08.2009
Цитата
И подскажите, что тут не доработано в ядре? DMA так и не заработает на приём?


там наверно много что недоработано - я сомневаюсь что у когото dma работает на этих uart 8250, тут на глаз невозможно сказать - с spi у меня на тестах dma подключался - это было видно по уменьшению прерываний от spi на порядки если посылки длинные.
Спуститься к концу Подняться к началу
Персональная информация
incredi
Добавлено 22.12.2023 17:32 Сообщение: 9
incredi
0

Пункты: 3192
Регистрация: 11.12.2014
Может, можно как-то повысить приоритет прерывания для порта?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 23.12.2023 00:13 Сообщение: 10
sasamy
4.71

Пункты: 83558
Регистрация: 14.08.2009
Цитата
Может, можно как-то повысить приоритет прерывания для порта?


у процессора 4 ядра - я вам давал ссылку как обработчик привязать к выделенному ядру

http://www.starterkit.ru/html/index.php?name=forum&op=view&id=29599&last#29606
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Процессорные модули » SK-A40i-SODIMM