当前位置:  技术问答>linux和unix

输入子系统驱动程序,input_report_ 这类函数的一个奇怪问题

    来源: 互联网  发布时间:2016-10-14

    本文导语:  例如: 内核程序中有如下报告事件函数:        input_report_abs(dev, ABS_X, xp);      在实验中发现,如果xp的值保持不变的话,在多次运行到这个函数时,只有第一次向应用程序报告了xp的值,其后由于xp值没有...

例如:
内核程序中有如下报告事件函数:
       input_report_abs(dev, ABS_X, xp);


     在实验中发现,如果xp的值保持不变的话,在多次运行到这个函数时,只有第一次向应用程序报告了xp的值,其后由于xp值没有变化,所以都没有上报给应用程序。
     如果xp产生变化,此函数会将xp的新值报告给应用程序,一旦xp值停止变化,它也只有上报第一次xp的值。
     这上通过实验得出的现象,请问在输入子系统中这个特性是正常的吗?




|
有问题看源码!
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 = 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);
}

|
虽然我没用过,但是我想
input_report_abs之后加入
input_sync 

不知道有没有效果

再想想你这种设备是绝对坐标,不是鼠标哪种相对坐标,也确实不需要上报没有变化的结果

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 gcount():返回读取的最后一次输入的字符数
  • KDE编程中,编辑器可以输入英文,但中文无法输入,换过输入法,还不行
  • C++ I/O 成员 peek():检查下一个输入的字符
  • 在red hat 7.2 中如何实现中文输入?是不是要装个输入法呀?有微软输入法吗?
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在linux下终端C编程做登陆时界面时,怎么在输入密码时让它不显示输入内容,或者输入一个字符是*
  • C++ I/O 成员 seekg():在一个输入流中进行随机访问
  • 当A,B程序都在不断读入标准输入的时候, 为什么往A标准输入里面输入的数据一定能被A读到,而不是被B读到?
  • C++ I/O 成员 open():创建一个输入流
  • redhat9.0下,我安装了紫光输入法和firefox浏览器,结果发现在firefox下用“Ctrl-Shift”切换不出输入法,怎么办?有其他输入法或者浏览
  • Uploadify 'uploadify.php'存在多个输入验证漏洞
  • 在linux下如何用c实现类似于Linux登陆时输入密码的场景: 即输入密码时不在屏幕上显示所输入的内容
  • HTML 各种表单和输入框用法介绍
  • 我要处理用户输入的一个字符窜。怎样写用户输入这段代码?
  • C语言下,如何识别键盘输入和文件输入?
  • 请问在RH9下我怎么输入汉字呢?输入法在哪儿可以打开.
  • linux怎么输入中文? 有没有中文输入法阿?
  • 为什么我的jb4打开后输入法会自动变成中文输入啊
  • 如何验证表单没有输入任何内容(包括只输入空格)
  • 请教一下,如何在英文FC3中调用输入法输入中文?
  • 谁知道什么软件能在linux下输入中文, 和下载中文输入法网址, 急,急,急!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3