ilitek i2c接口touchscreen驱动

展锐A16平台ILITEK_V3 I2C触摸屏驱动移植与调试实战(附配置与问题排查) 本文详细介绍了在展锐A16 Android平台上移植ILITEK_V3 I2C触摸屏驱动的实战过程,涵盖内核配置、设备树DTS设置、驱动初始化、中断处理、触摸事件上报及电源管理。重点解析了常见问题排查与调试技巧,帮助开发者高效完成驱动移植,确保触摸功能稳定运行。 阅读详情

一. 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); //注销设备。
    
               
[RK3399电容屏ilitek2511驱动添加及使能 Platform: ROCKCHIP Chip: RK3399 OS: Android7.1.2 Kernel: 4.4.126 ** 步骤 ** 1.源码加入工程kernel/drivers/input/touchscreen/下,修改该目录下的Kconfig以及Makefile Kconfig +config TOUCHSCREEN_ILI251X + tristate "Ilitek ILI251x based touchscreen" + depends on I2C + 阅读详情

相关推荐

ilitek ili2130触摸屏I2C驱动调试与干扰排查实战

本文详细记录了在RK3566 Android 11平台上调试ilitek ili2130触摸屏I2C驱动的实战过程。重点分析了因GPIO引脚复用配置错误导致的32KHz时钟信号干扰问题,并通过示波器定位和修改设备树配置成功解决中断异常与校验和错误,最终使触摸功能恢复正常。

f9g0h的博客 323

ilitek ili2130触摸屏I2C驱动移植与调试实战

本文详细介绍了ilitek ili2130触摸屏I2C驱动在RK3566 Android 11平台上的移植与调试实战。从驱动代码整合、设备树配置到硬件信号完整性检查,全面解析了移植过程中的关键步骤和常见问题解决方案,特别是针对时钟信号串扰导致的触摸失灵问题提供了有效调试方法。

weixin_30162121的博客 230

ilitek ili2130触摸屏I2C驱动适配与中断异常排查实战

本文详细介绍了ilitek ili2130触摸屏I2C驱动适配与中断异常排查的实战经验。从驱动代码合并、内核配置到I2C通信问题调试,重点分析了中断异常的原因及解决方案,并提供了硬件设计注意事项和常见问题排查技巧,帮助开发者高效完成触摸屏驱动适配。

weixin_29168813的博客 383

展锐A16平台ILITEK_V3 I2C触摸屏驱动移植与调试实战指南

本文详细介绍了在展锐A16平台上移植与调试ILITEK_V3 I2C触摸屏驱动的实战指南。从开发环境搭建、驱动源码获取到设备树配置、常见问题排查及性能优化,全面解析了Android系统下触摸屏驱动的移植流程与技巧,帮助开发者高效完成驱动适配工作。

weixin_30642561的博客 419

Linux 平台下的 ilitek 触摸屏驱动

Linux 平台下的 ilitek 触摸屏驱动。 包内是对Linux平台下的ilitek驱动。适用于mtk,allwin,rockchip,amlogic等不同平台下的ilitek触摸屏驱动,内含区分不同平台的配置说明文档.通过宏来区分不同的平台。 ilitek tp mtk allwin

ilitek奕力触摸屏驱动,MTK方案

ilitek奕力触摸屏驱动,MTK方案

ilitek_ld_tool:Ilitek触摸屏工具,用于固件更新

这是ILITEK触摸屏的固件更新工具 建造方法(TBU): 如何运行(TBU):

ilitek 触摸方案(工具调试Android下使用)

ilitek 触摸方案(工具调试Android下使用)

ILITEK 触摸屏 ITS调试工具中文 Windows-Studio-ITS-User-Guide(CHT)-v1.0.3.5

ILITEK 触摸屏 ITS调试工具中文版

Linux下的触摸屏驱动

一、触摸屏理论概述   对于触摸屏驱动,我们主要需要掌握触摸屏驱动代码和应用层测试代码。下面讲的是基于Mini2440的触摸屏驱动,现在的驱动我们都将设备和驱动分离,挂在平台设备总线上,让设备和驱动去匹配。而我们在linu2.6.32.2内核版本中的触摸屏驱动仍然没有将设备和驱动分离,这样不存在匹配问题,这种现象其实我们并不陌生,在我们学习驱动的前期,都会研究简单字符驱动代表LED驱动,那个驱动是把设备和驱动写在了一起。总结下,驱动和设备可以分离也可以不分离,建议分离,而本触摸屏驱动没有分离设备和驱动,有兴趣可以将设备和驱动进行分离。   先说明下触摸屏的工作原理,当有人在触摸屏上按下

DDS器件原理与应用(AD9833 AD9834)

是DDS的核心组成部分,用于实现相位的累加,并输出相应的幅值。相位累加器由M位宽加法器和M位宽寄存器组成,通过时钟控制,将上一次累加结果反馈到加法器输入端实现累加功能,从而使每个时钟周期内的相位递增数为,并取相位累加结果作为地址输出给ROM查找表部分。DDS的相位信息被存放在累加寄存器中,虽然幅值和相位不是线性关系,但寄存器累加值和相位可以是线性关系,很容易用寄存器的累加值表达相位信息。

m0_49968063的博客 6445

蚁群算法(Ant Colony Optimization,ACO)讲解+代码实现

通常情况下,较优的解对应的路径上的信息素会被加强,而较差解对应的信息素则会减少或蒸发。的化学物质,这种物质会在蚂蚁走过的路径上留下痕迹,后续的蚂蚁会根据这些信息素的浓度来选择路径,从而形成一条从蚁巢到食物源的。在求解TSP蚁群算法中,每只蚂蚁相互独立,用于构造不同的路线,蚂蚁之间通过信息素进行交流,合作求解。的过程,该路段经过的蚂蚁越多,信息素留下的就越多,浓度越高,更多的蚂蚁都会选择这个路段。需要注意的是,蚁群算法是一种。(6)计算每只蚂蚁的总距离:遍历每只蚂蚁的路线,累加经过的城市之间的距离。

m0_73804764的博客 1万+

Qt5.12.12安卓开发环境搭建:Windows下避开SDK版本坑的保姆级教程

本文提供Qt5.12.12在Windows下搭建Android开发环境的详细教程,重点解决SDK版本兼容性问题,特别是cmdline-tools与JDK8的匹配陷阱。通过精准选择组件版本、手动配置路径和修复常见错误,帮助开发者高效完成环境配置,适用于Qt跨平台移动开发。

weixin_33737774的博客 542

android广告SDK原理详解(附源码)

广大的开发者吃糠咽菜开发了一两款APP,获取了一些流量后自然就会想到流量变现,一般情况下大家会选择到百度联盟或者Google Admob这些广告服务提供商注册开发者账号,在自己的APP里面加上几行广告位代码,集成他们的广告SDK包。然后谋事在人,成事在天,只有每天看报表查查收益。   也有一些开发者为了能够提高自己的变现水平,同时接入了好几家的sdk,哪家出的收益高一点我就出哪家的广告,但是这

rmcgogo的博客 1万+

三菱PLC通信库大比拼:手把手教你用C#实现最高效的McProtocol数据读写

本文深入比较了三菱PLC通信库的性能,重点介绍了如何使用C#高效实现McProtocol数据读写。通过实测数据对比HslCommunication、McProtocol-next和自定义方案的优劣,提供优化技巧和代码示例,帮助开发者在工业自动化场景中提升通信效率。

m0n1o2p的博客 257

spdk + fio测试nvme 设备的性能

fio的测试对象可以是块设备、文件等,在spdk的使用过程中会unbind默认的nvme driver,所以在系统中是看不到nvme块设备的,在spdk中可以通过fio_plugin的方式,将spdk的用户态driver部分的io功能打包成一个ioengine提供给fio使用,可以综合spdk的高性能和fio提供的复杂场景。更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加。这个jobfile是spdk中提供的例子。领取,关注我持续更新哦!2.7 jobfile的例子。

lingshengxiyou的博客 1089

SAP-ABAP:SAP IDOC 全面学习指南

SAP-ABAP:SAP IDOC 全面学习指南

baidu_35680696的博客 1617

Python爬虫实战 | 拼多多商品评论采集与深度分析

本文从 API 调用、网页渲染到情感分析与关键词提取,全流程剖析了“拼多多商品评论采集与分析”项目。Scrapy + API 可快速抓取评论;Playwright 可突破 API 限制,抓取完整页面内容;数据清洗 + 分析揭示用户真实反馈;可持续部署、扩展至更多商品 & 时间段;

2201_76125261的博客 1696

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 使用ts_calibrate校准触摸屏
下一篇: 触摸屏的几种接口
lamdoc
博客等级 码龄18年 155粉丝 655原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值