Enabling GT911 Touchscreen on Raspberry Pi Zero 2W with Yocto
Raspberry Pi Zero 2W 기반으로 나만의 E-paper Device를 만들기 위해 7.5인치 E-Ink 디스플레이와 터치스크린을 구매했습니다.
E-Ink 디스플레이에 GT911 터치스크린이 결합된 Goodix 제품인데, 아마존에서 저렴하게 판매하길래 망설임 없이 구매했습니다.
이전 글에서 만든 meta-jooojub-rpi를 수정하여 제가 구매한 터치스크린과 E-Ink가 동작하도록 Yocto를 수정해 보려고 합니다.
우선 이번 글에서는 GT911 터치스크린을 먼저 활성화해 보겠습니다.
1. Hardware Setup
구매한 Goodix 제품은 아래와 같습니다.
- GDEY075T7-T01: https://www.good-display.com/product/483.html
Specification Drawing를 보면 터치스크린은 GT911 IC를 사용하며 I2C 통신을 합니다.
E-Ink 디스플레이는 SPI를 사용하며 별도 컨트롤러가 필요해 보입니다.

다행히 E-Ink 디스플레이 컨트롤러는 기존에 가지고 있던 것을 사용했습니다.
문제는 터치스크린인데, FPC 연결을 위한 커넥터 여유분이 없어서 인터넷으로 따로 주문해야 했습니다.
Pin Map을 보며 GPIO를 연결했고, 최종적으로 아래와 같이 하드웨어 구성이 완성되었습니다.

지금 당장 샘플 코드로 테스트해 보고 싶었지만, 우선 Yocto로 이미지를 구성하기로 했습니다.
2. Modifying Yocto Recipes - DT overlay
최신 라즈베리파이 커널 소스에서 overlay DT를 발견 하였습니다. 이를 사용하면 터치스크린을 쉽게 활성화할 수 있을 것 같습니다.
원하는 수정 사항을 적용하기 위해 goodix-overlay.dts 파일을 meta-jooojub-rpi 내 적절한 위치로 복사하고, Yocto 빌드 시 복사되도록 설정해줍니다.
기존 kernel 빌드는 그대로 유지하면서 원하는 동작을 추가하거나 삭제하려면 .bbappend 파일을 생성하면 됩니다.
meta-jooojub-rpi에 아래 파일을 추가해서 goodix overlay 사용하도록 합니다.
recipes-kernel/linux/linux-raspberrypi_%.bbappendmake
이제 files 디렉토리를 만들고 goodix-overlay.dts를 복사한 뒤 원하는 값을 수정합니다.
저는 제 하드웨어 구성에 맞게 size-x, size-y와 실제 물리적 사이즈를 추가했습니다.
그리고 터치스크린을 세로로 세워서 사용할 예정이므로 inverted-y와 swapped-x-y를 추가했습니다.
recipes-kernel/linux/files/goodix-overlay.dtsshell
이제 dtoverlay=goodix를 라즈베리파이 config에 추가해야 하는데, meta-raspberrypi를 살펴보니 RPI_EXTRA_CONFIG를 통해 설정할 수 있을 것 같습니다.
이러한 설정은 이전에 생성한 distro에 추가하면 됩니다.
이번에 설정하는 김에 i2c 사용을 위한 설정과, init manager를 기존 sysvinit에서 systemd를 사용하도록 수정하겠습니다.
conf/distro/rpi0-2w.confdiff
3. Modifying Yocto Recipes - GT911 firmware
빌드 후 부팅해 보니 goodix는 정상적으로 probe 되었으나, firmware가 없다는 메시지가 나타났습니다.
Attempting to load firmwareshell
goodix 드라이버 코드에서 펌웨어의 역할을 찾아보니 GT911이 사용하는 Configuration 값들이었습니다.
drivers/input/touchscreen/goodix.c - goodix_config_cbc
drivers/input/touchscreen/goodix.c - goodix_config_cb, goodix_send_cfgc
GT911의 불친절한 매뉴얼을 보면 0x8047이 Configuration Information (R/W)임을 확인할 수 있습니다.

제 하드웨어 구성에 맞게 펌웨어를 설정해야 했는데, Goodix에서는 따로 제공해준 펌웨어는 없었습니다.
설명이 불충분한 GT911 developer manual과 LLM의 RAG를 이용하여 하나하나 테스트하며 펌웨어를 만들 수밖에 없었습니다.
이렇게 만들어진 goodix_911_cfg.bin 파일을 Yocto가 빌드될 때 원하는 위치에 복사되도록 패키지로 구성하였습니다.
Yocto에서 패키지를 만드는 방법은 간단합니다.
원하는 패키지 이름으로 .bb 파일을 만들고, IMAGE_INSTALL에 추가하면 됩니다.
recipes-bsp/goodix-firmware/goodix-firmware.bbshell
4. Modifying Yocto Recipes - INSTALL packages
마지막으로 필요한 패키지들을 설치하도록 image recipe를 수정합니다.
이후에 필요할 것으로 예상되는 패키지들도 함께 추가했습니다.
recipes-core/images/jooojub-rpi0-2w.bbdiff
5. Build and test
이제 이미지 빌드 후 터치스크린이 잘 동작하는지 테스트해 보겠습니다.
Build and flashing to SD Cardshell
빌드 된 이미지를 Flash 한 후 부팅 하면 기존에 있었던 firmware load 실패 로그도 사라졌습니다.
Attempting to load firmwareshell
i2c-detect로 보면 문제 없이 probe 된거 같네요.
i2cdetectshell
evtest로 터치 테스트 해보니 정상적으로 원하는 event 가 올라옵니다.
evtestshell
6. Next Steps
GT911 터치스크린을 probe하기 위한 firmware와 DT 파일을 Yocto에 추가하여 빌드된 이미지에서 바로 사용할 수 있도록 했습니다.
이제 meta-jooojub-rpi에 E-Ink 디스플레이를 활성화하기 위한 수정 사항도 적용해 보겠습니다.
7. On a side note
여담이지만, i2c probe가 계속 실패하여 몇 달간 손놓고 있었습니다.
혹시나 하여 Power Meter로 3V GPIO를 측정해 보았는데, 전압이 인가되지 않고 있었습니다.
전류가 흐르지도 않는 컨트롤러를 활성화하려고 열심히 삽질을 하고 있었네요. ㅠ-ㅠ
결론적으로 GPIO 핀 헤더 납땜 문제였습니다.