/**************************************************************************** *_Copyright (c) 2004 Digital Stream Technologies Inc. All Rights Reserved. * * Module: dsthalca.c * Author: Jun-ku Park, hwatk@dstreamtech.com * Description: DST HAL [Conditional Access] Platform Indepedent Sources * ************************************************************************^^*/ #include #include #include #include #include "dsthalcommon.h" #include "dsthalca.h" //#include "dstddca.h" #ifdef DMALLOC #include #endif /****************************************************************************** * Global variable declaration ******************************************************************************/ int gCADbgLvl = 1; /****************************************************************************** * Imported variable declaration ******************************************************************************/ /****************************************************************************** * Imported function declaration ******************************************************************************/ /****************************************************************************** * Local definitions / typedefs ******************************************************************************/ /****************************************************************************** * Local variables ******************************************************************************/ static DST_CA sDSTCA; /****************************************************************************** * Local function prototypes ******************************************************************************/ typedef struct tag_CA_START_PARAMs { CaDescrMode_t Mode; CaDescrType_t Type; DS_U8 bParityEnable; DS_U32 Pid1; DS_U32 Pid2; DS_U32 EvenKeyHigh; DS_U32 EvenKeyLow; DS_U32 OddKeyHigh; DS_U32 OddKeyLow; } CA_START_PARAMs, *P_CA_START_PARAMs; static CA_START_PARAMs s_CaParams; DS_U8 gdbghalca = 0; /**************************************************************************** * * DHL_RESULT DHL_CA_Init * - Summary : Initialize the CA. * - Argument : None. * - Returns : DHL_OK on success, DHL_FAIL on failure. * ***************************************************************************/ DHL_RESULT DHL_CA_Init( void ) { DHL_RESULT dhlResult = DHL_OK; P_DST_CA pDSTCA = &sDSTCA; /* Initialize the CA data structure. */ pDSTCA->ScrMode = CaScrMode_DEFAULT; pDSTCA->ScrType = CaScrType_PASSTHROUGH; pDSTCA->ScrParityEnable = _FALSE_; pDSTCA->DescrMode = CaScrMode_DEFAULT; pDSTCA->DescrType = CaScrType_PASSTHROUGH; pDSTCA->ScrParityEnable = _FALSE_; pDSTCA->Pid1 = 0xFFFFFFFF; pDSTCA->Pid2 = 0xFFFFFFFF; pDSTCA->dwEvenKeyHigh = 0L; pDSTCA->dwEvenKeyLow = 0L; pDSTCA->dwOddKeyHigh = 0L; pDSTCA->dwOddKeyLow = 0L; pDSTCA->bStarted = _FALSE_; /* Call lower device driver. */ //dhlResult = DD_CA_Init( pDSTCA ); /* Initialize MUTEX */ pDSTCA->bCurState = CaState_INIT; return dhlResult; } /**************************************************************************** * * DHL_RESULT DHL_CA_SetScramblingAlgorithm * - Summary : Set the CA Scrambler Algorithm. * - Argument * Mode { CaScrMode_DEFAULT, CaScrMode_ECB, CaScrMode_CBC } * Type { CaScrType_PASSTHROUGH, CaScrType_DVB_CSA, CaScrType_3DES, * CaScrType_DES, CaScrType_CSS, CaScrType_M2 } * bParityEnable : (1) Using even/odd or (0) Using odd only. * - Returns : DHL_OK on success, DHL_FAIL on failure. * ***************************************************************************/ DHL_RESULT DHL_CA_SetScramblingAlgorithm( CaScrMode_t Mode, CaScrType_t Type, DS_BOOL bParityEnable ) { DHL_RESULT dhlResult = DHL_OK; P_DST_CA pDSTCA = &sDSTCA; /* State should be INIT or STOP. */ if ( (pDSTCA->bCurState == CaState_UNKNOWN) || (pDSTCA->bCurState == CaState_START) ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: CA State must INIT or STOP. State = 0x%x\n", pDSTCA->bCurState ); return DHL_FAIL; } /* Argument checks. */ if ( (Mode >= CaScrMode_MAX) || (Type >= CaScrType_MAX) ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: Invalid Arguments. Mode = %d, Type = %d\n", Mode, Type ); return DHL_FAIL_INVALID_PARAM; } /* Take the MUTEX. */ pDSTCA->ScrMode = Mode; pDSTCA->ScrType = Type; pDSTCA->ScrParityEnable = bParityEnable; /* Give the MUTEX. */ return dhlResult; } /**************************************************************************** * * DHL_RESULT DHL_CA_SetDescramblingAlgorithm * - Summary : Set the CA Descrambler Algorithm. * - Argument * Mode { CaScrMode_DEFAULT, CaScrMode_ECB, CaScrMode_CBC } * Type { CaScrType_PASSTHROUGH, CaScrType_DVB_CSA, CaScrType_3DES, * CaScrType_DES, CaScrType_CSS, CaScrType_M2 } * bParityEnable : (1) Using even/odd or (0) Using odd only. * - Returns : DHL_OK on success, DHL_FAIL on failure. * ***************************************************************************/ DHL_RESULT DHL_CA_SetDescramblingAlgorithm( CaDescrMode_t Mode, CaDescrType_t Type, DS_BOOL bParityEnable ) { DHL_RESULT dhlResult = DHL_OK; P_DST_CA pDSTCA = &sDSTCA; CA_START_PARAMs *p_caparam = &s_CaParams; //jfet_20050813 | For debuging //save the input parameters p_caparam->Mode = Mode; p_caparam->Type = Type; p_caparam->bParityEnable = bParityEnable; /* State should be INIT or STOP. */ if ( (pDSTCA->bCurState == CaState_UNKNOWN) || (pDSTCA->bCurState == CaState_START) ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: CA State must INIT or STOP. State = 0x%x\n", pDSTCA->bCurState ); return DHL_FAIL; } /* Argument checks. */ if ( (Mode >= CaDescrMode_MAX) || (Type >= CaDescrType_MAX) ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: Invalid Arguments. Mode = %d, Type = %d\n", Mode, Type ); return DHL_FAIL_INVALID_PARAM; } /* Take the MUTEX. */ pDSTCA->DescrMode = Mode; pDSTCA->DescrType = Type; pDSTCA->DescrParityEnable = bParityEnable; /* Give the MUTEX. */ DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " success change mode (%d)\n",Mode); return dhlResult; } /**************************************************************************** * * DHL_RESULT DHL_CA_Start * - Summary : Start the CA with Even / Odd Key. * - Argument * Pid1/Pid2 : Pid for CA Pid Filter * EvenKeyHigh,EvenKeyLow,OddKeyHigh,OddKeyLow : Key for CA * - Returns : DHL_OK on success, DHL_FAIL on failure. * ***************************************************************************/ DHL_RESULT DHL_CA_Start( DS_U32 Pid1, DS_U32 Pid2, DS_U32 EvenKeyHigh, DS_U32 EvenKeyLow, DS_U32 OddKeyHigh, DS_U32 OddKeyLow ) { DHL_RESULT dhlResult = DHL_OK; P_DST_CA pDSTCA = &sDSTCA; CA_START_PARAMs *p_caparam = &s_CaParams; //jfet_20050813 | For debuging //save the input parameters p_caparam->Pid1 = Pid1; p_caparam->Pid2 = Pid2; p_caparam->EvenKeyHigh = EvenKeyHigh; p_caparam->EvenKeyLow = EvenKeyLow; p_caparam->OddKeyHigh = OddKeyHigh; p_caparam->OddKeyLow = OddKeyLow; /* State should be INIT or STOP or START*/ if ( (pDSTCA->bCurState != CaState_STOP) && (pDSTCA->bCurState != CaState_INIT) && (pDSTCA->bCurState != CaState_START) ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: CA State must INIT or STOP. State = 0x%x\n", pDSTCA->bCurState ); return DHL_FAIL; } /* Arguments Checks. */ if ( (Pid1 > 0x1FFF) || (Pid2 > 0x1FFF) ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: Invalid PID. Pid1 = 0x%x, Pid2 = 0x%x\n", Pid1, Pid2 ); return DHL_FAIL_INVALID_PARAM; } /* Take the MUTEX. */ pDSTCA->Pid1 = Pid1; pDSTCA->Pid2 = Pid2; pDSTCA->dwEvenKeyHigh = EvenKeyHigh; pDSTCA->dwEvenKeyLow = EvenKeyLow; pDSTCA->dwOddKeyHigh = OddKeyHigh; pDSTCA->dwOddKeyLow = OddKeyLow; if ( pDSTCA->bStarted == _TRUE_ ) { dhlResult = DHL_CA_Stop(); if ( dhlResult != DHL_OK ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: DD_CA_Stop. dhlResult = 0x%x\n", dhlResult ); goto done; } } //dhlResult = DD_CA_Start( pDSTCA ); if ( dhlResult != DHL_OK ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: DD_CA_Start. dhlResult = 0x%x\n", dhlResult ); goto done; } pDSTCA->bCurState = CaState_START; pDSTCA->bStarted = _TRUE_; done: /* Give the MUTEX. */ return dhlResult; } /**************************************************************************** * * DHL_RESULT DHL_CA_Stop * - Summary : Stop the CA. * - Argument : None. * - Returns : DHL_OK on success, DHL_FAIL on failure. * ***************************************************************************/ DHL_RESULT DHL_CA_Stop(void) { DHL_RESULT dhlResult = DHL_OK; P_DST_CA pDSTCA = &sDSTCA; /* State should be INIT or STOP */ if ( (pDSTCA->bCurState != CaState_INIT) && (pDSTCA->bCurState != CaState_START) ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: CA State must INIT or STOP. State = 0x%x\n", pDSTCA->bCurState ); return DHL_FAIL; } /* Take the MUTEX. */ /* Call lower device driver. */ //dhlResult = DD_CA_Stop( pDSTCA ); if ( dhlResult != DHL_OK ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: DD_CA_Start, dhlResult = 0x%x\n", dhlResult ); goto done; } pDSTCA->bCurState = CaState_STOP; pDSTCA->bStarted = _FALSE_; done: /* Give the MUTEX. */ return dhlResult; } /**************************************************************************** * * DHL_RESULT DHL_CA_Close * - Summary : Close the CA. * - Argument : None. * - Returns : DHL_OK on success, DHL_FAIL on failure. * ***************************************************************************/ DHL_RESULT DHL_CA_Close(void) { DHL_RESULT dhlResult = DHL_OK; P_DST_CA pDSTCA = &sDSTCA; if ( (pDSTCA->bCurState == CaState_UNKNOWN) || (pDSTCA->bCurState >= CaState_MAX) ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: Invalid state. state = 0x%x\n", pDSTCA->bCurState ); return DHL_FAIL; } /* Take the MUTEX. */ /* Call lower device driver. */ //dhlResult = DD_CA_Close( pDSTCA ); if ( dhlResult != DHL_OK ) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " Error: DD_CA_Close, dhlResult = 0x%x\n", dhlResult ); goto done; } pDSTCA->bCurState = CaState_UNKNOWN; done: /* Give the MUTEX. */ return dhlResult; } /**************************************************************************** * * DHL_RESULT DHL_CA_SetMode * - Summary : SET the current CA Mode and Type * - Argument * mode : new mode * - Returns : DHL_OK on success, DHL_FAIL on failure. * * //--------------+------------- * // input MODE | TYPE * //--------------+------------- * // DEFAULT | PASSTHROUGH * // ECB | DES * //---------------------------- ***************************************************************************/ DHL_RESULT DHL_CA_SetMode(CaDescrMode_t mode) { DHL_RESULT dhlResult = DHL_OK; P_DST_CA pDSTCA = &sDSTCA; CA_START_PARAMs *p_caparam = &s_CaParams; //check the CA started if(!pDSTCA->bStarted) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA," |skip| CA is not started yet\n"); return DHL_FAIL; } //check the request mode if(p_caparam->Mode == mode) { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA," |skip| Same mode requested %d \n",mode); return DHL_FAIL; } else { DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA," |info| Chnage mode to %s \n", mode == 0? "DEFAULT": mode == CaDescrMode_ECB ? "ECB":"Unknown"); } //1. STOP CA dhlResult |= DHL_CA_Stop(); //2 set new Mode and Type // - There are just 2 mode for now. (Default and ECB) if( mode == CaDescrMode_DEFAULT) { p_caparam->Mode = CaDescrMode_DEFAULT; p_caparam->Type = CaDescrType_PASSTHROUGH; } else { p_caparam->Mode = CaDescrMode_ECB; p_caparam->Type = CaDescrType_DES; } //3. CHANGE DESCRAMBLING MODE &.. dhlResult |= DHL_CA_SetDescramblingAlgorithm(p_caparam->Mode,p_caparam->Type,p_caparam->bParityEnable); //4. RESTART with new Mode and Type dhlResult |= DHL_CA_Start( p_caparam->Pid1, p_caparam->Pid1, p_caparam->EvenKeyHigh, p_caparam->EvenKeyLow, p_caparam->OddKeyHigh, p_caparam->OddKeyLow ); if(dhlResult) DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA," |error| %d 0x%x\n",__LINE__,dhlResult); else DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA, " success\n"); return dhlResult; } //Get current Mode CaDescrMode_t DHL_CA_GetMode(void) { if(gdbghalca) DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA," |info| current mode is %s \n",s_CaParams.Mode == 0? "DEFAULT": s_CaParams.Mode == CaDescrMode_ECB ? "ECB":"Unknown"); return s_CaParams.Mode; } //Get current CA module's start state DS_BOOL DHL_CA_IsStarted(void) { if(gdbghalca) DHL_DbgPrintf( gCADbgLvl, DHLDBG_CA," |info| CA is %s\n",sDSTCA.bStarted == _TRUE_ ? "started" : "not started"); return sDSTCA.bStarted; }