wtorek, 10 października 2023

Colibri - Wyświetlacz Waveshare ze sterownikiem ILI2130

W tym poście chciałbym opisać sposób przygotowania sterownika panelu dotykowego w układzie Colibri iMX6. 


Uruchomienie wyświetlacza jest identyczne jak w tym poście. Różnica polega na zmianie zastosowanego kontrolera panelu dotykowego. 

Obsługa panelu dotykowego:

 
W celu uruchomienia panelu dotykowego należy zmodyfikować plik *.dts, gdzie dodajemy informację o pinach int oraz reset:

  1. pinctrl_ilitek_ili2130: ilitek_ts_i2c {
  2.     fsl,pins = <
  3.         MX6QDL_PAD_EIM_CS1__GPIO2_IO24  0x130b0 /*PAD_CTRL_HYS_PD*/ /*SODIMM 107 - "INT"*/
  4.         MX6QDL_PAD_SD2_DAT1__GPIO1_IO14 0x80000000 /*PAD_CTRL_NO*/ /*SODIMM 106 - "RESET"*/
  5.     >;
  6. };

Należy także wprowadzić informację o sterowniku panelu dotykowego:

  1. /*
  2.  * I2C: I2C3_SDA/SCL on SODIMM 194/196
  3.  * (e.g. RTC on carrier board)
  4.  */
  5. &i2c3 {
  6.     status = "okay";
  7.  
  8.     /* M41T0M6 real time clock on carrier board */
  9.     rtc_i2c: rtc@68 {
  10.         compatible = "st,m41t0";
  11.         reg = <0x68>;
  12.     };
  13.  
  14.     /* Ilitek ILI2130 touchscreen driver */
  15.     ilitek_ili2130: ilitek_ts_i2c@41 {
  16.         compatible = "ilitek,ili2130", "ilitek,ili2131", "ilitek,ili2132",
  17.             "ilitek,ili2316", "ilitek,ili2322", "ilitek,ili2323", "ilitek,ili2326",
  18.             "ilitek,ili2520", "ilitek,ili2521";
  19.         reg = <0x41>;
  20.         interrupt-parent = <&gpio2>;
  21.         interrupts = <24 IRQ_TYPE_EDGE_FALLING>;
  22.         reset-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>;
  23.         pinctrl-names = "default";
  24.         pinctrl-0 = <&pinctrl_ilitek_ili2130>;
  25.     };
  26. };

Kolejnym elementem jest wykonanie zmian w plikach:

linux-toradex\drivers\input\touchscreen\KConfig

Należy dołożyć informację o kontrolerze (link):

  1. config TOUCHSCREEN_ILITEK
  2.     tristate "Ilitek I2C 213X/23XX/25XX/Lego Series Touch ICs"
  3.     depends on I2C
  4.     help
  5.       Say Y here if you have touchscreen with ILITEK touch IC,
  6.       it supports 213X/23XX/25XX and other Lego series.
  7.  
  8.       If unsure, say N.
  9.  
  10.       To compile this driver as a module, choose M here: the
  11.       module will be called ilitek_ts_i2c.

linux-toradex\drivers\input\touchscreen\Makefile

Należy dołożyć konfigurację wraz z nazwą pliku sterownika (link):

  1. obj-$(CONFIG_TOUCHSCREEN_ILITEK)    += ilitek_ts_i2c.o

oraz dołożenie sterownika:

linux-toradex\drivers\input\touchscreen\ilitek_ts_i2c.c

Sterownik można pobrać pod tym adresem.

W opisanym sterowniku wykorzystano funkcję devm_device_add_group(). W związku z tym, że wykorzystuje jądro linuxa w wersji 4.9.220 to należy zamienić ją na sysfs_create_group(). Nowa nazwa funkcji jest wymagana dla jądra systemu w nowszej wersji.

Jeśli ta zmiana nie zostanie wykonana, to podczas kompilacji modułów zostanie wyświetlony następujący komunikat:

  1. drivers/input/touchscreen/ilitek_ts_i2c.c: W funkcji ‘ilitek_ts_i2c_probe’:
  2. drivers/input/touchscreen/ilitek_ts_i2c.c:599:10: error: implicit declaration of function ‘devm_device_add_group’; did you mean ‘devres_release_group’? [-Werror=implicit-function-declaration]
  3.   error = devm_device_add_group(dev, &ilitek_attrs_group);
  4.           ^~~~~~~~~~~~~~~~~~~~~
  5.           devres_release_group
  6. cc1: wybrane ostrzeżenia będą traktowane jako błędy

Następnie podczas przygotowywania kernela należy zaznaczyć opcję:


Jest ona do wybrania w zakładce:

Device Drivers -> Input device support -> Touchscreens -> Ilitek I2C 213X/23XX/25XX/Lego Series Touch ICs = "M"

Dalej generowany jest obraz systemu, zgodnie z opisem w tym poście

