Engineer-Bruce_Yang 2021-08-15 04:42:38 阅读数:219
I2C
地址i2cdetect
工具查看系統i2c
節點的情况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部分是沒有問題的。
i2cdetect
工具確定設備地址由於我的觸摸屏是連接在I2C5
上,硬件原理圖如下所示:
但是我還沒有實現它的驅動,所以可以通過i2cdetect
工具來確定設備的I2C
地址是多少,ARM端執行以下命令:
i2cdetect -y 5
這個命令中,-y
錶示Disable interactive mode
,簡單地說就是別讓我確認了,趕緊執行;5
錶示I2C
總線5(從0開始),執行後可以看到:
上圖中:
“--
”錶示沒有這個地址對應的 I2C
設備;
“UU
”錶示這個地址的 I2C
設備已經有驅動在使用占用它了,那這個I2C
設備肯定是存在的;
其他數值錶示該地址對應的 I2C
設備是存在的,並且還沒有驅動程序跟它匹配。
如上圖所示,這個5d
就錶示當前觸摸屏的I2C
地址,為社麼是5d
呢?你把觸摸屏拔掉,再用這個命令查看是不是消失了就可以驗證這個問題了。
GT911
驅動移植gt9xx
GT911
在Linux內核中已經支持了,比特於以下路徑,如果沒有的話就需要跟觸摸屏廠商要驅動代碼,如果要不到那麼就拿著Datasheet
自己幹吧!反正也不難的!
kernel/drivers/input/touchscreen/gt9xx
另外,也提供了menuconfig
,我們只需要在配置驅動的時候搜索GT9XX
,然後配置上就可以了。
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-gpio
、reset-gpio
、power-gpio
(3)max-x
、max-y
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;
}
這個值用來配置觸摸屏的尺寸。
touch-gpio
、reset-gpio
、power-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
這個管脚可以不用配置,另外的兩個一定要配置!!!!一定要配置!!!!(重要的事情說兩遍!)
max-x
、max-y
max-x
觸摸X方向的分辨率,由於我的觸摸屏是1024*600,項目上需要豎屏觸摸,所以X方向的分辨率配置為600。
max-y
觸摸Y方向的分辨率,由於我的觸摸屏是1024*600,項目上需要豎屏觸摸,所以X方向的分辨率配置為1024。
根據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";
};
};
這裏的中斷引脚對應的事件設置為高電平觸發。
./build.sh kernel && ./build.sh firmware
然後將生成的boot.img
下載到開發板上即可:
I2C
地址。由1部分我們已經知道“UU
”錶示這個地址的 I2C
設備已經有驅動在使用占用它了,那這個I2C
設備肯定是存在的;也就是說這個設備已經掛載成功了。
使用管道過濾內核信息,找到關鍵字段:
我們能够看到觸摸屏設備已經成功掛載上了,並且也已經生成了對應的事件節點。
如果配置成功,那麼通過以下命令可以查看到:
cat /proc/interrupts
hexdump
工具測試對應的事件節點如上,當我觸摸TP
的時候,就能够看到打印信息了,TP
驅動成功!
可能會出現報點不正確、需要調整方向,需要根據實際情况進行具體分析和討論。
如何添加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