void SiiMhlTxMscCommandDone(uint8_t data1) { TPI_DEBUG_PRINT(("MhlTx: SiiMhlTxMscCommandDone. data1 =%02X\n", (int) data1)); if ((MHL_READ_DEVCAP == mhlTxConfig.mscLastCommand) && (0x02 == mhlTxConfig.mscLastOffset)) { #ifdef CONFIG_INTERNAL_CHARGING_SUPPORT SiiMhlTxMscDetectCharger(data1); #else mhlTxConfig.mscState = MSC_STATE_POW_DONE; #endif } else if ((MHL_READ_DEVCAP == mhlTxConfig.mscLastCommand) && (0x0A == mhlTxConfig.mscLastOffset)) { mhlTxConfig.mscState = MSC_STATE_RCP_READY; mhlTxConfig.mscFeatureFlag = data1; mhlTxConfig.mhlConnectionEvent = true; mhlTxConfig.mhlConnected = MHL_TX_EVENT_RCP_READY; mhlTxConfig.mscLastCommand = 0; mhlTxConfig.mscLastOffset = 0; TPI_DEBUG_PRINT(("MhlTx: Peer's Feature Flag =%02X\n", (int) data1)); } else if (MHL_MSC_MSG_RCPE == mhlTxConfig.mscMsgLastCommand) { if (SiiMhlTxRcpkSend(mhlTxConfig.mscSaveRcpKeyCode)) { mhlTxConfig.mscMsgLastCommand = 0; mhlTxConfig.mscMsgLastData = 0; } } }
static void mhl_work(struct work_struct *work) { int T_Monitor = T_MONITORING_PERIOD; while(1) { SiiOsScheduler(); if (!T_Monitor) { if (rcpKeyCode >= 0) { if (!MhlTxCBusBusy()) { // SiiOsDebugPrintSimple(SII_OSAL_DEBUG_TRACE_ALWAYS,"App:%d Sending RCP (%02X)\n",(int)__LINE__, (int) rcpKeyCode); // // If RCP engine is ready, send one code // if( SiiMhlTxRcpSend( (uint8_t)rcpKeyCode )) { // SiiOsDebugPrintSimple(SII_OSAL_DEBUG_TRACE_ALWAYS,"App:%d SiiMhlTxRcpSend (%02X)\n",(int)__LINE__, (int) rcpKeyCode); } else { // SiiOsDebugPrintSimple(SII_OSAL_DEBUG_TRACE_ALWAYS,"App:%d SiiMhlTxRcpSend (%02X) Returned Failure.\n",(int)__LINE__, (int) rcpKeyCode); } rcpKeyCode = -1; } } #ifdef ENABLE_WRITE_BURST_TEST else if ( (!MhlTxCBusBusy()) && (testStart) ) { #define TEST_COUNT_LIMIT 100 if (testCount < TEST_COUNT_LIMIT) { static uint8_t testData[17]="MyDogHasFleas\0\0\0"; if (0 == SiiMhlTxRequestWriteBurst(0,sizeof(testData)-1,testData)) { testCount++; } } else { testStart = 0; SiiOsDebugPrintSimple(SII_OSAL_DEBUG_TRACE_ALWAYS,"App:%d Write Burst test complete after %d iterations\n",(int)__LINE__,testCount); } } #endif //) if (rcpkParam >= 0) { SiiMhlTxRcpkSend((uint8_t)rcpkParam); rcpkParam = -1; } T_Monitor = T_MONITORING_PERIOD; } else { T_Monitor--; } msleep(10); } }
ssize_t SendRcpAck(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned long keyCode = 0x100; unsigned long errCode = 0x100; char *pStr; int status = -EINVAL; SII_DEBUG_PRINT(SII_OSAL_DEBUG_TRACE,"SendRcpAck received buf len = %d\n", count); while(count) { SII_DEBUG_PRINT(SII_OSAL_DEBUG_TRACE,"SendRcpAck received string: ""%s""\n", buf); pStr = strstr(buf, "keycode="); if(pStr != NULL) { if(strict_strtoul(pStr + strlen("keycode="), 0, &keyCode)) { SII_DEBUG_PRINT(SII_OSAL_DEBUG_TRACE, "Unable to convert keycode string\n"); break; } } pStr = strstr(buf, "errorcode="); if(pStr != NULL) { if(strict_strtoul(pStr + strlen("errorcode="), 0, &errCode)) { SII_DEBUG_PRINT(SII_OSAL_DEBUG_TRACE, "Unable to convert keycode string\n"); break; } } while(--count&&*buf++); } if((keyCode > 0xFF) || (errCode > 0xFF)) { SII_DEBUG_PRINT(SII_OSAL_DEBUG_TRACE,"Invalid key code or error code "\ "specified, key code: 0x%02x error code: 0x%02x\n", (int)keyCode, (int)errCode); return status; } if(HalAcquireIsrLock() != HAL_RET_SUCCESS) { return -ERESTARTSYS; } while(gDriverContext.flags & MHL_STATE_FLAG_RCP_READY) { if((keyCode != gDriverContext.keyCode) || !(gDriverContext.flags & MHL_STATE_FLAG_RCP_RECEIVED)) { SII_DEBUG_PRINT(SII_OSAL_DEBUG_TRACE, "Attempting to ACK a key code that was not received!\n"); break; } if(errCode == 0) { SiiMhlTxRcpkSend((uint8_t)keyCode); } else { SiiMhlTxRcpeSend((uint8_t)errCode); } status = count; break; } HalReleaseIsrLock(); return status; }
void ProcessRcp(uint8_t event, uint8_t eventParameter) { uint8_t rcpKeyCode; switch (event) { case MHL_TX_EVENT_DISCONNECTION: TPI_DEBUG_PRINT(("App: Got event = MHL_TX_EVENT_DISCONNECTION\n")); break; case MHL_TX_EVENT_CONNECTION: TPI_DEBUG_PRINT(("App: Got event = MHL_TX_EVENT_CONNECTION\n")); break; case MHL_TX_EVENT_RCP_READY: #if 0 rcpKeyCode = APP_DEMO_RCP_SEND_KEY_CODE; TPI_DEBUG_PRINT(("App: Got event = MHL_TX_EVENT_RCP_READY...Sending RCP (%02X)\n", (int) rcpKeyCode)); if ((0 == (BIT_0 & eventParameter))) TPI_DEBUG_PRINT(("App: Peer does NOT support RCP\n")); if ((0 == (BIT_1 & eventParameter))) TPI_DEBUG_PRINT(("App: Peer does NOT support RAP\n")); if ((0 == (BIT_2 & eventParameter))) TPI_DEBUG_PRINT(("App: Peer does NOT support WRITE_BURST\n")); if (SiiMhlTxRcpSend(rcpKeyCode)) { TPI_DEBUG_PRINT(("App: SiiMhlTxRcpSend (%02X)\n", (int) rcpKeyCode)); TPI_DEBUG_PRINT(("Stupid coding check\n")); } else TPI_DEBUG_PRINT(("App: SiiMhlTxRcpSend (%02X) Returned Failure.\n", (int) rcpKeyCode)); #endif break; case MHL_TX_EVENT_RCP_RECEIVED: TPI_DEBUG_PRINT(("App: Received an RCP key code = %02X\n", eventParameter)); rcpKeyCode = ProcessRcpKeyCode(eventParameter); SiiMhlTxRcpkSend((int) rcpKeyCode); break; case MHL_TX_EVENT_RCPK_RECEIVED: TPI_DEBUG_PRINT(("App: Received an RCPK = %02X\n", (int)eventParameter)); break; case MHL_TX_EVENT_RCPE_RECEIVED: TPI_DEBUG_PRINT(("App: Received an RCPE = %02X\n", (int)eventParameter)); break; case MHL_TX_EVENT_NONE: break; default: TPI_DEBUG_PRINT(("App: Got event = %02X, eventParameter = %02X\n", (int)event, (int)eventParameter)); break; } }
void AppRcpDemo( uint8_t event, uint8_t eventParameter) { uint8_t rcpKeyCode; //printf("App: Got event = %02X, eventParameter = %02X\n", (int)event, (int)eventParameter); switch( event ) { case MHL_TX_EVENT_DISCONNECTION: printk("App: Got event = MHL_TX_EVENT_DISCONNECTION\n"); #ifdef CONFIG_OPPO_MODIFY //added by zhangyue on 2011-11-01 for adding the auto hpd feature #ifdef zy_auto_hpd //deleted by zhangyue on 2011-12-23 for debug audio problem start //external_common_enable_hpd_feature(false); //deleted by zhangyue on 2011-12-23 for debug audio problem end #endif #endif break; case MHL_TX_EVENT_CONNECTION: printk("App: Got event = MHL_TX_EVENT_CONNECTION\n"); #ifdef CONFIG_OPPO_MODIFY //added by zhangyue on 2011-11-01 for adding the auto hpd feature #ifdef zy_auto_hpd //modified by zhangyue on 2012-01-09 for debug the first plugin mhl can not output video start //external_common_enable_hpd_feature(true); //modified by zhangyue on 2012-01-09 for debug the first plugin mhl can not output video start #endif #endif break; case MHL_TX_EVENT_RCP_READY: // Demo RCP key code PLAY rcpKeyCode = APP_DEMO_RCP_SEND_KEY_CODE; printk("App: Got event = MHL_TX_EVENT_RCP_READY...Sending RCP (%02X)\n", (int) rcpKeyCode); if( (0 == (MHL_FEATURE_RCP_SUPPORT & eventParameter)) ){ printk( "App: Peer does NOT support RCP\n" ); } if( (0 == (MHL_FEATURE_RAP_SUPPORT & eventParameter)) ){ printk( "App: Peer does NOT support RAP\n" ); } if( (0 == (MHL_FEATURE_SP_SUPPORT & eventParameter)) ){ printk( "App: Peer does NOT support WRITE_BURST\n" ); } // // If RCP engine is ready, send one code // if( SiiMhlTxRcpSend( rcpKeyCode )){ printk("App: SiiMhlTxRcpSend (%02X)\n", (int) rcpKeyCode); }else{ printk("App: SiiMhlTxRcpSend (%02X) Returned Failure.\n", (int) rcpKeyCode); } break; case MHL_TX_EVENT_RCP_RECEIVED: // // Check if we got an RCP. Application can perform the operation here // and send RCPK or RCPE. For now, we send the RCPK // #ifdef ZY_IMPLEMENT_RCP rcpKeyCode = eventParameter; #else rcpKeyCode = eventParameter & 0x7F; #endif printk("App1: Received an RCP key code = %02X\n", (int)rcpKeyCode ); // Added RCP key printf and interface with UI. //by oscar 20101217 #ifdef ZY_IMPLEMENT_RCP input_report_mhl_rcp_key(rcpKeyCode); #endif SiiMhlTxRcpkSend(rcpKeyCode); break; case MHL_TX_EVENT_RCPK_RECEIVED: printk("App: Received an RCPK = %02X\n",MHL_TX_EVENT_RCPK_RECEIVED); break; case MHL_TX_EVENT_RCPE_RECEIVED: printk("App: Received an RCPE = %02X\n",MHL_TX_EVENT_RCPE_RECEIVED); break; default: break; } }