本文以Linux3.5--Exynos4412平台,分析触摸屏驱动核心内容。Linux下触摸屏驱动(以ft5x06_ts为例)需要了解如下知识:
一、背景
》。为了解决这个问题,决定在发生I2C死锁时,断掉I2C触摸屏的电源,然后给它上电,使处理器和触摸屏之间的I2C通信恢复正常。
二、驱动程序的总体框架
i2c_register_board_info(1, smdk4x12_i2c_devs1,ARRAY_SIZE(smdk4x12_i2c_devs1));
- "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函数的参数指向如下的结构体:
- 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中,有如下部分代码:
- staticstruct
- //对应原理图中EINT14
- #endif
- staticstruct
- "ft5x0x_ts"
- "transmark"
- #endif
static irqreturn_t ft5x0x_ts_interrupt(int irq, void *dev_id) {
}
static void ft5x0x_ts_pen_irq_work(struct work_struct *work) {
}
四、设备驱动层实现之输入子系统
- if
- goto
- #else
- #endif
- "input(mt)"
- if
- goto
ft5x0x_ts_report函数即上报事件,在ft5x0x_ts_pen_irq_work函数中被调用。
五、probe函数里面所有源码
- staticintstructconststruct
- /*
- */
- struct
- struct
- struct
- char
- int
- int
- if
- return
- if
- goto
- sizeof
- if
- goto
- if
- goto
- if
- else
- goto
- if
- //在运行时通过一个指针创建一个工作
- //创建工作queue
- if
- goto
- if
- goto