android系统按键从linux到java流程
概述:
  android系统的键值转换,从linux到java共经历3个层次分别是
  1 linux系统层,原始ir键值读取,转变为linux层键值
  2 framework层,linux层键值转换为android键值
  3 framework层,android键值上报java层
  关系图:
剩余疑问:dev/vinputdev/input之间到底怎么关联的
 
 
  目前没查到这二者是怎么关联的,但是从用户组可以看出,vinput应该是input的输入。
  猜测:这二者之间类似一个软连接处理,避免键值读写都在同一个文件,在不同进程之间造成数据异常;二者由系统负责同步。
  后续查到相关资料再补充.
1 原始ir键值读取,转变为linux层键值
  核心输入: 系统启动android_ir_user后台进程
  核心输出: 虚拟设备dev/vinput,写入linux键值
1.1 流程图
1.2转换流程详细说明:
1.2.1/device/hisilicon/bigfish/system/ir_user/key_l:
该文件编译后输出到/etc目录下。
定义原始硬件码值和对应linux层通用键名:
      < key value="0x639c4db2" name="KEY_MUTE"/>
1.2.2/device/hisilicon/bigfish/system/ir_user/key_pars/linux_key.h:
定义linux层通用键名和linux层键值的对应关系:
      {"KEY_MUTE",        113      },
结构linux和安卓的关系linux_keycode_ary类型的数组Linux_KeyCode_Ary[512].
1.2.3/device/hisilicon/bigfish/system/ir_user/key_pars/ key_pars.c:
提供接口get_keycode解析xml建立原始码值和linux层键值的映射数组
get_keycode(_key_arry *keyarry, int keyarry_num)解析:
a:调用readXml读取/etc/ l,返回xml根节点:
      l<hisi-key><other-key>分别各一个节点,我们的遥控器原始键值配置在<other-key>中。
b:调用Pars_Key解析每个节点下的所有按键:
      解析节点下的所有children节点,通过value属性获取xml定义的原始键值,通过name属性获取xml定义的键名字符串,再调用find_linux_key_code查询这个字符串对应的linux层键值。
      把这个映射关系存储到:
      keyarry->hi_keycode[keynum].ir_keycode = ir_keycode;
      keyarry->hi_keycode[keynum].linux_keycode = linux_keycode;
c: find_linux_key_code函数遍历在linux_key.h定义的Linux_KeyCode_Ary数组,到参数str(即键名字符串)对应的linux层键值。
1.2.4/device/hisilicon/bigfish/system/ir_user/ir_user.cpp:
1)编译为后台进程android_ir_user独立运行;
2)进程启动,执行main入口函数,调用get_keycode完成key.xml存储原始码值和linux层键值的映射关系到数组keyarry
3)建立ir_sample_thread线程读取原始码值,根据keyarry转换为linux层键值,通过ReportKeyEvent写入dev/vinput设备,其他进程可以读取键值
1.3总结
    出差拷机,如果不想其他厂家操作我们的盒子,只需要离开的时候删除/system/bin下面的android_ir_user这个bin文件即可。
2 linux层键值转换为android键值
  核心输入: /dev/input, 输入linux键值
  核心输出: 1)getEvents(),输出RawEvent* buffer,存储linux层键值;
          2)mapKey(),将linux层键值转换为android键值
2.1流程图
2.2详细说明
2.2.1 /device/hisilicon/bigfish/prebuilts/Vendor_0001_Product_0001.kl:
      定义linux键值和对应的键名字符串
      key 113  MUTE
2.2.2 /frameworks/native/include/input/KeycodeLabels.h
      定义键名字符串和android的java层键值对应关系结构数组KEYCODES
      { "MUTE", 91 }
2.2.3\frameworks\native\libs\input\ Keyboard.cpp
      提供函数loadKeyLayoutgetPath,定位linux到android键第一转换映射文件为Vendor_0001_Product_0001.kl:
      提供函数getKeyCodeByLabel,从KeycodeLabels.hKEYCODES数组中,查询返回android的java键值。
2.2.4\frameworks\native\libs\input\ KeyLayoutMap.cpp
      提供函数loadparse等解析Vendor_0001_Product_0001.kl,并调用Keyboard.cppgetKeyCodeByLabel,通过“linux键值---键名字符串---android的java层键值”的直接建立“linux键值--- android的java层键值map集合;
      提供函数mapKey基于此集合供上层转换linux键值为androidjava键值
2.2.5 \frameworks\base\services\input\EventHub.cpp
      1 提供getEvents,完成两个事:
      1):建立linux键值--- android的java层键值”map集合。
      2):扫描linux键值,存储到参数RawEvent* buffer
      2 提供mapKey,调用KeyLayoutMap.cppmapKey函数,完成转换linux键值为androidjava键值。
2.2.6关于建立linux键值--- android的java层键值”map集合,代码流程:
      1)\frameworks\base\services\input\EventHub.cpp
        a)getEvents()-> scanDevicesLocked():
 
        b)scanDevicesLocked-> scanDirLocked():
        static const char *DEVICE_PATH = "/dev/input";
     
      c)scanDirLocked()->openDeviceLocked()
        d) openDeviceLocked()->loadKeyMapLocked()
       
      e) loadKeyMapLocked调用Keyboard.cppload()函数:
  2)\frameworks\native\libs\input\ Keyboard.cpp   
      f) load()->probeKeyMap():
      g) probeKeyMap ()->loadKeyLayout():

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。