android TP驱动移植调试笔记(转)
1. 添加I2C 设备
TP 一般采用的是I2C 作为数据和命令接口,所以TP 驱动也可以归类为I2C 驱动。TP驱动的主要逻辑不在这里,但是了解了Linux 的I2C 体系架构,就可以对整个驱动流程有了
更加清晰的认识,但这里不详细展开讨论I2C 的体系架构,只围绕怎么移植开发TP 驱动展开讨论。
在板级文件中,也就是瑞星微的代码文件board-rk30-sdk.c 中,实例化一个i2c_board_info结构体,该结构抽象描述一个具体的i2c 设备,然后将该实例添加到__i2c_board_list 全局链表中。举个实例:
#if defined (CONFIG_TOUCHSCREEN_PIXCIR)
{
.type = "pixcir_ts",
.addr = 0x5c,
.flags =0,
.irq = RK30_PIN4_PC2,
.platform_data = &pixcir_info,
},
#endif
了解I2C 体系架构的应该都知道,Linux 系统在能成功找到I2C adapter 之后,也就是找到I2C 控制器之后,就会扫描__i2c_board_list 这个链表,每找到一个i2c_board_info,就会生成一个i2c_client,i2c_client 的部分信息来自于i2c_board_info,一部分来自于i2c_adapter。i2c_client 就表示一个真真切切的i2c 设备,因为它既有描述它基本属性的信息,也有描述它行为的方法,通俗的说就是I2C 的传输方法。
现在我们可以回过头来详细说说前面的提到的i2c_board_info结构体中各个成员的意义了。type成员用来赋给后来生成的i2c_client中的name成员,i2c_client中的name就表示这个i2c_client的名字。addr是这个i2c设备的地址,它和I2C控制器一起表示表示这个i2c设备,假如我们的TP是挂载在控制器0上,那么0-005c则表示是这个i2c设备,0-005c我们也可以在sys系统里面找到。Flag是i2c读写的标志,为0表示为写,1表示读。Irq是这个i2c设备的中断脚。Platform_data是在驱动注册时用到。
2. 添加I2C驱动
熟悉Linux设备驱动模型的人都了解设备,驱动,总线的关系,上面我们讲的是设备,光有设备不行,还得有驱动。一般TP供应商都会有驱动提供给我们,这里我们以瑞星微SDK中的pixcir_i2c_ts.c来作个例子。
第一步是添加i2c驱动:
i2c_add_driver(&pixcir_i2c_ts_driver);
这里就不展开讨论这个函数了,pixcir_i2c_ts_driver的定义如下:
static struct i2c_driver pixcir_i2c_ts_driver = {
.driver = {
.owner = THIS_MODULE,
.name = "pixcir_i2c_ts_v3.3.09",
#ifdef PIX_DRV_ATTR
.groups = pixcir_drv_grp,
#endif
},
#ifndef CONFIG_HAS_EARLYSUSPEND
.suspend = pixcir_i2c_ts_suspend,
.resume = pixcir_i2c_ts_resume,
#endif
.probe = pixcir_i2c_ts_probe,
.remove = __devexit_p(pixcir_i2c_ts_remove),
.id_table = pixcir_i2c_ts_id,
};
按照Linux设备驱动模型,一旦总线上有新的驱动加入,则系统会自动去搜索挂载在这个总线上的所有设备,然后拿每个设备的name跟驱动的id_table比较,如果两个的名字一样,那么接下来就会执行驱动里面的probe函数。
3. TP驱动中的Probe
无论是什么样的TP驱动,在probe中不外乎就做以下几件事情:
1) 申请TP相应的IO口,然后重启一下设备
2) 申请TP中断,熟悉Linux中断的人都应该知道中断的顶半部和底半部机制,于是要申请一个工作队列和初始化一个工作任务。
INIT_WORK(&tsdata->work.work, pixcir_ts_poscheck);
pixcir_wq = create_singlethread_workqueue("pixcir_wq");
TP的数据上报流程是,当人手按下的时候,TP则产生一个中断,在中断服务程序中,将数据读出并且通过输入子系统将数据上报给操作系统。
3) TP在硬件上通过I2C接口告诉人们它的数据,在软件上则是通过输入子系统告诉操作系统它的数据,而使用输入子系统的第一步则是申请一个输入子设备:
input_allocate_device();
这里不详细展开讨论这个函数里面的东西了,输入子系统通信的基本单位是事件,事件有三种属性:类型(type),编码(code),值(value)。输入子系统支持很多种事件,很多种事件编码,所以在使用输入设备前,要先设置这个设备支持何种类型的事件,何种事件编码。
4)一般的TP驱动支持的是以下几种事件
__set_bit(EV_KEY, input->evbit);
__set_bit(EV_ABS, input->evbit);
__set_bit(EV_SYN, input->evbit);
5)确定多点触摸的协议。多点触摸的协议有A协议跟B协议之分。A类在每次报点后加 input_mt_sync(touch_dev->input_dev);
B类需要在probe中执行input_mt_init_slots(ts->input_dev, ts->max_touch_num);再在每次报点前input_mt_slot(ts->input_dev, index);
6) 向输入子系统注册设备:
input_register_device(ts->input_dev);
4. 触摸屏调试常见问题参考:
1)在加载了驱动后,解不了锁。
可以先用USB鼠标解锁。如果可以用adb的话,也可以直接用adb shell input keyevent 82解锁
2)点击屏幕没反应
确定i2c设备供电正常,确定probe被执行了没,如果被执行了,再确定IO有没有先进行初始化,有没有重启设备,再确定I2C通不通,点击屏幕能否进入中断。
3)probe没被执行。检查i2c_board_info终端的type成员定义是否跟i2c_driver中的id_table一样。
4)I2C不通。检查供电正常否,有没有重启设备,i2c地址有没有错误,有的i2c设备是用7位,有的是用8位,8位的则必须右移一位
5)最常发生的问题,TP的报点不对。
这个问题到目前为止还没总结出一个方法论。个人调试经验以为,这个跟LCD的分辨率,TP的分辨率,输入子系统设置都有关系。
先讨论一个对例子确定屏幕的分辨率,假如分辨率为800 * 1280,那么应该是下图的样子:
图表 1 LCD屏幕表示图
假如TP的分辨率也是800 * 1280
图表 2 TP分辨率表示图
如上面两幅图所示,LCD和TP的分辨率是一样的,并且原点一样,假如这时输入子系统参数设置为:
input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, 800, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, 1280, 0, 0);
那么此时上报的点应该是不用经过任何转换的,也就是说上报的点是对的。
我们再讨论另外一种情况,假如TP的分辨率为:
图表 3 TP分辨率标示图
值得一提的是,TP的x,y轴可以互换,但是原点是不会变化的。如图3的TP跟图1的LCD,由于LCD的原点跟TP的原点不一样,那么上报的点则必须经过驱动转换。转换的公式为:
X=800 - y1;
Y=x1;
6)如何找LCD原点跟TP原点。
LCD原点应该是在系统没做任何翻转之前,在系统点亮的时候,小企鹅出现的地方
TP的原点,应该是在TP驱动里x,y没经过逻辑转换之前,用printk打印出点信息。
转载:http://blog.csdn.net/jkzrc/article/details/18549957
android TP驱动移植调试笔记(转)的更多相关文章
- android wifi驱动移植详细过程
转自:http://bbs.imp3.net/thread-10558924-1-1.html 对于刚入手android没多久的人来说,android wifi 驱动的移植确实还是有难度的,不过参考了 ...
- AM335x(TQ335x)学习笔记——GPIO关键驱动移植
或按照S5PV210学习秩序.我们首先解决的关键问题.TQ335x有六个用户按钮,每个上.下.剩下.对.Enter和ESC. 我想开始学习S5PV210当同一,写输入子系统驱动器的关键问题要解决,但浏 ...
- AM335x(TQ335x)学习笔记——WM8960声卡驱动移植
经过一段时间的调试,终于调好了TQ335x的声卡驱动.TQ335x采用的Codec是WM8960,本文来总结下WM8960驱动在AM335x平台上的移植方法.Linux声卡驱动架构有OSS和ALSA两 ...
- AM335x(TQ335x)学习笔记——GPIO按键驱动移植
还是按照S5PV210的学习顺序来,我们首先解决按键问题.TQ335x有六个用户按键,分别是上.下.左.右.Enter和ESC.开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题 ...
- AM335x(TQ335x)学习笔记——LCD驱动移植
TI的LCD控制器驱动是非常完善的,共通的地方已经由驱动封装好了,与按键一样,我们可以通过DTS配置完成LCD的显示.下面,我们来讨论下使用DTS方式配置内核完成LCD驱动的思路. (1)初步分析 由 ...
- 基于MT6752/32平台 Android L版本驱动移植步骤
基于MT6752/32平台 Android L版本驱动移植步骤 根据MK官网所述,在Android L 版本上Turnkey ABS 架构将会phase out,而Mediatek Turnkey架构 ...
- Android wifi驱动的移植 realtek 8188
Android wifi驱动的移植 一般我们拿到的android源代码中wifi应用层部分是好的, 主要是wifi芯片的驱动要移植并添加进去. wifi驱动的移植, 以realtek的8188etv为 ...
- AM335x(TQ335x)学习笔记——Nand&&网卡驱动移植
移植完成声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...
- Android驱动开发读书笔记七
第七章 (一)创建设备文件 1.使用cdev_init函数初始化cdec 描述设备文件需要一个cdev结构体,代码如下: struct cdev{ struct kobject kobj; struc ...
随机推荐
- Matlab中reshape函数的使用
reshape把指定的矩阵改变形状,但是元素个数不变, 例如,行向量: a = [1 2 3 4 5 6] 执行下面语句把它变成3行2列: b = reshape(a,3,2) 执行结果: b = 1 ...
- [MetaHook] Quake OpenGL function
Quake OpenGL function for MetaHook plugin. Thank hzqst :D QGL.h #ifndef QGL_H #define QGL_H #include ...
- 20135328信息安全系统设计基础第二周学习总结(vim、gcc、gdb)
第三周学习笔记 学习计时:共8小时 读书:1 代码:5 作业:1 博客:7 一.学习目标 熟悉Linux系统下的开发环境 熟悉vi的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 ...
- Bootstrap 排版
Bootstrap 使用 Helvetica Neue. Helvetica. Arial 和 sans-serif 作为其默认的字体栈. 使用 Bootstrap 的排版特性,您可以创建标题.段落. ...
- 有四中方法可以实现PHP的伪静态,你造吗?
说起伪静态的实现方案,你是不是很爽快的回答"简单,配置下apache的重写规则就行了嘛" 但是你有没有发现这种情况,你最近弄了很多新功能,每天上几个新功能,每天都有好多伪静态配置, ...
- maven integration with eclipse 3.0.4 does not work with NTLM proxy
Recently downloaded m2e(maven integration with eclipse). The version is 3.0.4. My environment is beh ...
- [AaronYang]C#人爱学不学[6]
不要回头,不要将就,做到这两点,人生就会简单很多幸福很多 --Aaronyang的博客(www.ayjs.net)-www.8mi.me 1. 运算符,还有哪些你能学到? 1.1 不安全运算符: si ...
- Mysql 调优小技巧
MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...
- 每天一个linux命令(52):scp命令
scp 是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且 scp传输是加密的.可能会稍微影响一下速度.当你服 ...
- “耐撕”团队2016.04.19站立会议
1. 时间 : 20:20--20:40 共计20分钟 2. 人员 : Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客 ...