背景

kernel version:4.14.98

drivers/input/touchscreen/atmel_mxt_ts.c

SoC与屏幕的touch ic通过I2C进行通信

代码分析

static struct i2c_driver mxt_driver = {.driver = {.name    = "atmel_mxt_ts",.owner  = THIS_MODULE,.of_match_table = of_match_ptr(mxt_of_match),.acpi_match_table = ACPI_PTR(mxt_acpi_id),.pm = &mxt_pm_ops,},.probe     = mxt_probe,.remove        = mxt_remove,.id_table = mxt_id,
};
//注册i2c driver
module_i2c_driver(mxt_driver);

因为是直接注册为i2c driver,没有init入口函数,所以直接看probe函数。

static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
{struct mxt_data *data;data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL);snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",client->adapter->nr, client->addr);data->client = client;data->pdata = pdata;i2c_set_clientdata(client, data);、、、、、、error = mxt_acquire_irq(data);//申请中断
}static int mxt_acquire_irq(struct mxt_data *data)
{int error;if (!data->irq) {//申请中断error = request_threaded_irq(data->client->irq, NULL,mxt_interrupt,data->pdata->irqflags | IRQF_ONESHOT,data->client->name, data);return 0;
}static irqreturn_t mxt_interrupt(int irq, void *dev_id)
{//中断服务函数中读取并处理touch数据struct mxt_data *data = dev_id;if (data->T44_address) {return mxt_process_messages_t44(data); //-->} else {return mxt_process_messages(data);}
}static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
{/* Read T44 and T5 together *///通过I2C读取touch数据到data->msg_buf中ret = __mxt_read_reg(data->client, data->T44_address,data->T5_msg_size + 1, data->msg_buf);//从data->msg_buf中读取数据并处理ret = mxt_proc_message(data, data->msg_buf + 1);
}static int mxt_proc_message(struct mxt_data *data, u8 *message)
{mxt_proc_t100_message(data, message);
}
static void mxt_proc_t100_message(struct mxt_data *data, u8 *message)
{//从touch数据中解析出xy坐标值等信息,并上报至input core层x = get_unaligned_le16(&message[2]);y = get_unaligned_le16(&message[4]);if (data->t100_aux_area)major = message[data->t100_aux_area];if (data->t100_aux_ampl)pressure = message[data->t100_aux_ampl];if (data->t100_aux_vect)orientation = message[data->t100_aux_vect];if (active) {dev_dbg(dev, "[%u] type:%u x:%u y:%u a:%02X p:%02X v:%02X\n",id, type, x, y, major, pressure, orientation);//上报坐标值input_report_abs(input_dev, ABS_MT_POSITION_X, x);input_report_abs(input_dev, ABS_MT_POSITION_Y, y);input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, major);input_report_abs(input_dev, ABS_MT_PRESSURE, pressure);input_report_abs(input_dev, ABS_MT_DISTANCE, distance);input_report_abs(input_dev, ABS_MT_ORIENTATION, orientation);}
}   

TouchScreen驱动相关推荐

  1. 2.6.36.2 s3c6410 触摸屏驱动移植。

    CSDN_Acanoe 的博客:http://blog.csdn.net/ACanoe 硬件环境:OK6410 A板,4.3 寸TFT 屏.  移植内核:Linux2.6.36.2 . 参考内核: 飞 ...

  2. ESP32驱动3.2寸ILI9341显示屏+XPT2046触摸,GUIslice用户图形库

    ESP32的主板ESPDUINO-32如下: 屏用如下的: 显示驱动用TFT_eSPI,这个显示的速度比adafruit ILI9341快10倍. 一.配置TFT_eSPI: arduino IDE ...

  3. linux驱动篇-touchscreen-完整版

    Touchscreen 本篇文章为触摸屏驱动完整版本,为的是给时间充裕的同学详细讲解.如要时间有限可以看精简版,传送门在下面. https://blog.csdn.net/chichi123137/a ...

  4. Linux内核中关于定时器Timer的应用

    2019独角兽企业重金招聘Python工程师标准>>> 在Touchscreen驱动中 1 声明  Ad7877.c (\linux-2.6.30.4\drivers\input\t ...

  5. printf 宏 调试技巧

    1 前言 printf调试是嵌入式调试的基本手段,而且是非常重要的手段,我认为相比单步调试更加有用有效,特别是单片机之后跑系统,单步调试效率更加低下了,我们在工作遇到bug的时候,我们第一时间就想知道 ...

  6. 索骥馆-编程语言之《Android内核剖析》扫描版[PDF]

    内容介绍: <android内核剖析>详细分析了android内核的内部机制,包括窗口管理系统.activity管理系统.输入法框架.编译系统等,为android内核定制及高级应用程序开发 ...

  7. IMX6 GT9XX 10.1寸触摸屏移植

    硬件平台:IMX6Q+GT928(10.1寸) 操作系统:Android 4.2.2 GT928接口原理图 触摸屏接口用到的硬件外设 I2C => I2C3 RST => GPIO2_27 ...

  8. linux内核关闭触摸屏校准,触摸屏校正原理

    1,触摸屏校准通用方法 主要采用以下公式,实现触摸屏校正,其中XL, YL是显示屏坐标,XT, YT是触摸屏坐标, XL = XT*A+YT*B+C; YL = XT*D+YT*E+F;    公式( ...

  9. linux timer 回调函数,Linux内核中关于定时器Timer的应用

    在Touchscreen驱动中 1 声明 Ad7877.c (\linux-2.6.30.4\drivers\input\touchscreen):struct timer_listtimer;/* ...

最新文章

  1. Python安装库较慢问题,Python报错pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool解决方法
  2. python绘制3维图-python——绘制二元高斯分布的三维图像,
  3. mongodb 群集图_群集和重叠条形图
  4. python面向对象中的私有属性和私有化方法
  5. GUI学习之〇——PyQt5安装
  6. Keil 安装 配置
  7. log4cxx vs2017编译
  8. 计算机配置ppt制作,做ppt.ps要用什么样的配置的手提电脑做
  9. 2018 年 5 月
  10. 假作真时真亦假,无为有处有还无
  11. 用EDA处理蛋白质数据小记
  12. PeckShield宣布与IOST达成全球战略合作
  13. 多伦多计算机科学排名,Times公布的计算机和工程专业排名,多伦多大学占两大榜首,最抢眼!...
  14. Ubuntu Linux 系统安装、分区规划
  15. 启动kafka无反应_kafka consumer无法正常启动原因调查
  16. python 实现热门音乐分析 附代码+数据 +论文
  17. LBR_iiwa_14_R820代码解析
  18. ESXI 7.02 Intel 核心显卡直通开启3D加速
  19. 使用 “恢复模式” 或 “DFU 模式” 来更新和恢复 iOS 固件
  20. 软件项目管理 6.2.功能点估算法

热门文章

  1. 习题1-1输入三个整数,输出它们的平均值,保留3位小数
  2. 购买域名搭建个人博客
  3. java实现在线富文本编辑器,并传格式数据给后端
  4. 预充电电路工作原理_研究电动汽车预充电过程
  5. 基于vue element-ui 的省市区数据结构 省市区三级联动数据---
  6. ab进行多个url压力测试
  7. 使用KeyManager免费更换多域名SSL证书。
  8. 【精炼】如果金庸小说里的门派都是企业……
  9. Github中文社区python练习小题目
  10. 【Docke进阶篇】Docker网络模式与容器间通信