社区
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的值。
这上通过实验得出的现象,请问在输入子系统中这个特性是正常的吗?
...全文
359
4
打赏
收藏
输入子系统驱动程序,input_report_ 这类函数的一个奇怪问题
例如: 内核程序中有如下报告事件函数: input_report_abs(dev, ABS_X, xp); 在实验中发现,如果xp的值保持不变的话,在多次运行到这个函数时,只有第一次向应用程序报告了xp的值,其后由于xp值没有变化,所以都没有上报给应用程序。 如果xp产生变化,此函数会将xp的新值报告给应用程序,一旦xp值停止变化,它也只有上报第一次xp的值。 这上通过实验得出的现象,请问在输入子系统中这个特性是正常的吗?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
不知道有没有效果
再想想你这种设备是绝对坐标,不是鼠标哪种相对坐标,也确实不需要上报没有变化的结果
Linux---
input
输入
子系统
设备驱动写法
input
_allocate_device()、
input
_event()、
input
_sync()
Linux---
input
输入
子系统
设备驱动写法
input
_allocate_device()、
input
_event()、
input
_sync()
input
子系统
学习笔记六 按键驱动实例分析下
本文接着
input
子系统
学习笔记五 按键驱动实例分析上接续分析这个按键驱动实例!
input
_
report
_key()向
子系统
报告事件 在 button_interrupt()中断
函数
中,不需要考虑重复按键的重复点击情况,
input
_
report
_key()
函数
会自动检查这个
问题
,并报告一次事件给
输入
子系统
。该
函数
的代码如下: C++代码 s
nput_
report
_rel 和
input
_
report
_abs
用于提交较常用的事件类型给
输入
子系统
的
函数
有:1. void
input
_
report
_key(struct
input
_dev *dev, unsigned int code, int value); 2. 3. //提交按键事件的
函数
4. 5. void
input
_repor...
linux的
input
子系统
上报
函数
input
_event的底层原理
前言 最近在学习
input
子系统
驱动的编写的时候,用imx6ull开发板上的按键作为
输入
设备进行注册。实现过程中没什么
问题
,但是在面试的时候被问到了
input
_event
函数
实现的底层原理,所以总结了一下,作为笔记,供大家参考吧。 一、如何使用
input
子系统
? 在使用
input
子系统
的时候我们只需要注册
一个
input
设备即可,
input
_dev 结构体表示
input
设备,此结构体定义在 include/linux/
input
.h 文件中 步骤大致分为以下几步: 在编写
input
设备驱动
【Linux驱动】
Input
子系统
输入
子系统
由驱动层(
input
_driver)、核心层(
input
_core)以及事件层(
input
_event_handle)组成,如下图所示: Note:
Input
子系统
中所有
输入
设备的主设备号都是13,核心层通过次设备号来将
输入
设备分类,例如如0-31是游戏杆,32-63是鼠标(对应Mouse Handler)、64-95是事件设备(如触摸屏,对应Event Handler)。在使用
input
系统时,不需要去注册字符设备,只需要向系统申请
一个
input
_device即可。在Linux内核中,使用inp
Linux_Kernel
4,466
社区成员
17,461
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章