在drivers/input/touchscreen/ft5302_tp/ft5302_ts.c中

module_init(ft5x0x_ts_init);

static int __init ft5x0x_ts_init(void)

{

ret = i2c_add_driver(&ft5x0x_ts_driver);

return ret;

}

其中ft5x0x_ts_driver结构如下:

static struct i2c_driver ft5x0x_ts_driver = {

.probe = ft5x0x_ts_probe,

.remove = __devexit_p(ft5x0x_ts_remove),

.id_table = ft5x0x_ts_id,

.driver = {

.name = FT5X0X_NAME,

.owner = THIS_MODULE,

},

};

在probe函数中

static int ft5x0x_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)

{

struct ft5x0x_ts_dev *ft5x0x_ts;

struct ft5x0x_platform_data *pdata = pdata = client->dev.platform_data;

struct input_dev *input_dev;

u8 buf_w[1];

u8 buf_r[1];

unsigned char reg_value;

unsigned char reg_version;

int result, irq = 0;

ft5x0x_ts = (struct ft5x0x_ts_dev *)kzalloc(sizeof(*ft5x0x_ts), GFP_KERNEL);

input_dev = input_allocate_device();

ft5x0x_ts->input_dev = input_dev;

ft5x0x_ts->client = this_client = client;

ft5x0x_ts->irq = client->irq;

__set_bit(EV_ABS, input_dev->evbit);

__set_bit(EV_KEY, input_dev->evbit);

__set_bit(EV_REP, input_dev->evbit);

__set_bit(INPUT_PROP_DIRECT, input_dev->propbit);

set_bit(ABS_MT_POSITION_X, input_dev->absbit);

set_bit(ABS_MT_POSITION_Y, input_dev->absbit);

set_bit(ABS_MT_TOUCH_MAJOR, input_dev->absbit);

set_bit(ABS_MT_WIDTH_MAJOR, input_dev->absbit);

input_mt_init_slots(input_dev, MAX_CONTACTS);

input_set_abs_params(input_dev,ABS_MT_POSITION_X, 0, SCREEN_MAX_X, 0, 0);

input_set_abs_params(input_dev,ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0);

input_set_abs_params(input_dev,ABS_MT_TOUCH_MAJOR, 0, PRESS_MAX, 0, 0);

input_set_abs_params(input_dev,ABS_MT_WIDTH_MAJOR, 0, 200, 0, 0);

input_dev->name = FT5X0X_NAME;

input_register_device(input_dev);

g_dev = ft5x0x_ts;

i2c_set_clientdata(client, ft5x0x_ts);

INIT_WORK(&ft5x0x_ts->pen_event_work, ft5x0x_ts_pen_irq_work); //动态建立一个工作队列

ft5x0x_ts->ts_workqueue = create_workqueue(FT5X0X_NAME);

ft5x0x_ts->irq = gpio_to_irq(ft5x0x_ts->irq);

err0:

msleep(200);

fts_register_read(FT5X0X_REG_FIRMID, &reg_version,1);

fts_register_read(FT5X0X_REG_REPORT_RATE, &reg_value,1);

fts_register_read(FT5X0X_REG_THRES, &reg_value,1);

fts_register_read(FT5X0X_REG_NOISE_MODE, &reg_value,1);

//注册中断

request_irq(ft5x0x_ts->irq, ft5x0x_ts_interrupt, IRQF_TRIGGER_FALLING, "ft5x0x_ts", ft5x0x_ts);

disable_irq_nosync(g_dev->irq);

//打开中断

enable_irq(g_dev->irq);

return 0;

}

当有按键按下时

static irqreturn_t ft5x0x_ts_interrupt(int irq, void *dev_id)

{

struct ft5x0x_ts_dev *ft5x0x_ts = dev_id;

del_timer(&ft5x0x_ts->timer); //关闭内核定时器

disable_irq_nosync(g_dev->irq); //关中断

queue_work(ft5x0x_ts->ts_workqueue, &ft5x0x_ts->pen_event_work); //把任务交给指定的工作队列

return IRQ_HANDLED;

}

INIT_WORK(&ft5x0x_ts->pen_event_work, ft5x0x_ts_pen_irq_work); //动态建立一个工作队列

进入工作队列处理函数:

static void ft5x0x_ts_pen_irq_work(struct work_struct *work)

{

ft5x0x_read_data();

ft5x0x_report_value();

enable_irq(g_dev->irq);

}

static int ft5x0x_read_data(void)

{

struct ft5x0x_ts_dev *data = i2c_get_clientdata(g_dev->client);

struct ts_event *event = &data->event;

u8 buf[61]= {0};

ret = ft5x0x_i2c_rxdata(buf, 61); //读取数据

memset(event, ~0x00, sizeof(struct ts_event));

event->touch_point = buf[2] & 0x0f; //查看有几个手指按下

if (event->touch_point == 0) { //如果没有手指按下,直接返回

return 0;

}

switch (event->touch_point) { //最多只能看到5个手指

case 5: //将手指的状态与坐标值记录下来

event->point[4].status = (buf[0x1b] & 0xc0)>>6;

event->point[4].id = (buf[0x1d] & 0xf0)>>4;

event->point[4].x = ((s16)(buf[0x1b] & 0x07)<<8 | (s16)buf[0x1c]);

event->point[4].y = (s16)(buf[0x1d] & 0x07)<<8 | (s16)buf[0x1e];

case 4:

case 3:

case 2:

case 1:

event->point[0].status = (buf[0x03] & 0xc0)>>6;

event->point[0].id = (buf[0x05] & 0xf0)>>4;

event->point[0].x= (s16)(buf[0x03] & 0x07)<<8 | (s16)buf[0x04];

event->point[0].y = (s16)(buf[0x05] & 0x07)<<8 | (s16)buf[0x06];

default:

return 0;

}

}

