具体情况:
现象:.ko文件已经是最新的,烧进去之后,或者使用adb工具push进去之后,
打印出来的log信息中发现没有执行GT9xx触摸屏驱动的加载模块函数。
原因:修改后期加载模块文件错误
错误的做法:
修改了A13\android\out\target\product\nuclear-evb045-jiaweiet616_xc3\root目录下的init.sun5i.rc
正确的做法:
修改:A13\android\device\softwinner\nuclear-evb045-jiaweiet616_xc3目录下的init.sun5i.rc
但是还没有调用GT9xx触摸屏驱动的proble函数,并且模块
加载的detect函数也没有执行。
原因:没有填充i2c_driver结构体的.class和address_list成员。
推测:
i2c设备层的代码注册 i2c_device 时使用了 i2c_register_board_info
注册;probe函数不是名字对上就能调用,还需要它探测到设备真实存在都会调用;
使用 i2c_register_board_info 注册的设备,其探测时机是在适配器驱动安装
时候就执行了,后期安装不会调用probe。因此使用 i2c_register_board_info 注册的,
要提供detect接口,而且i2c_driver结构体要填充.class和address_list成员。
1)注意中断号
2)注意注册中断的触发方式
如果注册为独占中断,则会出现IRQ handler type mismatch for IRQ 0错误。
ctp_ops.set_irq_mode("ctp_para","ctp_int_port", CTP_IRQ_MODE);
ts->client->irq = SW_INT_IRQNO_PIO;
ret = request_irq(ts->client->irq,
goodix_ts_irq_handler,
IRQF_TRIGGER_RISING | IRQF_SHARED,
ts->client->name,
ts);
printk("======gtp_request_irq======%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
文件所在目录:
A13\lichee\tools\pack\chips\sun5i\configs\android\a13-evb045-jiaweiet616_xc3
1)把触摸屏的名字改为我们这款触摸屏的名字
ctp_name = "Goodix-TS"
如下图
2)把IIC地址修改为这款触摸屏对应的IIC地址
ctp_twi_addr = 0x5d
如下图
也就是把ctp_ops的成员的实现搬过来
struct ctp_platform_ops ctp_ops = {
.get_pendown_state = ctp_get_pendown_state,
.clear_penirq = ctp_clear_penirq,
.set_irq_mode = ctp_set_irq_mode,
.set_gpio_mode = ctp_set_gpio_mode,
.judge_int_occur = ctp_judge_int_occur,
.init_platform_resource = ctp_init_platform_resource,
.free_platform_resource = ctp_free_platform_resource,
.fetch_sysconfig_para = ctp_fetch_sysconfig_para,
.ts_reset = ctp_reset,
.ts_wakeup = ctp_wakeup,
.ts_detect = ctp_detect,
};
主要的步骤是:
1) 获取系统配置信息
2) 进行物理地址到虚拟地址的映射,GPIO的申请
3) 调用ctp_ops的detect ,进行设备的推测
5:填充i2c_driver goodix_ts_driver结构体的 class和address_list 成员
说明:如果没有填充address_list地址表这个成员,即使
是设备和驱动的名字和IIC地址对应上了,proble函数也不会被调用到。
1)修改中断号
ts->client->irq = SW_INT_IRQNO_PIO;
2)设置中断模式
ctp_ops.set_irq_mode("ctp_para","ctp_int_port", CTP_IRQ_MODE);
3)注意修改中断的触发方式,申请方式。
ret = request_irq(ts->client->irq,
goodix_ts_irq_handler,
/*IRQF_TRIGGER_RISING | IRQF_SHARED,*/
irq_table[ts->int_trigger_type],
ts->client->name,
ts);
irq_table定义如下:它是用一个宏来初始化
const u8 irq_table[] = GTP_IRQ_TAB;
GTP_IRQ_TAB宏的定义:
#define GTP_IRQ_TAB {IRQ_TYPE_EDGE_RISING,
IRQ_TYPE_EDGE_FALLING,
IRQ_TYPE_LEVEL_LOW,
IRQ_TYPE_LEVEL_HIGH
}