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;
}
Exemple #2
0
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;
		}
	}
}