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 SiiMhlTxGetEvents(uint8_t *event, uint8_t *eventParameter) { TPI_Poll(); MhlTxDriveStates(); *event = MHL_TX_EVENT_NONE; *eventParameter = 0; if (mhlTxConfig.mhlConnectionEvent) { TPI_DEBUG_PRINT(("MhlTx: SiiMhlTxGetEvents mhlConnectionEvent\n")); mhlTxConfig.mhlConnectionEvent = false; *event = mhlTxConfig.mhlConnected; *eventParameter = mhlTxConfig.mscFeatureFlag; if (MHL_TX_EVENT_DISCONNECTION == mhlTxConfig.mhlConnected) { MhlTxResetStates(); } else if (MHL_TX_EVENT_CONNECTION == mhlTxConfig.mhlConnected) { WriteByteCBUS(0x13, 0x30) ; WriteByteCBUS(0x14, 0x01) ; WriteByteCBUS(0x12, 0x08) ; WriteByteCBUS(0x13, 0x20) ; WriteByteCBUS(0x14, 0x01) ; WriteByteCBUS(0x12, 0x08) ; } } else if (mhlTxConfig.mscMsgArrived) { TPI_DEBUG_PRINT(("MhlTx: SiiMhlTxGetEvents MSC MSG <%02X, %02X>\n", (int) (mhlTxConfig.mscMsgSubCommand), (int) (mhlTxConfig.mscMsgData))); mhlTxConfig.mscMsgArrived = false; switch (mhlTxConfig.mscMsgSubCommand) { case MHL_MSC_MSG_RAP: if (0x10 == mhlTxConfig.mscMsgData) SiiMhlTxDrvTmdsControl(true); else if (0x11 == mhlTxConfig.mscMsgData) SiiMhlTxDrvTmdsControl(false); SiiMhlTxRapkSend(); break; case MHL_MSC_MSG_RCP: if (MHL_LOGICAL_DEVICE_MAP & rcpSupportTable[mhlTxConfig.mscMsgData & 0x7F]) { *event = MHL_TX_EVENT_RCP_RECEIVED; *eventParameter = mhlTxConfig.mscMsgData; } else { mhlTxConfig.mscSaveRcpKeyCode = mhlTxConfig.mscMsgData; SiiMhlTxRcpeSend(RCPE_INEEFECTIVE_KEY_CODE); } break; case MHL_MSC_MSG_RCPK: *event = MHL_TX_EVENT_RCPK_RECEIVED; *eventParameter = mhlTxConfig.mscMsgData; break; case MHL_MSC_MSG_RCPE: *event = MHL_TX_EVENT_RCPE_RECEIVED; *eventParameter = mhlTxConfig.mscMsgData; break; case MHL_MSC_MSG_RAPK: break; default: break; } } }