📄 ctvtuner.c
字号:
} // Call CObject constructor with bAllocate = FALSE CObject__New ((CObject**)ppCTvTuner, pName, FALSE, dwInstance); // Call CI2C constructor CI2C__New ( (CI2C**)(&this->m_pII2C), pName, TRUE, dwInstance ); if (this->m_pII2C == NULL) { if (bAllocate) OSfree(*ppCTvTuner); *ppCTvTuner = NULL; return; } // Initialize virtual table this->VTable.Delete = CTvTuner__Delete; this->VTable.Init = CTvTuner__Init; this->VTable.Write = CTvTuner__Write; this->VTable.Read = CTvTuner__Read; this->VTable.InitPropertySet = CTvTuner__InitPropertySet; this->VTable.SetProperty = CTvTuner__SetProperty; this->VTable.GetProperty = CTvTuner__GetProperty; this->VTable.Test = CTvTuner__Test; this->lpVtbl = &this->VTable;}/****f* HwLib/ITvTuner_Delete * USAGE * ITvTuner_Delete(ITvTuner* pITvTuner, BOOL bDeleteObject) * CTvTuner__Delete(ITvTuner* pITvTuner, BOOL bDeleteObject) * DESCRIPTION * ITvTuner_Delete - frees memory for the specified TvTuner object. * ITvTuner_Delete plays the role of the destructor in C++. * PARAMETERS * IN ITvTuner* pITvTuner - pointer to the object created by a previous * call to CTvTuner__CreateInstance or CTvTuner__New. * BOOL bDeleteObject - usually called with TRUE to free memory for object. * - if FALSE doesn't free any memory. * SEE ALSO * CTvTuner__CreateInstance, CTvTuner__New/********************************************************************************************/void CTvTuner__Delete ( ITvTuner* pITvTuner, BOOL bDeleteObject ){ CTvTuner* this = (CTvTuner*) pITvTuner ; if (this == NULL) return; // Release what we were using // Call CI2C Destructor II2C_Delete ( this->m_pII2C, bDeleteObject ); // Call CObject Destructor CObject__Delete ((IObject*)this, FALSE); if (bDeleteObject) { // Delete CTvTuner OSfree(pITvTuner); }}/****f* HwLib/ITvTuner_Init * USAGE * void ITvTuner_Init(ITvTuner* pITvTuner) * void CTvTuner__Init(ITvTuner* pITvTuner) * DESCRIPTION * ITvTuner_Init - initialize the TvTuner object * It is called by CreateInstance. * PARAMETERS * IN ITvTuner* pITvTuner - pointer to the TvTuner object/********************************************************************************************/void CTvTuner__Init ( ITvTuner* pITvTuner ){ CTvTuner* this = (CTvTuner*) pITvTuner; II2C_SetI2CAddress( this->m_pII2C, TVTUNER_WRITE_ADDR, TVTUNER_READ_ADDR, TVTUNER_I2C_BUS_SPEED); II2C_Init( this->m_pII2C );}/****f* HwLib/ITvTuner_Write * USAGE * QRESULT ITvTuner_Write(ITvTuner* pITvTuner, BYTE Address, BYTE* pData) * QRESULT CTvTuner__Write(ITvTuner* pITvTuner, BYTE Address, BYTE* pData) * PARAMETERS * IN ITvTuner* pITvTuner - pointer to the TvTuner object * IN BYTE Address - address of the I2C register to write * IN BYTE* pData - pointer to the BYTE data to write/********************************************************************************************/QRESULT CTvTuner__Write( ITvTuner* pITvTuner, BYTE Address, BYTE* pData ){ // there is no subaddress for tv tuner: Address is ignored. // write size is 4 bytes (div1 div2 ctrl1 ctrl2) CTvTuner* this = (CTvTuner*) pITvTuner; BOOL bRet = II2C_Write_NoSubAddr(this->m_pII2C, pData, 4); QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" WriteTvTuner %02x %02x %02x %02x"),pData[0],pData[1],pData[2],pData[3])); return bRet? Q_OK:Q_FAIL;}/****f* HwLib/ITvTuner_Read * USAGE * QRESULT ITvTuner_Read(ITvTuner* pITvTuner, BYTE Address, BYTE* pData) * QRESULT CTvTuner__Read(ITvTuner* pITvTuner, BYTE Address, BYTE* pData) * PARAMETERS * IN ITvTuner* pITvTuner - pointer to the TvTuner object * IN BYTE Address - address of the I2C register to read * IN BYTE* pData - pointer where the BYTE data is read/********************************************************************************************/QRESULT CTvTuner__Read( ITvTuner* pITvTuner, BYTE Address, BYTE* pData ){ // there is no subaddress for tv tuner: Address is ignored. // read size is one byte (status byte) CTvTuner* this = (CTvTuner*) pITvTuner; BOOL bRet = II2C_Read_NoSubAddr(this->m_pII2C, pData, 1); QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" ReadTvTuner %02x"), *pData)); return bRet? Q_OK:Q_FAIL;}void CTvTuner__InitPropertySet(ITvTuner* pITvTuner, void* pPropSet, DWORD dwSize){ CTvTuner* this = (CTvTuner*) pITvTuner; if(dwSize != sizeof(PROPERTY_SET_ITEM)) return; InitPropSet(pITvTuner, pPropSet, TVTUNER_SET, eTvTunerMax,\ this->TvTunerPropertyList, CTvTuner__SetProperty, CTvTuner__GetProperty)}/****f* HwLib/ITvTuner_SetProperty * USAGE * QRESULT ITvTuner_SetProperty(ITvTuner* pITvTuner, * DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) * QRESULT CTvTuner__SetProperty(ITvTuner* pITvTuner, * DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) * PARAMETERS * IN ITvTuner* pITvTuner - pointer to the TvTuner object/********************************************************************************************/QRESULT CTvTuner__SetProperty( ITvTuner* pITvTuner, DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut){ // TVTUNER use DWORD for changing information and size condition is already checked DWORD Value = *(DWORD*)pData; QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT(" --> CTvTuner__SetProperty: set=%x id=%x flags=%x sz=%x value=%x"), PropSet, PropId, Flags, dwSizeIn, Value)); switch(PropId) { case eTvTunerChannel: { eTvTunerChannel_type* peTvTunerChannel_value = (eTvTunerChannel_type *)pData; BYTE channel_data[4],status; CHECK_SIZE(eTvTunerChannel) switch(peTvTunerChannel_value->evTvTunerRange_value) { #define CHJUMP 4 case evTvTunerRange_NTSC_MNAIR: if (peTvTunerChannel_value->eTvTunerChannelInRange >= sizeof(channel_NTSC_MN_AIR) / CHJUMP) return E_INVALID_PROPERTY_BUFFER; OSmemcpy(channel_data,&channel_NTSC_MN_AIR[peTvTunerChannel_value->eTvTunerChannelInRange*CHJUMP],4); break; case evTvTunerRange_NTSC_MNCABLE: if (peTvTunerChannel_value->eTvTunerChannelInRange >= sizeof(channel_NTSC_MN_CABLE) / CHJUMP) return E_INVALID_PROPERTY_BUFFER; OSmemcpy(channel_data,&channel_NTSC_MN_CABLE[peTvTunerChannel_value->eTvTunerChannelInRange*CHJUMP],4); break; #undef CHJUMP case evTvTunerRange_SECAM_AIR_France: { // for TEMIC 4046 FM5 (see linux kernel tuner.c) // it seems div=8288 for France2 using L2 #define TEMIC_SET_PAL_L 0x0a // SECAM ?#define TEMIC_SET_PAL_L2 0x0b // change IF ! unsigned long div=peTvTunerChannel_value->eTvTunerChannelInRange; /* PAL L: 622.4=16*38.90 PAL L2: 543.2=16*33.95 */ channel_data[0]=(BYTE)(div/256); channel_data[1]=(BYTE)(div%256); channel_data[2]=/*tun->config=*/0x8e; channel_data[3]=/*tun->UHF=*/0x30|TEMIC_SET_PAL_L2; QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT("CTvTuner__SetProperty want to set SECAM_AIR_France div=%d (norm=%02x uhf=%dMHz)"), div, (channel_data[3]&0x0f), (div-(((channel_data[3]&0x0f)==TEMIC_SET_PAL_L2)?543:622))*1000/16)); } break; default: return E_INVALID_PROPERTY_BUFFER; } ITvTuner_Write(pITvTuner,0,channel_data); ITvTuner_Read(pITvTuner,0,&status); QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT("CTvTuner__SetProperty status is POR=%d FL=%d A2=%d A1=%d A0=%d"), status&(1<<7), status&(1<<6), status&(1<<2), status&(1<<1), status&(1<<0) )); } break; default: return E_NOT_SUPPORTED; } return Q_OK;}/****f* HwLib/ITvTuner_GetProperty * USAGE * QRESULT ITvTuner_GetProperty(ITvTuner* pITvTuner, * DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) * QRESULT CTvTuner__GetProperty(ITvTuner* pITvTuner, * DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) * PARAMETERS * IN ITvTuner* pITvTuner - pointer to the TvTuner object/********************************************************************************************/QRESULT CTvTuner__GetProperty( ITvTuner* pITvTuner, DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut){ // TVTUNER use DWORD for changing information and size condition is already checked DWORD Value; switch(PropId) { default: return E_NOT_SUPPORTED; } *(DWORD*)pData = Value; QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT(" <-- CTvTuner__GetProperty: set=%x id=%x flags=%x sz=%x value=%x"), PropSet, PropId, Flags, dwSizeIn, Value)); return Q_OK;}QRESULT CTvTuner__Test(ITvTuner* pITvTuner){ int Error = 0; return Error ? E_TEST_TVTUNER_FAILED : Q_OK;}#else // ! TVTUNER_OBJECTvoid CTvTuner__CreateInstance(void **ppv, DWORD dwInstance){ *ppv = NULL;}#endif // TVTUNER_OBJECT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -