原创 敦泰电容屏芯片FT5X06 IIC参考驱动(1)

2012-4-18 10:31 32435 25 26 分类: 消费电子
[cpp] view plaincopyprint?
static void ft5x0x_ts_release(void)  
{  
    struct ft5x0x_ts_data *data = i2c_get_clientdata(this_client);  
  
#ifdef FT5X0X_MULTI_TOUCH  
    input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, 0);  
    input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, 0);  
    input_report_key(data->input_dev, BTN_TOUCH, 0);  
#else  
    input_report_abs(data->input_dev, ABS_PRESSURE, 0);  
    input_report_key(data->input_dev, BTN_TOUCH, 0);  
#endif  
    input_sync(data->input_dev);  
}  
  
static int ft5x0x_read_data(void)  
{  
    struct ft5x0x_ts_data *data = i2c_get_clientdata(this_client);  
    struct ts_event *event = &data->event;  
    u32 buf[32] = {0};  
    int ret = -1;  
      
#ifdef FT5X0X_MULTI_TOUCH  
    ret = ft5x0x_i2c_rxdata(buf, 31);  
#else  
    ret = ft5x0x_i2c_rxdata(buf, 7);  
#endif  
    if (ret < 0) {  
        printk("%s read_data i2c_rxdata failed: %d\n", __func__, ret);  
    }  
  
    memset(event, 0, sizeof(struct ts_event));  
    event->touch_point = buf[2] & 0x07;  
  
    if (event->touch_point == 0) {  
        ft5x0x_ts_release();  
        return 1;  
    }  
  
#ifdef FT5X0X_MULTI_TOUCH  
    switch (event->touch_point) {  
        case 5:  
            event->x5 = (s16)(buf[0x1b] & 0x0F)<<8 | (s16)buf[0x1c];  
            event->y5 = (s16)(buf[0x1d] & 0x0F)<<8 | (s16)buf[0x1e];  
        case 4:  
            event->x4 = (s16)(buf[0x15] & 0x0F)<<8 | (s16)buf[0x16];  
            event->y4 = (s16)(buf[0x17] & 0x0F)<<8 | (s16)buf[0x18];  
        case 3:  
            event->x3 = (s16)(buf[0x0f] & 0x0F)<<8 | (s16)buf[0x10];  
            event->y3 = (s16)(buf[0x11] & 0x0F)<<8 | (s16)buf[0x12];  
        case 2:  
            event->x2 = (s16)(buf[9] & 0x0F)<<8 | (s16)buf[10];  
            event->y2 = (s16)(buf[11] & 0x0F)<<8 | (s16)buf[12];  
        case 1:  
            event->x1 = (s16)(buf[3] & 0x0F)<<8 | (s16)buf[4];  
            event->y1 = (s16)(buf[5] & 0x0F)<<8 | (s16)buf[6];  
            break;  
        default:  
            return -1;  
    }  
#else  
    if (event->touch_point == 1) {   
        event->x1 = (s16)(buf[3] & 0x0F)<<8 | (s16)buf[4];  
        event->y1 = (s16)(buf[5] & 0x0F)<<8 | (s16)buf[6];  
    }  
#endif  
  
    event->pressure = 200;  
  
    return 0;  
}  
  
static void ft5x0x_reprot_value(void)  
{  
    struct ft5x0x_ts_data *data = i2c_get_clientdata(this_client);  
    struct ts_event *event = &data->event;  
  
#ifdef FT5X0X_MULTI_TOUCH  
    switch(event->touch_point) {  
        case 5:  
            input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->pressure);  
            input_report_abs(data->input_dev, ABS_MT_POSITION_X,  event->x5);  
            input_report_abs(data->input_dev, ABS_MT_POSITION_Y,  event->y5);  
            input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, event->pressure);  
            input_mt_sync(data->input_dev);  
        case 4:  
            input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->pressure);  
            input_report_abs(data->input_dev, ABS_MT_POSITION_X,  event->x4);  
            input_report_abs(data->input_dev, ABS_MT_POSITION_Y,  event->y4);  
            input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, event->pressure);  
            input_mt_sync(data->input_dev);  
        case 3:  
            input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->pressure);  
            input_report_abs(data->input_dev, ABS_MT_POSITION_X,  event->x3);  
            input_report_abs(data->input_dev, ABS_MT_POSITION_Y,  event->y3);  
            input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, event->pressure);  
            input_mt_sync(data->input_dev);  
        case 2:  
            input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->pressure);  
            input_report_abs(data->input_dev, ABS_MT_POSITION_X,  event->x2);  
            input_report_abs(data->input_dev, ABS_MT_POSITION_Y,  event->y2);  
            input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, event->pressure);  
            input_mt_sync(data->input_dev);  
        case 1:  
            input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->pressure);  
            input_report_abs(data->input_dev, ABS_MT_POSITION_X,  event->x1);  
            input_report_abs(data->input_dev, ABS_MT_POSITION_Y,  event->y1);  
            input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, event->pressure);  
            input_mt_sync(data->input_dev);  
            break;  
        default:  
            break;  
    }  
#else  
    if (event->touch_point == 1) {  
        input_report_abs(data->input_dev, ABS_X, event->x1);  
        input_report_abs(data->input_dev, ABS_Y, event->y1);  
        input_report_abs(data->input_dev, ABS_PRESSURE, event->pressure);  
    }  
    input_report_key(data->input_dev, BTN_TOUCH, 1);  
#endif  
  
    input_sync(data->input_dev);  
 
//摘自:http://blog.csdn.net/sunsea1026/article/details/7415803
 
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1057999 2015-11-23 11:52

外面不太好找的参考资料
相关推荐阅读
用户1648697 2014-06-29 12:47
新思轮专业提供新思synaptics触控解决方案
深圳市新思轮半导体科技有限公司是一家专业提供新思(Synaptics)电容屏触控解决方案的品牌代理商,配有多年资深电容屏触控行业的销售团队与技术支持团队,能依据您需要提供从方案选型、设计、量产全程...
用户1648697 2014-06-09 15:17
适用于医疗、POS机、工控等行业的高通方案智能核心板介绍
        CB01核心板是新思轮代理的一款集成度高、尺寸小、可扩展性强、低功耗、高性能的ARM核心模块,精简的外形、强大的功能、丰富的外设接口使其成为车载系统、智能家居、行业PDA、工业数字...
用户1648697 2014-05-05 10:41
新思最高效率的量产测试及烧录工具
  TP TESTER触摸屏在线测试设备  设备特点:简化测试、方便作业、专业规范,提高效率,缩短交期,降低成本,创造价值。  A、测试设备:   配备:5V电源、U...
用户1648697 2013-10-17 11:53
synaptics 新突思电子首次高调参加2013深圳全触展
  Synaptics中国区总经理Tina表示全触展是本年度重点也是首次参加国内触摸屏展会,全触展也是经过多年观察和了解起是专业针对触控领域的一个年度盛会,由于首次出展,今年将重点展示触控IC...
用户1648697 2013-10-09 13:28
新思Synaptics产品列表
新思Synaptics产品列表   产品 封装 封装尺寸 (mm) 通道数 支持尺寸 ...
用户1648697 2013-09-18 19:38
新思Synapics新增最具实力代理商---深圳市新思轮半导体科技有限公司
新思轮是一家专业的芯片代理商和方案提供商。公司成立于2013年,总部设在深圳,在上海设有Office。 目前,新思轮市场销售人员占40%,技术支持人员占30%,且市场销售与技术人员都是具有多年电子...
EE直播间
更多
我要评论
1
25
关闭 站长推荐上一条 /3 下一条