⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iap.c

📁 本程序为ST公司开发的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	00, 0x0A, 	00, 0x32, 00, 0x0B, 0x1F, 0xF8, 	 00, 00, 00, 0x1F, 0xF8, 0xFF, 0xFF, 0xFF, 	 0xFF, 0xD0, 00, 0x2F, 0xF8, 00, 00, 00, 	 0xBF, 0xFF, 0xFF, 0xFF, 0xF4, 0x03, 0xFF, 0xFF, 	 0xFF, 0xFF, 0xFF, 0xD0, 0xBF, 0xD0	//9};#endif /*IAP_TEST_COLOR*/t_player_state iap_set_cmd_set_image(t_iap_handler hIap){	t_player_state err = IAP_OK;	if(hIap)	{		tIap* pIap = (tIap*)hIap;		tIapItem Cmd;		/* prepare iAP command chunk */		Cmd.Code.LingoId = IAP_LINGO_EXT_INTERF;		Cmd.Code.CmdId = IAP_EXT_SET_DISP_IMG;		Cmd.CompleteState = IAP_ARCHIVE_ITEM_COMPLETE;		if(i==255)		{#ifdef IAP_TEST_COLOR			uint16 c;			uint8 value = 0;			uint8 Data[C_IAP_TEST_IMAGE_1ST_CHUNK_LEN];			memcpy(&Data, gaIapTestIMAGEInit, sizeof(gaIapTestIMAGEInit));			for(c=sizeof(gaIapTestIMAGEInit); c<C_IAP_TEST_IMAGE_1ST_CHUNK_LEN;c++)			{				Data[c] = value;				value += 0x1;			}			Cmd.RemainLen = Cmd.ChunkLen = C_IAP_TEST_IMAGE_1ST_CHUNK_LEN;			err = IAP_SetCmd(pIap, &Cmd, (uint8*)&Data, 0);#else			Cmd.RemainLen = Cmd.ChunkLen = C_IAP_TEST_IMAGE_1ST_CHUNK_LEN;			err = IAP_SetCmd(pIap, &Cmd, (uint8*)&gaIapTestIMAGEInit, 0);#endif			i = 0;		}		else if(i<C_IAP_TEST_IMAGE_CHUNKS_NUM)		{#ifdef IAP_TEST_COLOR			uint16 c;			uint8 value;			uint8 Data[C_IAP_TEST_IMAGE_CHUNK_LEN];			Data[0] = ((i+1)>>8)&&0xFF;			Data[1] = (i+1)&&0xFF;			for(c=2; c<C_IAP_TEST_IMAGE_CHUNK_LEN;c++)			{				Data[c] = value;				value += 0x10;			}			Cmd.RemainLen = Cmd.ChunkLen = C_IAP_TEST_IMAGE_CHUNK_LEN;			err = IAP_SetCmd(pIap, &Cmd, (uint8*)&Data, 0);#else			Cmd.RemainLen = Cmd.ChunkLen = C_IAP_TEST_IMAGE_CHUNK_LEN;			err = IAP_SetCmd(pIap, &Cmd, (uint8*)&(gaIapTestIMAGE.IapTestImage[i++]), 0);#endif			i++;		}	}	else		err = E_IAP_FATAL_CMD;	if(M_IS_IAP_ERROR(err))		DBG_REPORT_ERROR(err);	return err;}#else /*IAP_TEST*/t_player_state iap_set_cmd_set_image(t_iap_handler hIap) {return IAP_OK;}#endif /*IAP_TEST*/t_player_state iap_get_msg(t_iap_handler hIap, t_iap_msg* pMsg, uint8** ppMsgData){	tIap* pIap = (tIap*)hIap;	if(pIap)	{		memcpy(pMsg, &(pIap->Msg), sizeof(t_iap_msg));		*ppMsgData = pIap->Msg.pData;	}	return IAP_OK;	//TBD}t_player_state iap_transition(t_iap_handler hIap){	t_player_state ret = IAP_OK;//E_IAP;	tIap* pIap = (tIap*)hIap;	teIapFsmState* pFsmState = &(pIap->FsmState);	tuIapInEvent* pInEvent= &(pIap->InEvent);	tuIapOutEvent* pOutEvent= &(pIap->OutEvent);	uint8 bDoRx;	uint8 bDoRxCP;	uint8 bFsmDone;//	uint8 bAuth = pIap->bAuth;//	uint8 bReady = pIap->bReady;	M_CLEAR_FLAG(bDoRx);	M_CLEAR_FLAG(bDoRxCP);	M_CLEAR_FLAG(bFsmDone);	//do	//{/*		if(M_IS_SET(pInEvent->flag.Mounted))		{			M_CLEAR_FLAG(pInEvent->flag.Mounted);			//IAP_Init(pIap);			// *pFsmState = IAP_FSM_INIT;			ret = IAP_ProcessFsm(pIap);			break;		}*/		/*		if(M_IS_SET(pInEvent->flag.Disconnect))		{			M_CLEAR_FLAG(pInEvent->flag.Disconnect);			//IAP_Close(pIap);			// *pFsmState = IAP_FSM_DONE;			ret = IAP_CLOSED;			break;		}*/		if(M_IS_SET(pInEvent->flag.Timer))		{			M_CLEAR_FLAG(pInEvent->flag.Timer);			if(*pFsmState != IAP_FSM_DONE)			{				*pFsmState = IAP_FSM_DONE;				ret = IAP_OK;//;				//return IAP_OK;	/* immediatelly */			}			else			{				ret = IAP_TIMEOUT;			}			//break;		}		else if(M_IS_SET(pInEvent->flag.TxAck))		{			M_CLEAR_FLAG(pInEvent->flag.TxAck);			/* first to reset Tx pipe */			M_CLEAR_FLAG(gIap.Tx.bPending);			gIap.Tx.DataLength = 0;			//memset(&(gIap.Tx), 0, sizeof(tIapTx))			if(*pFsmState != IAP_FSM_DONE)			{				ret = IAP_ProcessFsm(pIap);				M_SET_FLAG(bFsmDone);			}			else			{				ret = IAP_OK;//;			}//			break;		}		else if(M_IS_SET(pInEvent->flag.Rx))		{			M_CLEAR_FLAG(pInEvent->flag.Rx);			M_SET_FLAG(pOutEvent->flag.RxAck);			if(*pFsmState != IAP_FSM_DONE)			{				if(pIap->bFree)				{					if(*pFsmState == IAP_FSM_IDLE)					{						*pFsmState = IAP_FSM_RX;						M_SET_FLAG(bDoRx);					}					else					{						/* some process is pending -> repeat Rx event */						//ret = IAP_REP_RX;						M_SET_FLAG(pInEvent->flag.Rx);						M_CLEAR_FLAG(pOutEvent->flag.RxAck);					}				}				else				{					M_SET_FLAG(bDoRx);				}			}			else			{//				ret = IAP_RX_DONE;				//M_SET_FLAG(pOutEvent->flag.RxAck);			}			if(M_IS_SET(bDoRx))			{				tIapRx* pIapRx = &(pIap->Rx);				if(IAP_IsArchiveEmpty(&(pIapRx->IapArchive)))				{					ret = IAP_ProcessRx(pIapRx);	//TBD					if(ret == IAP_OK)					{						M_CLEAR_FLAG(pOutEvent->flag.RxAck);	/* no RxAck yet; first data processing */						ret = IAP_ProcessFsm(pIap);						M_SET_FLAG(bFsmDone);					}				}				else				{					ret = E_IAP_RX;				}			}			//break;		}		else if(M_IS_SET(pInEvent->flag.RxAcp))		{			M_CLEAR_FLAG(pInEvent->flag.RxAcp);			if(*pFsmState != IAP_FSM_DONE)			{				if(pIap->bFree)				{					if(*pFsmState == IAP_FSM_IDLE)					{						*pFsmState = IAP_FSM_ACP;						M_SET_FLAG(bDoRxCP);					}					else					{						//ret = IAP_REP_RX_ACP;						M_SET_FLAG(pInEvent->flag.RxAcp);					}				}				else				{					M_SET_FLAG(bDoRxCP);				}			}			else			{				ret = IAP_OK;//;			}			if(M_IS_SET(bDoRxCP))			{				tIapAcp* pIapAcp = &(pIap->Acp);				ret = IAP_ProcessAcpRx(pIapAcp);	//TBD				if(ret == IAP_OK)				{					ret = IAP_ProcessFsm(pIap);					M_SET_FLAG(bFsmDone);				}			}			//break;		}				else if(M_IS_SET(pInEvent->flag.Cmd))		{			M_CLEAR_FLAG(pInEvent->flag.Cmd);			if(*pFsmState != IAP_FSM_DONE)			{				if( //(pIap->bReady) && 					//((*pFsmState == IAP_FSM_IDLE) || (*pFsmState == IAP_FSM_CMD)) )					((*pFsmState == IAP_FSM_IDLE) || (*pFsmState == IAP_FSM_CMD)) )				{					tIapReq* pIapReq = &(pIap->Req);					//M_CLEAR_FLAG(pIap->bReady);					ret = IAP_ProcessCmd(pIapReq, pIap->bIsExtMode);					if(ret == IAP_OK)					{						*pFsmState = IAP_FSM_CMD;						ret = IAP_ProcessFsm(pIap);						M_SET_FLAG(bFsmDone);						//if(!M_IS_IAP_ERROR(ret))						if(M_IS_IAP_ERROR(ret))						//	ret = IAP_CMD_ACK;						//else							ret = E_IAP_CMD;	//TBD					}				}				else				{	/* not possible to process it now */					/* let the cmd request pending instead of "problem"(=hold up) reporting */					M_SET_FLAG(pInEvent->flag.Cmd);					//ret = E_IAP_CMD;	//TBD				}			}			else			{	/* if here, cmd has been agreed */			 	/* probbaly, iAP processing has been stopped from some reason */				ret = E_IAP_FATAL_CMD;	//TBD - fatal or possible???			}			//break;		}		//else		//{		//	ret = IAP_ProcessFsm(pIap);		//}	//} while(0);	// TBD 	if(ret == IAP_OK)	{		if(M_IS_CLEAR(bFsmDone))		{	/* only one call in one turn */			ret = IAP_ProcessFsm(pIap);		}/*		if(bAuth != pIap->bAuth)		{			if(bAuth < pIap->bAuth)				ret = IAP_AUTH;			else				ret = IAP_AUTH_DONE;		}*//*		else if(bReady != pIap->bReady)		{			if(bReady < pIap->bReady)				ret = IAP_READY;			else				ret = IAP_BUSY;		}*/	}	if(M_IS_IAP_ERROR(ret))		DBG_REPORT_ERROR(ret);	return ret;}void IAP_Init(tIap* pIap){	tIapTx* pIapTx = &(pIap->Tx);	//tIapItem* pTxItem = &(pIapTx->Item);	tIapItem* pCmd = &(pIap->Req.Item);	memset(pIap, 0, sizeof(tIap));	//pIapTx->pData = gIapTxBuffer;	/* preset pointer to the tx data buffer */	//pTxItem->pData = gIapCmdBuffer;	/* preset pointer to the cmd data buffer */	pCmd->pData = M_IAP_GET_CMD_BUFFER_BASE();	/* preset pointer to the cmd data buffer */	M_SET_FLAG(pIapTx->bEndFlag);	/* indentifies that no Tx package is open */}void IAP_Close(tIap* pIap){	}t_player_state IAP_ProcessRx(tIapRx* pIapRx){	t_player_state err = E_IAP;	static uint8 bStart = TRUE;	//uint8* pData= pIapRx->pData;	//uint16 DataLen = pIapRx->DataLength;	IAP_ConsolidateArchive(&(pIapRx->IapArchive), bStart);	if(bStart)	{		pIapRx->ErrPacketCount = 0;		M_SET_FLAG(pIapRx->bParsing);		err = IAP_PushOntoArchive(&(pIapRx->IapArchive), pIapRx->pData, pIapRx->DataLength);		if (err == IAP_OK)			M_CLEAR_FLAG(pIapRx->bParsing);		else		{			DBG_REPORT_ERROR(err);		}	}	else	{		if(pIapRx->ErrPacketCount)		{			pIapRx->ErrPacketCount++;			err = E_IAP_RX_PACKET;			DBG_REPORT_ERROR(err);		}		else if(M_IS_SET(pIapRx->bParsing))		{			//TBD - CHECK Content			err = IAP_PushOntoArchive(&(pIapRx->IapArchive), pIapRx->pData, pIapRx->DataLength);		}	}//	if(err != IAP_OK)//	{//		M_CLEAR_FLAG(pIapRx->bParsing);//	}	bStart = pIapRx->bEndFlag;	if(M_IS_IAP_ERROR(err))	{		err = E_IAP_RX_PACKET;		DBG_REPORT_ERROR(err);	}	return err;}t_player_state IAP_ProcessAcpRx(tIapAcp* pIapAcp){	t_player_state err = IAP_OK;	if(pIapAcp->Error != ACP_OK)	{		DBG_REPORT_ERROR(E_IAP_AUTH);		DBG_PRINTF("iap: IAP_ProcessAcpRx: ACP error\r\n");		return E_IAP_AUTH;	//TBD	}	switch(pIapAcp->Cmd)	{	case ACP_CMD_INIT:		pIapAcp->InitInfo = *((tAcpInitInfo*)pIapAcp->pData);		break;	case ACP_CMD_GET_INFO:		pIapAcp->Info = *((tAcpInfoStatusData*)pIapAcp->pData);		break;	case ACP_CMD_GET_PAGE:		pIapAcp->pPage = (tAcpCertPageStatusData*)pIapAcp->pData;		break;	case ACP_CMD_GET_SIGNATURE:		pIapAcp->pSignature = (tAcpSignatureStatusData*)pIapAcp->pData;		break;	default:		err = E_IAP;		DBG_REPORT_ERROR(err);		DBG_PRINTF("iap: *E - FATAL: RxCopro wrong cmd\r\n");		break;	}	return err;	}t_player_state IAP_ProcessTxCopro(tIapAcp* pIapAcp, t_acp_cmd Cmd, void* pCmdData){	t_player_state err = IAP_OK;	//IAP_REQ_ACP;	switch(Cmd)	{	case ACP_CMD_INIT:		break;	case ACP_CMD_GET_INFO:		break;	case ACP_CMD_GET_PAGE:		pIapAcp->pPage = NULL;	/* clear for requested page */		break;	case ACP_CMD_GET_SIGNATURE:	{		tIapGenCmd0x17iData* pChallenge = (tIapGenCmd0x17iData*)pCmdData;		pIapAcp->pSignature = NULL;	/* clear for requested signature */		pIapAcp->pData = pIapAcp->InitInfo.pBuffer;		switch(pIapAcp->Info.Version.V.AuthMajVer)		{		case IAP_VER_1:			memcpy(pIapAcp->pData, pChallenge->Version.V1.Challenge, C_ACP_CHALLENGE_V1_LENGTH);	//TBD? max length pIapAcp->InitInfo.BufferLength			break;		case IAP_VER_2:			memcpy(pIapAcp->pData, pChallenge->Version.V1.Challenge, C_ACP_CHALLENGE_V2_LENGTH);	//TBD? max length			break;		default:			err = E_IAP;			DBG_REPORT_ERROR(err);			DBG_PRINTF("iap: *E - FATAL:TxCopro wrong VERSION\r\n");			break;		}		break;	}	default:		err = E_IAP;		DBG_REPORT_ERROR(err);		DBG_PRINTF("iap: *E - FATAL:TxCopro wrong CMD\r\n");		break;	}	if( !(M_IS_IAP_ERROR(err)) )	{	/* if OK */		pIapAcp->Cmd = Cmd;	}	else	{		DBG_REPORT_ERROR(err);	}	return err;}t_player_state IAP_ProcessCmd(tIapReq* pIapReq, uint8 bIsExtMode){ //TBD	t_player_state err = IAP_OK;	return err;}/* JS implemented */t_player_state IAP_ProcessFsm(tIap* pIap){	t_player_state err = IAP_OK;//	uint8 bAgain = 0;	tIapItem* pRxItem;	tIapGenCmd0x02iData* pIapGenCmd0x02iData;	tIapRx* pIapRx = &(pIap->Rx);	tIapTx* pIapTx = &(pIap->Tx);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -