社区
Linux_Kernel
帖子详情
输入子系统驱动程序,input_report_ 这类函数的一个奇怪问题
lfw19891101
2010-10-27 05:45:14
例如:
内核程序中有如下报告事件函数:
input_report_abs(dev, ABS_X, xp);
在实验中发现,如果xp的值保持不变的话,在多次运行到这个函数时,只有第一次向应用程序报告了xp的值,其后由于xp值没有变化,所以都没有上报给应用程序。
如果xp产生变化,此函数会将xp的新值报告给应用程序,一旦xp值停止变化,它也只有上报第一次xp的值。
这上通过实验得出的现象,请问在输入子系统中这个特性是正常的吗?
...全文
466
4
打赏
收藏
输入子系统驱动程序,input_report_ 这类函数的一个奇怪问题
例如: 内核程序中有如下报告事件函数: input_report_abs(dev, ABS_X, xp); 在实验中发现,如果xp的值保持不变的话,在多次运行到这个函数时,只有第一次向应用程序报告了xp的值,其后由于xp值没有变化,所以都没有上报给应用程序。 如果xp产生变化,此函数会将xp的新值报告给应用程序,一旦xp值停止变化,它也只有上报第一次xp的值。 这上通过实验得出的现象,请问在输入子系统中这个特性是正常的吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lfw19891101
2010-11-08
打赏
举报
回复
非常感谢,这让我知道了另一种学习方法
充电宝111
2010-10-28
打赏
举报
回复
有问题看源码!
static void input_handle_event(struct input_dev *dev,
unsigned int type, unsigned int code, int value)
{
int disposition = INPUT_IGNORE_EVENT;
switch (type) {
case EV_SYN:
switch (code) {
case SYN_CONFIG:
disposition = INPUT_PASS_TO_ALL;
break;
case SYN_REPORT:
if (!dev->sync) {
dev->sync = 1;
disposition = INPUT_PASS_TO_HANDLERS;
}
break;
case SYN_MT_REPORT:
dev->sync = 0;
disposition = INPUT_PASS_TO_HANDLERS;
break;
}
break;
case EV_KEY:
if (is_event_supported(code, dev->keybit, KEY_MAX) &&
!!test_bit(code, dev->key) != value) {
if (value != 2) {
__change_bit(code, dev->key);
if (value)
input_start_autorepeat(dev, code);
else
input_stop_autorepeat(dev);
}
disposition = INPUT_PASS_TO_HANDLERS;
}
break;
case EV_SW:
if (is_event_supported(code, dev->swbit, SW_MAX) &&
!!test_bit(code, dev->sw) != value) {
__change_bit(code, dev->sw);
disposition = INPUT_PASS_TO_HANDLERS;
}
break;
case EV_ABS:
if (is_event_supported(code, dev->absbit, ABS_MAX)) {
if (test_bit(code, input_abs_bypass)) { //触摸屏的数据从这里走了
disposition = INPUT_PASS_TO_HANDLERS;
break;
}
value = input_defuzz_abs_event(value,
dev->abs[code], dev->absfuzz[code]);
if (dev->abs[code] != value) { //不相等的才传上去!!!!!!!!
dev->abs[code] = value;
disposition = INPUT_PASS_TO_HANDLERS;
}
}
break;
case EV_REL:
if (is_event_supported(code, dev->relbit, REL_MAX) && value)
disposition = INPUT_PASS_TO_HANDLERS;
break;
case EV_MSC:
if (is_event_supported(code, dev->mscbit, MSC_MAX))
disposition = INPUT_PASS_TO_ALL;
break;
case EV_LED:
if (is_event_supported(code, dev->ledbit, LED_MAX) &&
!!test_bit(code, dev->led) != value) {
__change_bit(code, dev->led);
disposition = INPUT_PASS_TO_ALL;
}
break;
case EV_SND:
if (is_event_supported(code, dev->sndbit, SND_MAX)) {
if (!!test_bit(code, dev->snd) != !!value)
__change_bit(code, dev->snd);
disposition = INPUT_PASS_TO_ALL;
}
break;
case EV_REP:
if (code <= REP_MAX && value >= 0 && dev->rep[code] != value) {
dev->rep[code] = value;
disposition = INPUT_PASS_TO_ALL;
}
break;
case EV_FF:
if (value >= 0)
disposition = INPUT_PASS_TO_ALL;
break;
case EV_PWR:
disposition = INPUT_PASS_TO_ALL;
break;
/*selwin*/
case EV_TG:
if (is_event_supported(code, dev->absbit, ABS_MAX)) {
if (test_bit(code, input_abs_bypass)) {
disposition = INPUT_PASS_TO_HANDLERS;
break;
}
value = input_defuzz_abs_event(value,
dev->abs[code], dev->absfuzz[code]);
if (dev->abs[code] != value) {
dev->abs[code] = value;
disposition = INPUT_PASS_TO_HANDLERS;
}
}
break;
}
if (disposition != INPUT_IGNORE_EVENT && type != EV_SYN)
dev->sync = 0;
if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event)
dev->event(dev, type, code, value);
if (disposition & INPUT_PASS_TO_HANDLERS)
input_pass_event(dev, type, code, value);
}
lfw19891101
2010-10-27
打赏
举报
回复
恩!是用在触摸屏驱动好,报告触摸屏上按下的x、y值,
deep_pro
2010-10-27
打赏
举报
回复
虽然我没用过,但是我想
input_report_abs之后加入
input_sync
不知道有没有效果
再想想你这种设备是绝对坐标,不是鼠标哪种相对坐标,也确实不需要上报没有变化的结果
输入
子系统
(一)
1、框架 之前写的
驱动程序
都是使用自己的框架,也只有我们自己知道在测试时该打开什么设备,那么,内核中提供了一套框架,将这些
输入
设备都进行了统一和规范化,这就是今天要来介绍的
输入
子系统
打开内核source insight工程,在drivers目录下找到
input
.c,这是
输入
子系统
的最开始的文件,从这里进行分析 从上面这张图可以看到,
input
.c在它的入口
函数
里先注册了
一个
名为inout的类...
输入
子系统
之后list_for_each_entry(handler,&
input
_handler_list,node)
input
_attach_handler(dev,handler);若之前驱动
input
_dev和处理
input
_handler已经通过
input
_handler 的.connect
函数
建立起了连接,那么就调用evdev_event()的.event事件
函数
,之后在wake_up_interruptible(&evdev->wait),来唤醒evdev_read
函数
。
Part15: 内核的
输入
子系统
(
input
-subsystem)【待完善】
0 明确
输入
子系统
组成、目的 对于内核的
输入
子系统
,网上一堆文章。但是很少提及到
输入
子系统
的目的何在? 此外,
输入
子系统
三大层之间的划分缘由?(网上很多只是介绍是什么,而没提及分层的目的) 因此,在讲解之前,先阐明以上两点。 1)
输入
子系统
的目的 站在三个角度考虑: 1.1)站在设备
驱动程序
角度 设备
驱动程序
的目的很简单,它只想轻松融入进内核贡献它自己对硬件的操作功能,另外,它肯定不想 与...
输入
子系统
框架详解
输入
子系统
框架详解 (1)为什么要使用
输入
子系统
框架 我们在刚开始学习字符设备
驱动程序
的编写时,都会用到这样
一个
框架: 首先分配
一个
主设备号( alloc_chrdev_region(),推荐用这个
函数
),接着填充file_opreation 结构体(这是字符设备
驱动程序
编写的关键点),再接着在入口
函数
里面调用字符设备注册
函数
等,最后编写出口
函数
,不要忘记修饰入口...
今天遇到了
一个
奇怪
问题
呵呵!今天遇到了
一个
奇怪
的
问题
,我的单选按钮是这样的: 语言版本 中文 英文* 我在firefox下,选择英文,始终选不了,而在IE下测试是可以的不信你们把这段代码复制试试!最后终于解决了:也许很多人都忽略啦这个label标签的作用,我也一直没怎么注意,在dw8里,插入inp
Linux_Kernel
4,469
社区成员
17,458
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章