Poniższym poleceniem sprawdzam czy urządzenie jest widziane w systemie. Musi być ono obsługiwane przez sterownik systemowy oraz, że istnieje przypisane do niego zdarzenie.

  1. root@colibri-imx6:~# less /proc/bus/input/devices
  2. I: Bus=0019 Vendor=0001 Product=0001 Version=0100
  3. N: Name="gpio-keys"
  4. P: Phys=gpio-keys/input0
  5. S: Sysfs=/devices/soc0/gpio-keys/input/input0
  6. U: Uniq=
  7. H: Handlers=kbd event0
  8. B: PROP=0
  9. B: EV=3
  10. B: KEY=8000 0 0 0 0
  11.  
  12. I: Bus=0018 Vendor=0000 Product=0000 Version=0000
  13. N: Name="ilitek_ts"
  14. P: Phys=
  15. S: Sysfs=/devices/soc0/soc/2100000.aips-bus/21a8000.i2c/i2c-2/2-0041/input/input1
  16. U: Uniq=
  17. H: Handlers=mouse0 event1
  18. B: PROP=2
  19. B: EV=b
  20. B: KEY=400 0 0 0 0 0 0 0 0 0 0
  21. B: ABS=2608000 3

Po instalacji systemu na module, sterownik należy aktywować następującymi poleceniami:

  1. modprobe ilitek_ts_i2c
  2. echo 'ilitek_ts_i2c' >/etc/modules-load.d/ilitek_ts_i2c.conf

Następnie można przetestować działanie dotyku, wykorzystując

  1. root@colibri-imx6:~# ls -l /dev/input/event*
  2. crw-rw----    1 root     input      13,  64 Oct  9 13:33 /dev/input/event0
  3. crw-rw----    1 root     input      13,  65 Oct  9 13:33 /dev/input/event1

Powyżej mamy dwa zdarzenia obsługujące panel dotykowy. Pierwszy z nich odpowiada za układ umieszczony na płycie Colibri. Drugi jest wykorzystywanym kontrolerem panelu dotykowego.

Sprawdzenie odpowiedzi od panelu wykonujemy następującym poleceniem:

  1. root@colibri-imx6:~# evtest /dev/input/event1
  2. Input driver version is 1.0.1
  3. Input device ID: bus 0x18 vendor 0x0 product 0x0 version 0x0
  4. Input device name: "ilitek_ts"
  5. Supported events:
  6.   Event type 0 (EV_SYN)
  7.   Event type 1 (EV_KEY)
  8.     Event code 330 (BTN_TOUCH)
  9.   Event type 3 (EV_ABS)
  10.     Event code 0 (ABS_X)
  11.       Value   2047
  12.       Min        0
  13.       Max    16384
  14.     Event code 1 (ABS_Y)
  15.       Value  16204
  16.       Min        0
  17.       Max    16384
  18.     Event code 47 (ABS_MT_SLOT)
  19.       Value      0
  20.       Min        0
  21.       Max        4
  22.     Event code 53 (ABS_MT_POSITION_X)
  23.       Value      0
  24.       Min        0
  25.       Max    16384
  26.     Event code 54 (ABS_MT_POSITION_Y)
  27.       Value      0
  28.       Min        0
  29.       Max    16384
  30.     Event code 57 (ABS_MT_TRACKING_ID)
  31.       Value      0
  32.       Min        0
  33.       Max    65535
  34. Properties:
  35.   Property type 1 (INPUT_PROP_DIRECT)
  36. Testing ... (interrupt to exit)
  37. Event: time 1696935839.803505, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 12
  38. Event: time 1696935839.803505, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 3829
  39. Event: time 1696935839.803505, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 8628
  40. Event: time 1696935839.803505, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
  41. Event: time 1696935839.803505, type 3 (EV_ABS), code 0 (ABS_X), value 3829
  42. Event: time 1696935839.803505, type 3 (EV_ABS), code 1 (ABS_Y), value 8628
  43. Event: time 1696935839.803505, -------------- SYN_REPORT ------------
  44. Event: time 1696935839.949429, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
  45. Event: time 1696935839.949429, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
  46. Event: time 1696935839.949429, -------------- SYN_REPORT ------------
  47. Event: time 1696935840.438553, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 13
  48. Event: time 1696935840.438553, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 5120
  49. Event: time 1696935840.438553, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 5821
  50. Event: time 1696935840.438553, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
  51. Event: time 1696935840.438553, type 3 (EV_ABS), code 0 (ABS_X), value 5120
  52. Event: time 1696935840.438553, type 3 (EV_ABS), code 1 (ABS_Y), value 5821
  53. Event: time 1696935840.438553, -------------- SYN_REPORT ------------
  54. Event: time 1696935840.541655, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
  55. Event: time 1696935840.541655, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
  56. Event: time 1696935840.541655, -------------- SYN_REPORT ------------