Здравствуйте!
Куплен комплект
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? Если нет, то подскажите, пожалуйста, есть ли в системе подходящий драйвер и как его использовать, а если нет, то дайте хотя бы общее/схематичное описание, как это сделать. В нете много пишут от похожих задачах, но подходящего/понятного не нашел.
SPI MOSI это пин PD12 процессора, на модуле контакт 37, на материнской плате 37 контакт обозначен SDHC_CMD и выведен на X2->38
теперь что вы увидели осцилографом: X2->36 на матплате это SDHC_D3 выведен с 39 контакта mini-pcie, на модуле 39 контакт выведен с PD11 он же SPI CLK
какой дисплей и зачем ему таймер в spidev?
файлы устройств для уарт-ов /dev/ttySX - в интернете масса примеров как работать с последовательными портами в Linux, нюанс будет с настройкой скорости 3-4 Мбит - нужно будет перенастраивать источник тактирования
Спасибо.
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 это обеспечивает и достаточно найти в нете пример пользовательской программы с похожим функционалом?
Вопрос по GPIO снят, разобрался и проверил, вывод идет, номера линий для драйвера gpiochip0:
0-РА
32 PB
64 PC
96 PD
128 PE == PE4==132
160 PF
192 PG == PG6=198
Остался вопрос по UART, подскажите, что возможно, чтобы сократить область поиска насколько возможно.
на вашем модуле штатно есть только ttyS3 и он занят для отладочной консоли, можно отклчить консоль от него (использовать консоль на USB) и тогда использовать.
у linux кроссплатформенный API для любого UART - берите любой пример, DMA у этого процессора подключен и используется
но прерывание будет не по завершении всего пакета а кусками - откда уарту знать дину пакета, вот тут ктото делал аналогичную задачу, я изложил там своё мнение как можно сделать
на t113 есть ещё вариант - обрабатывать UART на ядре xtensa - в buildroot есть для него freertos, после приёма целового пакета через прерывание сообщать в Linux и отдавать целый пакет. Но боюсь вам снаскоку это будет слишком затратно по врмени, там надо будет и freertos программировать и модуль ядра Linux дописывать.
Еще по ttyS2: сделал тест, передает и принимает. TX замкнут на RX.
Для больших пакетов до 128 байт - правильно, далее идут ошибки. Разбирался в serial_core.c, 8250_port.c, 8250_dw.c
Пробовал увеличить для "AW_16550A" буфер в 4 раза
.fifo_size = 256*4,
Но стало еще хуже, ошибки пошли в р-не 80-го байта.
Наверное не стыкуется с длиной аппаратного fifo, которая для T113 =256.
А для ttyS только в 8250_dw.c:
if (of_device_is_compatible(dev->of_node, "allwinner,sun8i-uart")) {
Отсюда предположение, что драйвер посл.канала написан без использования dtsi, сделана только "нашлепка" по его частичному учету, а в самом драйвере DMA не было сделано для "AW_16550A", отсюда все проблемы.
Но, как это все переделать, увеличить буфер (4К) и правильно настроить DMA - не знаю. Не подскажете?