ilitek i2c接口touchscreen驱动

一. data structure.

1. i2c_data 数据结构, 这是代表ilitek触摸屏在kernel里的工作状况的一个数据结构。
里面的各项数据在后面都有各自的用处。

// declare i2c data member

struct i2c_data {

    // input device

        struct input_dev *input_dev;    //输入设备

        // i2c client

        struct i2c_client *client;

        // polling thread

        struct task_struct *thread;     

        // maximum x

        int max_x;

        // maximum y

        int max_y;

    // maximum touch point

    int max_tp;

    // maximum key button

    int max_btn;

        // the total number of x channel

        int x_ch;

        // the total number of y channel

        int y_ch;

        // check whether i2c driver is registered success

        int valid_i2c_register;

        // check whether input driver is registered success

        int valid_input_register;

    // check whether the i2c enter suspend or not

    int stop_polling;

    // read semaphore

    struct semaphore wr_sem;

    // protocol version

    int protocol_ver;

    // valid irq request

    int valid_irq_request;

    // work queue for interrupt use only

    struct workqueue_struct *irq_work_queue;

    // work struct for work queue

    struct work_struct irq_work;



    struct timer_list timer;



    struct completion complete;

#ifdef CONFIG_HAS_EARLYSUSPEND

    struct early_suspend early_suspend;

#endif

};


 

  1. 2. dev_data.
    // device data
    
    struct dev_data {
    
            // device number
    
            dev_t devno;
    
            // character device
    
            struct cdev cdev;
    
            // class device
    
            struct class *class;
    
    };
    


  1. 3.  global variables. 声明上述2数据结构的全局变量:
    // global variables
    
    static struct i2c_data i2c;
    
    static struct dev_data dev;
    
    static char DBG_FLAG;
    
    static char Report_Flag;
    
    
    

  1. 二、设备驱动:

    1. init/exit
    /* set init and exit function for this module */
    
    module_init(ilitek_init);
    
    module_exit(ilitek_exit);
    ilitek_init:
    
    
    /*
    
    description
    
        initiali function for driver to invoke.
    
    parameters
    
    
    
        nothing
    
    return
    
        status
    
    */
    
    static int
    
    ilitek_init(
    
        void)
    
    {
    
        int ret = 0;
    
    
    
        printk(ILITEK_DEBUG_LEVEL "%s\n", __func__);
    
    
    
        // initialize global variable
    
            memset(&dev, 0, sizeof(struct dev_data));  //dev 变量 置为0
    
            memset(&i2c, 0, sizeof(struct i2c_data));  //i2c 变量 置为0
    
    
    
        // initialize mutex object
    
    #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37)     //判断linux版本
    
        init_MUTEX(&i2c.wr_sem);             //初始化 信号量
    
    #else
    
        sema_init(&i2c.wr_sem,1);            //新版初始化信号量方式
    
    #endif
    
    
    
        i2c.wr_sem.count = 1;                //使用的信号量个数
    
    
    
        // register i2c device
    
        ret = ilitek_i2c_register_device();   //注册I2C设备
    
        if(ret < 0){
    
            printk(ILITEK_ERROR_LEVEL "%s, register i2c device, error\n", __func__);
    
            return ret;
    
        }
    
    
    
        // allocate character device driver buffer
    
        ret = alloc_chrdev_region(&dev.devno, 0, 1, ILITEK_FILE_DRIVER_NAME);  //分配字符设备驱动空间
    
            if(ret){
    
                printk(ILITEK_ERROR_LEVEL "%s, can't allocate chrdev\n", __func__);
    
            return ret;
    
        }
    
            printk(ILITEK_DEBUG_LEVEL "%s, register chrdev(%d, %d)\n", __func__, MAJOR(dev.devno), MINOR(dev.devno));
    
    
    
        // initialize character device driver
    
        cdev_init(&dev.cdev, &ilitek_fops);     //初始化字符设备驱动
    
        dev.cdev.owner = THIS_MODULE;
    
            ret = cdev_add(&dev.cdev, dev.devno, 1);   //添加字符设备
    
            if(ret < 0){
    
                printk(ILITEK_ERROR_LEVEL "%s, add character device error, ret %d\n", __func__, ret);
    
            return ret;
    
        }
    
        dev.class = class_create(THIS_MODULE, ILITEK_FILE_DRIVER_NAME);   //建立class 类。
    
        if(IS_ERR(dev.class)){
    
                printk(ILITEK_ERROR_LEVEL "%s, create class, error\n", __func__);
    
            return ret;
    
            }
    
        device_create(dev.class, NULL, dev.devno, NULL, "ilitek_ctrl");   //建立设备
    
        Report_Flag=0;
    
        return 0;
    
    }


  1. ilitek_exit
    /*
    
        description
    
            driver exit function
    
        parameters
    
            none
    
        return
    
            nothing
    
        */
    
        static void
    
        ilitek_exit(
    
            void)
    
        {
    
        #ifdef CONFIG_HAS_EARLYSUSPEND //判断系统是否支持early suspend 模式
    
            unregister_early_suspend(&i2c.early_suspend); //如果支持,则注销early suspend.
    
        #endif
    
            // delete i2c driver
    
            if(i2c.client->irq != 0){
    
                    if(i2c.valid_irq_request != 0){
    
                            free_irq(i2c.client->irq, &i2c); //释放中断
    
                            printk(ILITEK_DEBUG_LEVEL "%s, free irq\n", __func__);
    
                            if(i2c.irq_work_queue){
    
                                    destroy_workqueue(i2c.irq_work_queue); //释放工作队列
    
                                    printk(ILITEK_DEBUG_LEVEL "%s, destory work queue\n", __func__);
    
                            }
    
                    }
    
            }
    
            else{
    
                    if(i2c.thread != NULL){
    
                            kthread_stop(i2c.thread); //停止i2c thread。
    
                            printk(ILITEK_DEBUG_LEVEL "%s, stop i2c thread\n", __func__);
    
                    }
    
            }
    
                if(i2c.valid_i2c_register != 0){
    
                        i2c_del_driver(&ilitek_i2c_driver); //删除i2c驱动。
    
                        printk(ILITEK_DEBUG_LEVEL "%s, delete i2c driver\n", __func__);
    
                }
    
                if(i2c.valid_input_register != 0){
    
                        input_unregister_device(i2c.input_dev); //注销设备。
    
                        printk(ILITEK_DEBUG_LEVEL "%s, unregister i2c input device\n", __func__);
    
                }
    
            // delete characte
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ilitek2511qg010是一种触摸屏控制器芯片,用于计算机、平板电脑、智能手机等设备,具有高度精准、快速响应、多点触控等功能。为了使设备正常工作,需要安装相应的驱动软件。针对win10系统,需要安装兼容的ilitek2511qg010驱动程序,这样才能保证设备与操作系统完全匹配,实现正常的触控操作。 安装win10驱动软件时,需要先检查电脑硬件是否支持ilitek2511qg010芯片,并确保驱动软件版本兼容。在安装之前,可以通过官网下载相应的驱动程序,并按照提示完成安装及设置。在设置过程中,需要根据个人需求进行设置,如滑动灵敏度、手势识别等。安装完成后,可以测试触摸屏是否正常工作,如果发现问题可以重新安装驱动程序或者寻求专业技术支持。 总之,ilitek2511qg010 win10驱动程序是保证设备正常运行的必备软件,用户需要选择兼容的版本并进行正确的安装,以确保设备能够完成高效、稳定的触控操作。 ### 回答2: ilitek2511qg010是一种触控芯片,它需要对应的驱动软件才能在计算机中正常工作。win10驱动软件则是针对Windows 10操作系统的驱动程序,如果您的计算机系统是win10,那么需要安装该驱动软件才能正常使用ilitek2511qg010触控芯片。 一般来说,您可以在ilitek官网上下载对应的win10驱动软件。下载安装后,将触控芯片接入计算机,系统会自动检测并安装驱动程序。接着,您便可以在Windows 10系统上使用ilitek2511qg010触控芯片了。 如果您安装驱动程序遇到了问题,可以参考官网提供的帮助文档或联系技术支持进行解决。需要注意的是,选择正确的驱动软件版本对于实现正常工作十分重要,因此请确保下载的驱动软件与您的ilitek2511qg010触控芯片型号完全匹配。 ### 回答3: ilitek2511qg010是一款数字电容式触控芯片产品,其功用是用来控制触控设备的。对于win10操作系统而言,需要安装相应的驱动程序才能让这个触控芯片正常使用。要想获得ilitek2511qg010 win10驱动软件,最好的方式是到ilitek官方网站上进行下载。但在下载之前,确保自己获取到了正确的驱动程序,否则其它不安全的软件也可能会搭配进来。 安装ilitek2511qg010 win10驱动软件需要按照以下几个步骤操作。首先,下载驱动程序并将其解压到任意位置。其次,将触控设备连接到电脑上,并确认它没有任何故障。然后,在设备管理器内右击触控设备,选择“更新驱动程序软件”。最后,选择“浏览计算机以查找驱动程序软件”,并将解压好的驱动程序所在文件夹作为源目录。这样一来,就能顺利安装ilitek2511qg010 win10驱动软件,从而使用触控设备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值