static void ft5x0x_report_value(void)

{

struct ft5x0x_ts_dev *data = i2c_get_clientdata(g_dev->client);

struct ts_event *event = &data->event;

int key_id = 0xff;

down_table = 0;

for(i=0; itouch_point; i++)

{

event->point[i].x=event->point[i].x;

input_mt_slot(data->input_dev, event->point[i].id);

input_report_abs(data->input_dev, ABS_MT_TRACKING_ID, event->point[i].id);

down_table |= 1 << event->point[i].id;

input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, 100);

input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->point[i].x);

input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->point[i].y);

input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, 100);

}

for(i=0; i

if( ( (~down_table) & 1<

{

input_mt_slot(data->input_dev, i);

input_report_abs(data->input_dev, ABS_MT_TRACKING_ID, -1);

}

}

up_table = ~down_table;

input_sync(data->input_dev);

}

关于内核定时器: setup_timer(&ft5x0x_ts->timer, Touch_timer_release, (unsigned long)ft5x0x_ts); data->timer.expires = jiffies +8; add_timer(&data->timer); 时间一到执行内核定时器处理函数 static void Touch_timer_release(unsigned long ft_ts_pdev) { do_something(); }

android 触摸屏驱动分析,rk3188--6.android 触摸屏驱动分析相关推荐

  1. MTK8788[android 9.0]汇顶GT9XX TP触摸屏驱动流程分析

    TP 相关引脚DTS中的定义 我们这个项目TP复位引脚是GPIO158,中断引脚是GPIO1,由下图原理图知道我们的TP挂载在I2c0上,3.3v的供电电压是有PMIC 2.8V供电电压通过i2c电平 ...

  2. 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/337.html   ...

  3. 【ANDROID游戏开发十六】ANDROID GESTURE之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/337.html - ...

  4. android中国卫星,全球首款原生Android系统卫星手机: 5.2寸触摸屏

    全球首款原生Android系统卫星手机: 5.2寸触摸屏 金羊网  作者:蒋梦娜  2018-11-21 当智能手机的功能越来越丰富的时候,手机通讯实力似乎也变得不那么重要.不过,即便现在4G覆盖率高 ...

  5. Android 驱动(3)---Android驱动开发知识储备

    Android驱动开发知识储备 Android软件层次结构 (1)操作系统层 显示驱动(Frame Buffer),Flash内存驱动,照相机驱动,音频驱动,WiFi驱动,键盘驱动,蓝牙驱动,Bind ...

  6. android定制化软件修改或添加按键驱动的核心操作步骤讲解

    最近在Amlogic方案的定制化android软件上,做了添加按键的驱动工作,也熟悉了按键的基本流程,现在把核心步骤给总结如下: 1.基本流程: ./表示android源代码目录,按键属于输入设备,支 ...

  7. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  8. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  9. 【Android 事件分发】ItemTouchHelper 事件分发源码分析 ( 绑定 RecyclerView )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  10. Android 功耗(4)---MTK平台待机功耗分析流程

    MTK平台待机功耗分析流程 MTK平台待机功耗分析流程 1.目的 2.MTK平台各个场景功耗数据测试方法 很多功耗问题都是因为测试手法不对,列出一些常用场景功耗测试手法.  测试功耗数据之前,请先确认 ...

最新文章

  1. PolarDB数据库性能大赛:95后徐妈的经验分享
  2. shell判断false_Python中的True, False条件判断
  3. php 得到 ts文件,获取TypeScript声明文件.d.ts步骤详解
  4. 【若依(ruoyi)】向DAO中传递动态参数
  5. LiveVideoStack线上分享第五季(十一):Open WebRTC Toolkit实时视频分析系统
  6. oracle pl/sql编程详解,OraclePL/SQL高级编程详解
  7. SpringMVC原理及非注解配置详解
  8. ping端口_干货分享:shell脚本批量telnet ip 端口
  9. KinedEditor特性
  10. java程序用户权限管理,java用户管理权限
  11. linux vi编辑器常用命令
  12. 基于爬虫制作的Python翻译程序
  13. 极客时间-技术领导力300讲-小小读后感
  14. 数学在线绘图计算机,Desmos Graphing Calculator插件,在线可视化图形计算器
  15. JS实现项目查找功能
  16. 1960-2019年世界各国人均GDP增长率
  17. lammps案例:堆垛层错能的计算
  18. 一代测序、二代测序以及三代测序的优缺点及应用对比?
  19. GetLastErr返回值ErrCode的宏定义以及含义
  20. 移动电信联通三大运营商的“流量不清零”,谁最坑?

热门文章

  1. 金刚经知识地图(上)
  2. 超链接的字体颜色设置
  3. 优秀的spring入门书籍列表
  4. 客快物流大数据项目(七十):Impala入门介绍
  5. start service失败的问题解决
  6. 2022-2028年全球与中国电视发射机行业竞争格局与投资战略研究
  7. 在控制面板中,找不到安装的软件 pr,但是要对它进行清理
  8. bfs优化技巧——键盘输入
  9. 机架式交换机到底是干什么的
  10. C++开源游戏推荐,EA部分开源红色警戒1