高通8X16的TP笔记(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yanleizhouqing/article/details/51591080

上一篇主要讲的与TP相关的知识点,讲这个主要是,你对这一模块有个基本的概念,知道其工作原理,这样在实际开发过程中,你才知道怎么去写起的驱动,碰到问题时,出现在哪一块,该怎么去解决。

      这一篇,主要根据代码来讲上一篇涉及到的相关机制。TP的连线很简单,一路I2C,一根中断线,VCC、GND,reset。

1. TP主要相关demo:

驱动demo:\kernel\drivers\input\touchscreen\Ft5x06_ts.c 

    \kernel\drivers\input\touchscreen\Ft5x06_ts.h

dtsi文件:\kernel\arch\arm\boot\dts\qcom\Msm8X16-qrd.dtsi

2. dtsi的相关解释

i2c@f9923000{ //TP所连的I2C的寄存器
focaltech@38{ 
compatible = "focaltech,5x06"; //I2C驱动match的内容
reg = <0x38>; //I2C地址
interrupt-parent = <&msmgpio>;  //中断引脚
interrupts = <1 0x2>;
vdd-supply = <&pm8110_l19>;     //I2C供电的电影控制
vcc_i2c-supply = <&pm8110_l14>;
focaltech,name = "ft6x06";     //tp类型
focaltech,family-id = <0x06>;   
focaltech,reset-gpio = <&msmgpio 0 0x00>; //复位引脚,,用于初始化时序
focaltech,irq-gpio = <&msmgpio 1 0x00>;   //中断引脚
focaltech,display-coords = <0 0 480 800>; //TP的触点范围
focaltech,panel-coords = <0 0 480 800>;
focaltech,button-map= <139 102 158>;     //虚拟按键
focaltech,no-force-update;
focaltech,i2c-pull-up;
focaltech,group-id = <1>;
focaltech,hard-reset-delay-ms = <20>;
focaltech,soft-reset-delay-ms = <150>;
focaltech,num-max-touches = <2>;
focaltech,fw-name = "ft_8610_qrd_fw.bin"; //TP固件
focaltech,fw-delay-aa-ms = <100>;
focaltech,fw-delay-55-ms = <30>;
focaltech,fw-upgrade-id1 = <0x79>;
focaltech,fw-upgrade-id2 = <0x08>;
focaltech,fw-delay-readid-ms = <10>;
focaltech,fw-delay-era-flsh-ms = <2000>;
};
}; 

3. 驱动文件

3.1 I2C驱动注册

static int __init ft5x06_ts_init(void)
{
pr_err("start \n");
return i2c_add_driver(&ft5x06_ts_driver); //I2C驱动注册
pr_err("end \n");
}

3.2 文件接口,of_match_table,需要DTSI中compatible定义的一致。

static struct i2c_driver ft5x06_ts_driver = {
.probe = ft5x06_ts_probe,
.remove = ft5x06_ts_remove,
.driver = {
  .name = "ft5x06_ts",
  .owner = THIS_MODULE,
.of_match_table = ft5x06_match_tabl
#ifdef CONFIG_PM
  .pm = &ft5x06_ts_pm_ops,
#endif
  },
.id_table = ft5x06_ts_id,
};

3.3 probe

这个里面代码量太多,就不详细一一说明,这里主要讲解一些基本的步骤。

一般,先给相关的结构体分配存储空间,然后从dt设备树中读取相关的信息,测试I2C是否通。

input_dev = input_allocate_device();//分配输入子系统

data->input_dev = input_dev;
data->client = client;
data->pdata = pdata;
input_dev->name = "ft5x06_ts";
input_dev->id.bustype = BUS_I2C;
input_dev->dev.parent = &client->dev;
input_set_drvdata(input_dev, data);
i2c_set_clientdata(client, data);
__set_bit(EV_KEY, input_dev->evbit);  //设置有什么事件 按键事件 tp虚拟按键
__set_bit(EV_ABS, input_dev->evbit);  //绝对事件 
__set_bit(BTN_TOUCH, input_dev->keybit);
__set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
input_mt_init_slots(input_dev, pdata->num_max_touches, 0);
input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, //X坐标事件
    pdata->x_max, 0, 0);
input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, //Y坐标事件
    pdata->y_max, 0, 0);

ft5x06_power_init(data, true); //电源、GPIO相关的初始化

ft5x06_power_on(data, true); // 上电,时序初始化

err = request_threaded_irq(client->irq, NULL,ft5x06_ts_interrupt,IRQF_ONESHOT,
client->dev.driver->name, data); //请求中断,并把事件处理放在下半部。

psensor_input_dev = input_allocate_device(); 分配子输入设备

err = input_register_device(psensor_input_dev);

ft5x06_update_fw_ver(data); //导入固件信息
ft5x06_update_fw_vendor_id(data); //获取固件版本ID


3.4 中断处理程序 ft5x06_ts_interrupt

static irqreturn_t ft5x06_ts_interrupt(int irq, void *dev_id)

这个里面主要是读I2C,根据芯片手册,进行数据出来,然后上报事件。

input_report_abs(ip_dev, ABS_MT_POSITION_X, x);
input_report_abs(ip_dev, ABS_MT_POSITION_Y, y);

input_sync(ip_dev);

当然有些TP,如GT9xxxx,会申请工作队列,然后中断产生会在上半部,启动工作队列,然后屏蔽当前中断,在工作队列事件处理完后,使能中断。有些还会当中断请求失败时,申请一个高精度的定时器,会一直轮询启动工作线程,上报事件。


4. 调试相关经验

4.1 一般TP驱动开发,屏产都会给驱动代码或者PATCH,这时主要合代码进去。

一般找代码内现有的一个TP驱动,按它的添加。主要:

1. 把驱动文件放入kernel\drivers\input\touchscreen\,

2. 修改kconfig和Makefile,加入需要根据宏才能编进去,那么需要在deconfig配置文件中设置为Y.

3. 在DTSI中加入该TP的配置。


  4.2 编译boot,在out/target/product/msmXXX/obj/KERNEL_OBJ/driver/input/touchscreen/下,看是否有.o文件没有,有则编译成功。

4.3 把新的boot文件刷入板子,查看内核log,cat proc/kmsg,看是否有该TP驱动的打印信息。

4.4 根据打印信息,判断出错的问题。

一般问题,中断注册不上,资源分配不成功,I2C设备通信失败。

一些经验,I2C总线不通,可能是因为I2C供电的电源没有供电,或者该总线上挂的设备太多影响的,前期调最好I2C总线上,只挂一个设备。

若probe成功,可在中断或者工作线程里面加一些打印log。在adb shell进入终端,输入getevent,手按TP,查看是否有数据打出,对于该TP的输入设备。


5. 查看I2C设备:

root@android:/sys/bus/i2c # cd devices
cd devices
root@android:/sys/bus/i2c/devices # ls
ls
0-0020
0-0022
0-0036
0-0078
1-000c
1-000d
1-001d
1-0028
1-0029
1-002a
1-0038
1-0060
1-0068
2-001c
i2c-0
i2c-1
i2c-2
root@android:/sys/bus/i2c/devices # cd 0-0036
cd 0-0036
root@android:/sys/bus/i2c/devices/0-0036 # ls
ls
driver
modalias
name
power
subsystem
uevent
root@android:/sys/bus/i2c/devices/0-0036 # cat name
cat name
msm_actuator
root@android:/sys/bus/i2c/devices/0-0036 #


猜你喜欢

转载自blog.csdn.net/yanleizhouqing/article/details/51591080
今日推荐