LINUX.ORG.RU

Совместная работа Orange Pi и дисплея 3.5" KeDei

 , , ,


1

1

Доброго времени суток, форумчане. Приобрёл на AliExpress LCD дисплей 3.5" KeDei (модель KD0350AV02. Фото - https://auctions.afimg.jp/j1107751807/ya/image/j1107751807.1.jpg). Данная модель имеет на борту схему RTD2660H, отвечающую за вывод по HDMI и микросхему XPT2046, отвечающую за работу тачскрина и взаимодействие по SPI с одноплатным компьютером. Использую одноплатный компьютер Orange Pi PC (allwinner,sun8i-h3). Решил не заморачиваться со сборкой системы и установил готовую Armbian 24.11.0 на базе ядра Linux 6.6.54-current-sunxi (на 6 ноября это была последняя доступная версия Armbian для данного SBC). Почитав форумы в сети, я заметил, что с этой схемой используют драйвер ADS7846, который в данном ядре уже был встроен. Суть в том, что HDMI подрубился «из коробки», а тачскрин ни в какую не хочет, какой бы Device Tree и конфиг я не использовал. Device Tree для данной микросхемы пришлось добавить в overlay, потому что его изначально не было. Система подкинула драйвер, но при тестировании касания тачскрина не дают никакого результата. В сети есть гайды по похожим дисплеям для систем и ядер более старой версии, есть также Device Tree и конфиги для них, но они разнятся с учётом версий. Возможно я что-то не дописал или упустил из виду. Поэтому прилагаю ниже части лога загрузчика, ядра, конфиг и Device Tree и прошу что-то подсказать в данном направлении знающих людей.

Конфиг armbianEnv.txt:

verbosity=1
bootlogo=true
console=serial
disp_mode=640x480p60
overlay_prefix=sun8i-h3
rootfstype=ext4
extraargs=drm_kms_helper.edid_firmware=HDMI-A-1:edid/640x480.bin video=HDMI-A-1:640x480-24@60
overlays=spi-add-cs1 spi-jedec-nor spi-spidev usbhost2 usbhost3 w1-gpio ads7846
param_spidev_spi_bus=0
param_spidev_spi_cs=1
video-mode=sunxi:1024x600,monitor=hdmi,hpd=1,edid=1
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u

Device Tree для ADS7846:

/dts-v1/;
/plugin/;

/ {
        compatible = "allwinner,sun4i-a10", "allwinner,sun7i-a20", "allwinner,sun8i-h3", "allwinner,sun50i-a64", "allwinner,sun50i-h5";

        fragment@0 {
                target = <&pio>;
                __overlay__ {
                        ads7846_pins: ads7846_pins {
                                pins= "PA2";
                                function = "irq";
                        };
                };
        };

        fragment@1 {
                target = <&spi0>;
                __overlay__ {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "okay";
                        ads7846@0 {
                                compatible = "ti,ads7846";
                                reg = <0x1>; /* Chip Select 1 */
                                status = "okay";
                                pinctrl-names = "default";
                                pinctrl-0 = <&ads7846_pins>;
                                spi-max-frequency = <2000000>;
                                interrupt-parent = <&pio>;
                                interrupts = <0 2 2>; /* PA2 IRQ_TYPE_EDGE_FALLING */
                                pendown-gpio = <&pio 0 2 0>; /* PA2 */

                                /* driver defaults, optional */
                                ti,x-min = /bits/ 16 <0>;
                                ti,y-min = /bits/ 16 <0>;
                                ti,x-max = /bits/ 16 <0x0FFF>;
                                ti,y-max = /bits/ 16 <0x0FFF>;
                                ti,pressure-min = /bits/ 16 <0>;
                                ti,pressure-max = /bits/ 16 <0xFFFF>;
                                ti,x-plate-ohms = /bits/ 16 <400>;
                        };
                };
        };

        fragment@2 {
                target = <&spi0>;
                __overlay__ {
                        status = "disabled";
                };
        };
};

Вывод загрузчика о том, что файл дерева был подхвачен:

Found mainline kernel configuration
35117 bytes read in 12 ms (2.8 MiB/s)
Working FDT set to 43000000
1177 bytes read in 14 ms (82 KiB/s)
Applying kernel provided DT overlay sun8i-h3-spi-add-cs1.dtbo
804 bytes read in 15 ms (51.8 KiB/s)
Applying kernel provided DT overlay sun8i-h3-spi-jedec-nor.dtbo
804 bytes read in 14 ms (55.7 KiB/s)
Applying kernel provided DT overlay sun8i-h3-spi-spidev.dtbo
504 bytes read in 14 ms (35.2 KiB/s)
Applying kernel provided DT overlay sun8i-h3-usbhost2.dtbo
504 bytes read in 14 ms (35.2 KiB/s)
Applying kernel provided DT overlay sun8i-h3-usbhost3.dtbo
777 bytes read in 14 ms (53.7 KiB/s)
Applying kernel provided DT overlay sun8i-h3-w1-gpio.dtbo
1378 bytes read in 16 ms (84 KiB/s)
Applying kernel provided DT overlay sun8i-h3-ads7846.dtbo
4185 bytes read in 15 ms (272.5 KiB/s)
Applying kernel provided DT fixup script (sun8i-h3-fixup.scr)
## Executing script at 45000000
Kernel image @ 0x42000000 [ 0x000000 - 0x893d88 ]

lsmod | grep -iP ‘(spi|ads)’:

ads7846                20480  0

dmesg | grep -iP ‘(spi|ads)’:

