A20 源码里现在支持的触摸屏应该是三种,ft5x, gt82x, gslX680
源码分别是 ft5x_ts.c, gt82x.c gslX680.c。
在这三个文件头部都有触摸屏配置结构体的引用。
extern struct ctp_config_info config_info;
搜索源码可以看到用到了以下几处。
ctp_get_system_config里(被ft5x_ts_init调用)
twi_id = config_info.twi_id;
screen_max_x = config_info.screen_max_x;
screen_max_y = config_info.screen_max_y;
revert_x_flag = config_info.revert_x_flag;
revert_y_flag = config_info.revert_y_flag;
exchange_x_y_flag = config_info.exchange_x_y_flag;
ft5x_ts_init函数里
config_info.ctp_used
很明显触摸屏几个关键参数是从外部的config_info这个结构体得到了。搜寻这个结构体。
在include/linux/ctp.h里找到他的定义
struct ctp_config_info{
int ctp_used;
__u32 twi_id;
int screen_max_x;
int screen_max_y;
int revert_x_flag;
int revert_y_flag;
int exchange_x_y_flag;
u32 irq_gpio_number;
u32 wakeup_gpio_number;
#ifdef TOUCH_KEY_LIGHT_SUPPORT
u32 key_light_gpio_number;
#endif
};
在/drivers/input/init_ctp.c里找到变量的定义。
struct ctp_config_info config_info;
并且在ctp_fetch_sysconfig_para这个函数中给config_info赋值。
都是通过script_get_item从配置文件里取出值来给config_info赋值。
script_get_item("ctp_para", "ctp_used", &val)
config_info.ctp_used = val.val;
script_get_item("ctp_para", "ctp_twi_id", &val)
config_info.twi_id = val.val;
script_get_item("ctp_para", "ctp_screen_max_x", &val)
config_info.screen_max_x = val.val;
script_get_item("ctp_para", "ctp_screen_max_y", &val)
config_info.screen_max_y = val.val;
script_get_item("ctp_para", "ctp_revert_x_flag", &val)
config_info.revert_x_flag = val.val;
script_get_item("ctp_para", "ctp_revert_y_flag", &val)
config_info.revert_y_flag = val.val;
script_get_item("ctp_para", "ctp_exchange_x_y_flag", &val)
config_info.exchange_x_y_flag = val.val;
但是,从上面的代码可以看到,ctp_name没有用到,那内核是如何知道我们用的是哪种触摸屏呢。
搜索了内核源码发现这个文件,drivers/input/device.c
发现这个结构体定义和赋值
struct base_info{
char name[NAME_LENGTH];
unsigned short i2c_address[ADDRESS_NUMBER];
unsigned short chip_id_reg;
unsigned short chip_id_reg_value[REG_VALUE_NUMBER];
};
static struct base_info ctps[] = {
{ "ft5x_ts", { 0x38}, 0xa3, {0x55,0x08,0x02,0x06,0xa3}},
{ "gt82x", { 0x5d}, 0xf7d, {0x13,0x27,0x28 }},
{ "gslX680", { 0x40}, 0x00, {0x00 }},
{"gt9xx_ts", {0x14, 0x5d}, 0x8140, {0x39 }},
{ "gt811", { 0x5d}, 0x715, {0x11 }},
};
从这里基本可以判端出,内核是从这个表里取得触摸芯片的信息的。但是不用配置文件,如何知道是哪个,
可以基本推测,内核是在i2c总线上去根据上面表中的芯片i2c地址通信来测试其是否存在。
好,现在我看来验证这个事情。
i2c_detect_device
i2c_device_i2c_test 用ctps里的每一个i2c地址来尝试通信,最终找到一个能用的i2c地址
chip_id_detect 用ctps里的chip_id_reg找到芯片里的id,并且和chip_id_reg_value里的值进行
匹配,实际就是找到芯片后,再确认一下芯片的id
i2c_update_device_name 将找到的ctps项中的name,就是芯片名称,拷贝到全局变量ctp_name中。
通过以上分析,发现全志的配置文件中关于触摸屏这块的配置,ctp_name, ctp_twi_addr这两个键实际是没有用的。ctp_twi_id应该配置成chip_id_reg_value里面的一个。