У меня возникли проблемы с сенсорным экраном, работающим на Atmel MXT641T на платформе Android 5 для работы.Как правильно настроить прерывание для строки INT для Atmel MXT641T сенсорной микросхемы в Android-устройстве ядра Android 5?
Установка у меня выглядит следующим образом:
- Оборудование: Inforce 6309 СБК с Qualcomm Snapdragon 410 msm8916 процессор ARM64.
- Пользовательский сенсорный экран с чипом контроллера Atmel MXT641T.
- Соединение I2C между Atmel и Snapdragon, подключенным к I2C0.
- Android 5 операционной системы Linux с использованием ядра 3.10 из
git://codeaurora.org/kernel/msm-3.10.git
ветвиRel_V1.3
(это часть БСП, которая поставляется с SBC) ... - ... но с последней версией драйвера Atmel
atmel_mxt_ts.c
наложенной на (но также проверено с версиейatmel_maxtouch_ts.c
вmsm-3.10.git
, которая показывает то же поведение). - INT линия от чипа Atmel, подключенного к GPIO 53 (это
EXT_CONN_GPIO_1
этой платы) и с внешним подтягивающим резистором до 1,8 В. - Сброс линии от чипа Atmel отключен.
Что я сделал, чтобы добраться до этой точки, чтобы изменить дерево устройства, чтобы включить устройство Atmel следующим образом:
&i2c_0 {
[email protected] {
compatible = "atmel,maxtouch";
reg = <0x4a>;
interrupt-parent = <&msm_gpio>;
interrupts = <53 0>;
atmel,panel-coords = <0 0 1024 768>;
atmel,display-coords = <0 0 1024 768>;
atmel,family-id = <164>;
atmel,variant-id = <2>;
atmel,version = <21>;
atmel,build = <0xaa>;
};
};
Для справки, msm_gpio
определяется следующим образом в БСП (нетронутый) ,
&soc {
tlmm_pinmux: [email protected] {
compatible = "qcom,msm-tlmm-8916";
reg = <0x1000000 0x300000>;
interrupts = <0 208 0>;
/*General purpose pins*/
gp: gp {
qcom,num-pins = <122>;
#qcom,pin-cells = <1>;
msm_gpio: msm_gpio {
compatible = "qcom,msm-tlmm-gp";
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
num_irqs = <122>;
};
};
Я скомпилировал ядро как модуль (CONFIG_TOUCHSCREEN_ATMEL_MXT=m
), и я бегу insmod
вручную.
То, что я вижу следующее:
- При использовании утилиты
mxt-app
Atmel устройство работает: когда я прикасаюсь экран сообщения приходят в, поэтому соединение I2C нормально (но он использует опрос). - Вызывается при загрузке драйвера
mxt_start
, в котором включено прерывание. Я добавил несколько драйверов отладки в драйвер, чтобы убедиться, что он действительно загружается. - При загрузке драйвера информационный блок считывается с устройства, а на осциллографе отображаются короткие показания I2C. Адрес I2C считывается из дерева устройств, поэтому я уверен, что загружено мое дерево устройств.
- Устройство ввода зарегистрировано как
/dev/input/event6
и может быть открыто с помощьюcat
(но при касании экрана не появляются сообщения). - Прерывание видно в
/proc/interrupts
, но никогда не срабатывает (см. Ниже). - Всякий раз, когда я касаюсь экрана, линия INT от чипа Atmel вытаскивается с помощью чипа, но на осциллографе не видно трафика I2C.
- Я проверил, что условие прерывания запуска (
0x0
,0x8
или0x2008
в качестве второго элемента в ячейке прерывания в дереве устройств) не имеет значения вручную вызывая максимумы и минимумы на линии прерывания: нет прерывания не срабатывает в любом случае.
Вступление в /proc/interrupts
:
$ cat /proc/interrupts
...
326: 0 0 0 0 msm_tlmm_irq maxtouch
...
Это то, что появляется в dmesg
:
<6>[ 55.290620] atmel_mxt_ts 0-004a: Family: 164 Variant: 2 Firmware V1.5.AA Objects: 43
<4>[ 55.291252] atmel_mxt_ts 0-004a: Enabling RETRIGEN workaround
<6>[ 55.365918] atmel_mxt_ts 0-004a: Touchscreen size X1024Y768
<6>[ 55.367017] input: Atmel maXTouch Touchscreen as /devices/soc.0/78b6000.i2c/i2c-0/0-004a/input/input6
То, что я понял из чтения коды драйвера в atmel_mxt_ts.c
является то, что водитель должен вызвать это прерывание и затем запросить устройство, запустив передачу I2C, чтобы прочитать сообщение T5, после чего устройство вернет список касаний, которые затем передаются на операционная система. Я не нашел документа или документа, правильно объясняющего это, но это то, что я подозреваю, основываясь на том, что я видел до сих пор.
Я испытал штырь GPIO 53 (к которому я обычно подключить линию INT чипа Atmel) вручную, выполнив следующие действия:
$ echo 955 > /sys/class/gpio/export # 955 because EXP_CONN_GPIO_1 is GPIO pin 53, which has offset 902
cat /sys/class/gpio/gpio955/value
изменений это значение при подключении линии INT к V + или земля, поэтому я уверен, что я должен использовать GPIO 53.
Нет GPIO для maxtouch драйвера показан в /sys/kernel/debug/gpio
:
$ cat /sys/kernel/debug/gpio
GPIOs 576-607, platform/qcom,smp2pgpio-ssr-smp2p-4-out.19, master-kernel:
GPIOs 608-639, platform/qcom,smp2pgpio-ssr-smp2p-4-in.18, slave-kernel:
GPIOs 640-671, platform/qcom,smp2pgpio-ssr-smp2p-1-out.13, master-kernel:
GPIOs 672-703, platform/qcom,smp2pgpio-ssr-smp2p-1-in.12, slave-kernel:
GPIOs 704-735, platform/qcom,smp2pgpio-smp2p-4-out.16, smp2p:
GPIOs 736-767, platform/qcom,smp2pgpio-smp2p-4-in.14, smp2p:
GPIOs 768-799, platform/qcom,smp2pgpio-smp2p-1-out.10, smp2p:
GPIOs 800-831, platform/qcom,smp2pgpio-smp2p-1-in.8, smp2p:
GPIOs 832-863, platform/qcom,smp2pgpio-smp2p-7-out.6, smp2p:
GPIOs 864-895, platform/qcom,smp2pgpio-smp2p-7-in.4, smp2p:
GPIOs 896-899, spmi/qpnp-pin-ffffffc031550c00, pm8916-gpio:
gpio-898 (qcom,hub-reset-gpio) out hi
gpio-899 (qcom,sw-sel-gpio ) in lo
GPIOs 900-901, spmi/qpnp-pin-ffffffc031550800, pm8916-mpp:
GPIOs 902-1023, platform/1000000.pinctrl, msm_tlmm_gpio:
gpio-922 (adv7533_hpd_irq_gpio) in lo
gpio-923 (led1 ) out lo
gpio-927 (disp_rst_n ) in hi
gpio-933 (adv7533_irq_gpio ) in hi
gpio-934 (hdmi_lvds ) in lo
gpio-940 (7864900.sdhci cd ) in hi
gpio-1009 (volume_up ) in hi
gpio-1010 (camera_focus ) in hi
gpio-1011 (camera_snapshot ) in hi
gpio-1022 (led2 ) out lo
gpio-1023 (USB_ID_GPIO ) in hi
Я сформулированный несколько сек полезные вопросы, чтобы помочь решить головоломку:
- Каков правильный способ регистрации прерывания? Я использую
interrupt-parent = <&msm_gpio>;
иinterrupts = <53 0>
для идентификации булавки GPIO 53 Snapdragon. Я тестировал как с<53 0>
, так и с<53 8>
. - Я иногда вижу, что люди используют
0x2008
как вторую запись в ячейке. Я думаю, что0x0008
должен установить прерывание для запуска на уровне LOW, но что делает 13-й бит? Я тестировал как с0x0
, так и с0x8
, не имеет значения (пока :-)). - Должен ли я ожидать ввода в
/sys/kernel/debug/gpio
? - Есть ли дополнительные записи в дереве устройств, необходимые для подключения прерывания maxtouch к физическому выводу?
- Откуда берутся номер IRQ
326
в/proc/interrupts
, и есть ли способ проверить, с чем он связан? - Возможно ли настроить, что линия INT будет отключена Snapdragon, вместо того, чтобы использовать внешний резистор подтягивания?
Заранее за вашу помощь.
PS: А тангенциально связан вопрос: как я могу быстро проверить обновления дерева устройств без необходимости ждать 20 минут для всех Makefiles, чтобы загрузить и ядро пересобрать, а затем прошить новый boot.img
к устройству и перезагрузки ? Я использую команду make bootimage
.
Любое обновление по этому вопросу? Удалите его, чтобы решить его;) Я также сталкиваюсь с аналогичной проблемой на доске Snapdragon 820. – dheeraj
Привет @dheeraj, спасибо, что напомнил мне, чтобы опубликовать ответ. Ниже приведена конфигурация дерева устройств, которая решила проблему для меня, я надеюсь, что она вам поможет. Если вам потребуются дополнительные шаги или у вас есть дополнительные вопросы, сообщите мне, тогда я уточню ответ, если смогу. –