zoukankan      html  css  js  c++  java
  • android中kl布局文件加载失败解决办法

    涉及的代码文件

      input驱动程序

        1、input_dev->name                                                    是自定义的,可以根据实际函数确定,是确定kl文件的条件之一

        2、input_dev->evbit[0] = BIT_MASK(EV_KEY)           该条代码可有可无,目前还不清楚

          set_bit(EV_KEY, input_dev->evbit)                          用来确定驱动上报的设备类型,此处为key

      通用Generic.kl布局文件

        通用布局文件是系统提供的一个比较全面的kl文件,主要用于系统的鼠标、键盘、触摸屏等输入设备使用

      自己创建的devicename.kl布局文件

        可以参考Generic.kl布局文件,添加自己需要的键值

      inputdevice.cpp布局文件路径搜索

        根据的文件后缀名进行搜索,.idc, .kl, .kcm, 只有在.kl和.kcm文件同时存在时,才表示搜索成功

      eventhub.cpp输入事件获取,识别以及加载

        使用getevent函数获取event事件后,更具device的name和id进行搜索.idc, .kl, .kcm, 同时通过ioctl函数获取驱动中的输入设备类型,以及具体事件,例如KEY_HOME, KEY_BACK, KEY_ENTER等事件,最终决定加载哪个kl和kcm

      keyboard.cpp加载map

        根据搜索到的路劲加载kl和kcm

    主要流程和注意事项

      在原生uart串口驱动已有的前提下,通过编写应用程序去读串口接收的数据(这里采用select方式比较多,非阻塞模式),根据串口通信协议检测接收的数据是否正确且完整,将接受的数据进行相应的逻辑处理后将结果通过系统函数进行上报,上报的数据通过android输入系统进入内核,内核通过eventhub程序中的getevent函数获取上报的数据(一般为键值),通过根据对应输入设备驱动传入(ioctl函数)的设备事件类型以及相关具体键值事件进行匹配kl文件,然后keyboard程序中的loadmap函数对kl文件进行加载,加载后的键值数据映射android层的键值并传入android层供上层使用,上层具体操作这里不再赘述。

      注意:输入设备驱动中的设备name和设备id是确定加载哪个kl的关键,自定义后,一定要检查系统中的kl文件名要与之对应

           一般情况下,系统加载kl文件的优先级为:设备name>设备id>Generic.kl>最后尝试虚拟kl文件

          kl文件的格式说明:key     158(linux系统层的键值)    BACK(android层对应的按键功能,其字符串对应android层的键值)

          输入设备驱动input_dev中设定的键值范围一定不能超过Generic.kl中现有键值的范围,否则kl会加载失败,其中可以单独set_bit(); 也可for循环进行一段范围的set_bit

          在现有android系统中Generic.kl默认给系统的鼠标、键盘、和触摸屏,以及虚拟设备;当自定义的keyboard输入设备(如遥控器)匹配Generic.kl文件时,系统键盘将无法正常使用,会产生冲突(具体原因不明)

         

  • 相关阅读:
    Python 多线程就这么简单
    Linux中使用SecureCRT上传、下载文件命令sz与rz用法实例
    LAMP第四部分 mysql相关
    LAMP第三部分php配置和mysql配置
    LAMP第二部分apache的配置
    LAMP第一部分安装mysql -apache -php
    LAMP总四部分
    用户和组管理
    系统操作命令
    2017网易---统计回文
  • 原文地址:https://www.cnblogs.com/goahead--linux/p/13048263.html
Copyright © 2011-2022 走看看