示例#1
0
static void SiiMhlMscAbortTimerCB(void * pArg)
{
    SiiOsTimerDelete(MscAbortTimer);
    MscAbortTimer = NULL;
    mscAbortFlag = false;
    SiiMhlTriggerSoftInt();
}
long SiiMhlIoctl(struct file *pFile, unsigned int ioctlCode, unsigned long ioctlParam)
{
	long retStatus = 0;
	Register_t RegisterInfo;
	uint8_t reg;
	UserControl_t user_control;
	if (HalAcquireIsrLock() != HAL_RET_SUCCESS) {
		return -ERESTARTSYS;
	}
	switch (ioctlCode) {
	case SII_IOCTRL_REGISTER_READ:
		retStatus = copy_from_user(&RegisterInfo, (Register_t *) ioctlParam,
					   sizeof(Register_t));
		if (!retStatus) {
			RegisterInfo.value =
			    I2C_ReadByte(RegisterInfo.dev_address, RegisterInfo.subaddr);
			retStatus =
			    copy_to_user((Register_t *) ioctlParam, &RegisterInfo,
					 sizeof(Register_t));
		} else {
			pr_info("register read error!\n");
		}
		break;
	case SII_IOCTRL_REGISTER_WRITE:
		retStatus = copy_from_user(&RegisterInfo, (Register_t *) ioctlParam,
					   sizeof(Register_t));
		reg = I2C_ReadByte(RegisterInfo.dev_address, RegisterInfo.subaddr);
		reg = (reg & (~RegisterInfo.mask)) | (RegisterInfo.mask & RegisterInfo.value);
		I2C_WriteByte(RegisterInfo.dev_address, RegisterInfo.subaddr, reg);
		break;
	case SII_IOCTRL_USER:
		retStatus = copy_from_user(&user_control, (UserControl_t *) ioctlParam,
					   sizeof(UserControl_t));
		switch (user_control.ControlID) {
		case USER_GPIO_GET:
			/* HalGpioGetPin(user_control.SubCommand.GpioCtrl.GpioIndex, &user_control.SubCommand.GpioCtrl.Value); */
			break;
		case USER_GPIO_SET:
			/* HalGpioSetPin(user_control.SubCommand.GpioCtrl.GpioIndex, user_control.SubCommand.GpioCtrl.Value); */
			break;
		case USER_TRIGGER_EXT_INT:
			/* SiiTriggerExtInt(); */
			break;
		case USER_TRIGGER_MHL_INT:
			{
				if (TestDelay != NULL) {
					SiiOsTimerDelete(TestDelay);
					TestDelay = NULL;
				}
				SiiOsTimerCreate("Abort Time Out", SiiMhlTimerTestCB, NULL, true,
						 2000, false, &TestDelay);
			}
			break;
		case USER_ON_OFF_MHL_INT:
			HalEnableIrq(user_control.SubCommand.iSubCommand ? 1 : 0);
			break;
		case USER_RESET_MHL_CHIP:
			SiiMhlTxInitialize(EVENT_POLL_INTERVAL_MS);
			break;
		case USER_READ_SINK_EDID:
			{
#define _MASK_(aByte, bitMask, setBits) ((setBits) ? (aByte | bitMask) : (aByte & ~bitMask))
				int RepeatNums = 5, i;
				int iRepeatCnt = 0;
				uint8_t reg;
				uint8_t reg_save;
				reg_save = reg = I2C_ReadByte(0x72, 0xC7);
				reg = _MASK_(reg, BIT0, 1);
				I2C_WriteByte(0x72, 0xc7, reg);
				do {
					if (++iRepeatCnt > RepeatNums)
						break;
					reg = I2C_ReadByte(0x72, 0xC7);
					HalTimerWait(10);
				} while (!(reg & BIT1));
				if (iRepeatCnt > RepeatNums) {
					printk("try time out\n");
				} else {
					reg = I2C_ReadByte(0x72, 0xC7);
					reg = _MASK_(reg, BIT2, 1);
					I2C_WriteByte(0x72, 0xc7, reg);
					for (i = 0; i < 256; i++) {
					}
					I2C_ReadBlock(0xa0, 0, user_control.SubCommand.EDID, 128);
					I2C_ReadBlock(0xa0, 128, &user_control.SubCommand.EDID[128],
						      128);
					I2C_WriteByte(0x72, 0xc7, reg_save);
				}
			}
			break;
		}
		retStatus = copy_to_user((UserControl_t *) ioctlParam,
					 &user_control, sizeof(UserControl_t));
		break;
	default:
		SII_DEBUG_PRINT(SII_OSAL_DEBUG_TRACE,
				"SiiMhlIoctl, unrecognized ioctlCode 0x%0x received!\n", ioctlCode);
		retStatus = -EINVAL;
		break;
	}
	HalReleaseIsrLock();
	return retStatus;
}
示例#3
0
static uint8_t CBusProcessErrors( uint8_t intStatus )
{
    uint8_t result          = 0;
    uint8_t abortReason  = 0;
    intStatus &= (BIT_MSC_ABORT | BIT_MSC_XFR_ABORT | BIT_DDC_ABORT);
    if ( intStatus )
    {
		if( intStatus & BIT_DDC_ABORT )
		{
			abortReason |= SiiRegRead(REG_DDC_ABORT_REASON);
			TX_DEBUG_PRINT( ("CBUS:: DDC ABORT happened. Clearing 0x0C\n"));
            SiiRegWrite(REG_DDC_ABORT_REASON, 0xFF);
		}
        if ( intStatus & BIT_MSC_XFR_ABORT )
        {
            abortReason |= SiiRegRead(REG_MSC_REQ_ABORT_REASON );
            TX_DEBUG_PRINT( ("CBUS:: MSC Requester ABORTED. Clearing 0x0D\n"));
            SiiRegWrite(REG_MSC_REQ_ABORT_REASON , 0xFF);
        }
        if ( intStatus & BIT_MSC_ABORT )
        {
            abortReason |= SiiRegRead(REG_MSC_RES_ABORT_REASON );
            TX_DEBUG_PRINT( ("CBUS:: MSC Responder ABORT. Clearing 0x0E\n"));
            SiiRegWrite(REG_MSC_RES_ABORT_REASON , 0xFF);
        }
        if ( abortReason & (BIT0|BIT1|BIT2|BIT3|BIT4|BIT7) )
        {
            TX_DEBUG_PRINT( ("CBUS:: Reason for ABORT is ....0x%02X \n", (int)abortReason ));
            if ( abortReason & CBUSABORT_BIT_REQ_MAXFAIL)
            {
                TX_DEBUG_PRINT( ("Retry threshold exceeded\n"));
            }
            if ( abortReason & CBUSABORT_BIT_PROTOCOL_ERROR)
            {
                TX_DEBUG_PRINT( ("Protocol Error\n"));
            }
            if ( abortReason & CBUSABORT_BIT_REQ_TIMEOUT)
            {
                TX_DEBUG_PRINT( ("Translation layer timeout\n"));
            }
            if ( abortReason & CBUSABORT_BIT_UNDEFINED_OPCODE)
            {
                TX_DEBUG_PRINT( ("Undefined opcode\n"));
            }
            if ( abortReason & CBUSABORT_BIT_UNDEFINED_OFFSET)
            {
                TX_DEBUG_PRINT( ("Undefined offset\n"));
            }
            if ( abortReason & CBUSABORT_BIT_PEER_BUSY)
            {
                TX_DEBUG_PRINT( ("Opposite device is busy\n"));
            }
            if ( abortReason & CBUSABORT_BIT_PEER_ABORTED)
            {
#ifndef __KERNEL__
                HalTimerSet(TIMER_ABORT, T_ABORT_NEXT);
                mscAbortFlag = true;
#else
                if(MscAbortTimer)
                {
                    SiiOsTimerDelete(MscAbortTimer);
                    MscAbortTimer = NULL;
                }
                mscAbortFlag = true;
                SiiOsTimerCreate("Abort Time Out", SiiMhlMscAbortTimerCB, NULL, true,
                2000, false, &MscAbortTimer);
#endif
                TX_DEBUG_PRINT( ("Peer sent an abort, start 2s timer Tabort_next\n"));
            }
        }
    }
    return( result );
}
static void SiiMhlTimerTestCB(void *pArg)
{
	SiiOsTimerDelete(TestDelay);
	TestDelay = NULL;
	SiiMhlTriggerSoftInt();
}