基於瑞芯微RV1109 Linux觸摸屏GT911驅動調試心得

Engineer-Bruce_Yang 2021-08-15 04:42:38 阅读数:219

本文一共[544]字,预计阅读时长:1分钟~
rv1109 rv linux gt911 gt

點擊上方「嵌入式雲IOT技術圈」,選擇「置頂公眾號」第一時間查看嵌入式筆記!

1、確定I2C地址

1.1、使用i2cdetect工具查看系統i2c節點的情况

很明顯這裏可以看到系統已經配置了i2c-0、i2c-1、i2c-3、i2c-4、i2c-5,我們可以看下原廠在設備樹裏面的支持情况:
gedit kernel/arch/arm/boot/dts/rv1126.dtsi &

打開後我們可以看到設備樹的支持情况如下:

i2c0: [email protected] {
  compatible = "rockchip,rv1126-i2c", "rockchip,rk3399-i2c";
  reg = <0xff3f0000 0x1000>;
  interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
  #address-cells = <1>;
  #size-cells = <0>;
  clocks = <&pmucru CLK_I2C0>, <&pmucru PCLK_I2C0>;
  clock-names = "i2c", "pclk";
  pinctrl-names = "default";
  pinctrl-0 = <&i2c0_xfer>;
  status = "disabled";
};
i2c1: [email protected] {
  compatible = "rockchip,rv1126-i2c", "rockchip,rk3399-i2c";
  reg = <0xff510000 0x1000>;
  interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
  #address-cells = <1>;
  #size-cells = <0>;
  clocks = <&cru CLK_I2C1>, <&cru PCLK_I2C1>;
  clock-names = "i2c", "pclk";
  pinctrl-names = "default";
  pinctrl-0 = <&i2c1_xfer>;
  status = "disabled";
};
i2c3: [email protected] {
  compatible = "rockchip,rv1126-i2c", "rockchip,rk3399-i2c";
  reg = <0xff520000 0x1000>;
  interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
  #address-cells = <1>;
  #size-cells = <0>;
  clocks = <&cru CLK_I2C3>, <&cru PCLK_I2C3>;
  clock-names = "i2c", "pclk";
  pinctrl-names = "default";
  pinctrl-0 = <&i2c3m0_xfer>;
  status = "disabled";
};
i2c4: [email protected] {
  compatible = "rockchip,rv1126-i2c", "rockchip,rk3399-i2c";
  reg = <0xff530000 0x1000>;
  interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
  #address-cells = <1>;
  #size-cells = <0>;
  clocks = <&cru CLK_I2C4>, <&cru PCLK_I2C4>;
  clock-names = "i2c", "pclk";
  pinctrl-names = "default";
  pinctrl-0 = <&i2c4m0_xfer>;
  status = "disabled";
};
i2c5: [email protected] {
  compatible = "rockchip,rv1126-i2c", "rockchip,rk3399-i2c";
  reg = <0xff540000 0x1000>;
  interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>;
  #address-cells = <1>;
  #size-cells = <0>;
  clocks = <&cru CLK_I2C5>, <&cru PCLK_I2C5>;
  clock-names = "i2c", "pclk";
  pinctrl-names = "default";
  pinctrl-0 = <&i2c5m0_xfer>;
  status = "disabled";
};

在ARM端的文件系統裏查看一下:

ls /proc/device-tree/

ls /sys/devices/platform

當開機的時候系統已經將相應的I2C節點注册成功了,說明I2C部分是沒有問題的。

1.2、使用i2cdetect工具確定設備地址

由於我的觸摸屏是連接在I2C5上,硬件原理圖如下所示:

但是我還沒有實現它的驅動,所以可以通過i2cdetect工具來確定設備的I2C地址是多少,ARM端執行以下命令:

i2cdetect -y 5

這個命令中,-y錶示Disable interactive mode,簡單地說就是別讓我確認了,趕緊執行;5錶示I2C總線5(從0開始),執行後可以看到:

上圖中:

--”錶示沒有這個地址對應的 I2C設備;

UU”錶示這個地址的 I2C 設備已經有驅動在使用占用它了,那這個I2C 設備肯定是存在的;

其他數值錶示該地址對應的 I2C 設備是存在的,並且還沒有驅動程序跟它匹配。

如上圖所示,這個5d就錶示當前觸摸屏的I2C地址,為社麼是5d呢?你把觸摸屏拔掉,再用這個命令查看是不是消失了就可以驗證這個問題了。

2、GT911驅動移植

2.1、配置Linux內核支持gt9xx

GT911在Linux內核中已經支持了,比特於以下路徑,如果沒有的話就需要跟觸摸屏廠商要驅動代碼,如果要不到那麼就拿著Datasheet自己幹吧!反正也不難的!

kernel/drivers/input/touchscreen/gt9xx

另外,也提供了menuconfig,我們只需要在配置驅動的時候搜索GT9XX,然後配置上就可以了。

2.2、查看GT911驅動代碼中需要配置的設備樹參數

驅動代碼:

kernel/drivers/input/touchscreen/gt9xx

接下來打開gt9xx.c,劃到最下面,我們可以看到:

這樣,我們就確定了設備樹中的第一個參數compatible

.compatible = "goodix,gt9xx"

看到這個結構體:

static struct i2c_driver goodix_ts_driver = {
    .probe      = goodix_ts_probe,
    .remove     = goodix_ts_remove,
    .id_table   = goodix_ts_id,
    .driver = {
        .name     = GTP_I2C_NAME,
  .of_match_table = of_match_ptr(goodix_ts_dt_ids),
    },
};

我們直接定比特到goodix_ts_probe函數,基本上所有的設備樹參數都是在probe函數裏實現的,這個函數實現的功能如下:

  • 讀取設備樹中配置的信息

  • 將配置信息設置到TP

經過查看代碼,我們主要需要配置的參數有如下:

(1)tp-size

(2)touch-gpioreset-gpiopower-gpio

(3)max-xmax-y

2.2.1、配置tp-size
  • tp-size

if (of_property_read_u32(np, "tp-size", &val)) {
     dev_err(&client->dev, "no max-x defined\n");
     return -EINVAL;
    }
if (val == 89) {
 m89or101 = TRUE;
 gtp_change_x2y = TRUE;
 gtp_x_reverse = FALSE;
 gtp_y_reverse = TRUE;
} else if (val == 101) {
 m89or101 = FALSE;
 gtp_change_x2y = TRUE;
 gtp_x_reverse = TRUE;
 gtp_y_reverse = FALSE;
} else if (val == 911) {
 m89or101 = FALSE;
 bgt911 = TRUE;
 gtp_change_x2y = TRUE;
 gtp_x_reverse = FALSE;
 gtp_y_reverse = TRUE;
} else if (val == 970) {
 m89or101 = FALSE;
 bgt911 = FALSE;
 bgt970 = TRUE;
 gtp_change_x2y = FALSE;
 gtp_x_reverse = FALSE;
 gtp_y_reverse = TRUE;
} else if (val == 910) {
 m89or101 = FALSE;
 bgt911 = FALSE;
 bgt970 = FALSE;
 bgt910 = TRUE;
 gtp_change_x2y = TRUE;
 gtp_x_reverse = FALSE;
 gtp_y_reverse = TRUE;
}

這個值用來配置觸摸屏的尺寸。

2.2.2、配置touch-gpioreset-gpiopower-gpio
  • touch-gpio

  • reset-gpio

  • power-gpio

ts->irq_pin = of_get_named_gpio_flags(np, "touch-gpio", 0, (enum of_gpio_flags *)(&ts->irq_flags));
ts->rst_pin = of_get_named_gpio_flags(np, "reset-gpio", 0, &rst_flags);
ts->pwr_pin = of_get_named_gpio_flags(np, "power-gpio", 0, &pwr_flags);

touch-gpio是配置中斷管脚、reset-gpio是配置複比特引脚、power-gpio是配置給觸摸屏上電。由於硬件工程師設計的時候采用的是硬件上電,所以power-gpio這個管脚可以不用配置,另外的兩個一定要配置!!!!一定要配置!!!!(重要的事情說兩遍!)

2.2.3、配置max-xmax-y
  • max-x

觸摸X方向的分辨率,由於我的觸摸屏是1024*600,項目上需要豎屏觸摸,所以X方向的分辨率配置為600。

  • max-y

觸摸Y方向的分辨率,由於我的觸摸屏是1024*600,項目上需要豎屏觸摸,所以X方向的分辨率配置為1024。

2.3、配置設備樹

根據2中,閱讀驅動得知的設備樹參數信息,我們就能够非常簡單的把設備樹給寫出來了,實在不知道怎麼寫,直接去設備樹文件裏搜,搜到一個類似的,直接複制過來,照著改即可,以下是我在自己平臺上配置的設備樹節點:

  • 中斷IO原理圖連接方式:


  • 複比特IO原理圖連接方式:

跟據以上規則,配置設備樹如下:

&i2c5 {
 status = "okay";
 [email protected] {
   compatible = "goodix,gt9xx";
   reg = <0x5d>;
   touch-gpio = <&gpio2 RK_PB2 IRQ_TYPE_LEVEL_HIGH>;   //中斷IO
         reset-gpio = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>;      //複比特IO
   max-x = <600>;   //x方向解析度
   max-y = <1024>;  //y方向解析度
   tp-size = <911>; //TP尺寸
   status = "okay"; 
  };
};

這裏的中斷引脚對應的事件設置為高電平觸發。

3、重新編譯內核

./build.sh kernel && ./build.sh firmware

然後將生成的boot.img下載到開發板上即可:

4、確認是否適配成功

4.1、確定驅動是否已經占用了對應的I2C地址。

由1部分我們已經知道“UU”錶示這個地址的 I2C 設備已經有驅動在使用占用它了,那這個I2C 設備肯定是存在的;也就是說這個設備已經掛載成功了。

4.2、查看內核信息

使用管道過濾內核信息,找到關鍵字段:

我們能够看到觸摸屏設備已經成功掛載上了,並且也已經生成了對應的事件節點。

4.3、查看配置的中斷資源

如果配置成功,那麼通過以下命令可以查看到:

cat /proc/interrupts

4.4、使用hexdump工具測試對應的事件節點

如上,當我觸摸TP的時候,就能够看到打印信息了,TP驅動成功!

4.5、其它

可能會出現報點不正確、需要調整方向,需要根據實際情况進行具體分析和討論。

往期精彩

一個强大的音視頻編解碼庫-rkmedia的應用

瑞芯微RV1109配置7寸電容觸摸屏的方向修改筆記

如何添加APP到Buildroot裏(以瑞芯微rv1126為例)

Linux MIPI DSI LCD設備驅動開發調試細節學習筆記(一)

Linux MIPI DSI驅動調試筆記-設備樹DCS格式序列之配置LCD初始化代碼(二)

Linux MIPI DSI驅動調試筆記-LCD時序參數配置(三)

瑞芯微RV1109配置GPIO設備樹修改筆記(熟悉新平臺從點燈大法開始)

新產品立項了,作為嵌入式軟件工程師該如何來開展設計工作?(個人經驗分享)

覺得本次分享的文章對您有幫助,隨手點[在看]並轉發分享,也是對我的支持。

版权声明:本文为[Engineer-Bruce_Yang]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815044219031r.html