1. 初识FT5X06触摸屏与IIC总线
大家好,今天我来分享一下在Linux下开发FT5X06触摸屏驱动的实战经验。如果你正在做嵌入式Linux项目,需要给屏幕添加触摸功能,这篇内容应该能帮到你。FT5X06是一款很常见的电容触摸芯片,支持多点触控,通过IIC总线与主控通信。我最早接触这个芯片是在一个工控项目上,当时需要为7寸屏添加触摸功能,选型就是FT5206(FT5X06系列的一种)。
电容屏和电阻屏有很大不同。电阻屏需要用力按压,而且只能单点触控,还需要经常校准。电容屏就方便多了,轻轻触摸就行,支持多点,而且一般不需要校准。FT5X06内部有个8051内核的MCU,它会处理原始的电容信号,转换成坐标数据,我们只需要通过IIC读取这些数据就行。
IIC总线大家应该不陌生,两条线:SCL时钟线和SDA数据线。FT5X06的设备地址通常是0x38,这个地址很重要,后面写驱动时会用到。Linux下写IIC驱动有两种方式:一种是直接当字符设备来操作,简单但可移植性差;另一种是用Linux的IIC子系统,虽然复杂点但更规范。我推荐用IIC子系统的方式,毕竟以后移植到其他平台会方便很多。
2. 硬件连接与设备树配置
先来看看硬件怎么连接。FT5X06一般需要四根线:VCC、GND、SDA、SCL。有些模块还会引出INT和RST引脚,INT是中断输出,RST是复位输入。INT引脚特别有用,可以用中断方式而不是轮询来读取数据,这样更省电。
设备树配置是关键一步。我们需要在设备树里添加FT5X06的节点,指定IIC总线、设备地址和中断引脚。以i.MX6平台为例,设备树节点大概长这样:
&i2c2 {
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c2>;
status = "okay";
ft5x06: touchscreen@38 {
compatible = "edt,ft5x06";
reg = <0x38>;
interrupt-parent = <&gpio1>;
interrupts = <9 IRQ_TYPE_EDGE_FALLING>;
reset-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>;
irq-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
touchscreen-size-x = <800>;
touchscreen-size-y = <480>;
};
};
这里的compatible属性很重要,驱动就是靠这个来匹配设备的。reg指定设备地址0x38。interrupts属性定义中断引脚和触发方式,这里是GPIO1_9,下降沿触发。reset-gpios指定复位引脚,有些模块需要硬件复位。touchscreen-size-x和y定义屏幕尺寸,这样驱动才知道坐标范围。
设备树编译后,要更新到开发板上。你可以用dtc工具反编译dtb文件,检查节点是否正确添加。有时候设备树配置不对,驱动就probe不了,所以这一步一定要仔细。
3. 驱动框架与IIC子系统
Linux的IIC子系统分为三层:适配器层(IIC控制器驱动)、设备层和驱动层。适配器层由芯片厂商提供,我们一般不用动。设备层描述IIC设备的信息,比如地址、中断等。驱动层才是我们主要写的部分,负责与设备通信。
驱动的基本框架是这样的:先定义一个i2c_driver结构体,设置probe、remove函数,还有id_table。当设备与驱动匹配时,系统会调用probe函


2398

被折叠的 条评论
为什么被折叠?



