mstar android-supernva key处理流程

来源:互联网 发布:32u网络机柜尺寸 编辑:程序博客网 时间:2024/05/14 19:26

Mstar 6A638平台MHL按键KEY发送流程

分类: Mstar_MHL  |  标签: Mstar MHL  |  作者: kevinx_xu 相关  |  发布日期 : 2015-09-23  |  热度 : 393°
2015年9月18日 
  1. Android 部分
    1. RootActivity
      android/device/mstar/common/apps/MTvPlayer/src/com/mstar/tv/tvplayer/ui/RootActivity.java
      2185 public boolean onKeyDown(int keyCode, KeyEvent event) {
      //此处对MHL进行检测,看是否有MHL 的设备接入,如果没有,则不进行下发,如果有,则继续发送
      2232 if (mTvMhlManager.CbusStatus() == true && mTvMhlManager.IsMhlPortInUse() == true) {
      //调用mTvMhlManager 中的IRKeyProcess 进行key 的发送
      2233 if (mTvMhlManager.IRKeyProcess(keyCode, false) == true) {
      2234 SystemClock.sleep(140);
      2235 return true;
      2236 }
      2237 } ...

    2. TvMhlManager
      android/device/mstar/common/libraries/tv2/java/com/mstar/android/tv/TvMhlManager.java
      129 public boolean IRKeyProcess(int keycode, boolean bIsRelease) {
      130 ITvMhl service = getService();
      131 try {
      //只是转去调用TvMhlService.java 中的IRKeyProcess
      132 return service.IRKeyProcess(keycode, bIsRelease);
      133 } catch (RemoteException e) {
      134 e.printStackTrace();
      135 }
      136 return false;
      137 }
      138
    3. TvMhlService
      android/device/mstar/common/libraries/tv2/MTvService/src/com/mstar/tv/service/TvMhlService.java
      103 public boolean IRKeyProcess(int keycode, boolean isRelease) throws RemoteException {
      //此处获取MStar tvapi 中的MhlManager.java进行调用
      104 return TvManager.getInstance().getMhlManager().IRKeyProcess(keycode, isRelease);
      105 }
    4. MhlManager
      android/device/mstar/common/libraries/tvapi/java/com/mstar/android/tvapi/common/MhlManager.java
      //直接调用JNI 中的函数
      147 // native fuc
      148 public native final boolean IRKeyProcess(int keycode, boolean bIsRelease);
    5. com_mstar_android_tvapi_common_MhlManager
      android/device/mstar/common/libraries/tvapi/jni/com_mstar_android_tvapi_common_MhlManager.cpp
      //向android注册此接口
      391 {"IRKeyProcess", "(IZ)Z", (void *)com_mstar_android_tvapi_common_MhlManager_IRKeyProcess},
      296 jboolean com_mstar_android_tvapi_common_MhlManager_IRKeyProcess
      297 (JNIEnv *env, jobject thiz, jint keycode, jboolean bIsRelease) {
      298 ALOGI("IRKeyProcess");
      299 sp<MhlManager> srv = getMhlManager(env, thiz);
      300 if (srv == NULL) {
      301 jniThrowException(env, "com/mstar/android/tvapi/common/exception/TvIpcException", "can not connect to server");
      302 return 0;
      303 }
      304
      305 jint size = sizeof(astRCPKeyTranslate) / sizeof(android2MufKey);
      306 for (jint i = 0; i < size; i++) {
          //NOTE:此处对Android 的Key 与 muf 的Key 进行转换,如果发现有哪些Key没发送成功,可以先查下此表是不是有对应的Key 进行转换
      307 if (astRCPKeyTranslate[i].androidKeyCode == keycode) {
      308 return srv->IRKeyProcess(astRCPKeyTranslate[i].mufKeyCode, bIsRelease);
           //对Key值进行转换后,进行本地方法的调用,调用 Supervnoa 中tvos MhlManager 的接口进行发送,此处进行 Supernova
      309 }
      310 }
      311 return false;
      312 }
      313
  2. Supernova 部分
    1. MhlManager
      Supernova/projects/tvos/mhlmanager/libmhlmanager/MhlManager.cpp
      241 bool MhlManager::IRKeyProcess(int32_t keycode, bool bIsRelease)
      242 {
      243 ALOGV("IRKeyProcess\n\n");
      244 if(mMhlManager == NULL)
      245 {
      246 return false;
      247 }
      248
      //调用"mstar.mhlmanager" 的服务MhlManagerService connect 时返回的代理IMhlManager BpMhlManager进行发送
      249 return mMhlManager->IRKeyProcess(keycode, bIsRelease);
      250 }
      251

    2. IMhlManager
      Supernova/projects/tvos/mhlmanager/libmhlmanager/IMhlManager.cpp
      130 bool BpMhlManager::IRKeyProcess(int32_t keycode, bool bIsRelease)
      131 {
      132 ALOGV("Send MHL_IRKEYPROCESS\n");
      133 Parcel data, reply;
      134 data.writeInterfaceToken(IMhlManager::getInterfaceDescriptor());
      135 data.writeInt32(keycode);
      136 data.writeInt32(bIsRelease);
      137 remote()->transact(MHL_IRKEYPROCESS, data, &reply);
      //通过Binder来调用服务端进行发送
      138 return static_cast<bool>(reply.readInt32());
      139 }
      140
      178 status_t BnMhlManager::onTransact(uint32_t code,
      179 const Parcel& data,
      180 Parcel* reply,
      181 uint32_t flags)
      182 {
      183 switch(code)
      184 {
      ...
      200 case MHL_IRKEYPROCESS:
      201 {
      202 ALOGV("Receive MHL_IRKEYPROCESS\n");
      203 CHECK_INTERFACE(IMhlManager, data, reply);
      204 int32_t keycode = data.readInt32();
      205 int32_t bIsReleas = data.readInt32();
                      //调用 MhlManagerService 中的服务函数来进行调用Msrv
      206 reply->writeInt32(IRKeyProcess(keycode, (bool)bIsReleas));
      207 return NO_ERROR;
      208 } break;
      ...

    3. MhlManagerService 
      Supernova/projects/tvos/mhlmanager/libmhlmanagerservice/MhlManagerService.cpp
      281 bool MhlManagerService::Client::IRKeyProcess(int32_t u32RCPKey, bool bIsRelease)
      282 {
      283 #if(RELEASE_BINDER_TEST == 1)
      284 TEST_BOOL_SHORT("IRKeyProcess","u32RCPKey",u32RCPKey) ;
      285 #endif
      286
      287 TVOS_API_ESTIMATE_START()
      288 TVOS_API_ESTIMATE_START(LOCK)
      289 Mutex::Autolock lock(m_FuncLock);
      290 TVOS_API_ESTIMATE_END(LOCK)
      291 bool ret = false;
      292 #if (MHL_ENABLE == 1)
      293 ALOGV("IRKeyProcess(callingPid %d, clientPid %d)\n", IPCThreadState::self()->getCallingPid(), m_ClientPid);
      294
      295 ret = MSrv_Control::GetMSrvMHL()->IRKeyProcess((U32)u32RCPKey, (bool)bIsRelease);  
              //调用MSrv层的服务
      296 #endif
      297 TVOS_API_ESTIMATE_END()
      298 return ret;
      299 }

    4. MSrv_MHL
      Supernova/projects/msrv/common/src/MSrv_MHL.cpp
      611 // Key Event
      612 MAPI_BOOL MSrv_MHL::IRKeyProcess(U32 u32RCPKey, BOOL bIsRelease)
      613 {
      614 if(m_pMhl==NULL)
      615 {
      616 return false;
      617 }
      618 return m_pMhl->IRKeyProcess(u32RCPKey,bIsRelease);
      //调用Mapi中的内容进行发送
      //m_pMhl = mapi_interface::Get_mapi_mhl();
      619 }

    5. mapi_mhl
      Supernova/MStarSDK/src/devices/mhl/mapi_mhl.cpp
      153 MAPI_BOOL mapi_mhl::IRKeyProcess(MAPI_U32 u32RCPKey, MAPI_BOOL bIsRelease)
      154 {
      155 // mapi_scope_lock(scopeLock, &m_Mutex);
      156
      157 if(stMapiMHLFun.IRKeyProcess == NULL)
      158 {
      159 printf("!!!!! Error: Mhl SendRCP PressRelease Cmd = NULL");
      160 return MAPI_FALSE;
      161 } 162
      163 return(stMapiMHLFun.IRKeyProcess(u32RCPKey,bIsRelease)); //NOTE:此处的Mapi 可以认为是一个傀儡,在device_mhl.cpp 中会实现mapi_mhl 中的接口函数,mapi_mhl 只是将所有的调用接口转给
      device_mhl
      164 }

    6. device_mhl
      Supernova/projects/devices/mhl/device_mhl.cpp
      412 MAPI_BOOL device_mhl::IRKeyProcess( MAPI_U32 u32Keycode, MAPI_BOOL bIsRelease)
      413 {
      414 MAPI_U8 u8RcpKey, u8Idx;// u8Len;
      415
      416 //printf("IR Key: 0x%x %x\r\n", static_cast<MAPI_U16>(0xFFFF & (u32Keycode>>16)), static_cast<MAPI_U16>(0xFFFF & u32Keycode));
      417 if(bIsRelease == MAPI_TRUE) 418 {
      419 printf("MHL utopia will send RCP Release key after Press key\r\n");
      420 return MAPI_FALSE;
      421 }
      422 for(u8Idx = 0; u8Idx < LENGTH_TRANSLATION_ARRAY; u8Idx++)
      423 {
      424 if (astRCPKeyTranslate[u8Idx].u8IRKeyCode == u32Keycode)
      425 {
      426 u8RcpKey = astRCPKeyTranslate[u8Idx].u8RCPKeyCode;          //此处将muf key 转化为 RCP 的key 即转化为标准的MHL 定义的key 如果发现有哪些Key没发送成功,
      //可以先查下此表是不是有对应的Key 进行转换
      427 printf("RCP Key: 0x%x\r\n", u8RcpKey);
      428 break;
      429 }
      430 }
      431
      432 if (u8Idx == LENGTH_TRANSLATION_ARRAY)
      433 {
      434 printf("IR key is not supported by RCP key, AL = %d\r\n", LENGTH_TRANSLATION_ARRAY);
      435 return MAPI_FALSE;
      436 }
      437 else
      438 {
      439 return mapi_mhl_SendRCPAutoReleaseCmd(u8RcpKey); //调用Mapi 的接口将RCP key发送
      //oh, My God. 此处调用的utopia 的接口进行协议发送。已经打包了,看不到了哦,一般不会有问题,有问题只能请MStar进行协助解决了。
      440 //return msapi_mhl_SendRCPCmd(u8RcpKey);
      441 }
      442

   以上为Android 到Supernova 中的整个MHL key 的发送过程。 


原创粉丝点击