數(shù)碼520相關(guān)信息cas0機(jī)頂盒移植手冊_第1頁
數(shù)碼520相關(guān)信息cas0機(jī)頂盒移植手冊_第2頁
數(shù)碼520相關(guān)信息cas0機(jī)頂盒移植手冊_第3頁
數(shù)碼520相關(guān)信息cas0機(jī)頂盒移植手冊_第4頁
數(shù)碼520相關(guān)信息cas0機(jī)頂盒移植手冊_第5頁
已閱讀5頁,還剩114頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

11主要內(nèi) 約 硬件要 軟件要 13/反功能的移 13.1/反的實現(xiàn)流 13.2查詢的實現(xiàn)流 19功能的移 24區(qū)域限制的移植(非必要功能 測 附 標(biāo)準(zhǔn) 本文先介紹了與機(jī)頂盒廠家的約定內(nèi)容(主要包括定義、接口類別和說明術(shù)發(fā)展(簡稱數(shù)碼視訊)的StreamGuard條件接收系統(tǒng)5.1版。CAS數(shù)據(jù)的移植”。這類移植是必須按照順序,逐一要完成的,因為它們是后續(xù)CAS功能移植的基礎(chǔ)。CAS各項功能的,除了標(biāo)識有(可選)的功能外,其他都必的移植”項中,“CAS用到的機(jī)頂盒接口”部分就是要求機(jī)頂盒實現(xiàn)的接口(函數(shù)以接口”就是要求數(shù)碼視訊實現(xiàn)的接口(函數(shù)以“DVTCASTB_”開頭,都在附件的本文檔僅限于在數(shù)碼視訊公司CAS部門及機(jī)頂盒合作廠商內(nèi)部公開, EMM數(shù)據(jù)接收線程最大消耗0字節(jié);Msg線程最大消耗1340字節(jié);Msg需要4K,需要4K,雙向需要10K。Flash:CAS32K字節(jié),為了保護(hù)數(shù)據(jù),CASflash(CAS要用到5個過濾器,即:EcmFilter、PrivateEmmFilter、PublicEmmFilter、IC0.70×Vcc~Vcc+0.3,VIL為-0.3~0.15×VcVOH0.70×Vcc~Vcc+0.3,VOL為0.3~0.15×Vcc。STB加擾時測電壓CAS17K(IPP信息么分配足夠的堆棧空間。CAS會說明需要大空間的接口。ATR。第一個命令過程(數(shù)據(jù)都是十六進(jìn)制Send:00A40400 收到 Recv:9000 :Send:00A40400 收到 Recv:90 9000Send:00b20005 收到Send:0001ff0001 Recv:61 Send:00c00000 Recv:0001640006f709456457000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044565400fdfdfddddddddddddddddddddddddd00000000000000004d1a92Recv:90 9000HRESULTDVTSTBCA_SCAPDU(BYTEbyReaderNo,BYTE*pbyLen,constBYTE*mand,BYTE*byszReply);盒區(qū)分此命令是要送到哪個。單個的,給0即可。byszReply256字節(jié)。DVTSTBCA_SCAPDU1~2(因為有的智能卡命令執(zhí)行時程字,根據(jù)7816的T0協(xié)議要求,機(jī)頂盒需要重新計時。697816的T0DVTSTBCA_SCAPDU接口時,如果通訊失敗應(yīng)重試(reset卡,僅重試一下失敗的讀/寫操作)2次,重試都失敗后才返回錯誤號,CA模DVTSTBCA_SCAPDUDVTSTBCA_SCReset重IC卡,然后調(diào)用DVTSTBCA_SCAPDU重新初始化IC卡。HRESULTDVTSTBCA_SCAPDU(unsignedcharbyReaderNo,unsignedchar*pbyLen,constunsignedchar* mand,unsignedchar*byszReply){inti=0;HRESULThRet=0;BYTEbysw[2]=BYTEbyrpylen=0,bytemplen=bytemplen=*pbyLen;for(i=0;i<100;i++) if(*pbyLen<5){hRet=goto}hRet=ICC_Write( if(hRet)goto}hRet=ICC_Read(&bysw[0]);if(hRet)gotoif(0x60==bysw[0] if((6==(bysw[0]>>4))||(9==(bysw[0]>>4))){hRet=ICC_Read(&bysw[1]);gotoexit;} ){hRet=goto}ifif mand[4]!=(*pbyLen-{hRet=goto} hRet=ICC_Write( if(hRet)goto

*pbyLen=for hRet=ICC_Read(&byszReply[i]);if(hRet)goto}forhRet=ICC_Read(&bysw[i]);if(hRet)goto}byrpylen goto}}

if*pbyLen=}

*pbyLen=byrpylen;*pbyLen+=1;*pbyLen+=return}ST5105方案中,設(shè)置了智能卡操作的超時時間,但是感覺實際上沒有等那么長時答:stuartapi.c文件中,有如下版本定義語句:staticconstST_Revision_tRevision="STUART-REL_1.8.2";1.8.2及以前的版本(1.8.3版本已經(jīng)修改了這個(ST_GetClocksPerSecond()*TimeOut)/1000ST_GetClocksPerSecond()5105中返回值為,如果超時設(shè)置太大,會導(dǎo)致溢出,改為先除后乘可解決,即將上述超時計算代碼改為ST_GetClocksPerSecond()/1000*TimeOut。APDUINS5個命令Reset操作過程,由于受到此小脈沖的影響導(dǎo)致收到了一些數(shù)據(jù),于是在之后的APDU執(zhí)行時出錯。解決辦法是:在scdrv.c文件的SMART_InitiateAnswerToReset函數(shù)中,在SMART_IO_SetBitRate調(diào)用之后,增加空讀操作(SMART_IO_Rx,給參數(shù)為0個字節(jié)Reset操作之前就消除掉了,可以避免對卡的影響。CA模塊中為集成方便和以后問題的查找,會在很多位置調(diào)DVTCASTB_AddDebugMsgSign接口來控制,機(jī)頂盒每次開機(jī)時默認(rèn)為關(guān)閉打印,同時機(jī)頂盒需要提供隱藏的組合鍵,組合鍵觸發(fā)調(diào)用DVTCASTB_AddDebugMsgSign(false)來關(guān)閉打印。CADVTCASTB_AddDebugMsgSign(true)接口來打開其他的地方不會調(diào)用DVTCASTB_AddDebugMsgSign函數(shù)。{}調(diào)用調(diào) 、 調(diào)用DVTSTBCA_RegisterTaskCAS的線程,在成功的任務(wù)內(nèi),會調(diào)如果DVTSTBCA_GetDataFromEeprom返回成功,CA模塊還可能調(diào)用調(diào)用調(diào)用定要進(jìn)行調(diào)優(yōu),每款的數(shù)值都是不同的,可靈活掌握。機(jī)頂盒創(chuàng)建信號量之后,將信號量的標(biāo)識寫入到pSemaphore地址內(nèi)(*pSemaphore=新創(chuàng)建的信號量標(biāo)識;),CA模塊后續(xù)使用。需要注意的是,此函數(shù)不要給信號量加信號,CADVTSTBCA_SemaphoreInit后會馬上調(diào)用DVTSTBCA_SemaphoreSignal來加信號。HRESULTDVTSTBCA_Sleep(intdwMicroseconds功能:把所處的進(jìn)程掛起dwMicroseconds毫秒。longchar*pFlashBeginAddr=0; 如首地址為0x ,就“*ppStartAddr=0x HRESULTDVTSTBCA_ReadDataBuffer(constchar*pStartAddr,long*plDataLen,BYTE*pData);HRESULTDVTSTBCA_WriteDataBuffer(constchar*pStartAddr,long*plDataLen,constBYTE*pData);CASflash中的數(shù)據(jù)應(yīng)修改了,機(jī)頂盒應(yīng)盡快把數(shù)據(jù)更新到flash中。HRESULTDVTSTBCA_SaveDataToEeprom(long*plDataLen,constBYTE*pData){return(HRESULT)-1;}{return(HRESULT)-} boolDVTCASTB_Init();HRESULTDVTSTBCA_RegisterTask(constchar*szName,pThreadFunc{intnTaskPrior;if(NULL==szName||NULL==nTaskPrior=nTaskPrior=8;sTaskID=STB_OSAL_TaskCreate(szName,(STB_OSAL_EntryPoint_t)pTaskFun, if(NULLsTaskID)//判斷任務(wù)創(chuàng)建是否成功returnDVTCAERR_STB_UNKNOWN;return}HRESULTDVTSTBCA_SemaphoreInit(DVTCA_Semaphore*pSemaphore{ if(NULL==pSemaphore)returnDVTCAERR_STB_POINTER_INVALID;//判斷傳入的指針的有效性Id_SemaphoreTB_OSAL_SemCreate("CA_Semphore",STB_OSAL_kFifoNoTimeOut,0);if(NULL==Id_Semaphore)return*pSemaphoreDVTCA_Semaphore)Id_Semaphore;//強(qiáng)制轉(zhuǎn)化變量類型;returnDVTCA_OK;}HRESULTDVTSTBCA_SemaphoreSignal(DVTCA_Semaphore*pSemaphore{ if(NULL==Id_Semaphore=(STB_OSAL_SemId_t)(*pSemaphore);//變量類型轉(zhuǎn)換if(STB_OSAL_kNoError!=sErr)returnreturn}HRESULTDVTSTBCA_SemaphoreWait(DVTCA_Semaphore*pSemaphore{ if(NULL==pSemaphore)Id_Semaphore=(STB_OSAL_SemId_t)(*pSemaphore);sErr=STB_OSAL_SemWait(Id_Semaphore,STB_OSAL_kWaitForEver);if(STB_OSAL_kNoError!=sErr)returnreturn}HRESULTDVTSTBCA_Sleep(intdwMicroseconds{unsignedintms,step,step_ticks=ms=(ST_GetClocksPerSecond()+999)/1000;step=0x7FFFFFFF/ms;if(dwMilliseconds>step)step_ticks=step*ms;while(dwMillisecondsdwMilliseconds-=step;}if(dwMillisecondstask_delay(dwMilliseconds*ms);returnDVTCA_OK;}HRESULTDVTSTBCA_GetDataBufferAddr(long*lSize,char**{StbErr_tsErr=if(NULL==lSize||NULL==sErr=STB_GetCaDataBuf((u32*)lSize,ppStartAddr);if(Err_OK!=returnreturn}StbErr_tSTB_GetCaDataBuf(u32*lSize,char**{if(NULL==lSize||NULL==ppStartAddr)returnErr_CA_BadPara;*lSize=*ppStartAddr=(char*)aCA_DataBuff;returnErr_OK;}BYTE*{char*pbyCaBuf=NULL;u32dwCaSizeBuf=0;StbErr_tsErr=Err_OK;if(NULLpStartAddr||NULLplDataLen||NULLpData)sErr=STB_GetCaDataBuf(&dwCaSizeBuf,&pbyCaBuf);if(Err_OK!=sErr)return//startaddroutofif(pStartAddr<pbyCaBuf||pStartAddr>pbyCaBuf+dwCaSizeBuf)returnDVTCAERR_STB_POINTER_INVALID;//endaddroutofif((pStartAddr+*plDataLen)>(pbyCaBuf+dwCaSizeBuf))returnDVTCAERR_STB_DATA_LEN_ERROR;memcpy((void*)pData,(void*)pStartAddr,(size_t)(*plDataLen));returnDVTCA_OK;}constBYTE*{char*pbyCaBuf=NULL;u32dwCaSizeBuf=0;StbErr_tsErr=Err_OK;if(NULL==pStartAddr||NULL==plDataLen||NULL==pData)returnDVTCAERR_STB_POINTER_INVALID;sErr=STB_GetCaDataBuf(&dwCaSizeBuf,&pbyCaBuf);if(Err_OK!=sErr)return//startaddroutofif((pStartAddr<pbyCaBuf)||(pStartAddr>(pbyCaBuf+dwCaSizeBuf)))returnDVTCAERR_STB_POINTER_INVALID;//endaddroutofif((pStartAddr+*plDataLen)>(pbyCaBuf+dwCaSizeBuf))returnDVTCAERR_STB_DATA_LEN_ERROR;memcpy((void*)pStartAddrvoid*)pData,size_t)(*plDataLen));sErr=SendMsg2Flash(CAINFO_TYPE);//此函數(shù)要做flash備份機(jī)制if(Err_OK!=sErr)returnreturn}Flash到64k的最后面。(也可以最前面。比較crc32:多次flash了,進(jìn)行b)的操作??梢圆蛔?flashDVTSTBCA_GetDataBufferAddr答:請檢查DVTSTBCA_ReadDataBuffer函數(shù)的實現(xiàn)。注意函數(shù)的返回值是Lengthnot答:請檢查DVTSTBCA_ReadDataBuffer函數(shù)的實現(xiàn),是否沒有按傳入的參數(shù)dwReadLen得到指定長度的數(shù)據(jù),或者雖然得到了指定長度的數(shù)據(jù),但是將dwReadLen給錯了。NotDVT分配給CA模塊的flash數(shù)據(jù)被破壞了。LengthnotequaltoInvalidoffset,formatflashDataheadinvalidinflash,format...Pairingdatainvalidineeprom,clear...Pairingdatainvalidinflash,clear...或IDdatainvalidinflash,clear...或UrgencydatainvalidinwriteheadbufferfailedinDVTSYS_SYSInfoFormat!或writeparingflashbufferfailedinDVTSYS_SYSInfoFormat!或write bufferfailedinDVTSYS_SYSInfoFormat!或write IDbufferfailureinDVTSYS_SYSInfoFormat!或writeUrgencyVersionbufferfailureinDVTSYS_SYSInfoFormat!答:OSD/等信息的處理線程失敗,請檢查DVTSTBCA_RegisterTask函間、或者增加一段循環(huán)代碼、或者增加一個變量定義等,可能使問題,但如果機(jī)頂盒中因為某些原因?qū)ㄟM(jìn)行了Reset操作,機(jī)頂盒需要重新調(diào)用一次郵件,調(diào)用DVTSTBCA_Notify(DVTCAS__NEW)。DVTSTBCA_SCReset接口復(fù)位卡,接著也要初始化卡,初始化卡后會返回成功(0),否則返回錯誤號(0)。} }}這個值從0開始,如果機(jī)頂盒只使用一個,給0即可。HRESULTvoid{u32dwErr=dwErr=STB_CA_HidePromptMsg();if(dwErr){CA_PRINT(("error}}initICcardgetcardinfofailed!getratingfailed!或getworktime無(即:相關(guān)接口面的移植中已經(jīng)實現(xiàn),沒有新的接口void機(jī)頂盒在剛上電、PMTDVTCASTB_SetCurEcmInfo()告盒也要調(diào)用DVTCASTB_SetCurEcmInfos,只是此時ECMPID值為0。表,逐一得到其中的CA_Descriptor,調(diào)用DVTCASTB_CASIDVerify校驗此CA_Descriptor中的CA_PID就是數(shù)碼視訊CASECMPID。只在搜索時,進(jìn)行PMT表的分析工作,保存視音頻PID、ECMPID等信息,頻PID、ECMPID等信息。1.機(jī)頂盒剛上電和每次切臺(不管是切到加擾的還是不加擾的Service)的時候串口都會 HRESULTDVTSTBCA_SetStreamGuardFilter(BYTEbyReqID,WORDwPID,constBYTE*szFilter,constBYTE*szMask,BYTEbyLen,intnWaitSeconds){return}true:是數(shù)碼視訊的CASID。1.HRESULTDVTSTBCA_SetStreamGuardFilter(BYTEbyReqID,WORDwPID,constBYTE*szFilter,constBYTE*szMask,BYTEbyLen,intnWaitSeconds){u32if(NULL==szFilter||NULL==szMask)if(8!=returndwErr=ifreturnreturn}0,請檢查是否這樣實現(xiàn)的。訊的ECMPID。答:PMTCA_Descriptor,如果機(jī)頂盒沒有分析到,所以請機(jī)頂盒要逐一分答:端修改加擾的設(shè)置(如修改ECMPID、修改加擾狀態(tài))時會改變,這時也需要調(diào)用DVTCASTB_SetCurEcmInfos告知CA模塊新的ECMPID和ServiceID視、音頻分別加擾的處理說明:當(dāng)加擾,音頻不加擾時,不插卡時,STB應(yīng)該有聲音無圖像;當(dāng)音頻加擾,不加擾時,不插卡時,STB應(yīng)該無聲音有圖像。機(jī)頂盒在剛上電和檢測到CAT表發(fā)生了變化的時候,應(yīng)逐一分析CAT表中包含的CA_Descriptor,調(diào)用DVTCASTB_CASIDVerify校驗此CA_Descriptor中的CA_system_IDDVTCASTB_CASIDVerifytrue就意味著是數(shù)碼視訊的,就調(diào)用DVTCASTB_SetEmmPid函數(shù)設(shè)置EmmPIDCA模塊。的時候則不需要按照此流程處理。答:在同密環(huán)境下,CATCA_DescriptorCA_Descriptor不視訊的之后,應(yīng)該繼續(xù)分析后續(xù)的CA_Descriptor,直到找到屬于數(shù)碼視訊的CA模塊會調(diào)用DVTSTBCA_SetStreamGuardFilter去讓機(jī)頂盒收取數(shù)碼視訊的ECM和時間),機(jī)頂盒在收到數(shù)據(jù)或者過期時間到了的時候必須調(diào)用機(jī)頂盒調(diào)用DVTCASTB_StreamGuardDataGot的時候,要告知CA模塊是哪個filter的反饋(也就是第一個參數(shù)必須與設(shè)置過濾器時一樣。如:CA模塊調(diào)用byszEcmMask,8,2)設(shè)置的過濾器,機(jī)頂盒在2秒內(nèi)過濾到了數(shù)據(jù),機(jī)頂盒用 wReceiveDataLen,byszReceiveData)通知給CA模塊。濾器,但在不釋放過濾器時再次過濾到了新數(shù)據(jù)不應(yīng)再次調(diào)用DVTCASTB_StreamGuardDataGot,需要等DVTSTBCA_SetStreamGuardFilter設(shè)置了filter后再用DVTCASTB_StreamGuardDataGot提供給CA模塊,也就是說,DVTSTBCA_SetStreamGuardFilterDVTCASTB_StreamGuardDataGot是先后交替、一如果是應(yīng)急廣播數(shù)據(jù),會調(diào)用 HRESULTDVTSTBCA_SetStreamGuardFilter(BYTEbyReqID,WORDwPID,constBYTE*szFilter,constBYTE*szMask,BYTEbyLen,intnWaitSeconds);byReqIDFilter的標(biāo)識。機(jī)頂盒應(yīng)該保存該數(shù)據(jù),CASDVTCASTB_StreamGuardDataGot時會用szMask某一bit1bit位一定要與szFilter里對應(yīng)的bit位相同。nWaitSeconds:收此表最長的等待時間(單位為秒)。如果為0則無限等待,此時DVTSTBCA_SetStreamGuardFilterCA模塊先前設(shè)置filterbyReqIDfilter,如果有,必須先釋放掉原來的,然后ST6FilterSTBFilter數(shù)據(jù)和szFilterszMaskTableID2個字節(jié)BYTEi;szActualFilter[i]=szFilter[i+2];}HRESULTDVTSTBCA_SetDescrCW(WORDwEcmPID,BYTEbyKeyLen,constBYTE*szOddKey,constBYTE*szEvenKey,boolbTaControl);wEcmPIDCWECMPIDService的CW。機(jī)頂盒用它來判頂盒應(yīng)不使用這些CW。byKeyLen:CW的長度,目前都是8。 bTaControl:控制,true允許,false。此參數(shù)需要機(jī)頂盒的機(jī)頂盒應(yīng)根據(jù)當(dāng)前TS包頭的加擾控制值(Transport_scrambling_control)說明的奇偶性來使用CW,奇時用奇CW偶時用偶CW(奇數(shù)szEvenKeyCWTransport_scrambling_control值為“10”(偶數(shù))時,那么當(dāng)前的CW用szEvenKey,szOddKey為下一個CW。DVTSTBCA_SetDescrCWService上,此時機(jī)頂盒即使收到了CW也不能使用。DWORD,可以把本身的序列號作一個作一個CRC32,然后把值返回。 值012345沒有此6運(yùn)營商限制該789余額不足,不能此,請及時充值您沒有訂購此IPPV,請到“訂購/訂IPP”菜單下訂您沒有訂購此IPPV,請到“訂購/訂IPP”菜單下訂voidDVTSTBCA_ShowFingerPrinting(DWORDdwCardID,WORDwDuration){return;}voidDVTSTBCA_ShowOSDMsg(constchar*szOSD,WORDwDuration){return;}void return} wServiceID,WORDwDuration){return}DVTSTBCA_CancelUrgencyBroadcast(void){return;}voidDVTSTBCA_InquireBookIpp(WORDwEcmPid,constSDVTCAIpp*pIpp){return;}DVTSTBCA_AreaLockOk(void){r} voidDVTCASTB_StreamGuardDataGot(BYTEbyReqID,boolbSuccess,WORDwPID,WORDwLen,constBYTE*byszReceiveData);個接口通知CA模塊,如果過濾到數(shù)據(jù),還需把數(shù)據(jù)提供給CA模塊。byReqIDFilterDVTSTBCA_SetStreamGuardFilter#define #define #define #defineDVTCA_STB_EMM_Group_SLOT //forGroupAddress#defineDVTCA_STB_EMM_AreaLock_SLOT /*用于過濾特征碼流的過濾器標(biāo)識1.HRESULTDVTSTBCA_SetDescrCW(WORDwEcmPID,BYTEbyKeyLen,constBYTE*szOddKey,constBYTE*szEvenKey,boolbTaControl);{ if(NULL==szOddKey||NULL==szEvenKey)returnif(8!=returnsErr=SMSX_STB_DES_VidSetCW((u8*)szEvenKey,(u8*)szOddKey);if(ST_NO_ERROR!=sErr)returnsErr=SMSX_STB_DES_AudSetCW((u8*)szEvenKey,(u8*)szOddKey);if(ST_NO_ERROR!=sErr)returnreturn}ReqIDCA模塊檢查到DVTCASTB_StreamGuardDataGotbyReqID參數(shù)值不是DVTSTBCA_SetStreamGuardFilterbyReqIDDVTEmm_EmmDataGotfailure.TheEmmPidisCA模塊檢查到DVTCASTB_StreamGuardDataGot的wPid參數(shù)值不是setEcmfilter注意返回值是HRESULT類型,0表示成功,其他表示失敗。CAFilter收不到數(shù)據(jù),但從碼流中分析有數(shù)據(jù)。filter8個字節(jié)的(TableID8個字節(jié)),因2、3個字節(jié)的數(shù)據(jù)去掉,把后面的數(shù)據(jù)往前移。filterTSECM(EMM)包,沒有去的PID去設(shè)置過濾器,因而過濾不到數(shù)據(jù)。濾不到EMM的現(xiàn)象。疑問:CAEMMCA模塊送出的參數(shù)中(8個字答:EMM過濾器有兩個,一個是私有數(shù)據(jù)過濾器,一個是公有數(shù)據(jù)過濾器。公有數(shù)據(jù)過濾器的后4位設(shè)的都是全FF的,是正?,F(xiàn)象。 CADVTSTBCA_SetStreamGuardFilterSTB的過濾傳遞給CA模塊。IC卡把數(shù)據(jù)保存到卡中機(jī)頂盒提供菜單(為第二級的菜單,第一級的菜單為“智能卡服務(wù),接口(SDVTCATvsInfopOperatorInfo[5]140個字節(jié)的內(nèi)空間,大概占10K字節(jié)的內(nèi)存),處理返回值:前端發(fā)送反命令后,提示“沒有此”HRESULTDVTCASTB_GetOperatorInfo(WORDwTVSID,BYTE*pbyCount,SDVTCATvsInfo*pOperatorInfo);張卡內(nèi)的運(yùn)營商信息最多有5個。SDVTCAServiceEntitle*psEntitles);的最大數(shù)組個數(shù)為250。例代碼轉(zhuǎn)成char數(shù)組。//如果線程堆棧不夠時,動態(tài)申請內(nèi)存。注意:此2方法用一種即可 BYTEbyEntitleCount=250;}時間轉(zhuǎn)換函數(shù)boolGetDateStrFromValC(intwInputDate,char*{/*szOutmemoryisprovidedbyoutside,anditsoutformatislike2002-5-22.*/intnYear,nMon,nDay,nTemp,nDate=wInputDate;charsz[30];nYear=1970;if((nYear%4==0&&nYear%100!=0)||nYear%400==0)nTemp=366;nTemp=if(nDate-nTemp<0)nDate-=nTemp;nYear++;nMon=1;if(2==nMon){/*ifisif((nYear%4==0&&nYear%100!=0)||nYear%400==0)/*ifleap.*/nTemp=29;}

nTemp=elseif(4==nMon||6==nMon||9==nMon||11==nMon)nTemp=30;nTemp=if(nDate-nTemp<0)nDate-=nTemp;nMon++;if(1>nMon||12<nMon)returnfalse;nDay=nDay+=nDate;/*day.*/if(1>nDay||31<nDay)returnreturn}時間轉(zhuǎn)換函數(shù)boolGetTimeStrFromValC(u32nInputTime,char*intnDate,nHour,nMin,nSec,nOff,nTime;charnDate=nInputTime/(24*3600);nTime=nInputTime%(24*3600);nHour=nTime/3600;if(24<=(nHour+8))//tolocalhour.nDate++;returnfalse;nOff=strlen(szTime);if(8>nOff)returnnTime=nInputTime%3600;nMin=nTime/60;if(0>nMin||59<nMin)returnfalse;nSec=nTime%if(0>nSec||59<nSec)returnfalse;sprintf(szTime+nOff,"%d:%d:%d",(nHour+8)%24,nMin,nSec);return}用戶沒有不能時,斷掉ECMG后給卡,卡收到了但用戶仍不。FilterCAS數(shù)據(jù)的移植”中的問題需要機(jī)頂盒的filter能夠過濾到數(shù)據(jù),并且要根據(jù)用戶有可以時,斷掉ECMG后給卡反,卡收到了反但用戶仍能繼續(xù)加擾??ㄖ械膇d與前端的加擾id不同。有可能是操作或者前端的STB從IC中讀出的多運(yùn)營商的等信息不全0。例如:STBDVTCASTB_GetOperatorInfo()時,其參數(shù)OperatorNums的初值要賦為CA定義的最大值=DVTCA_MAXNUMBER_TVSID。同理,STBDVTCASTB_GetServiceEntitles()時,數(shù)時,其IPPCount的初值也要賦為CA定義的最大值=250。COS的版本號、智能卡的有效期。(如果函數(shù)返回失敗,機(jī)頂盒提示DVTCASTB_GetAreaInfo得到卡的區(qū)域碼、區(qū)域鎖定狀態(tài)、收到特征機(jī)頂盒調(diào)用DVTCASTB_GetMotherInfo得到母卡。如果為0,則‘子母卡,‘母卡’顯示為函數(shù)得到的。 HRESULTDVTCASTB_GetWorkTime(BYTE*pbyStartHour,BYTE*pbyStartMinute,BYTE*pbyEndHour,BYTE*pbyEndMinute);么只能晚上20:00到第二天5點能收看,其他時間不能收看。 返回值 其他值 失敗,則卡信息中顯示區(qū)域碼為“無”功能得到子母卡配對的信息 值不為0,表示當(dāng)前卡為子卡,值為母卡。返回值 其他值 失敗示用戶“PIN碼如果連續(xù)錯誤3次,將被鎖定”:戶“輸入PIN碼長度錯誤”。如果返回DVTCA_OK:意味著校驗通過,機(jī)頂盒接著調(diào)用如果返回示用戶“新PIN碼長度錯誤”。改PIN碼成功”。 SDVTCAPinPIN.m_byLen=8;nRet=//處理返回值PIN被鎖定。DVTCAERR_STB_DATA_LEN_ERROR:做PIN碼測試時,不要測試3次PIN碼失敗的情況,因為如果測試了,卡必須拿到CAS廠商來才能繼續(xù)使用,浪費(fèi)時間。DVTCAERR_STB_DATA_LEN_ERROR:機(jī)頂盒在界面下方提示用戶“PIN碼長度錯誤”。不接納;如果輸入2,在界面上以顯示2,光標(biāo)后移,讓用戶繼續(xù)輸入小時的低位。DVTCAERR_STB_DATA_LEN_ERROR:機(jī)頂盒在界面下方提示用戶“PIN碼長度錯誤,如果連續(xù)錯誤3次,PIN碼將被鎖定”。錯誤,如果連續(xù)錯誤3次,PIN碼將被鎖定”。DVTCA_OK如果返回失敗,機(jī)頂盒在界面下方提示用戶“修改失敗,小時必須在 HRESULTDVTCASTB_SetWorkTime(BYTEbyStartHour,BYTEbyStartMinute,BYTEbyEndHour,BYTEbyEndMinute);byStartHour:開始工作的小時,取值范圍為0~23。byEndHour:結(jié)束工作的小時,取值范圍為0~23。byEndMinute0~59。OSD數(shù)據(jù),OSD數(shù)據(jù),并返回。機(jī)頂盒在另外線程中檢測到OSD信息,取出并按照要求在電視屏幕下方以左滾字幕形式顯示傳入的信息。機(jī)頂盒無論用哪種方式顯示OSD,但顯示完后,都必須調(diào)用DVTCASTB_ShowOSDMser(wDuration)通知CA模塊顯示完成,wDuration為機(jī)頂盒顯示完此OSD實際花的時間(單位為秒。折超過5秒。{u32dwErr=Err_OK;dwErr=STB_CA_ShowOsdMsg((byte)byPriority,(char*)szOSD);if(dwErr){}}{STB_OSAL_Status_tsErr;char*szBuf=NULL;if(NULL==returnErr_CA_Disy;szBuf=STB_OSAL_MemoryAlloc(strlen(szStr)+1);if(NULL==szBuf)returnErr_CA_Disy;memset(szBuf,0,strlen(szStr)+1);strcpy(szBuf,szStr);sMsg.m_sMsgType.m_dwTaskId=(u32)STB_OSAL_TaskIdSelf(); =szBuf; =sErr=STB_OSAL_MsgSendWithTimeOut(g_sScrollTaskID,&sMsg,if(sErr!={if(sErr=={}{}}

return}答:機(jī)頂盒在顯示完一次OSD后,沒有調(diào)用DVTCASTB_ShowOSDMser來告訴CA模塊這次顯示已經(jīng)完畢,CA模塊認(rèn)為機(jī)頂盒始終沒有顯示完,也就不提供新的顯答:機(jī)頂盒在調(diào)用DVTCASTB_ShowOSDMser接口來通知CA模塊顯示完畢時,傳過來的wDuration比實際顯示的時間要大得多,也就是說機(jī)頂盒計時誤差太大導(dǎo)致OSD顯示少了。盒仍繼續(xù)顯示,直到OSD過期。19功能的移機(jī)頂盒如果在顯示的過程中,CA模塊又調(diào)用了DVTSTBCA_ShowFingerPrinting{u32dwErr=dwErr=STB_CA_ShowFinger((u32)dwCardID,(u32)wDuration);if(dwErr){}}{u32dwErr=Err_OK;OSD_RECT_tsRect;if(0==dwSeconds)returndwErr=CA_DrawFinger(dwID);if(dwErr)return sRect.height=CA_FINGERMSG_H; sRect.y=CA_FINGERMSG_Y+CA_FINGERMSG_Y_STEPdwErr=ifreturnif(dwErr)returnif(dwErr)returnErr_OK;}20功能的移前端發(fā)送令數(shù)據(jù)如果郵箱未滿,調(diào)用DVTSTBCA_Notify(DVTCAS__NEW)通知機(jī)頂 用前需要定義SDVTCAInfo[50]數(shù)組對象或動態(tài)申請50封郵認(rèn)鍵查看郵件內(nèi)容、F3鍵刪除選中的郵件、F4刪除所有郵件。參考界面如下:有的話,成員變量m_wLength應(yīng)不為0,此時提示用戶m_sz中的 byShow:標(biāo)識類型,可能的值如下:DVTCAS__NEW:表示有新郵件。DVTCAS__NEW_NO_ROOM:表示郵箱已滿。DVTCAS__NONE:表示需要 調(diào)用此函數(shù)前,需要定義一個SDVTCA HRESULT HRESULT (DWORD功能:機(jī)頂盒用此接口刪除tVersion的 {u32dwErr=if(dwErr){}}u32STB_CA_Notify(u32{u32dwErr=Err_OK;{if(dwErr)returndwErr=CA_HidNotify();if(dwErr)

return}return}

答:CAS可以在20K的flash空間內(nèi)放不定封數(shù)的,但考慮一般的數(shù)據(jù)和50封郵件就可。所以,在調(diào)用此函數(shù)時,如果線程堆棧請一個“50*sizeof(SDVTCAInfo)SDVTCAInfo數(shù)組空間。答:CAS每封的內(nèi)容最長可以為1024字節(jié),用20K的flash空間來保存,如果每封的內(nèi)容有1024字節(jié),可以存放19封;如果每封的內(nèi)容為256要機(jī)頂盒在界面上提示用戶“最多顯示50封郵件”。前端發(fā)送啟動/取消機(jī)卡配對令如果取配對信息失敗,CADVTSTBCA_ShowOSDMsg要求機(jī)頂盒顯示eeprom(DVTSTBCA_WriteDataBufferflash),同時會調(diào)用DVTSTBCA_ShowOSDMsg顯示“機(jī)卡配對成功!”。CA模塊收到取消機(jī)卡配對命令后,調(diào)用DVTSTBCA_SaveDataToEeprom接口(eepromeeprom的任意地址,如果這些數(shù)STBeeprom,則此函數(shù)一定要返回-1(即:0xffffffff)!即:此時HRESULTDVTSTBCA_SaveDataToEeprom(long*plDataLen,constBYTE*pData){return(HRESULT)-1;//如果沒有eeprom就這樣實現(xiàn)}頂盒給CAS用的eeprom是從0x HRESULTDVTSTBCA_SaveDataToEeprom(long*plDataLen,constBYTE*pData){boolbSucess;if(80 *plDataLen=returnreturn }如果機(jī)頂盒有eeprom,則從保存CAS數(shù)據(jù)的Eeprom中取出CAS數(shù)據(jù),數(shù)據(jù)最長為80字節(jié)。如機(jī)頂盒給CAS用的eeprom是從0x HRESULTDVTSTBCA_GetDataFromEeprom(long*plDataLen,BYTE*pData){boolbSucess;if(80 *plDataLen=//returnreturn }錯誤)eeprom的時候,出現(xiàn)的可能比較大。這時需要前端再對卡發(fā)啟動機(jī)卡配對令。的機(jī)頂盒不是立即寫flash,而是先放到內(nèi)存中,隔段時間再寫,就更慢了),很容易能的失效,增加了以后運(yùn)營過程中的麻煩。所以,我們強(qiáng)烈建議機(jī)頂盒給CAS擠eepromCASeeprom的函數(shù)一定要返回-1回0或者其他的值,CA模塊將無法保存機(jī)卡配對數(shù)據(jù)。80個字節(jié)就是考慮到盡量不占用機(jī)頂盒的資源而要求的,不能在每次開機(jī)后,機(jī)頂盒從主頻點NIT表中獲取PDSD值(數(shù)據(jù)說明描述符的flash中原先保存的值。(PDSD位置見下圖) 相等,常收看。 返回值0:無無F3+1((DVTCASTB_SwitchChannelOverCA模塊處理的情況)通知機(jī)頂盒切換到這個頻點;CA模塊在這頻點正確接收到區(qū)域鎖定的特征碼流信息后會調(diào)用DVTSTBCA_AreaLockOk通知機(jī)頂盒切回到用戶原來的Service,在等待接收的過程中,要在界面提示‘正在獲取區(qū)域信息,請稍后’,背景畫面使用開機(jī)畫面。接收超時,返回到用戶原來的Service。了頻點點,那么機(jī)頂盒會不斷去切臺,串口會打印‘頻點錯誤,SwitchChannelfaild’。void功能:CA模塊用此函數(shù)通知機(jī)頂盒特征碼流接收完畢。功能:CA模塊用此函數(shù)通知機(jī)頂盒切換到單頻點區(qū)域鎖定的頻點(boolg_bAreaLockOK boolg_bSwitchTask voidDVTSTBCA_AreaLockOk(void){ g_bAreaLockOK=true;}unsignedshortwEMMPID; //保存數(shù)碼視訊的EMMPIDint return //0和-110}g_bSwitchTask=ture;return}{goto;ForbidSwitchChannel();//用戶切臺操作 nRetSwitchToAreaLockChannel(channel);//切換到區(qū)域鎖定的頻點的第一個AllowSwitchChannel();//允許用戶的切臺操作 g_bSwitchTask=false; } DVTCASTB_SetEmmPid(wEMMPID);//告知CA模塊新的EMMPIDgoto } }息}

AllowSwitchChannel();//允許用戶的切臺操作 g_bSwitchTask=false; CA模塊在一定的時間內(nèi)收取特征流,收完后機(jī)頂盒再切回到用戶原來bouquet_idBATBAT表來過濾節(jié)在通過區(qū)域控制的情況下,機(jī)頂盒在搜索時,通過調(diào)用DVTCASTB_GetAreaInfoBAT表,如果卡里的區(qū)域碼發(fā)生了變化,要進(jìn)行更新。無 無但是那個時間點有,因此想主動提前進(jìn)行子母卡配對,確??梢酝暾7绞蕉号鋵?自動配對)。無論是在母卡所在的STB,還是在所在的STB中用戶在機(jī)頂盒出現(xiàn)“此卡是,到某年月某日某時:某分:某秒將被OSD滾動時,可以主動進(jìn)入菜單,通過如下方式進(jìn)行子用戶插入母卡,按“確認(rèn)”鍵后,機(jī)頂盒調(diào)用DVTCASTB_GetCorrespondInfo如果信息失敗(函數(shù)返回值非0):機(jī)頂盒把界面的提示內(nèi)容更換為“配對失如果信息成功(函數(shù)返回值為0):機(jī)頂盒保存讀出的母卡配對信息以備設(shè)置IC卡中寫入讀出的母卡配對信息::盒可以通過調(diào)用DVTCASTB_GetMotherInfo來判斷當(dāng)前卡是母卡還是。)用戶插入母卡,機(jī)頂盒調(diào)用DVTCASTB_GetCorrespondInfoIC卡中的母卡配對信息,)如果插入的不是母卡,或者母卡信息失?。ê瘮?shù)返回值非0):機(jī)頂盒把界面如果信息成功(函數(shù)返回值為0):機(jī)頂盒保存讀出的母卡配對信息以備設(shè)置息,請插入要配對的”,進(jìn)行后續(xù)的操作,參考界面如下:用戶拔出母卡,插入后,機(jī)頂盒調(diào)用DVTCASTB_SetCorrespondInfo,往IC卡中喜,配對成功,請插入其他要配對的”(參考界面如下),如果插入其它的。 pData:輸出的數(shù)據(jù),最長為250字節(jié)。(6B436B44:失敗。讓STB提示配對失敗。 返回值 其他值 失就是從母卡中讀出一些數(shù)據(jù)寫到中,所以需要機(jī)頂盒提供一些菜單和界面。DVTCASTB_GetOperatorInfo(-1,pbyCount,pOperatorInfo)接(SDVTCATvsInfopOperatorInfo[5]140個字節(jié)的內(nèi)存),DVTCASTB_GetMoneyInfo接口去獲得如果成功獲取每個運(yùn)營商的電子錢包信息(就是每次DVTCASTB_GetMoneyInfo返回失敗,該運(yùn)營商不顯示錢參考界面如下(界面下方要有“PIN碼如果連續(xù)錯誤3次,將被鎖定”的提示):PIN碼驗證界面,返回到上一級菜單;如果用戶DVTCAERR_STB_DATA_LEN_ERROR:機(jī)頂盒在界面下方提示用戶“PIN碼長度錯誤”。DVTCASTB_GetBookIpps接口(SDVTCAIpp[250]數(shù)機(jī)頂盒成功獲得信息后,彈出“訂購/退訂IPP”界面,顯示一屏的IPP,同顯示輸入周期數(shù)),在界面最下方顯示操作提示:左右鍵翻頁、上下鍵選擇、確認(rèn) 開始時間:2008-06-188:00:00))請用數(shù)字鍵輸入想要的周期數(shù):20個要求界面中要顯示的內(nèi)容有:名稱、訂購狀態(tài)(未訂購/已訂購、類(IPPV/IPPT由于目前數(shù)碼視訊CA只用到“不回傳、不可的價格”一種當(dāng)前價格類型,其他價格類型均可不顯示。(如果是IPPV,則不必顯示輸入周期數(shù))無效,請選擇其他價格”;如果不為0,進(jìn)行后面B中的檢查。當(dāng)前SDVTCAIpp中的m_wBookedPrice、m_byBookedPriceType和戶選中的IPP信息,機(jī)頂盒應(yīng)該已經(jīng)根據(jù)用戶的選擇填充了 DVTCASTB_BookIpp函數(shù)頭文件功能描述,更新DVTCASTB_GetViewedIpps接口(個 月、年開始時間:2008-06-18持續(xù)時間、其他信息(此為ippt,總時間(?分鐘),扣錢總數(shù)(?元)。,之前又沒有彈出“實時IPP”的界面,就會調(diào)用DVTSTBCA_InquireBookIpp接口通知機(jī)頂盒彈出“實時IPP”的界面,界面 數(shù)開始時間:2008-06-18(IPPT/IPPV 示為“不回傳、不可的價格(0元/?分鐘(或小時、天、月、年如果非0則把選中的價格設(shè)置給SDVTCAIpp中的m_wBookedPrice、m_byBookedPriceType和m_wIpptPeriod變量,并且在訂購價格處只顯示為“不回傳、不可的價格(?元/?m_wIpptPeriod變量中的值顯示在訂購價格中)CA只用到“不回傳、不可的價格”一種價格類型。容為“PIN碼長度錯誤,連續(xù)超過3次將被鎖定”。如果返回DVTCAERR_STB_PIN_LOCKED:機(jī)頂盒更新界面下方的提示內(nèi)容為“PIN碼被鎖定”。果用戶按“取消”鍵,則機(jī)頂盒退出實時界面,并且機(jī)頂盒調(diào)用CA模塊結(jié)束;隱藏(退出)此界面DVTCASTB_BookIpp函數(shù)頭文件功能描述,更新界面Service上,機(jī)頂盒應(yīng)不彈出實時的界面。用于STB做顯示IPPT的相關(guān)信息。BYTE BYTEm_byUnit; //間隔的單位0-分鐘1-小時2-天3-月4-年WORDm_byIpptPeriod; //用戶訂購IPPT的周期數(shù)。(機(jī)頂盒在實現(xiàn)此函數(shù)時,需要根據(jù)pIpp中的成員數(shù)據(jù)拼湊成實時界面中顯charszTime[20]; DisyToInterface(szOneLine,坐標(biāo)); );//sprintf(szOneLine,"開始時間:%s",szTime);DisyToInterface(szOneLine,坐標(biāo)); 持續(xù)時間:%d天%d時%d分%d秒",DisyToInterface(szOneLine,坐標(biāo)); if(pIpp->m_byIppStatus&0x08){//IPPV

sprintf(szOneLine,"不回傳、能錄像價 %d.%02d sprintf(szOneLine,"不回傳、不能價 %d.%02d

sprintf(szOneLine,"回傳、能錄像價 %d.%02d

sprintf(szOneLine,"回傳、不能價格 %d.%02d元 }else{

sprintf(szOneLine,"不回傳、能價格 %d.%02d元/%d分鐘

sprintf(szOneLine,"不回傳、不能價格%d.%02d元/%d分鐘

sprintf(szOneLine,"回傳、能價格 %d.%02d元/%d分鐘

sprintf(szOneLine,"回傳、不能價格 %d.%02d元/%d分鐘 }HRESULTDVTCASTB_GetMoneyInfo(WORDwTVSID,DWORD*pdwAllBalance,DWORD*pdwRemainder);wTVSID:運(yùn)營商的ID號。pdwAllBalance:輸出已花費(fèi)的錢數(shù),單位分。pdwRemainder:pIpps:SDVTCAIpp結(jié)構(gòu)數(shù)組,輸出IPP信息。20KBSDVTCAIpp中的成員數(shù)據(jù)SDVTCAIpp*pIpps=(SDVTCAIpp*)charszTime[20];SDVTCAIpp*pIpp=NULL;HRESULTnRet;nRetDVTCASTB_GetBookIpps(&byCount,pIpps); }//以下以第iIPP sprintf(szOneLine,"IPP總數(shù):%d個,選中的是:第%d個",byCount,i+1);DisyToInterface(szOneLine,坐標(biāo)); sprintf(szOneLine+23,"%s sprintf(szOneLine,"開始時間:%s",szTime);DisyToInterface(szOneLine,坐標(biāo)); sprintf(szOneLine,"持續(xù)時間:%d天%d時%d分%d秒",DisyToInterface(szOneLine,坐標(biāo));//顯示到界面 casecasecase

}if(pIpp->m_byIppStatus&0x08)//IPPV //IPPTsprintf(szOneLine,"%s(%d.%02d元/%d分鐘)",szTmp,}else//0 DisyToInterface(szOneLine,坐標(biāo)); DisyToInterface(szOneLine,坐標(biāo)); DisyToInterface(szOneLine,坐標(biāo)); if(pIpp->m_byIppStatus&0x08){//IPPV

sprintf(szOneLine,"0:不回傳、能價格(%d.%02d元)",

sprintf(szOneLine,"1:不回傳、不能價格(%d.%02d元)", 回傳、能價格(無)");

sprintf(szOneLine,"2:回傳、能價格(%d.%02d元)", 回傳、不能價格(無)");

sprintf(szOneLine,"3:回傳、不能價格(%d.%02d元)", }else{

sprintf(szOneLine,"0:不回傳、能價格(%d.%02d元/%d分鐘)",

回傳、能價格(無)");

sprintf(szOneLine,"2:回傳、能價格(%d.%02d元/%d分鐘)", 回傳、不能價格(無)");

sprintf(szOneLine,"3:回傳、不能價格(%d.%02d元/%d分鐘)", }功能:訂購/退訂Ippv和Ippt。DVTCA_OK:成功。CAS自己根據(jù)狀態(tài)來判斷用戶是訂購還是退訂,機(jī)頂盒只需要按照實現(xiàn)流17250ByteSDVTCAViewedIpp中的成員數(shù)據(jù)拼湊成已的IPP界面中顯示的一個個字符串。參考代碼如//如果線程堆棧不夠時,動態(tài)申請內(nèi)存。注意:此2方法用一種即可 charszTime[20

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論