enclis_ 0 8 августа, 2020 Опубликовано 8 августа, 2020 · Жалоба Пытаюсь добавить сенсорный экран ( 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. У меня не так, но мне кажется, что это не так важно. Или важно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 11 8 августа, 2020 Опубликовано 8 августа, 2020 · Жалоба 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 имел дело много раз и никаких проблем не возникало Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
enclis_ 0 8 августа, 2020 Опубликовано 8 августа, 2020 · Жалоба Quote Странное решение - у этого процессора нет видеоконтроллера для LCD Зачем обязательно иметь видеоконтроллер для LCD? Может быть мне надо просто одну статическую картинку вывести раз в час (фоторамка-роутер, лол ). Может быть мне вообще не надо LCD. Хочу просто тачскрин как input устройство. Quote а в логе у вас 4 ядра У MT7621A 2 ядра, 4 потока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
enclis_ 0 8 августа, 2020 Опубликовано 8 августа, 2020 · Жалоба Меня вот больше интересует вопрос почему функции ads7846_hard_irq () и ads7846_irq () из драйвера не используются. Как это отлаживать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 11 9 августа, 2020 Опубликовано 9 августа, 2020 (изменено) · Жалоба 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>; Изменено 9 августа, 2020 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
enclis_ 0 9 августа, 2020 Опубликовано 9 августа, 2020 · Жалоба Огромное спасибо вам за то, что вы хотя бы поверхностно взглянули на проблему. 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" соответствует правде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 11 9 августа, 2020 Опубликовано 9 августа, 2020 · Жалоба 10 minutes ago, enclis_ said: В новых версиях openwrt оно немного по-другому. Проблема в том что openwrt это какой-то трэш - куча своих патчей и разобраться что в исходниках вашей сборки мне не представляется возможным. До какой-то версии контроллер gpio у них не генерировал прерывания https://patchwork.ozlabs.org/project/openwrt/patch/[email protected]/ и если смотреть DTS разных роутеров на этом процессоре кнопки на GPIO у них без прерываний на поллинге - програмном периодическом опросе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
enclis_ 0 9 августа, 2020 Опубликовано 9 августа, 2020 · Жалоба Ну так в "обычном линуксе" тоже самое: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
enclis_ 0 29 октября, 2020 Опубликовано 29 октября, 2020 · Жалоба Довольно очевидно, но я на всякий случай проверил. Собрал openwrt для raspberry pi 3b с поддержкой ads7846 - всё нормально работает - прерывание срабатывает. То есть дело не в openwrt, а в mt7621 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться