日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android平台的s5pc110触摸屏驱动分析

發(fā)布時(shí)間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android平台的s5pc110触摸屏驱动分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
內(nèi)核linux2.6.35 andorid2.3 觸摸屏型號(hào)ft5xo6
首先給出該觸摸屏的一些結(jié)構(gòu)體---->drivers/input/touchscreen/ft5x06_ts.h

點(diǎn)擊(此處)折疊或打開

  • #ifndef __LINUX_FT5X0X_TS_H__
  • #define __LINUX_FT5X0X_TS_H__

  • #define SCREEN_MIN_X 0
  • #define SCREEN_MAX_X 320
  • #define SCREEN_MIN_Y 0
  • #define SCREEN_MAX_Y 240
  • #define PRESS_MAX 255

  • #define MIN_X_CTP 0
  • #define MAX_X_CTP 896
  • #define MIN_Y_CTP 0
  • #define MAX_Y_CTP 640


  • #define EVENT_PENDOWN 0
  • #define EVENT_REPEAT 2
  • #define EVENT_PENUP 1

  • #define I2C_CTPM_ADDRESS 0x38


  • #define FT5X0X_NAME????"ft5x06-ts"//"synaptics_i2c_rmi"//"synaptics-rmi-ts"//

  • struct ft5x0x_ts_platform_data{
  • ????u16????intr;????????/* irq number????*/
  • };



  • #ifndef ABS_MT_TOUCH_MAJOR
  • #define ABS_MT_TOUCH_MAJOR????0x30????/* touching ellipse */
  • #define ABS_MT_TOUCH_MINOR????0x31????/* (omit if circular) */
  • #define ABS_MT_WIDTH_MAJOR????0x32????/* approaching ellipse */
  • #define ABS_MT_WIDTH_MINOR????0x33????/* (omit if circular) */
  • #define ABS_MT_ORIENTATION????0x34????/* Ellipse orientation */
  • #define ABS_MT_POSITION_X????0x35????/* Center X ellipse position */
  • #define ABS_MT_POSITION_Y????0x36????/* Center Y ellipse position */
  • #define ABS_MT_TOOL_TYPE????0x37????/* Type of touching device */
  • #define ABS_MT_BLOB_ID????????0x38????/* Group set of pkts as blob */
  • #define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */
  • #endif /* ABS_MT_TOUCH_MAJOR */


  • #endif
  • 還有一些在ft5x06_ts.c中

    點(diǎn)擊(此處)折疊或打開

  • struct ts_event {
  • ????u16????x1;
  • ????u16????y1;
  • ????u16????x2;
  • ????u16????y2;
  • ????u16????x3;
  • ????u16????y3;
  • ????u16????x4;
  • ????u16????y4;
  • ????u16????x5;
  • ????u16????y5;
  • ????u16????pressure;
  • ????u8 touch_point;
  • };

  • struct ft5x0x_ts_data {
  • ????struct input_dev????*input_dev;
  • ????struct ts_event????????event;
  • ????struct work_struct ????pen_event_work;
  • ????struct workqueue_struct *ts_workqueue;
  • ????struct early_suspend????early_suspend;
  • };
  • 觸摸屏屬于I2C子設(shè)備,按照I2C子系統(tǒng)來寫驅(qū)動(dòng),首先添加I2C信息。---->arch/arm/mach-s5pv210/smdkc110.c

    點(diǎn)擊(此處)折疊或打開

  • static struct i2c_board_info i2c_devs1[] __initdata = {
  • #ifdef CONFIG_VIDEO_TV20
  • ????{
  • ? ? ? ?I2C_BOARD_INFO("ft5x06-ts", (0x38)),//初始化i2c_board_info的type和addr成員(#define I2C_BOARD_INFO(dev_type, dev_addr) \.type = dev_type, .addr = (dev_addr))
  • ???????.irq = IRQ_EINT(2),//中斷號(hào)
  • ????},
  • #endif
  • };
  • 在arch/arm/mach-s5pv210/mach-smdkc110.c中的machine_init()函數(shù)中會(huì)調(diào)用i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));函數(shù)注冊(cè)i2c子設(shè)備
    之后,系統(tǒng)會(huì)創(chuàng)建一個(gè)i2c_devinfo結(jié)構(gòu)體,然后將其掛如控制器設(shè)備鏈表中。代碼如下:

    點(diǎn)擊(此處)折疊或打開

  • int __init?i2c_register_board_info(int busnum,?struct i2c_board_info const *info, unsigned len)
  • {
  • ????int status;

  • ????down_write(&__i2c_board_lock);

  • ????/* dynamic bus numbers will be assigned after the last static one */
  • ????if (busnum >= __i2c_first_dynamic_bus_num)
  • ????????__i2c_first_dynamic_bus_num = busnum + 1;

  • ????for (status = 0; len; len--, info++) {//i2c_dev(x)數(shù)組有幾個(gè)成員,就創(chuàng)建幾個(gè)i2c_devinfo結(jié)構(gòu)體
  • ????????struct i2c_devinfo????*devinfo;

  • ????????devinfo = kzalloc(sizeof(*devinfo), GFP_KERNEL);
  • ????????if (!devinfo) {
  • ????????????pr_debug("i2c-core: can't register boardinfo!\n");
  • ????????????status = -ENOMEM;
  • ????????????break;
  • ????????}

  • ????????devinfo->busnum = busnum;//掛接在那個(gè)i2c控制器上
  • ????????devinfo->board_info = *info;//type 和addr
  • ????????list_add_tail(&devinfo->list, &__i2c_board_list);//將devinfo添加到控制器的設(shè)備鏈表
  • ????}

  • ????up_write(&__i2c_board_lock);

  • ????return status
  • 當(dāng)i2c控制器驅(qū)動(dòng)加載時(shí)回去掃描這條鏈表,調(diào)用流程為匹配i2c控制器設(shè)備,調(diào)用probe函數(shù),在probe函數(shù)中調(diào)用i2c_add_numbered_adapter或i2c_add_adapter。在添加adapter時(shí)調(diào)用i2c_register_adapter()-->
    i2c_scan_static_board_info()--->i2c_new_device創(chuàng)建client,注冊(cè)client設(shè)備(device_register)。
    觸摸屏設(shè)備驅(qū)動(dòng)
    drivers/input/touchscreen/ft5x06_ts.c?
    首先:

    點(diǎn)擊(此處)折疊或打開

  • static int __init ft5x0x_ts_init(void)
  • {
  • ????return i2c_add_driver(&ft5x0x_ts_driver);//設(shè)備驅(qū)動(dòng)結(jié)構(gòu)體
  • }

  • static void __exit ft5x0x_ts_exit(void)
  • {
  • ????i2c_del_driver(&ft5x0x_ts_driver);
  • }
  • ft5x 0x_ts_driver如下:

    點(diǎn)擊(此處)折疊或打開

  • static const struct i2c_device_id ft5x0x_ts_id[] = {
  • ????{ FT5X0X_NAME, 0 },{ }
  • };

  • MODULE_DEVICE_TABLE(i2c, ft5x0x_ts_id);

  • static struct i2c_driver ft5x0x_ts_driver = {
  • ????.driver????= {
  • ????????.name????= FT5X0X_NAME,????
  • ????},
  • ????.probe????????= ft5x0x_ts_probe,
  • ????.remove????????= ft5x0x_ts_remove,????
  • ????.id_table????= ft5x0x_ts_id,//id_table如上
  • ????

  • };
  • i2c_add_driver()分析

    點(diǎn)擊(此處)折疊或打開

  • static inline int i2c_add_driver(struct i2c_driver *driver)
  • {
  • ????return i2c_register_driver(THIS_MODULE, driver);
  • }
  • i2c_regist er_driver()分析:

    點(diǎn)擊(此處)折疊或打開

  • int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
  • {
  • ????int res;

  • ????/* Can't register until after driver model init */
  • ????if (unlikely(WARN_ON(!i2c_bus_type.p)))//調(diào)試用
  • ????????return -EAGAIN;

  • ????/* add the driver to the list of i2c drivers in the driver core */
  • ????driver->driver.owner = owner;
  • ????driver->driver.bus = &i2c_bus_type;

  • ????/* When registration returns, the driver core
  • ???? * will have called probe() for all matching-but-unbound devices.
  • ???? */
  • ????res = driver_register(&driver->driver);//注冊(cè),匹配成功會(huì)調(diào)用觸摸屏的probe函數(shù)
  • ????if (res)
  • ????????return res;

  • ????pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name);

  • ????INIT_LIST_HEAD(&driver->clients);
  • ????/* Walk the adapters that are already present */
  • ????mutex_lock(&core_lock);
  • ????bus_for_each_dev(&i2c_bus_type, NULL, driver, __process_new_driver);
  • ????mutex_unlock(&core_lock);

  • ????return 0;
  • }
  • probe函數(shù)分析

    點(diǎn)擊(此處)折疊或打開

  • static int ft5x0x_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
  • {
  • ????struct ft5x0x_ts_data *ft5x0x_ts;//在ft5x06_ts.h中定義
  • ????struct input_dev *input_dev;
  • ????int err = 0;
  • ????unsigned char uc_reg_value;
  • ????
  • ????printk("==ft5x0x_ts_probe=\n");
  • ????
  • ????if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {//驗(yàn)證i2c控制器的能力,實(shí)現(xiàn)了那些函數(shù),這里驗(yàn)證是否實(shí)現(xiàn)了I2C_FUNC_I2C函數(shù)
  • ????????err = -ENODEV;
  • ????????goto exit_check_functionality_failed;
  • ????}

  • ????printk("==kzalloc=\n");
  • ????ft5x0x_ts = kzalloc(sizeof(*ft5x0x_ts), GFP_KERNEL);//分配空間
  • ????if (!ft5x0x_ts)????{
  • ????????err = -ENOMEM;
  • ????????goto exit_alloc_data_failed;
  • ????}


  • ????this_client = client;
  • ????i2c_set_clientdata(client, ft5x0x_ts);//設(shè)置屏相關(guān)的數(shù)據(jù)client->dev->p->driver_data = data;


  • ????INIT_WORK(&ft5x0x_ts->pen_event_work, ft5x0x_ts_pen_irq_work);//初始化工作隊(duì)列

  • ????ft5x0x_ts->ts_workqueue = create_singlethread_workqueue(dev_name(&client->dev));//創(chuàng)建工作線程
  • ????if (!ft5x0x_ts->ts_workqueue) {
  • ????????err = -ESRCH;
  • ????????goto exit_create_singlethread;
  • ????}

  • ????err = request_irq(client->irq, ft5x0x_ts_interrupt, IRQF_TRIGGER_FALLING, "ft5x06_ts", ft5x0x_ts);//申請(qǐng)中斷
  • ????if (err < 0) {
  • ????????dev_err(&client->dev, "ft5x0x_probe: request irq failed\n");
  • ????????goto exit_irq_request_failed;
  • ????}

  • ????disable_irq(this_client->irq);//關(guān)閉中斷

  • ????input_dev = input_allocate_device();//分配input_dev結(jié)構(gòu)體
  • ????if (!input_dev) {
  • ????????err = -ENOMEM;
  • ????????dev_err(&client->dev, "failed to allocate input device\n");
  • ????????goto exit_input_dev_alloc_failed;
  • ????}
  • ????
  • ????ft5x0x_ts->input_dev = input_dev;

  • #ifdef CONFIG_FT5X0X_MULTITOUCH//多點(diǎn)觸摸
  • ??????set_bit(EV_ABS, input_dev->evbit);//那類事件
  • ????set_bit(ABS_MT_TOUCH_MAJOR, input_dev->absbit);//設(shè)置adsbit代表那些事件
  • ????set_bit(ABS_MT_POSITION_X, input_dev->absbit);
  • ????set_bit(ABS_MT_POSITION_Y, input_dev->absbit);
  • ????set_bit(ABS_MT_WIDTH_MAJOR, input_dev->absbit);

  • ????input_set_abs_params(input_dev,
  • ???????????? ABS_MT_POSITION_X, 0, SCREEN_MAX_X-1, 0, 0);
  • ????input_set_abs_params(input_dev,
  • ???????????? ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y-1, 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);
  • #else
  • ????set_bit(ABS_X, input_dev->absbit);
  • ????set_bit(ABS_Y, input_dev->absbit);
  • ????set_bit(ABS_PRESSURE, input_dev->absbit);
  • ????set_bit(BTN_TOUCH, input_dev->keybit);

  • ????input_set_abs_params(input_dev, ABS_X, 0, SCREEN_MAX_X, 0, 0);
  • ????input_set_abs_params(input_dev, ABS_Y, 0, SCREEN_MAX_Y, 0, 0);
  • ????input_set_abs_params(input_dev,
  • ???????????? ABS_PRESSURE, 0, PRESS_MAX, 0 , 0);
  • #endif

  • ????set_bit(EV_SYN, input_dev->evbit);
  • ???????set_bit(BTN_TOUCH, input_dev->keybit);
  • ????set_bit(EV_KEY, input_dev->evbit);

  • ????input_dev->name????????= FT5X0X_NAME;????????//dev_name(&client->dev)//以上是設(shè)置input_dev
  • ????err = input_register_device(input_dev);//注冊(cè)input_dev
  • ????if (err) {
  • ????????dev_err(&client->dev,
  • ????????"ft5x0x_ts_probe: failed to register input device: %s\n",
  • ????????dev_name(&client->dev));
  • ????????goto exit_input_register_device_failed;
  • ????}

  • ????ft5x06_hw_init();//硬件相關(guān)初始化

  • ????msleep(50);

  • ????uc_reg_value = ft5x0x_read_fw_ver();//讀取硬件版本
  • ????printk("[FST] Firmware version = 0x%x\n", uc_reg_value);

  • ????enable_irq(this_client->irq);//使能中斷

  • ????printk("==probe over =\n");
  • ????return 0;

  • exit_input_register_device_failed://以下是錯(cuò)誤處理
  • ????input_free_device(input_dev);
  • exit_input_dev_alloc_failed:
  • free_irq(client->irq, ft5x0x_ts);
  • exit_irq_request_failed:
  • ????cancel_work_sync(&ft5x0x_ts->pen_event_work);
  • ????destroy_workqueue(ft5x0x_ts->ts_workqueue);
  • exit_create_singlethread:
  • ????printk("==singlethread error =\n");
  • ????i2c_set_clientdata(client, NULL);
  • ????kfree(ft5x0x_ts);
  • exit_alloc_data_failed:
  • exit_check_functionality_failed:
  • ????return err;
  • }
  • ft5x06_hw_init ( ) ;分析

    點(diǎn)擊(此處)折疊或打開

  • static void ft5x06_hw_init(void)
  • {
  • ????if ((gpio_request(S5PV210_GPG3(2), "ft5406 wake-up"))< 0)
  • ????{
  • ????????printk("gpio_request failed for GPIOWake[%d]\n\n",S5PV210_GPG3(2));
  • ????}????
  • ????else if ((gpio_direction_output(S5PV210_GPG3(2),1)) < 0)//將觸摸屏從睡眠模式喚醒
  • ????{
  • ????????printk("gpio_direction_output failed for GPIOWake[%d]\n\n",S5PV210_GPG3(2));
  • ????????gpio_free(S5PV210_GPG3(2));
  • ????}
  • ????
  • ????msleep(5);
  • ????gpio_free(S5PV210_GPG3(2));
  • }
  • i2c讀寫函數(shù)

    點(diǎn)擊(此處)折疊或打開

  • static int ft5x0x_i2c_rxdata(char *rxdata, int length)
  • {
  • ????int ret;

  • ????struct i2c_msg msgs[] = {
  • ????????{
  • ????????????.addr????= this_client->addr,
  • ????????????.flags????= 0,//寫
  • ????????????.len????= 1,//數(shù)據(jù)長度,單位字節(jié)
  • ????????????.buf????= rxdata,是//護(hù)具
  • ????????},
  • ????????{
  • ????????????.addr????= this_client->addr,
  • ????????????.flags????= I2C_M_RD,//讀
  • ????????????.len????= length,//讀的字節(jié)數(shù)
  • ????????????.buf????= rxdata,//存放數(shù)據(jù)的位置
  • ????????},
  • ????};

  • ????ret = i2c_transfer(this_client->adapter, msgs, 2);
  • ????if (ret < 0)
  • ????????pr_err("msg %s i2c read error: %d\n", __func__, ret);
  • ????
  • ????return ret;
  • }

  • static int ft5x0x_i2c_txdata(char *txdata, int length)
  • {
  • ????int ret;

  • ????struct i2c_msg msg[] = {
  • ????????{
  • ????????????.addr????= this_client->addr,
  • ????????????.flags????= 0,//寫
  • ????????????.len????= length,//寫的字節(jié)數(shù)
  • ????????????.buf????= txdata,//要寫的數(shù)據(jù)
  • ????????},
  • ????};

  • ????ret = i2c_transfer(this_client->adapter, msg, 1);
  • ????if (ret < 0)
  • ????????pr_err("%s i2c write error: %d\n", __func__, ret);

  • ????return ret;
  • }
  • 工作隊(duì)列函數(shù)實(shí)現(xiàn)

    點(diǎn)擊(此處)折疊或打開

  • static void ft5x0x_ts_pen_irq_work(struct work_struct *work)
  • {
  • ????int ret = -1;

  • ????ret = ft5x0x_read_data();????
  • ????if (ret == 0) {????
  • ????????ft5x0x_report_value();
  • ????}

  • ??enable_irq(this_client->irq);
  • }
  • 讀取事件數(shù)據(jù)函數(shù)實(shí)現(xiàn) ft5x0x _read_data

    點(diǎn)擊(此處)折疊或打開

  • static int ft5x0x_read_data(void)
  • {
  • ????struct ft5x0x_ts_data *data = i2c_get_clientdata(this_client);
  • ????struct ts_event *event = &data->event;

  • ????u8 buf[26] = {0};
  • ???????unsigned long x_tmp[5]={0},y_tmp[5]={0};
  • ????
  • ????int ret = -1;????

  • ???????buf[0]=0xf9;
  • ???? ret = ft5x0x_i2c_rxdata(buf, 26);

  • ????if (ret < 0) {
  • ????????printk("%s read_data i2c_rxdata failed: %d\n", __func__, ret);
  • ????????return ret;????
  • ???????????????????????????}
  • ????memset(event, 0, sizeof(struct ts_event));

  • ????event->touch_point = buf[3] & 0x07;// 000 0111

  • ????if (event->touch_point == 0) {
  • ????????ft5x0x_ts_release();
  • ????????return 1;
  • ????}


  • ????switch (event->touch_point) {
  • ????????case 5:

  • ???????????????????????x_tmp[4] = (((buf[21] & 0x0f) << 8 | buf[22]))*SCREEN_MAX_X;
  • ???????????????????????do_div(x_tmp[4],MAX_X_CTP);
  • ???????????????????????event->x5= (s16)x_tmp[4];

  • ???????????????????????y_tmp[4] = (((buf[23] & 0x0f) << 8 | buf[24]))*SCREEN_MAX_Y;
  • ???????????????????????do_div(y_tmp[4],MAX_Y_CTP);
  • ???????????????????????event->y5 =(s16)y_tmp[4];????
  • ????????????????

  • ????????case 4:
  • ???????????? x_tmp[3] = (((buf[17] & 0x0f) << 8 | buf[18]))*SCREEN_MAX_X;
  • ???????????????????????do_div(x_tmp[3],MAX_X_CTP);
  • ???????????????????????event->x4 = (s16)x_tmp[3];

  • ???????????????????????y_tmp[3] = (((buf[19] & 0x0f) << 8 | buf[20]))*SCREEN_MAX_Y;
  • ???????????????????????do_div(y_tmp[3],MAX_Y_CTP);
  • ???????????????????????event->y4 =(s16)y_tmp[3];????

  • ????????case 3:
  • ???????????????????????x_tmp[2] = (((buf[13] & 0x0f) << 8 | buf[14]))*SCREEN_MAX_X;
  • ???????????????????????do_div(x_tmp[2],MAX_X_CTP);
  • ???????????????????????event->x3 = (s16)x_tmp[2];

  • ???????????????????????y_tmp[2] = (((buf[15] & 0x0f) << 8 | buf[16]))*SCREEN_MAX_Y;
  • ???????????????????????do_div(y_tmp[2],MAX_Y_CTP);
  • ???????????????????????event->y3 =(s16)y_tmp[2];????

  • ????????case 2:
  • ???????????????????????x_tmp[1] = (((buf[9] & 0x0f) << 8 | buf[10]))*SCREEN_MAX_X;
  • ???????????????????????do_div(x_tmp[1],MAX_X_CTP);
  • ???????????????????????event->x2 = (s16)x_tmp[1];

  • ???????????????????????y_tmp[1] = (((buf[11] & 0x0f) << 8 | buf[12]))*SCREEN_MAX_Y;
  • ???????????????????????do_div(y_tmp[1],MAX_Y_CTP);
  • ???????????????????????event->y2 =(s16)y_tmp[1];????
  • ????????????
  • ????????case 1:
  • ???????????? x_tmp[0] = (((buf[5] & 0x0f) << 8 | buf[6]))*SCREEN_MAX_X;
  • ???????????????????????do_div(x_tmp[0],MAX_X_CTP);
  • ???????????????????????event->x1 = (s16)x_tmp[0];

  • ???????????????????????y_tmp[0] = (((buf[7] & 0x0f) << 8 | buf[8]))*SCREEN_MAX_Y;
  • ???????????????????????do_div(y_tmp[0],MAX_Y_CTP);
  • ???????????????????????event->y1 =(s16)y_tmp[0];????
  • ????????????break;
  • ????????default:
  • ???????? return -1;
  • ????}
  • ????event->pressure = 200;

  • ????dev_dbg(&this_client->dev, "%s: 1:%d %d 2:%d %d \n", __func__,
  • ????????event->x1, event->y1, event->x2, event->y2);

  • ????return 0;
  • }
  • 上報(bào)數(shù)據(jù)

    點(diǎn)擊(此處)折疊或打開

  • static void ft5x0x_report_value(void)
  • {
  • ????struct ft5x0x_ts_data *data = i2c_get_clientdata(this_client);
  • ????struct ts_event *event = &data->event;????

  • ????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, 1);
  • ???????????? input_report_key(data->input_dev, BTN_TOUCH, 1);
  • ????????????input_mt_sync(data->input_dev);
  • ????????????printk("===x2 = %d,y2 = %d ====\n",event->x2,event->y2);
  • ????????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, 1);
  • ???????????? input_report_key(data->input_dev, BTN_TOUCH, 1);
  • ????????????input_mt_sync(data->input_dev);
  • ????????????printk("===x2 = %d,y2 = %d ====\n",event->x2,event->y2);
  • ????????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, 1);
  • ???????????? input_report_key(data->input_dev, BTN_TOUCH, 1);
  • ????????????input_mt_sync(data->input_dev);
  • ????????????printk("===x2 = %d,y2 = %d ====\n",event->x2,event->y2);
  • ????????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, 1);
  • ???????????? input_report_key(data->input_dev, BTN_TOUCH, 1);
  • ????????????input_mt_sync(data->input_dev);
  • ????????????printk("===x2 = %d,y2 = %d ====\n",event->x2,event->y2);
  • ????????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, 1);
  • ???????????? input_report_key(data->input_dev, BTN_TOUCH, 1);
  • ????????????input_mt_sync(data->input_dev);
  • ????????????printk("===x1 = %d,y1 = %d ====\n",event->x1,event->y1);

  • ????????????break;

  • ????????default:
  • ????????????printk("==touch_point default =\n");
  • ????????????break;
  • ????}
  • ????input_sync(data->input_dev);

  • ????dev_dbg(&this_client->dev, "%s: 1:%d %d 2:%d %d \n", __func__,
  • ????????event->x1, event->y1, event->x2, event->y2);
  • }????/*end ft5x0x_report_value*/

  • 中斷函數(shù)實(shí)現(xiàn)

    點(diǎn)擊(此處)折疊或打開

  • static irqreturn_t ft5x0x_ts_interrupt(int irq, void *dev_id)
  • {
  • ????struct ft5x0x_ts_data *ft5x0x_ts = dev_id;

  • ????disable_irq_nosync(this_client->irq);????
  • ????
  • ????if (!work_pending(&ft5x0x_ts->pen_event_work)) {
  • ????????queue_work(ft5x0x_ts->ts_workqueue, &ft5x0x_ts->pen_event_work);
  • ????}
  • ????
  • ????return IRQ_HANDLED;
  • }
  • 要完全貫通的理解整個(gè)原理,還需要input子系統(tǒng),i2c子系統(tǒng),工作隊(duì)列機(jī)制,中斷機(jī)制和上層應(yīng)用的結(jié)合。

    總結(jié)

    以上是生活随笔為你收集整理的android平台的s5pc110触摸屏驱动分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。