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文件时,系统键盘将无法正常使用,会产生冲突(具体原因不明)

     

posted on 2020-06-05 10:31  二进制的奥秘  阅读(822)  评论(0编辑  收藏  举报

导航