A20 触摸屏配置
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里面的一個。
總結
- 上一篇: django 学习 (三) 模板变量
- 下一篇: std::copy