MTK touchscreen 流程
1. kernel-3.18/drivers/input/touchscreen/mediatek/tpd_common_probe.c
- static int __init tpd_probe_init(void)
- {
- tpd_device_init();
- return ;
- }
2. kernel-3.18/drivers/input/touchscreen/mediatek/mtk_tpd.c
- int tpd_device_init(void)
- {
- int res = ;
- tpd_init_workqueue = create_singlethread_workqueue("mtk-tpd");
- INIT_WORK(&tpd_init_work, tpd_init_work_callback);
- res = queue_work(tpd_init_workqueue, &tpd_init_work);
- if (!res)
- pr_err("tpd : touch device init failed res:%d\n", res);
- return ;
- }
3. kernel-3.18/drivers/input/touchscreen/mediatek/mtk_tpd.c
- /* called when loaded into kernel */
- static void tpd_init_work_callback(struct work_struct *work)
- {
- TPD_DEBUG("MediaTek touch panel driver init\n");
- if (platform_driver_register(&tpd_driver) != )
- TPD_DMESG("unable to register touch panel driver.\n");
- }
platform_device 和 platform_driver 匹配后,调用tpd_probe
- static struct platform_driver tpd_driver = {
- .remove = tpd_remove,
- .shutdown = NULL,
- .probe = tpd_probe,
- .driver = {
- .name = TPD_DEVICE,
- .pm = &tpd_pm_ops,
- .owner = THIS_MODULE,
- .of_match_table = touch_of_match,
- },
- };
- /* touch panel probe */
- static int tpd_probe(struct platform_device *pdev)
- {
- int touch_type = ; /* 0:R-touch, 1: Cap-touch */
- int i = ;
- #ifndef CONFIG_CUSTOM_LCM_X
- #ifdef CONFIG_LCM_WIDTH
- unsigned long tpd_res_x = , tpd_res_y = ;
- int ret = ;
- #endif
- #endif
- TPD_DMESG("enter %s, %d\n", __func__, __LINE__);
- if (misc_register(&tpd_misc_device))
- pr_err("mtk_tpd: tpd_misc_device register failed\n");
- tpd_get_gpio_info(pdev);
- tpd = kmalloc(sizeof(struct tpd_device), GFP_KERNEL);
- if (tpd == NULL)
- return -ENOMEM;
- memset(tpd, , sizeof(struct tpd_device));
- /* allocate input device */
- tpd->dev = input_allocate_device();
- if (tpd->dev == NULL) {
- kfree(tpd);
- return -ENOMEM;
- }
- /* TPD_RES_X = simple_strtoul(LCM_WIDTH, NULL, 0); */
- /* TPD_RES_Y = simple_strtoul(LCM_HEIGHT, NULL, 0); */
- #ifdef CONFIG_MTK_LCM_PHYSICAL_ROTATION
- if ( == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION, "", )
- || == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION, "", )) {
- #ifdef CONFIG_MTK_FB /*Fix build errors,as some projects cannot support these apis while bring up*/
- TPD_RES_Y = DISP_GetScreenWidth();
- TPD_RES_X = DISP_GetScreenHeight();
- #endif
- } else
- #endif
- {
- #ifdef CONFIG_CUSTOM_LCM_X
- #ifndef CONFIG_MTK_FPGA
- #ifdef CONFIG_MTK_FB /*Fix build errors,as some projects cannot support these apis while bring up*/
- TPD_RES_X = DISP_GetScreenWidth();
- TPD_RES_Y = DISP_GetScreenHeight();
- #else/*for some projects, we do not use mtk framebuffer*/
- TPD_RES_X = tpd_dts_data.tpd_resolution[];
- TPD_RES_Y = tpd_dts_data.tpd_resolution[];
- #endif
- #endif
- #else
- #ifdef CONFIG_LCM_WIDTH
- ret = kstrtoul(CONFIG_LCM_WIDTH, , &tpd_res_x);
- if (ret < ) {
- pr_err("Touch down get lcm_x failed");
- return ret;
- }
- TPD_RES_X = tpd_res_x;
- ret = kstrtoul(CONFIG_LCM_HEIGHT, , &tpd_res_y);
- if (ret < ) {
- pr_err("Touch down get lcm_y failed");
- return ret;
- }
- TPD_RES_Y = tpd_res_y;
- #endif
- #endif
- }
- if ( == TPD_RES_X)
- TPD_RES_X = ;
- if ( == TPD_RES_Y)
- TPD_RES_Y = ;
- pr_debug("mtk_tpd: TPD_RES_X = %lu, TPD_RES_Y = %lu\n", TPD_RES_X, TPD_RES_Y);
- tpd_mode = TPD_MODE_NORMAL;
- tpd_mode_axis = ;
- tpd_mode_min = TPD_RES_Y / ;
- tpd_mode_max = TPD_RES_Y;
- tpd_mode_keypad_tolerance = TPD_RES_X * TPD_RES_X / ;
- /* struct input_dev dev initialization and registration */
- tpd->dev->name = TPD_DEVICE;
- set_bit(EV_ABS, tpd->dev->evbit);
- set_bit(EV_KEY, tpd->dev->evbit);
- set_bit(ABS_X, tpd->dev->absbit);
- set_bit(ABS_Y, tpd->dev->absbit);
- set_bit(ABS_PRESSURE, tpd->dev->absbit);
- #if !defined(CONFIG_MTK_S3320) && !defined(CONFIG_MTK_S3320_47)\
- && !defined(CONFIG_MTK_S3320_50) && !defined(CONFIG_MTK_MIT200) \
- && !defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S3528) && !defined(CONFIG_MTK_S7020) \
- && !defined(CONFIG_TOUCHSCREEN_MTK_SYNAPTICS_3320_50)
- set_bit(BTN_TOUCH, tpd->dev->keybit);
- #endif /* CONFIG_MTK_S3320 */
- set_bit(INPUT_PROP_DIRECT, tpd->dev->propbit);
- /* save dev for regulator_get() before tpd_local_init() */
- tpd->tpd_dev = &pdev->dev;
- for (i = ; i < TP_DRV_MAX_COUNT; i++) {
- /* add tpd driver into list */
- if (tpd_driver_list[i].tpd_device_name != NULL) {
- tpd_driver_list[i].tpd_local_init();
- /* msleep(1); */
- if (tpd_load_status == ) {
- TPD_DMESG("[mtk-tpd]tpd_probe, tpd_driver_name=%s\n",
- tpd_driver_list[i].tpd_device_name);
- g_tpd_drv = &tpd_driver_list[i];
- break;
- }
- }
- }
- if (g_tpd_drv == NULL) {
- if (tpd_driver_list[].tpd_device_name != NULL) {
- g_tpd_drv = &tpd_driver_list[];
- /* touch_type:0: r-touch, 1: C-touch */
- touch_type = ;
- g_tpd_drv->tpd_local_init();
- TPD_DMESG("[mtk-tpd]Generic touch panel driver\n");
- } else {
- TPD_DMESG("[mtk-tpd]cap touch and Generic touch both are not loaded!!\n");
- return ;
- }
- }
- touch_resume_workqueue = create_singlethread_workqueue("touch_resume");
- INIT_WORK(&touch_resume_work, touch_resume_workqueue_callback);
- /* use fb_notifier */
- tpd_fb_notifier.notifier_call = tpd_fb_notifier_callback;
- if (fb_register_client(&tpd_fb_notifier))
- TPD_DMESG("register fb_notifier fail!\n");
- /* TPD_TYPE_CAPACITIVE handle */
- if (touch_type == ) {
- set_bit(ABS_MT_TRACKING_ID, tpd->dev->absbit);
- set_bit(ABS_MT_TOUCH_MAJOR, tpd->dev->absbit);
- set_bit(ABS_MT_TOUCH_MINOR, tpd->dev->absbit);
- set_bit(ABS_MT_POSITION_X, tpd->dev->absbit);
- set_bit(ABS_MT_POSITION_Y, tpd->dev->absbit);
- input_set_abs_params(tpd->dev, ABS_MT_POSITION_X, , TPD_RES_X, , );
- input_set_abs_params(tpd->dev, ABS_MT_POSITION_Y, , TPD_RES_Y, , );
- #if defined(CONFIG_MTK_S3320) || defined(CONFIG_MTK_S3320_47) \
- || defined(CONFIG_MTK_S3320_50) || defined(CONFIG_MTK_MIT200) \
- || defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S3528) || defined(CONFIG_MTK_S7020) \
- || defined(CONFIG_TOUCHSCREEN_MTK_SYNAPTICS_3320_50)
- input_set_abs_params(tpd->dev, ABS_MT_PRESSURE, , , , );
- input_set_abs_params(tpd->dev, ABS_MT_WIDTH_MAJOR, , , , );
- input_set_abs_params(tpd->dev, ABS_MT_WIDTH_MINOR, , , , );
- input_mt_init_slots(tpd->dev, , );
- #else
- input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MAJOR, , , , );
- input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MINOR, , , , );
- #endif /* CONFIG_MTK_S3320 */
- TPD_DMESG("Cap touch panel driver\n");
- }
- input_set_abs_params(tpd->dev, ABS_X, , TPD_RES_X, , );
- input_set_abs_params(tpd->dev, ABS_Y, , TPD_RES_Y, , );
- input_abs_set_res(tpd->dev, ABS_X, TPD_RES_X);
- input_abs_set_res(tpd->dev, ABS_Y, TPD_RES_Y);
- input_set_abs_params(tpd->dev, ABS_PRESSURE, , , , );
- input_set_abs_params(tpd->dev, ABS_MT_TRACKING_ID, , , , );
- if (input_register_device(tpd->dev))
- TPD_DMESG("input_register_device failed.(tpd)\n");
- else
- tpd_register_flag = ;
- if (g_tpd_drv->tpd_have_button)
- tpd_button_init();
- if (g_tpd_drv->attrs.num)
- tpd_create_attributes(&pdev->dev, &g_tpd_drv->attrs);
- return ;
- }
MTK touchscreen 流程的更多相关文章
- MTK HDMI 流程
一.HDMI初始化 1. kernel-3.18/drivers/misc/mediatek/ext_disp/mtk_extd_mgr.c static int __init mtk_extd_mg ...
- MTK OTG 流程
一.注册mt_usb驱动 kernel-3.18/drivers/misc/mediatek/usb20/mt6735/usb20.c static int __init usb20_init(voi ...
- android MTK驱动背光唤醒流程
在标准的android驱动中,睡眠唤醒流程非常清晰,能够较方便的更改lcd唤醒时间和led背光的点亮时间,但是也很容易出现问题,比如说闪屏,唤醒慢! 出现闪屏有两个原因 1. 开背光时间在唤醒lcd前 ...
- MTK Camera 开机启动流程(转载)
一.MTK平台Camera框架 MTK平台的Camera的架构见下图, 这里主要介绍kernel部分和HAL层部分. 1.Kernel 部分主要有两块: 1.1.image sensordriver, ...
- andorid之摄像头驱动流程--MTK平台
原文地址:andorid之摄像头驱动流程--MTK平台 作者:守候心田 camera成像原理: 景物通过镜头生产光学图像投射到sensor表面上,然后转为模拟电信号,经过数模变成数字图像信号,在经过D ...
- 居于mtk芯片安卓车机系统具体流程
一:车机系统框架 MCU 功能 电源控制 Radio 控制(RDS) 按键检测(Panel/Remote/SW) 常见信号检查(倒车/大灯/刹车) CAN 模块通讯 ARM- ...
- MTK camera 闪光灯Flashlight驱动调试流程
MTK camera 闪光灯Flashlight驱动调试流程 分类: MtkDev | 作者: topicdev 相关 | 发布日期 : 2014-09-26 | 热度 : 153° ...
- mtk lcm驱动加载流程 (转载)
平台:mt6582 + Android 4.4 前面就说过,在mtk代码中支持屏是可兼容的,通过调用驱动中的compare_id函数来匹配驱动和屏,这里来细看一下代码. 1. LK部分(mediate ...
- mtk 的conferrence call建立流程
(重点看main_log与) 抓mtk log: 1.*#*#82533284#*#* 进入抓log UI 2.*#*#825364#*#* 进入工程模式 3.进入"Lo ...
随机推荐
- java 发送微信客服消息
package com.baosight.wechat.service; import net.sf.json.JSONObject; import org.apache.commons.httpcl ...
- poj 1651 Multiplication Puzzle【区间DP】
题目链接:http://poj.org/problem? id=1651 题意:初使ans=0,每次消去一个值,位置在pos(pos!=1 && pos !=n) 同一时候ans+=a ...
- [笔记] sed and awk
/ awk程序的典型示例是将数据转换成格式化的报表,当数据拥有某种结构时就能最好的体现awk的好处:可以使用awk脚本对数据的列重新排序,甚至可以将列变成行以及将行变成列:awk的功能将文本编辑的思想 ...
- 宜信开源|分布式任务调度平台SIA-TASK的架构设计与运行流程
一.分布式任务调度的背景 无论是互联网应用或者企业级应用,都充斥着大量的批处理任务.我们常常需要一些任务调度系统来帮助解决问题.随着微服务化架构的逐步演进,单体架构逐渐演变为分布式.微服务架构.在此背 ...
- ORACLE 36进制和10进制,互相转换函数
第一部分 --36转10进制 create or replace function f_36to10 (str varchar) return int is returnValue int; s ...
- 关于TCP通信程序中数据的传递格式
前言 在之前的回射程序中,实现了字符串的传递与回射.幸运的是,字符串的传递不用担心不同计算机类型的大小端匹配问题,然而,如果传递二进制数据,这就是一个要好好考虑的问题.在客户端和服务器使用不同的字节序 ...
- MongoDB 操作手冊CRUD 事务 两步提交
运行两步提交 概述 这部分提供了多记录更新或者多记录事务.使用两步提交来完毕多记录写入的模板. 另外.能够扩展此方法来提供rollback-like功能. 背景 MongoDB对于单条记录的操作是原子 ...
- iOS进程间通信之CFMessagePort
本文转载至 http://www.cocoachina.com/industry/20140606/8701.html iOS系统是出了名的封闭,每个应用的活动范围被严格地限制在各自的沙盒中.尽管如此 ...
- 2016/07/11 PHP接口的介绍与实现
接口定义了实现某种服务的一般规范,声明了所需的函数和常量,但不指定如何实现.之所以不给出实现的细节,是因为不同的实体可能需要用不同的方式来实现公共的方法定义.关键是要建立必须实现的一组一般原则 ...
- Node 文件上传,ZIP
上传文件: 很多人会使用第三包进行文件的上传,例如formidable. 我也研究过,可是与Express3.x框架一起使用时,发现上传的文件总是找不到.结果原因是下面这句导致: app.use(ex ...