• MTK touchscreen 流程


    1. kernel-3.18/drivers/input/touchscreen/mediatek/tpd_common_probe.c

    1 static int __init tpd_probe_init(void)
    2 {
    3     tpd_device_init();
    4     return 0;
    5 }

    2. kernel-3.18/drivers/input/touchscreen/mediatek/mtk_tpd.c

     1 int tpd_device_init(void)
     2 {
     3     int res = 0;
     4 
     5     tpd_init_workqueue = create_singlethread_workqueue("mtk-tpd");
     6     INIT_WORK(&tpd_init_work, tpd_init_work_callback);
     7 
     8     res = queue_work(tpd_init_workqueue, &tpd_init_work);
     9     if (!res)
    10         pr_err("tpd : touch device init failed res:%d
    ", res);
    11     return 0;
    12 }

     3. kernel-3.18/drivers/input/touchscreen/mediatek/mtk_tpd.c

    1 /* called when loaded into kernel */
    2 static void tpd_init_work_callback(struct work_struct *work)
    3 {
    4     TPD_DEBUG("MediaTek touch panel driver init
    ");
    5     
    6     if (platform_driver_register(&tpd_driver) != 0)
    7         TPD_DMESG("unable to register touch panel driver.
    ");
    8 }

    platform_device 和 platform_driver 匹配后,调用tpd_probe

     1 static struct platform_driver tpd_driver = {
     2     .remove = tpd_remove,
     3     .shutdown = NULL,
     4     .probe = tpd_probe,
     5     .driver = {
     6             .name = TPD_DEVICE,
     7             .pm = &tpd_pm_ops,
     8             .owner = THIS_MODULE,
     9             .of_match_table = touch_of_match,
    10     },
    11 };
      1 /* touch panel probe */
      2 static int tpd_probe(struct platform_device *pdev)
      3 {
      4     int touch_type = 1;    /* 0:R-touch, 1: Cap-touch */
      5     int i = 0;
      6 #ifndef CONFIG_CUSTOM_LCM_X
      7 #ifdef CONFIG_LCM_WIDTH
      8     unsigned long tpd_res_x = 0, tpd_res_y = 0;
      9     int ret = 0;
     10 #endif
     11 #endif
     12 
     13     TPD_DMESG("enter %s, %d
    ", __func__, __LINE__);
     14 
     15     if (misc_register(&tpd_misc_device))
     16         pr_err("mtk_tpd: tpd_misc_device register failed
    ");
     17     tpd_get_gpio_info(pdev);
     18     tpd = kmalloc(sizeof(struct tpd_device), GFP_KERNEL);
     19     if (tpd == NULL)
     20         return -ENOMEM;
     21     memset(tpd, 0, sizeof(struct tpd_device));
     22 
     23     /* allocate input device */
     24     tpd->dev = input_allocate_device();
     25     if (tpd->dev == NULL) {
     26         kfree(tpd);
     27         return -ENOMEM;
     28     }
     29     /* TPD_RES_X = simple_strtoul(LCM_WIDTH, NULL, 0); */
     30     /* TPD_RES_Y = simple_strtoul(LCM_HEIGHT, NULL, 0); */
     31 
     32     #ifdef CONFIG_MTK_LCM_PHYSICAL_ROTATION
     33     if (0 == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION, "90", 2)
     34         || 0 == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION, "270", 3)) {
     35 #ifdef CONFIG_MTK_FB    /*Fix build errors,as some projects  cannot support these apis while bring up*/
     36         TPD_RES_Y = DISP_GetScreenWidth();
     37         TPD_RES_X = DISP_GetScreenHeight();
     38 #endif
     39     } else
     40     #endif
     41     {
     42 #ifdef CONFIG_CUSTOM_LCM_X
     43 #ifndef CONFIG_MTK_FPGA
     44 #ifdef CONFIG_MTK_FB    /*Fix build errors,as some projects  cannot support these apis while bring up*/
     45         TPD_RES_X = DISP_GetScreenWidth();
     46         TPD_RES_Y = DISP_GetScreenHeight();
     47 #else/*for some projects, we do not use mtk framebuffer*/
     48     TPD_RES_X = tpd_dts_data.tpd_resolution[0];
     49     TPD_RES_Y = tpd_dts_data.tpd_resolution[1];
     50 #endif
     51 #endif
     52 #else
     53 #ifdef CONFIG_LCM_WIDTH
     54         ret = kstrtoul(CONFIG_LCM_WIDTH, 0, &tpd_res_x);
     55         if (ret < 0) {
     56             pr_err("Touch down get lcm_x failed");
     57             return ret;
     58         }
     59         TPD_RES_X = tpd_res_x;
     60         ret = kstrtoul(CONFIG_LCM_HEIGHT, 0, &tpd_res_y);
     61         if (ret < 0) {
     62             pr_err("Touch down get lcm_y failed");
     63             return ret;
     64         }
     65         TPD_RES_Y = tpd_res_y;
     66 #endif
     67 #endif
     68     }
     69 
     70     if (2560 == TPD_RES_X)
     71         TPD_RES_X = 2048;
     72     if (1600 == TPD_RES_Y)
     73         TPD_RES_Y = 1536;
     74     pr_debug("mtk_tpd: TPD_RES_X = %lu, TPD_RES_Y = %lu
    ", TPD_RES_X, TPD_RES_Y);
     75 
     76     tpd_mode = TPD_MODE_NORMAL;
     77     tpd_mode_axis = 0;
     78     tpd_mode_min = TPD_RES_Y / 2;
     79     tpd_mode_max = TPD_RES_Y;
     80     tpd_mode_keypad_tolerance = TPD_RES_X * TPD_RES_X / 1600;
     81     /* struct input_dev dev initialization and registration */
     82     tpd->dev->name = TPD_DEVICE;
     83     set_bit(EV_ABS, tpd->dev->evbit);
     84     set_bit(EV_KEY, tpd->dev->evbit);
     85     set_bit(ABS_X, tpd->dev->absbit);
     86     set_bit(ABS_Y, tpd->dev->absbit);
     87     set_bit(ABS_PRESSURE, tpd->dev->absbit);
     88 #if !defined(CONFIG_MTK_S3320) && !defined(CONFIG_MTK_S3320_47)
     89     && !defined(CONFIG_MTK_S3320_50) && !defined(CONFIG_MTK_MIT200) 
     90     && !defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S3528) && !defined(CONFIG_MTK_S7020) 
     91     && !defined(CONFIG_TOUCHSCREEN_MTK_SYNAPTICS_3320_50)
     92     set_bit(BTN_TOUCH, tpd->dev->keybit);
     93 #endif /* CONFIG_MTK_S3320 */
     94     set_bit(INPUT_PROP_DIRECT, tpd->dev->propbit);
     95 
     96     /* save dev for regulator_get() before tpd_local_init() */
     97     tpd->tpd_dev = &pdev->dev;
     98     for (i = 1; i < TP_DRV_MAX_COUNT; i++) {
     99         /* add tpd driver into list */
    100         if (tpd_driver_list[i].tpd_device_name != NULL) {
    101             tpd_driver_list[i].tpd_local_init();
    102             /* msleep(1); */
    103             if (tpd_load_status == 1) {
    104                 TPD_DMESG("[mtk-tpd]tpd_probe, tpd_driver_name=%s
    ",
    105                       tpd_driver_list[i].tpd_device_name);
    106                 g_tpd_drv = &tpd_driver_list[i];
    107                 break;
    108             }
    109         }
    110     }
    111     if (g_tpd_drv == NULL) {
    112         if (tpd_driver_list[0].tpd_device_name != NULL) {
    113             g_tpd_drv = &tpd_driver_list[0];
    114             /* touch_type:0: r-touch, 1: C-touch */
    115             touch_type = 0;
    116             g_tpd_drv->tpd_local_init();
    117             TPD_DMESG("[mtk-tpd]Generic touch panel driver
    ");
    118         } else {
    119             TPD_DMESG("[mtk-tpd]cap touch and Generic touch both are not loaded!!
    ");
    120             return 0;
    121         }
    122     }
    123     touch_resume_workqueue = create_singlethread_workqueue("touch_resume");
    124     INIT_WORK(&touch_resume_work, touch_resume_workqueue_callback);
    125     /* use fb_notifier */
    126     tpd_fb_notifier.notifier_call = tpd_fb_notifier_callback;
    127     if (fb_register_client(&tpd_fb_notifier))
    128         TPD_DMESG("register fb_notifier fail!
    ");
    129     /* TPD_TYPE_CAPACITIVE handle */
    130     if (touch_type == 1) {
    131 
    132         set_bit(ABS_MT_TRACKING_ID, tpd->dev->absbit);
    133         set_bit(ABS_MT_TOUCH_MAJOR, tpd->dev->absbit);
    134         set_bit(ABS_MT_TOUCH_MINOR, tpd->dev->absbit);
    135         set_bit(ABS_MT_POSITION_X, tpd->dev->absbit);
    136         set_bit(ABS_MT_POSITION_Y, tpd->dev->absbit);
    137         input_set_abs_params(tpd->dev, ABS_MT_POSITION_X, 0, TPD_RES_X, 0, 0);
    138         input_set_abs_params(tpd->dev, ABS_MT_POSITION_Y, 0, TPD_RES_Y, 0, 0);
    139 #if defined(CONFIG_MTK_S3320) || defined(CONFIG_MTK_S3320_47) 
    140     || defined(CONFIG_MTK_S3320_50) || defined(CONFIG_MTK_MIT200) 
    141     || defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S3528) || defined(CONFIG_MTK_S7020) 
    142     || defined(CONFIG_TOUCHSCREEN_MTK_SYNAPTICS_3320_50)
    143         input_set_abs_params(tpd->dev, ABS_MT_PRESSURE, 0, 255, 0, 0);
    144         input_set_abs_params(tpd->dev, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0);
    145         input_set_abs_params(tpd->dev, ABS_MT_WIDTH_MINOR, 0, 15, 0, 0);
    146         input_mt_init_slots(tpd->dev, 10, 0);
    147 #else
    148         input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MAJOR, 0, 100, 0, 0);
    149         input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MINOR, 0, 100, 0, 0);
    150 #endif /* CONFIG_MTK_S3320 */
    151         TPD_DMESG("Cap touch panel driver
    ");
    152     }
    153     input_set_abs_params(tpd->dev, ABS_X, 0, TPD_RES_X, 0, 0);
    154     input_set_abs_params(tpd->dev, ABS_Y, 0, TPD_RES_Y, 0, 0);
    155     input_abs_set_res(tpd->dev, ABS_X, TPD_RES_X);
    156     input_abs_set_res(tpd->dev, ABS_Y, TPD_RES_Y);
    157     input_set_abs_params(tpd->dev, ABS_PRESSURE, 0, 255, 0, 0);
    158     input_set_abs_params(tpd->dev, ABS_MT_TRACKING_ID, 0, 10, 0, 0);
    159 
    160     if (input_register_device(tpd->dev))
    161         TPD_DMESG("input_register_device failed.(tpd)
    ");
    162     else
    163         tpd_register_flag = 1;
    164     if (g_tpd_drv->tpd_have_button)
    165         tpd_button_init();
    166 
    167     if (g_tpd_drv->attrs.num)
    168         tpd_create_attributes(&pdev->dev, &g_tpd_drv->attrs);
    169 
    170     return 0;
    171 }
  • 相关阅读:
    Java程序执行超时——Future接口介绍
    JENKINS 打包发布脚本
    获取servletContext springMvc获取servletContext
    14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制:
    14.18.1 The InnoDB Recovery Process InnoDB 恢复进程:
    perl 获取文件内容里第一个AAA和最后一个AAA
    14.18 InnoDB Backup and Recovery 备份和恢复:
    职业素养与职业声誉——北漂18年(62)
    Openstack组件实现原理 — Nova 体系结构
    Openstack组件实现原理 — Nova 体系结构
  • 原文地址:https://www.cnblogs.com/jiangjh/p/10073145.html
Copyright © 2020-2023  润新知