понедельник, 9 ноября 2015 г.

Подключение 4-проводной тачпанели Sharp LQ057Q3DC12 к BBB (через промежуточную плату Digi LCD application board for 6.4 sharp vga)

Для того, чтобы на BBB появилось соответствующее устройство надо включить сборку следующих модулей при конфигурировании ядра (у меня 4.1.0-rc1-bone0):

1) ti_am335x_tscadc.ko(CONFIG_MFD_TI_AM335X_TSCADC);
2) ti_am335x_tsc.ko(CONFIG_TOUCHSCREEN_TI_AM335X_TSC);
3) ti_am335x_adc.ko(CONFIG_TI_AM335X_ADC).


Модули лучше сделать встроенными (build-in): соответствующие опции будут выделены звездочкой (*). Можно сделать загружаемыми (loadable) - соответствующие опции при конфигурировании будут выделены (M). Модули adc и tsc зависят от tscadc, поэтому настойки типа сборки касаются сразу всех модулей.

Необходимые опции menuconfig: 

1) ti_am335x_adc.ko(CONFIG_TI_AM335X_ADC)

Device Drivers --->
 [*] Industrial I/O support --->
   [*] Enable buffer support within IIO
   <*> Industrial I/O lock free software ring
     Analog to digital converters --->
       <*> TI's AM335X ADC driver


2) ti_am335x_tscadc.ko(CONFIG_MFD_TI_AM335X_TSCADC)

Device Drivers --->
  Multifunction device drivers --->
    <*> TI ADC / Touch Screen chip support


3) ti_am335x_tsc.ko(CONFIG_TOUCHSCREEN_TI_AM335X_TSC)

Device Drivers ---> 
Input device support ---> 
  -*- Generic input layer (needed for keyboard, mouse, ...) -*- Support for memoryless force-feedback devices {M} Polled input device skeleton <M> Sparse keymap support library <M> Matrix keymap support library *** Userland interfaces *** < > Mouse interface < > Joystick interface <*> Event interface <*> Event debugging < > Input Power Event -> APM Bridge *** Input Device Drivers *** [ ] Keyboards ---- [ ] Mice ---- [ ] Joysticks/Gamepads ---- [*] Tablets ---> [*] Touchscreens ---> <*> <*> TI Touchscreen Interface

В device tree для корректной работы tsc-контроллера надо внести следующие исправления:
1) файл bb-kernel/KERNEL/arch/arm/boot/dts/am33xx.dtsi :

...
tscadc: tscadc@44e0d000 {
compatible = "ti,am3359-tscadc";
reg = <0x44e0d000 0x1000>;
interrupt-parent = <&intc>;
interrupts = <16>;
ti,hwmods = "adc_tsc";
status = "okay";

tsc {
compatible = "ti,am3359-tsc";
ti,wires = <4>;
ti,x-plate-resistance = <200>;
ti,coordinate-readouts = <5>;
ti,wire-config = <0x00 0x11 0x22 0x33>;
ti,charge-delay = <0x400>;
  };

adc {
compatible = "ti,am3359-adc";
ti,adc-channels = <4 5 6 7>;
};
};
...


После сборки обновленного ядра должно появиться устройство /dev/input/event[0..9] (у меня /dev/input/event0).

Проверить получение данных с панели можно следующим образом:

cat /dev/input/event0 | hexdump

Подключение тачпанели через промежуточную плату  к BBB произведем следующим образом:
1) TSMx (41 X10) - AIN0 (39 P9)
2) TSPx (39 X10) - AIN1 (40 P9)
3) TSMy (42 X10) - AIN2 (37 P9)
4) TSPy (40 X10) - AIN3 (38 P9)

Настройка TSC controller производится через devicetree, а из полученного бинарника считывают следующие исходные файлы модулей:
1) заголовочный файл с определением констант регистров ADCTSC controller'а - /media/Data/Kernel/bbb/bb-kernel/KERNEL/include/linux/mfd/ti_am335x_tscadc.h;
2) конфигурирование tscadc - /media/Data/Kernel/bbb/bb-kernel/KERNEL/drivers/mfd/ti_am335x_tscadc.c;
3) конфигурирование tsc - /media/Data/Kernel/bbb/bb-kernel/KERNEL/drivers/input/touchscreen/ti_am335x_tsc.c.


Для корректной работы курсора в qt-приложении, надо написать специальный драйвер, преобразующий информацию, полученную с /dev/input/event0 в перемещения курсора на экране.

Использованный материал:
1) http://processors.wiki.ti.com/index.php/Linux_Core_ADC_User%27s_Guide
2) http://www.farnell.com/datasheets/1780810.pdf
3) http://ftp1.digi.com/support/documentation/90000944_A.pdf