Ник:
Пароль:

Контакты

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

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:3
Форум » starterkit.ru » Процессорные модули » ES-T113-NANO(-LV), SK-T113-MOD
Вопросы по схеме, SPI & UART
Hsb
Добавлено 28.02.2025 12:04
0
Сообщение: 1
Hsb
0

Пункты: 266
Регистрация: 18.02.2025
Здравствуйте!
Куплен комплект
ES-T113-Nano-LV V1.А
SK-T113-LCD-MB V2.B
SK-iMX6ULL-NANO-MB
Хотели вариант NAND, то на складе не было, заменили на вариант еMMC
Вопросы:
1. Возможно, схемы не соответствуют тем, которые на сайте в магазине и присланы в архиве. Запустил тест http://www.starterkit.ru/html/index.php?name=forum&op=view&id=31548
Там указано и по схеме так –MOSI,MISO=20 и 21-я нога X2, а реально осциллографом нашел MOSI на 36-й ноге. Если я не ошибся, то где взять новые схемы этих трех плат?
2. На SPI хочу подключить простой дисплей, необходимо добавить управление C/D с линии GPIO, поизучал указанный по ссылке выше драйвер spidev.c, но не нашел, в каком месте и как добавить линию GPIO в инициализации драйвера и управление при передаче. Непонятно, почему указано для DTS compatible = "menlo,m53cpld"; когда
В другом модуле, Licheepi-Zero, например, делал так:
TIMER_OF_DECLARE(rtv_v3s, "allwinner,timer5", sun5i_timer_init);
И соответственно добавлял в dts,
timer@1c60000 {
compatible = "allwinner,timer5";
и дальше инициализировал таймер по выбранным из dts адресам регистров, а здесь непонятно, если возможно - подскажите, пожалуйста, где и как в драйвер SPI включить инициализацию линии GPIO и в каком месте устанавливать на ней 0/1 перед началом передачи в варианте DMA (передается дисплейная память) и снимать после окончания передачи.
3. Также требуется обмениваться с другим котроллером по UART пакетами 1-2К на скорости 3-4Мбит каждые 10мс, нет ли примера/теста, аналогичного приведенному для SPI с DMA? Если нет, то подскажите, пожалуйста, есть ли в системе подходящий драйвер и как его использовать, а если нет, то дайте хотя бы общее/схематичное описание, как это сделать. В нете много пишут от похожих задачах, но подходящего/понятного не нашел.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 28.02.2025 14:22 Сообщение: 2
sasamy
4.71

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

1. Возможно, схемы не соответствуют


схемы соответствуют, в тесте описан вариант с другим модулем ES-T113-NANO, в первую очередь надо смотреть схему своего модуля

http://starterkit.ru/html/doc/ES-T113-NANO-LV_V1A.pdf

и сопоставлять его контакты mini-pcie со схемой материнской платы

http://starterkit.ru/html/doc/SK-iMX6ULL-NANO-MB_V1A.pdf

SPI MOSI это пин PD12 процессора, на модуле контакт 37, на материнской плате 37 контакт обозначен SDHC_CMD и выведен на X2->38

теперь что вы увидели осцилографом: X2->36 на матплате это SDHC_D3 выведен с 39 контакта mini-pcie, на модуле 39 контакт выведен с PD11 он же SPI CLK

Цитата

2. На SPI хочу подключить простой дисплей


какой дисплей и зачем ему таймер в spidev?

Цитата

3. Также требуется обмениваться с другим котроллером по UART


файлы устройств для уарт-ов /dev/ttySX - в интернете масса примеров как работать с последовательными портами в Linux, нюанс будет с настройкой скорости 3-4 Мбит - нужно будет перенастраивать источник тактирования
Спуститься к концу Подняться к началу
Персональная информация
Hsb
Добавлено 28.02.2025 15:07 Сообщение: 3
Hsb
0

Пункты: 266
Регистрация: 18.02.2025
Спасибо.
2. Таймер был примером, как делался драйвер. Вопрос отпал - нашел, что есть библиотека Libgpiod, которая позволяет из пользовательской программы управлять GPIO.
У вас есть драйвер на основе этой библиотеки dev/gpiochip0, я написал для него тест, но пока не работает. Не подскажете - как задавать конкретные порт PA, PB, PC, PD и т.д. - драйвер gpiochip0 соответствует им всем или только РА? В тесте:
chip = gpiod_chip_open("../dev/gpiochip0");
if (!chip)
{
printf("\r\n Error no gpiochip0");
return -1;
}
line = gpiod_chip_get_line(chip, 3);
if (!line) {
printf("\r\n Error no line");
gpiod_chip_close(chip);
return -1;
}
можно понять так, что РА линия 3, но в вашей схеме РА на процессоре нет.
Тест проходит до назначения линии на ввод.

3. В то-то и дело, что масса, да еще для разных версий линукс и т.п. Правильно ли я понял, что любой ttySx можно использовать для решения требуемой задачи: выдавать большой пакет, принимать большой пакет (через готовность, не завешивая программу), причем это автоматически пойдет через DMA, т.е. не будет отнимать время у процессора на побайтные прерывания. И на прием будет циклический буфер DMA, каждый тик 10мс в пользовательской программе можно будет определять, сколько пришло и из циклического буфера забирать?
Т.е. стандартный драйвер любого ttySx это обеспечивает и достаточно найти в нете пример пользовательской программы с похожим функционалом?
Спуститься к концу Подняться к началу
Персональная информация
Hsb
Добавлено 28.02.2025 15:57 Сообщение: 4
Hsb
0

Пункты: 266
Регистрация: 18.02.2025
Вопрос по GPIO снят, разобрался и проверил, вывод идет, номера линий для драйвера gpiochip0:
0-РА
32 PB
64 PC
96 PD
128 PE == PE4==132
160 PF
192 PG == PG6=198

Остался вопрос по UART, подскажите, что возможно, чтобы сократить область поиска насколько возможно.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 28.02.2025 16:16 Сообщение: 5
sasamy
4.71

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

как задавать конкретные порт PA, PB, PC, PD и т.д. - драйвер gpiochip0 соответствует им всем или только РА?


все порты и линии на одном gpiochip, есть утилиты чтобы контролировать в частности gpioinfo

https://devdotnet.org/post/rabota-s-gpio-v-linux-chast-6-biblioteka-libgpiod/#library-and-tools

line = 32 * PORT + PIN

PORT= 0,1,2,... где PA =0, PB = 1, PC = 2,...

line(PG11) = 32 * 6 + 11 = 203

Цитата

3. Правильно ли я понял, что любой ttySx можно использовать для решения требуемой задачи


на вашем модуле штатно есть только ttyS3 и он занят для отладочной консоли, можно отклчить консоль от него (использовать консоль на USB) и тогда использовать.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 28.02.2025 16:50 Сообщение: 6
sasamy
4.71

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

Остался вопрос по UART, подскажите, что возможно, чтобы сократить область поиска насколько возможно.


у linux кроссплатформенный API для любого UART - берите любой пример, DMA у этого процессора подключен и используется

Цитата

uart3: serial@2500c00 {
compatible = "snps,dw-apb-uart", "allwinner,sun8i-uart";
reg = <0x2500c00 0x400>;
reg-io-width = <4>;
reg-shift = <2>;
interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_UART3>;
resets = <&ccu RST_BUS_UART3>;

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

status = "disabled";
};


но прерывание будет не по завершении всего пакета а кусками - откда уарту знать дину пакета, вот тут ктото делал аналогичную задачу, я изложил там своё мнение как можно сделать

http://starterkit.ru/html//index.php?name=forum&op=view&id=31837
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 28.02.2025 17:12 Сообщение: 7
sasamy
4.71

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

изложил там своё мнение как можно сделать


на t113 есть ещё вариант - обрабатывать UART на ядре xtensa - в buildroot есть для него freertos, после приёма целового пакета через прерывание сообщать в Linux и отдавать целый пакет. Но боюсь вам снаскоку это будет слишком затратно по врмени, там надо будет и freertos программировать и модуль ядра Linux дописывать.
Спуститься к концу Подняться к началу
Персональная информация
Hsb
Добавлено 28.02.2025 17:41 Сообщение: 8
Hsb
0

Пункты: 266
Регистрация: 18.02.2025
А PD1 PD2 Uart2? В варианте, когда процессорный модуль установлен в маленькую МБ, там по схеме UART2 выведен на разъем?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 01.03.2025 00:50 Сообщение: 9
sasamy
4.71

Пункты: 86398
Регистрация: 14.08.2009
Цитата
А PD1 PD2 Uart2? В варианте, когда процессорный модуль установлен в маленькую МБ, там по схеме UART2 выведен на разъем?


можно и так, но в таком случае надо device tree корректировать - отключить lcd и добавить uart2

buildroot-2022.08.3-sk-t113/output/build/linux-custom/arch/arm/boot/dts/sun8i-t113-nano-lv-emmc.dts

Цитата

&de {
status = "disabled";
};

&tcon_lcd0 {
pinctrl-0 = <&lcd_rgb666_pd19_pins>;
pinctrl-names = "default";
status = "disabled";
};


&uart2 {
pinctrl-0 = <&uart2_pd1_pins>;
pinctrl-names = "default";
status = "okay";
};

Спуститься к концу Подняться к началу
Персональная информация
Hsb
Добавлено 06.03.2025 12:53 Сообщение: 10
Hsb
0

Пункты: 266
Регистрация: 18.02.2025
Еще по ttyS2: сделал тест, передает и принимает. TX замкнут на RX.
Для больших пакетов до 128 байт - правильно, далее идут ошибки. Разбирался в serial_core.c, 8250_port.c, 8250_dw.c
Пробовал увеличить для "AW_16550A" буфер в 4 раза
.fifo_size = 256*4,
Но стало еще хуже, ошибки пошли в р-не 80-го байта.
Наверное не стыкуется с длиной аппаратного fifo, которая для T113 =256.

Нашел, что 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;
}
Присвоил принудительно p->fifosize=256, не помогло, изменил:
[PORT_U6_16550A] = {
.name = "AW_16550A",
.fifo_size = 256,
.tx_loadsz = 256,
// .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
.fcr = UART_FCR_DMA_SELECT | UART_FCR_ENABLE_FIFO |
UART_FCR_R_TRIG_00 | UART_FCR_T_TRIG_00,

После этого режим DMA включился, но выдал ошибки при запуске теста:
[ 199.286348] dma dma0chan5: Invalid DMA configuration
[ 199.298359] dma dma0chan4: Invalid DMA configuration
При этом первые 15 байт идут правильные, остальные - неправильные.
И в dtsi задан другой канал, 16:
uart2: serial@2500800 {
compatible = "snps,dw-apb-uart", "allwinner,sun8i-uart";
reg = <0x2500800 0x400>;
reg-io-width = <4>;
reg-shift = <2>;
interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_UART2>;
resets = <&ccu RST_BUS_UART2>;
dmas = <&dma 16>, <&dma 16>;

Для других драйверов compatible указывается в файлах yaml
properties:
compatible:
oneOf:
- items:
- enum:
- allwinner,sun20i-d1-dmic
- const: allwinner,sun50i-h6-dmic
- const: allwinner,sun50i-h6-dmic
enum:
- allwinner,sun20i-d1-iommu

и в драйверах:
static const struct of_device_id sun4i_i2s_match[] = {
{
.compatible = "allwinner,sun4i-a10-i2s",
.data = &sun4i_a10_i2s_quirks,
},
static const struct of_device_id sun50i_iommu_dt[] = {
{ .compatible = "allwinner,sun20i-d1-iommu", .data = &sun20i_d1_iommu },

А для ttyS только в 8250_dw.c:
if (of_device_is_compatible(dev->of_node, "allwinner,sun8i-uart")) {

Отсюда предположение, что драйвер посл.канала написан без использования dtsi, сделана только "нашлепка" по его частичному учету, а в самом драйвере DMA не было сделано для "AW_16550A", отсюда все проблемы.
Но, как это все переделать, увеличить буфер (4К) и правильно настроить DMA - не знаю. Не подскажете?
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Процессорные модули » ES-T113-NANO(-LV), SK-T113-MOD