A20 触摸屏配置

来源:互联网 发布:反洗钱系统数据抓取 编辑:程序博客网 时间:2024/05/16 17:31

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里面的一个。



0 0
原创粉丝点击