示例#1
0
/*============================================================================*/
tmErrorCode_t
setHwRegisters
(
    tmHdmiTxobject_t *pDis,
    UInt16 regShadPageAddr,
    UInt8 *pData,
    UInt16 lenData
)
{
    tmErrorCode_t   err;        /* Error code */
    UInt8           regShad;    /* The index to the register's shadow copy */
    UInt8           regPage;    /* The index to the register's page        */
    UInt8           regAddr;    /* The register's address on the page      */
    UInt8           newRegPage; /* The register's new page number          */
    tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function   */

    /* Unpack 1st register's shadow index, page index and address */
    regShad = SPA2SHAD(regShadPageAddr);
    regPage = SPA2PAGE(regShadPageAddr);
    regAddr = SPA2ADDR(regShadPageAddr);
    newRegPage = kPageIndexToPage[regPage];

    /* Check length does not overflow page */
    RETIF_BADPARAM((regAddr+lenData) > E_REG_CURPAGE_ADR_W)

    /* Check 1st reg does not have a shadow - whole range assumed likewise */
    RETIF_BADPARAM(regShad != E_SNONE)

    /* Set page register if required - whole range is on same page */
    if (pDis->curRegPage != newRegPage)
    {
        /* All non-OK results are errors */
        sysArgs.slaveAddr       = pDis->uHwAddress;
        sysArgs.firstRegister   = E_REG_CURPAGE_ADR_W;
        sysArgs.lenData         = 1;
        sysArgs.pData           = &newRegPage;
        err = pDis->sysFuncWrite(&sysArgs);
        RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_WRITE)
        pDis->curRegPage = newRegPage;
    }

    /* Write to I2C register range - all non-OK results are errors */
    sysArgs.slaveAddr       = pDis->uHwAddress;
    sysArgs.firstRegister   = regAddr;
    sysArgs.lenData         = (UInt8)lenData;
    sysArgs.pData           = pData;
    err = pDis->sysFuncWrite(&sysArgs);

    if (err == TM_OK)
    {
        return TM_OK;

    }
    else
    {
        printk(KERN_ERR "[HDMI] TMBSL_ERR_HDMI_I2C_WRITE  %s %d\n",__func__,__LINE__);
        return TMBSL_ERR_HDMI_I2C_WRITE;
    }
}
/*============================================================================*/
tmErrorCode_t
    tmbslTDA9989EdidGetAudioCapabilities
    (tmUnitSelect_t txUnit,
     tmbslHdmiTxEdidSad_t *pEdidAFmts, UInt aFmtLength, UInt *pAFmtsAvail, UInt8 *pAudioFlags) {
	tmHdmiTxobject_t *pDis;	/* Pointer to Device Instance Structure */
	tmErrorCode_t err;	/* Error code */
	UInt i;			/* Loop index */

	/* Check unit parameter and point to TX unit object */
	err = checkUnitSetDis(txUnit, &pDis);
	RETIF(err != TM_OK, err)

	    /* Check remaining parameter(s) */
	    RETIF_BADPARAM(pEdidAFmts == Null)
	    RETIF_BADPARAM(aFmtLength < 1)
	    RETIF_BADPARAM(pAFmtsAvail == Null)
	    RETIF_BADPARAM(pAudioFlags == Null)

	    if ((pDis->EdidStatus == HDMITX_EDID_READ) ||
		(pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) {
		/* allow if edid are read or if there are a chk error on an other block than block 0 */

		/* Copy the Device Instance Structure EdidAFmts descriptors to
		 * pEdidAFmts until we run out or no more space in structure.
		 */
		if (pDis->EdidSadCnt > 0) {
			for (i = 0; (i < (UInt) pDis->EdidSadCnt) && (i < aFmtLength); i++) {
				pEdidAFmts[i].ModeChans = pDis->EdidAFmts[i].ModeChans;
				pEdidAFmts[i].Freqs = pDis->EdidAFmts[i].Freqs;
				pEdidAFmts[i].Byte3 = pDis->EdidAFmts[i].Byte3;
			}
		} else {
			/* No pEdidAFmts to copy so set a zero format to be safe */
			pEdidAFmts[0].ModeChans = 0;
			pEdidAFmts[0].Freqs = 0;
			pEdidAFmts[0].Byte3 = 0;
		}

		/* Fill Audio Flags parameter */
		*pAudioFlags = ((pDis->EdidCeaFlags & 0x40) << 1);	/* Basic audio */
		if (pDis->EdidSinkAi == True) {
			*pAudioFlags += 0x40;	/* Mask in AI support */
		}

		/* Fill number of SADs available parameter */
		*pAFmtsAvail = pDis->EdidSadCnt;
	} else {
		/* Not allowed if EdidStatus value is not valid */
		err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE;
	}
	return err;
}
/*============================================================================*/
tmErrorCode_t
lmemcpy
(
    void *pTable1,
    const void * pTable2,
    UInt Size
)
{
    char *ptrSource = (char*) pTable1;
    char *endSource = (char*)pTable1 + Size;
    char *ptrDest = (char *)pTable2;

    RETIF_BADPARAM(pTable1 == Null)
    RETIF_BADPARAM(pTable2 == Null)

    while (endSource > ptrSource)
    {
        *(ptrSource++) = *(ptrDest++);
    }
    return TM_OK;
}
/*============================================================================*/
tmErrorCode_t tmbslTDA9989EdidGetStatus(tmUnitSelect_t txUnit, UInt8 *puEdidStatus) {
	tmHdmiTxobject_t *pDis;	/* Pointer to Device Instance Structure */
	tmErrorCode_t err;	/* Error code */

	/* Check unit parameter and point to TX unit object */
	err = checkUnitSetDis(txUnit, &pDis);
	RETIF(err != TM_OK, err)

	    /* Check remaining parameter(s) */
	    RETIF_BADPARAM(puEdidStatus == Null)

	    if (puEdidStatus) {
		*puEdidStatus = pDis->EdidStatus;
	}

	return err;
}
/*============================================================================*/
tmErrorCode_t tmbslTDA9989EdidGetBlockCount(tmUnitSelect_t txUnit, UInt8 *puEdidBlockCount) {
	tmHdmiTxobject_t *pDis;	/* Pointer to Device Instance Structure */
	tmErrorCode_t err;	/* Error code */

	/* Check unit parameter and point to TX unit object */
	err = checkUnitSetDis(txUnit, &pDis);
	RETIF(err != TM_OK, err)

	    /* Check remaining parameter(s) */
	    RETIF_BADPARAM(puEdidBlockCount == Null)

	    if ((pDis->EdidStatus == HDMITX_EDID_READ) ||
		(pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) {
		/* allow if edid are read or if there are a chk error on an other block than block 0 */
		*puEdidBlockCount = pDis->EdidBlockCnt;
	} else {
		/* Not allowed if EdidStatus value is not valid */
		err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE;
	}

	return err;
}
/*============================================================================*/
tmErrorCode_t
    tmbslTDA9989HwGetCapabilities
    (tmUnitSelect_t txUnit, tmbslHdmiTxHwFeature_t deviceCapability, Bool *pFeatureSupported) {
	tmHdmiTxobject_t *pDis;
	tmErrorCode_t err = TM_OK;

	/* Check unit parameter and point to its object */
	err = checkUnitSetDis(txUnit, &pDis);
	RETIF(err != TM_OK, err)

	    RETIF_BADPARAM(pFeatureSupported == Null)

	    * pFeatureSupported = False;


	switch (deviceCapability) {
	case HDMITX_FEATURE_HW_HDCP:
		if ((pDis->uDeviceFeatures & E_MASKREG_P00_VERSION_not_h) == 0) {
			*pFeatureSupported = True;
		}
		break;
	case HDMITX_FEATURE_HW_SCALER:
		if ((pDis->uDeviceFeatures & E_MASKREG_P00_VERSION_not_s) == 0) {
			*pFeatureSupported = True;
		}
		break;
	case HDMITX_FEATURE_HW_AUDIO_OBA:
		*pFeatureSupported = True;
		break;
	case HDMITX_FEATURE_HW_AUDIO_DST:
		*pFeatureSupported = False;
		break;
	case HDMITX_FEATURE_HW_AUDIO_HBR:
		*pFeatureSupported = False;
		break;
	case HDMITX_FEATURE_HW_HDMI_1_1:
		*pFeatureSupported = True;
		break;
	case HDMITX_FEATURE_HW_HDMI_1_2A:
		*pFeatureSupported = True;
		break;
	case HDMITX_FEATURE_HW_HDMI_1_3A:
		*pFeatureSupported = False;
		break;

	case HDMITX_FEATURE_HW_DEEP_COLOR_30:
		*pFeatureSupported = False;
		break;

	case HDMITX_FEATURE_HW_DEEP_COLOR_36:
		*pFeatureSupported = False;
		break;

	case HDMITX_FEATURE_HW_DEEP_COLOR_48:
		*pFeatureSupported = False;
		break;

	case HDMITX_FEATURE_HW_UPSAMPLER:
		*pFeatureSupported = True;
		break;

	case HDMITX_FEATURE_HW_DOWNSAMPLER:
		*pFeatureSupported = True;
		break;

	case HDMITX_FEATURE_HW_COLOR_CONVERSION:
		*pFeatureSupported = True;
		break;

	default:
		*pFeatureSupported = False;
		break;
	}


	return err;
}