Перейти к содержанию
    

Прерывания в драйвере ADS7846 на OpenWrt

Пытаюсь добавить сенсорный экран ( compatible = "ti,ads7846"; ) к железке на базе MT7621 через SPI, но похоже, что OpenWrt (ядро 5.4.52) не хочет перенаправлять прерывание к драйверу ads7846 (https://github.com/torvalds/linux/blob/master/drivers/input/touchscreen/ads7846.c). Кусок из моего дерева устройств:

....
#include "mt7621.dtsi"
....

    xpt2046reg: xpt2046_reg {
        compatible = "regulator-fixed";
        regulator-name = "xpt2046_vcc";
        regulator-min-microvolt = <3300000>;
        regulator-max-microvolt = <3300000>;
        regulator-always-on;
.....
&spi0 {
    status = "okay";

....

    spidev3@3 {
        #address-cells = <1>;
        #size-cells = <0>;
        compatible = "ralink,mt7621-spi";
        reg = <3>;
        spi-max-frequency = <250000>;
        status = "disabled";
    };
    
    xpt2046@4 {
        compatible = "ti,ads7846";
        reg = <3>;
        vcc-supply = <&xpt2046reg>;
        spi-max-frequency = <250000>;

        interrupt-parent = <&gpio>;
        interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
        pendown-gpio = <&gpio 18 GPIO_ACTIVE_LOW>;
        ti,x-min = /bits/ 16 <0x0>;
        ti,x-max = /bits/ 16 <0x0fff>;
        ti,y-min = /bits/ 16 <0x0>;
        ti,y-max = /bits/ 16 <0x0fff>;
        ti,x-plate-ohms = /bits/ 16 <180>;
        ti,pressure-max = /bits/ 16 <255>;
        ti,debounce-max = /bits/ 16 <10>;
        ti,debounce-tol = /bits/ 16 <5>;
        ti,debounce-rep = /bits/ 16 <1>;
        ti,keep-vref-on = <1>;
        ti,settle-delay-usec = /bits/ 16 <150>;

        wakeup-source;
        status = "okay";
    };
};

Прерывание успешно регистрируется в системе:

ads7846 spi0.3: touchscreen, irq 27

Драйвер тоже успешно грузится:

input: ADS7846 Touchscreen as /devices/platform/1e000000.palmbus/1e000b00.spi/spi_master/spi0/spi0.3/input/input0

MISO, MOSI, SCK и CS работают на spi0.3, а драйвер сенсорного экрана даже что-то отвечает вразумительное во время инициализации линуксового драйвера во время загрузки системы. В /proc/interrupts появляется соответствующая строка:

27:          0          0          0          0  1e000600.gpio  18  ads7846

Event находится в /dev/input/event0.

GPIO18 подтянут снаружи к питанию через 10 кОм. Но когда чип драйвера сенсорного экрана опускает вниз соответствующую ножку (pendown), в /proc/interrupts ничего не происходит. Функции ads7846_hard_irq () и ads7846_irq () из драйвера даже не используются.

Если я удалю всякое упоминание о GPIO18 в дереве устройств, то GPIO18 можно будет свободно использовать в качестве источника прерывания через gpiolib записав echo falling > /sys/class/gpio/gpio490/edge, что будет потом видно в /proc/interrupts.

# cat /proc/bus/input/devices 
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="ADS7846 Touchscreen"
P: Phys=spi0.3/input0
S: Sysfs=/devices/platform/1e000000.palmbus/1e000b00.spi/spi_master/spi0/spi0.3/input/input0
U: Uniq=
H: Handlers=event0 
B: PROP=0
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=1000003

Как еще можно это отлаживать?

Я видел, что у некоторых event тачскрина регистрировался как два устройства - например как /dev/input/event0 и /dev/input/event1,  а прерывания шли только на /dev/input/event1. Соответственно в /proc/bus/input/devices  было Phys=spi0.х/input0, а Sysfs=/devices/platform/...../spi_master/spi0/spi0.х/input/input1. У меня не так, но мне кажется, что это не так важно. Или важно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, enclis_ said:

Пытаюсь добавить сенсорный экран ( compatible = "ti,ads7846"; ) к железке на базе MT7621

Странное решение - у этого процессора нет видеоконтроллера для LCD

Quote

Dual-core Network Processor

а в логе у вас 4 ядра

Quote

27:          0          0          0          0  1e000600.gpio  18  ads7846

с драйвером ads7846 имел дело много раз и никаких проблем не возникало

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote

Странное решение - у этого процессора нет видеоконтроллера для LCD

Зачем обязательно иметь видеоконтроллер для LCD? Может быть мне надо просто одну статическую картинку вывести раз в час (фоторамка-роутер, лол ). Может быть мне вообще не надо LCD. Хочу просто тачскрин как input устройство. 

Quote

а в логе у вас 4 ядра

У MT7621A 2 ядра, 4 потока.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Меня вот больше интересует вопрос почему функции ads7846_hard_irq () и ads7846_irq () из драйвера не используются. Как это отлаживать? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, enclis_ said:

почему функции ads7846_hard_irq () и ads7846_irq () из драйвера не используются. Как это отлаживать? 

не вызываются потому что запрос на прерывание не приходит - cкорей всего прерывание неправильно описано в dts. У этого процессора 3 банка GPIO (gpio0, gpio1, gpio2) 

 

https://github.com/openwrt-mirror/openwrt/blob/9b4650b3b92e6246b986ac9e3d7c2a80d66b805b/target/linux/ramips/dts/mt7621.dtsi#L70

 

я не знаю какой у вас пин и из  какого банка, предположим из банка 0

        interrupt-parent = <&gpio0>;
        interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
        pendown-gpio = <&gpio0 18 GPIO_ACTIVE_LOW>;

 

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Огромное спасибо вам за то, что вы хотя бы поверхностно взглянули на проблему. 

Quote

interrupt-parent = <&gpio0>;
interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
pendown-gpio = <&gpio0 18 GPIO_ACTIVE_LOW>;

Ну ведь это было бы совсем просто, правда же? :)  В новых версиях openwrt оно немного по-другому. Достаточно посмотреть dts конкретной железки (https://github.com/openwrt/openwrt/blob/master/target/linux/ramips/dts/mt7621_xiaomi_mir3g-v2.dts) и увидеть, что обращение к первому банку идёт просто через gpio. Ну а так оно даже не собирается:

ERROR (phandle_references): /palmbus@1E000000/spi@b00/xpt2046@4: Reference to non-existent node or label "gpio0"
Quote

прерывание неправильно описано в dts. У этого процессора 3 банка GPIO (gpio0, gpio1, gpio2)

В этом зацепке наверное что-то есть, но как к ней подойти правильно я не знаю. Раньше было явно 3 банка, теперь как бы один.  При этом:

# ls /sys/class/gpio/
export       gpiochip416  gpiochip448  gpiochip480  unexport
# cat /sys/class/gpio/gpiochip4*/label 
1e000600.gpio-bank2
1e000600.gpio-bank1
1e000600.gpio-bank0

По 32 GPIO на каждый gpiochip при том что согласно даташиту доступно только 49 (ну не развели наверное просто на ножки). А вообще в конце таблицы с описанием пинов - "Total 265 balls", а всего шариков 347, опять же, если верить "Ball Map" из того же даташита. Я уж не стал сверять таблицу с описанием пинов и  "Ball Map". Или всё-таки надо? "GPIO pin share scheme" соответствует правде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, enclis_ said:

В новых версиях openwrt оно немного по-другому.

Проблема в том что openwrt это какой-то трэш - куча своих патчей и разобраться что в исходниках вашей сборки мне не представляется возможным. До какой-то версии контроллер gpio у них не генерировал прерывания

https://patchwork.ozlabs.org/project/openwrt/patch/[email protected]/

и если смотреть DTS разных роутеров на этом процессоре кнопки на GPIO у них без прерываний на поллинге - програмном периодическом опросе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так в "обычном линуксе" тоже самое: https://github.com/torvalds/linux/blob/master/drivers/staging/mt7621-dts/mt7621.dtsi, оно конечно staging,  но не суть.

Quote

openwrt это какой-то трэш

А что не треш? openwrt кстати весьма неплохо выглядит на фоне остальных. Лет 5-10 назад может быть было не очень, а сейчас всё не так плохо как может показаться. 

Quote

 

До какой-то версии контроллер gpio у них не генерировал прерывания

https://patchwork.ozlabs.org/project/openwrt/patch/[email protected]/

 

Этого коммита я кстати не нашёл в официальной репе openwrt)) В обычном линуксе было дело, да) - https://github.com/torvalds/linux/commit/c7092ed7946217a9ffad8aa1bcacece727843674

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Довольно очевидно, но я на всякий случай проверил.

Собрал openwrt для raspberry pi 3b с поддержкой ads7846 - всё нормально работает - прерывание срабатывает. То есть дело не в openwrt, а в mt7621:boredom:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...