Step 21.EventHub.openDevice
这个函数定义在frameworks/base/libs/ui/EventHub.cpp文件中:
        
  1. intEventHub::openDevice(constchar*deviceName){
  2. intversion;
  3. intfd;
  4. structpollfd*new_mFDs;
  5. device_t**new_devices;
  6. char**new_device_names;
  7. charname[80];
  8. charlocation[80];
  9. charidstr[80];
  10. structinput_idid;
  11. LOGV("Openingdevice:%s",deviceName);
  12. AutoMutex_l(mLock);
  13. fd=open(deviceName,O_RDWR);
  14. if(fd<0){
  15. LOGE("couldnotopen%s,%s\n",deviceName,strerror(errno));
  16. return-1;
  17. }
  18. ......
  19. intdevid=0;
  20. while(devid<mNumDevicesById){
  21. if(mDevicesById[devid].device==NULL){
  22. break;
  23. }
  24. devid++;
  25. }
  26. ......
  27. mDevicesById[devid].seq=(mDevicesById[devid].seq+(1<<SEQ_SHIFT))&SEQ_MASK;
  28. if(mDevicesById[devid].seq==0){
  29. mDevicesById[devid].seq=1<<SEQ_SHIFT;
  30. }
  31. new_mFDs=(pollfd*)realloc(mFDs,sizeof(mFDs[0])*(mFDCount+1));
  32. new_devices=(device_t**)realloc(mDevices,sizeof(mDevices[0])*(mFDCount+1));
  33. if(new_mFDs==NULL||new_devices==NULL){
  34. LOGE("outofmemory");
  35. return-1;
  36. }
  37. mFDs=new_mFDs;
  38. mDevices=new_devices;
  39. ......
  40. device_t*device=newdevice_t(devid|mDevicesById[devid].seq,deviceName,name);
  41. if(device==NULL){
  42. LOGE("outofmemory");
  43. return-1;
  44. }
  45. device->fd=fd;
  46. mFDs[mFDCount].fd=fd;
  47. mFDs[mFDCount].events=POLLIN;
  48. mFDs[mFDCount].revents=0;
  49. //Figureoutthekindsofeventsthedevicereports.
  50. uint8_tkey_bitmask[sizeof_bit_array(KEY_MAX+1)];
  51. memset(key_bitmask,0,sizeof(key_bitmask));
  52. LOGV("Gettingkeys...");
  53. if(ioctl(fd,EVIOCGBIT(EV_KEY,sizeof(key_bitmask)),key_bitmask)>=0){
  54. //Seeifthisisakeyboard.Ignoreeverythinginthebuttonrangeexceptfor
  55. //gamepadswhicharealsoconsideredkeyboards.
  56. if(containsNonZeroByte(key_bitmask,0,sizeof_bit_array(BTN_MISC))
  57. ||containsNonZeroByte(key_bitmask,sizeof_bit_array(BTN_GAMEPAD),
  58. sizeof_bit_array(BTN_DIGI))
  59. ||containsNonZeroByte(key_bitmask,sizeof_bit_array(KEY_OK),
  60. sizeof_bit_array(KEY_MAX+1))){
  61. device->classes|=INPUT_DEVICE_CLASS_KEYBOARD;
  62. device->keyBitmask=newuint8_t[sizeof(key_bitmask)];
  63. if(device->keyBitmask!=NULL){
  64. memcpy(device->keyBitmask,key_bitmask,sizeof(key_bitmask));
  65. }else{
  66. deletedevice;
  67. LOGE("outofmemoryallocatingkeybitmask");
  68. return-1;
  69. }
  70. }
  71. }
  72. ......
  73. if((device->classes&INPUT_DEVICE_CLASS_KEYBOARD)!=0){
  74. chartmpfn[sizeof(name)];
  75. charkeylayoutFilename[300];
  76. //amoredescriptivename
  77. device->name=name;
  78. //replaceallthespaceswithunderscores
  79. strcpy(tmpfn,name);
  80. for(char*p=strchr(tmpfn,'');p&&*p;p=strchr(tmpfn,''))
  81. *p='_';
  82. //findthe.klfileweneedforthisdevice
  83. constchar*root=getenv("ANDROID_ROOT");
  84. snprintf(keylayoutFilename,sizeof(keylayoutFilename),
  85. "%s/usr/keylayout/%s.kl",root,tmpfn);
  86. booldefaultKeymap=false;
  87. if(access(keylayoutFilename,R_OK)){
  88. snprintf(keylayoutFilename,sizeof(keylayoutFilename),
  89. "%s/usr/keylayout/%s",root,"qwerty.kl");
  90. defaultKeymap=true;
  91. }
  92. status_tstatus=device->layoutMap->load(keylayoutFilename);
  93. if(status){
  94. LOGE("Error%dloadingkeylayout.",status);
  95. }
  96. //telltheworldaboutthedevname(thedescriptivename)
  97. if(!mHaveFirstKeyboard&&!defaultKeymap&&strstr(name,"-keypad")){
  98. //thebuilt-inkeyboardhasawell-knowndeviceIDof0,
  99. //thisdevicebetternotgoaway.
  100. mHaveFirstKeyboard=true;
  101. mFirstKeyboardId=device->id;
  102. property_set("hw.keyboards.0.devname",name);
  103. }else{
  104. //ensuremFirstKeyboardIdissetto-something-.
  105. if(mFirstKeyboardId==0){
  106. mFirstKeyboardId=device->id;
  107. }
  108. }
  109. charpropName[100];
  110. sprintf(propName,"hw.keyboards.%u.devname",device->id);
  111. property_set(propName,name);
  112. //'Q'keysupport=cheaptestofwhetherthisisanalpha-capablekbd
  113. if(hasKeycodeLocked(device,AKEYCODE_Q)){
  114. device->classes|=INPUT_DEVICE_CLASS_ALPHAKEY;
  115. }
  116. //SeeifthisdevicehasaDPAD.
  117. if(hasKeycodeLocked(device,AKEYCODE_DPAD_UP)&&
  118. hasKeycodeLocked(device,AKEYCODE_DPAD_DOWN)&&
  119. hasKeycodeLocked(device,AKEYCODE_DPAD_LEFT)&&
  120. hasKeycodeLocked(device,AKEYCODE_DPAD_RIGHT)&&
  121. hasKeycodeLocked(device,AKEYCODE_DPAD_CENTER)){
  122. device->classes|=INPUT_DEVICE_CLASS_DPAD;
  123. }
  124. //Seeifthisdevicehasagamepad.
  125. for(size_ti=0;i<sizeof(GAMEPAD_KEYCODES)/sizeof(GAMEPAD_KEYCODES[0]);i++){
  126. if(hasKeycodeLocked(device,GAMEPAD_KEYCODES[i])){
  127. device->classes|=INPUT_DEVICE_CLASS_GAMEPAD;
  128. break;
  129. }
  130. }
  131. LOGI("Newkeyboard:device->id=0x%xdevname='%s'propName='%s'keylayout='%s'\n",
  132. device->id,name,propName,keylayoutFilename);
  133. }
  134. ......
  135. mDevicesById[devid].device=device;
  136. device->next=mOpeningDevices;
  137. mOpeningDevices=device;
  138. mDevices[mFDCount]=device;
  139. mFDCount++;
  140. return0;
  141. }

更多相关文章

  1. 学习深入理解android第一章
  2. android 文件下载到SD卡中
  3. java android 删除文件和文件夹的函数
  4. 安装Android(安卓)SDK
  5. Android自定义Dialog去除黑色边框
  6. Android中Log机制
  7. Android设计开发要必用的Color.xml文件整理
  8. [置顶] android 中使用回调函数
  9. Android中java.lang.ClassNotFoundException: ***.**** in loade

随机推荐

  1. Gallery組件學習总结及OutOfMemoryError:
  2. 修改软键盘的回车键为发送键
  3. android ImageView实现图片浏览器(点击左
  4. android heapStartSize heapMaximumSize
  5. android fastboot flash system 失败
  6. Android APK分析工具
  7. persist应用
  8. Android面试题目总结
  9. Android无法启动虚拟机
  10. Android音视频开发学习笔记