社区
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的值。
这上通过实验得出的现象,请问在输入子系统中这个特性是正常的吗?
...全文
343
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下多点电容触摸屏实验
文章目录一、linux下电容触摸屏驱动框架简介1. 多点触摸(MT)协议详解2. Type A触摸点信息上报时序3. Type B触摸点信息上报时序4. MT其他事件的使用5. 多点触摸所使用的API
函数
1.
input
_mt_init_slots
函数
2.
input
_mt_slot
函数
3.
input
_mt_
report
_slot_state
函数
4.
input
_
report
_abs
函数
5.
input
_mt_
report
_pointer_emulation
函数
6. 多点电容触摸驱动框架1.
Linux_Kernel
4,465
社区成员
17,462
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章