[   62.843560] ads7846@0 enforce active low on GPIO handle
[   62.844389] sun6i-spi 1c68000.spi: chipselect 1 already in use
[   62.844409] spi_master spi0: spi_device register error /soc/spi@1c68000/spidev@0
[   62.844439] spi_master spi0: Failed to create SPI device for /soc/spi@1c68000/spidev@0
[   73.221749] ads7846 spi0.1: supply vcc not found, using dummy regulator
[   73.226083] ads7846 spi0.1: touchscreen, irq 43
[   73.236311] input: ADS7846 Touchscreen as /devices/platform/soc/1c68000.spi/spi_master/spi0/spi0.1/input/input4

evtest не выводит строки, когда я взаимодействую с дисплеем. Соответственно система ругается, что не удалось создать устройство spidev, поскольку уже занят данный адрес. В других версиях это исправляли в Device Tree, но я не особо силён в Device Tree и его параметрах, поэтому прошу помощи.

Ответ на: комментарий от Stanson

Вот это я и не знаю. Драйвер по идее должен отдельно от SPI быть подключен и нельзя чтобы они конфликтовали, но во всех гайдах SPI линию с селектором 1 (также как у драйвера ADS7846) включали. Тут же ядро ругается.

alexnname
() автор топика
Ответ на: комментарий от Stanson

Поправил немного оверлей, но это не дало никакого результата.

/dts-v1/;
/plugin/;

/ {
	compatible = "allwinner,sun8i-h3";	

  fragment@0 {
    target = <&pio>;
    __overlay__ {	  
	  ads7846_pins: ads7846_pins {
		pins= "PA2";
		function = "irq";
	  };
    };
  };
  
  fragment@1 {
    target = <&spi0>;
    __overlay__ {
		#address-cells = <1>;
		#size-cells = <0>;
	
      status = "okay"; 
	  pinctrl-names = "default", "default";
	  
      cs-gpios = <&pio 2 3 0>, <&pio 0 21 0>; /* PD0 */
	  
	  ads7846: ads7846@0 {
				pinctrl-0 = <&ads7846_pins>;
				compatible = "ti,ads7846";
				reg = <1>;
				status = "okay";
				spi-max-frequency = <1600000>;
				interrupt-parent = <&pio>;
				interrupts = <0 2 2>;   
				pendown-gpio = <&pio 0 2 0>;
				ti,x-plate-ohms = /bits/ 16 <60>;
				touchscreen-max-pressure = <255>;
		};
    };
  };
};
alexnname
() автор топика
Ответ на: комментарий от Stanson

Да, в поведении ничего не изменилось. Отображается устройство ввода ADS7846, но evtest не отображает ивенты, когда тыкаю по тачу. После моего вроде бы не подгружается ничего, мой последним идёт

alexnname
() автор топика
Ответ на: комментарий от alexnname

Значит дело точно не в fragment@2.

Слушай, а для SPI нет сниффера типа usbmon или tcpdump? Наверняка написали же, иначе как драйвера или работу с девайсом отлаживать. Попробуй поискать такую утилитку - может понятно станет, оно вообще нормально обменивается данными или нет.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Я тоже думал об этом. Саму линию SPI я проверял, по ней обмен есть. С драйвером - нули. Проверял напряжение мультиметром. Тактовая нога CLK должна хоть что-то выдавать, она же даёт 0.11 Вольт (знаю, что нужен осциллограф, но такового под руками нет). Тут я начал задумываться над тем, что кто должен тактировать - master или slave?

alexnname
() автор топика
Ответ на: комментарий от alexnname

она же даёт 0.11 Вольт (знаю, что нужен осциллограф, но такового под руками нет).

Ну на CLK не обязательно меандр, там могут быть иголки, так что вполне может быть и 0.11В

Если совсем никак с осциллографом, можно пиковый детектор сгородить - к ноге CLK диод, резистор на 1к и конденсатор на землю. Импульсы логической «1» CLK через диод и резистор будут заряжать конденсатор, при этом диод не даст конденсатору разряжаться обратно через CLK когда там «0». На конденсаторе будет напряжение лог.«1» за вычетом прямого падения напражения на диоде, что для обычных 0.7В, для Шоттки - 0.3В. Колхозно, но можно убедиться что импульсы нужной амплитуды присутствуют.

А так - хотя бы дешёвый китайский USB осциллограф купи, особенно если собираешься этой занимательным электроникой заниматься. Очень полезная штука.

Тут я начал задумываться над тем, что кто должен тактировать - master или slave?

Мастер тактирует, однозначно, при любом направлении обмена данными.

Проверял линию SPI, когда был продгружен драйвер SPIDEV, а не ADS7846

А если к этой линии временно какой-нибудь SPI девайс подключить, типа SPI flash вместо ADS7846 и посмотреть - оно будет работать или нет? Чтобы локализовать проблему. Если работает - надо драйвер ADS7846 копать и сам девайс, а если нет, то разбираться с инициализацией SPI сначала.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

С SPI шиной, по идее, проблем быть не может, так как я через прогу spi-pipe проверял наличие сигнала. Я закорачивал MISO на землю, когда туда шли данные, в итоге программа показывала нули, когда рассоединял закоротку - показывала данные.

alexnname
() автор топика
Ответ на: комментарий от alexnname

Я закорачивал MISO на землю, когда туда шли данные, в итоге программа показывала нули, когда рассоединял закоротку - показывала данные.

Ну это ты проверил DI и DO, но не CLK.

Чисто теоретически, если у тебя на CLK 0.11В, то это очень тонкие иголки. Может ADS7846 нужны CLK пошире, например, вот его и плющит.

Но по поводу детектора - спасибо, стоит проверить. На макетной плате быстро набросаю детальки и посмотрю

Да его можно прям на щупе мультиметра скрутками собрать на скорую руку.

Stanson ★★★★★
()