Linux下触摸屏驱动程序分析

匿名 (未验证) 提交于 2019-12-02 21:59:42

本文以Linux3.5--Exynos4412平台,分析触摸屏驱动核心内容。Linux下触摸屏驱动(以ft5x06_ts为例)需要了解如下知识:






一、背景


》。为了解决这个问题,决定在发生I2C死锁时,断掉I2C触摸屏的电源,然后给它上电,使处理器和触摸屏之间的I2C通信恢复正常。


二、驱动程序的总体框架





i2c_register_board_info(1, smdk4x12_i2c_devs1,ARRAY_SIZE(smdk4x12_i2c_devs1));

  1. "TINY4412"

/*











};

__mach_desc_##_type,类型为machine_desc结构体类型。这个类型的变量放在内核代码段.arch.info.init中,在内核运行初期,被函数lookup_machine_type(汇编)取出,读取流程为:

Start_kernel() -> setup_arch() -> setup_processor() -> lookup_machine_type()


i2c_register_board_info函数中会把i2c_board_info结构放入__i2c_board_lis链表,然后在i2c_scan_static_board_info函数中使用到__i2c_board_list链表,即调用i2c_new_device函数把链表中的每个成员构造成一个i2c_client,并放入bus-dev-drv模型中总线中设备链表中去。这样,就完成了i2c_client结构体的设置和注册。


static struct ft5x0x_i2c_platform_data ft5x0x_pdata = {





};



注册i2c_driver。i2c_add_driver函数的参数指向如下的结构体:

  1. staticstruct

i2c_board_info结构中的name(用i2c_driver结构的id_table成员去匹配)。如果匹配,将调用探测函数probe,即上述ft5x0x_ts_probe。





5. 关于平台设备的注册(I2C控制器)


(1)构建platform_device型设备tiny4412_i2c1_data


构建platform_device型设备tiny4412_i2c1_data,相关代码如下:

s3c_i2c1_set_platdata(&tiny4412_i2c1_data);

s3c_set_platdata(&tiny4412_i2c1_data, sizeof(struct s3c2410_platform_i2c),&s3c_device_i2c1);

struct platform_device s3c_device_i2c1 = {





static struct resource s3c_i2c1_resource[] = {




static struct s3c2410_platform_i2c tiny4412_i2c1_data __initdata = {





};


(2)I2C总线注册到平台总线




,此函数最终调用platform_device_register函数,这就就实现了平台设备的注册。


三、设备驱动层实现之中断


err = request_irq(client->irq, ft5x0x_ts_interrupt, IRQ_TYPE_EDGE_FALLING /*IRQF_TRIGGER_FALLING*/, "ft5x0x_ts", ts);



体,在Mach-tiny4412.c中,有如下部分代码:

  1. staticstruct
  2. //对应原理图中EINT14
  3. #endif

  1. staticstruct
  2. "ft5x0x_ts"
  3. "transmark"
  4. #endif
从个代码中可以知道gpio_irq的值被设置为EXYNOS4_GPX1(6),即原理图上的EINT14,也就是触摸屏的中断引脚。


static irqreturn_t ft5x0x_ts_interrupt(int irq, void *dev_id) {









}

static void ft5x0x_ts_pen_irq_work(struct work_struct *work) {







}










四、设备驱动层实现之输入子系统



  1. if
  2. goto
  3. #else
  4. #endif
  5. "input(mt)"
  6. if
  7. goto

ft5x0x_ts_report函数即上报事件,在ft5x0x_ts_pen_irq_work函数中被调用。


五、probe函数里面所有源码


  1. staticintstructconststruct
  2. /*
  3. */
  4. struct
  5. struct
  6. struct
  7. char
  8. int
  9. int
  10. if
  11. return
  12. if
  13. goto
  14. sizeof
  15. if
  16. goto
  17. if
  18. goto
  19. if
  20. else
  21. goto
  22. if
  23. //在运行时通过一个指针创建一个工作
  24. //创建工作queue
  25. if
  26. goto
  27. if
  28. goto
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!