int main()
{
   SMSHOSTLIB_ERR_CODES_E RetCode = SMSHOSTLIB_ERR_OK;
   char Buffer[10];
		 
   RetCode = SmsLiteAdrInit( SMSHOSTLIB_DEVMD_CMMB, SmsLiteCmmbControlRxCallback, SmsLiteCmmbDataCallback );
   	if ( RetCode != SMSHOSTLIB_ERR_OK )
	{
		printf("xingyu[Test_Siano] Return err 0x%x\n",RetCode);              //init error
		return RetCode ;
	}
	else
             printf("xingyu[Test_Siano]SmsLiteAdrInit ok\n");


	SmsMsgData_ST* pStaticMsg = (SmsMsgData_ST*)(malloc(sizeof(SmsMsgData_ST)));	
	
	printf("Get version before FW downloading\n");
	PrepareGetVersion(pStaticMsg);
	SmsLiteAdrWriteMsg( pStaticMsg );                    //debug

	printf("Start to tune to frequency %d\n", CMMB_USER_FREQUENCY);
	PrepareCMMBTuneMsg(pStaticMsg, CMMB_USER_FREQUENCY);
	SmsLiteAdrWriteMsg( pStaticMsg );                    //debug


	OSW_TaskSleep(5000);
	printf("Start service %d\n", CMMB_USER_SERVICE);
	PrepareStartServiceMsg(pStaticMsg, CMMB_USER_SERVICE);
	SmsLiteAdrWriteMsg( pStaticMsg );                    //debug

	
	//OSW_TaskSleep(60000);
#if 0
      printf("[Test Siano] using hw\n");

   // driver loop back test, test driver working
      AdrLoopbackTest();
#else
    printf("xingyu[Test_Siano] waiting ............press 'c' stop.........\n ");

    while(1){
	fgets(Buffer, 10, stdin);
	if(Buffer[0] =='c')
		break;
    }
#endif


//driver terminate
       printf("xingyu[Test_Siano]SmsLiteAdrTerminate\n");
       SmsLiteAdrTerminate();
	   
  printf("xingyu[Test_Siano] ****************************** End ******************************* \n\n\n ");
  free(pStaticMsg);
   return 0;
}
//*******************************************************************************
// 
SMSHOSTLIB_ERR_CODES_E SMSHOSTLITE_API SmsLiteCmmbLibInit( SMSHOSTLIBLITE_CMMB_INITLIB_PARAMS_ST* pInitLibParams )
{
	SMSHOSTLIBLITE_CMMB_INITLIB_PARAMS_ST LocalInitParams = {0};
	SMSHOSTLIB_ERR_CODES_E RetCode = SMSHOSTLIB_ERR_OK;

	SMSHOST_LOG1(SMSLOG_APIS,"Crystal=%d", pInitLibParams->Crystal );
 
	if ( g_LibCmmbState.IsLibInit )
	{
		SMSHOST_LOG1(SMSLOG_APIS | SMSLOG_ERROR,"Return err 0x%x",SMSHOSTLIB_ERR_LIB_ALREADY_INITIATED);
		return SMSHOSTLIB_ERR_LIB_ALREADY_INITIATED;
	}

	//ZERO_MEM_OBJ(&g_LibCmmbState);
        memset(&g_LibCmmbState, 0, sizeof(g_LibCmmbState)); //jan

	if ( pInitLibParams == NULL 
		|| pInitLibParams->pCtrlCallback == NULL 
		|| pInitLibParams->Size == 0 )
	{
		SMSHOST_LOG1(SMSLOG_APIS | SMSLOG_ERROR,"Return err 0x%x",SMSHOSTLIB_ERR_INVALID_ARG);
		return SMSHOSTLIB_ERR_INVALID_ARG;
	}

	memcpy( &LocalInitParams, pInitLibParams, pInitLibParams->Size );
	
//	SmsLiteInit( LocalInitParams.pCtrlCallback );
	g_LibCmmbState.pDataCallback = LocalInitParams.pDataCallback;
	g_LibCmmbState.Crystal = LocalInitParams.Crystal;
	if ( LocalInitParams.Crystal == 0 )
	{
		g_LibCmmbState.Crystal = SMSHOSTLIB_DEFAULT_CRYSTAL;
	}

	RetCode = SmsLiteAdrInit( SMSHOSTLIB_DEVMD_CMMB, SmsLiteCmmbControlRxCallback, SmsLiteCmmbDataCallback );
	if ( RetCode != SMSHOSTLIB_ERR_OK )
	{
		SMSHOST_LOG1(SMSLOG_APIS | SMSLOG_ERROR,"Return err 0x%x",RetCode);
		return RetCode ;
	}

	// Set crystal message
	if ( g_LibCmmbState.Crystal != SMSHOSTLIB_DEFAULT_CRYSTAL )
	{
		SmsMsgData_ST SmsMsg = {0};
		SMS_SET_HOST_DEVICE_STATIC_MSG_FIELDS( &SmsMsg );
		SmsMsg.xMsgHeader.msgType  = MSG_SMS_NEW_CRYSTAL_REQ;
		SmsMsg.xMsgHeader.msgLength = (UINT16)sizeof(SmsMsg);

		SmsMsg.msgData[0] = g_LibCmmbState.Crystal;

		g_LibCmmbState.SyncFlag = FALSE;
		SmsLiteSendCtrlMsg( (SmsMsgData_ST*)&SmsMsg );

		// Wait for device init response
		if ( !SmsHostWaitForFlagSet( &g_LibCmmbState.SyncFlag, 200 ) )
		{
			return SMSHOSTLIB_ERR_DEVICE_NOT_INITIATED;
		}
	}

	g_LibCmmbState.IsLibInit = TRUE ;
#ifdef SMSHOST_ENABLE_LOGS
	SmsLiteSetDeviceFwLogState();
#endif

	//SmsLiteGetVersion_Req();
	 
	SMSHOST_LOG0(SMSLOG_APIS,"LibInit OK");
	return SMSHOSTLIB_ERR_OK;
}