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

📄 txbin.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
字号:
/*
================================================================================
* @file   TxBin.c
* @brief  Process UART binary transmision
* @author 2006/03/29 Michiru Kagaya
* Copyright (C)SEIKO EPSON Corp. All Rights Reserved.
================================================================================
*/

//=================================
// Include files
//=================================
#include <string.h>
#include "UART_FUNC.h"
#include "UART_FuncCom.h"
#include "UART_UserConfig.h"
#include "UART_IF.h"

//=================================
// 	Function prototype
//=================================
static short SendCallback( unsigned short wMsg, unsigned short wStatus, void* pTxSize );


/*
--------------------------------------------------------------------------------
*					  UART_FuncSendDataA
* @brief   Transmit data (Asynchronous)
* @param   unsigned char bChannel : Channel number of suspension
*		   unsigned short wSize   : Size of tranmission
*		   unsigned char  *pData  : The address of the transmission data
*		   UART_FUNC_CALLBACK pfnCallbackProc : Transmision complete notification callback function
* @retval  unsigned short
*			STATUS_SUCCESS			: Complete normally
*			STATUS_INVALID_PARAMETER: Parameter error
--------------------------------------------------------------------------------
*/
short UART_FuncSendDataA ( unsigned char bChannel, unsigned short wSize,
								  unsigned char *pData, UART_FUNC_CALLBACK pfnCallbackProc )
{
	PTX_INFO psTxInfo;
	short txStatus;
	unsigned char index = bChannel - 1;

	//===============================
	// Check parameter
	//===============================
	if( wSize == 0 || pData == NULL
		|| bChannel == 0 || bChannel > MAX_UART_CHANNEL ){
		return STATUS_INVALID_PARAMETER;
	}
	psTxInfo = &sModuleInfo.sChInfo[index].txInfo;

	// Does not the number of transmission exceed the size of sheltering buffer?
	if( wSize > psTxInfo->wTempSize ){
		return STATUS_UNSUCCESSFUL;
	}

	//===============================
	// Check the state
	//===============================
	if( sModuleInfo.sChInfo[index].state != STATE_READY
		|| sModuleInfo.sChInfo[index].txInfo.state != TRAN_STATE_READY){
		return STATUS_UNSUCCESSFUL;
	}

	//===============================
	// Save the data
	//===============================
	psTxInfo->wActSize = 0;
	psTxInfo->wReqSize = wSize;
	psTxInfo->pReqAddr = pData;
	memcpy( psTxInfo->pTempBuf, pData, wSize );				// Copy data
	psTxInfo->pPutAddr = psTxInfo->pTempBuf;				// Set the transmission address
	psTxInfo->pfnCallback = pfnCallbackProc;

	//===============================
	// Data transmission request
	//===============================
	psTxInfo->state = TRAN_STATE_EXEC_BINASYNC;		// Set to Executing transmission.
	txStatus = UART_IFWriteData( bChannel, psTxInfo->wReqSize, psTxInfo->pPutAddr, SendCallback );
	if( txStatus != STATUS_SUCCESS ){
		return STATUS_UNSUCCESSFUL;
	}

	return STATUS_SUCCESS;
}

/*
--------------------------------------------------------------------------------
*					  UART_FuncSendDataA
* @brief   Data transmission (Asynchronous)
* @param   unsigned char bChannel : Channel number of suspension
*		   unsigned short wSize   : Transfer size
*		   unsigned char  *pData  : The address of the transfer data
*		   UART_FUNC_CALLBACK pfnCallbackProc :  Completion notification callback function
* @retval  unsigned short
*			STATUS_SUCCESS			: Complete normally
*			STATUS_INVALID_PARAMETER: Parameter error
--------------------------------------------------------------------------------
*/
short UART_FuncSendData ( unsigned char bChannel, unsigned short wSize, unsigned char *pData )
{
	unsigned short txStatus;
	volatile unsigned char* pTranState;
	PTX_INFO psTxInfo;
	unsigned char index = bChannel - 1;

	//===============================
	// Check parameter
	//===============================
	if( wSize == 0 || pData == NULL
		|| bChannel == 0 || bChannel > MAX_UART_CHANNEL ){
		return STATUS_INVALID_PARAMETER;
	}

	//===============================
	// Check the state
	//===============================
	if( sModuleInfo.sChInfo[index].state < STATE_READY
		|| sModuleInfo.sChInfo[index].txInfo.state != TRAN_STATE_READY ){
		return STATUS_UNSUCCESSFUL;
	}

	//===============================
	// Save the data
	//===============================
	psTxInfo = &sModuleInfo.sChInfo[index].txInfo;
	psTxInfo->wActSize = 0;
	psTxInfo->wReqSize = wSize;
	psTxInfo->pReqAddr = psTxInfo->pPutAddr = pData;
	psTxInfo->pfnCallback = NULL;

	//===============================
	// Data transmission processing
	//===============================
	psTxInfo->state = TRAN_STATE_EXEC_BINSYNC;		// Is transmiting
	txStatus = UART_IFWriteData( bChannel, psTxInfo->wReqSize, psTxInfo->pPutAddr, SendCallback );	// 1Byte transmit request
	if( txStatus != STATUS_SUCCESS ){
		return STATUS_UNSUCCESSFUL;
	}
	pTranState = &psTxInfo->state;				// Update the data pointer

	// Waiting for the completion of the transmission.
	//-------------------------------
	do {
		UART_DELAY( UART_DELAY_TIME );			// Waiting for the completion of the transmission.
	}while( *pTranState != TRAN_STATE_CMP );

	psTxInfo->state = TRAN_STATE_READY;			// Waiting for the transmision to be ready

	return STATUS_SUCCESS;
}

/*
--------------------------------------------------------------------------------
*					  SendCallback
* @brief   The data transmit complettion callback
* @param   unsigned short wMsg	 : transmission size
*
*
* @retval  unsigned short
*			STATUS_SUCCESS			: Complete normally
--------------------------------------------------------------------------------
*/
static short SendCallback( unsigned short wMsg, unsigned short wStatus, void* pTxResult )
{
	PTX_INFO psTxInfo;
	unsigned char index;
	unsigned short txStatus;
	PUART_IF_TX_STS psTxStatus = (PUART_IF_TX_STS)pTxResult;

	// Error check(make sure)
	//===============================
	if( wMsg != UART_IF_SND_DATA_CMP || pTxResult == NULL
		|| psTxStatus->bChannel == 0 || psTxStatus->bChannel < MAX_UART_CHANNEL ){
		return STATUS_INVALID_PARAMETER;
	}

	index = psTxStatus->bChannel - 1;

	psTxInfo = &sModuleInfo.sChInfo[index].txInfo;

	//===============================


	//===============================
	// Check status
	//===============================
	if( wStatus != STATUS_SUCCESS ){
		// --- Transmission error completion callback notification ---

		// Processing that corresponds synchronization or asynchronous
		if( psTxInfo->state == TRAN_STATE_EXEC_BINASYNC ){
			// Asynchronous

			if( psTxInfo->pfnCallback != NULL ){		// pCallbackProc is NULL, so do not do the callback notification
				UART_FUNC_XFER_RESULT sXferResult;
				sXferResult.bChannel = psTxStatus->bChannel;
				sXferResult.wReqSize = psTxInfo->wReqSize;
				sXferResult.wActSize = psTxInfo->wActSize;
				sXferResult.pBufAddr = psTxInfo->pReqAddr;
				psTxInfo->state = TRAN_STATE_READY;		// Waiting for the transmision ready
				psTxInfo->pfnCallback( UART_FUNCM_SND_DATA_CMP, wStatus, &sXferResult );
			}
		}else{
			// Synchronous
			psTxInfo->state = TRAN_STATE_CMP;	// The state is changed without call the callback when at synchronization.
		}
		return STATUS_SUCCESS;;
	}

	//===============================
	// Update the data number
	//===============================
	psTxInfo->wActSize += psTxStatus->wActSize;
	psTxInfo->pPutAddr += psTxStatus->wActSize;

	//===============================
	// Check if the transmission is completed
	//===============================
	if( psTxInfo->wReqSize <= psTxInfo->wActSize ){
		//
		if( psTxInfo->state == TRAN_STATE_EXEC_BINASYNC ){
			// --- Asynchronous ---
			if( psTxInfo->pfnCallback != NULL ){				// pCallbackProc is NULL, so do not do the callback notification
				UART_FUNC_XFER_RESULT sXferResult;
				sXferResult.bChannel = psTxStatus->bChannel;
				sXferResult.wReqSize = psTxInfo->wReqSize;
				sXferResult.wActSize = psTxInfo->wActSize;
				sXferResult.pBufAddr = psTxInfo->pReqAddr;		// Address specified by API call
				psTxInfo->pfnCallback( UART_FUNCM_SND_DATA_CMP, STATUS_SUCCESS, &sXferResult );
			}
			psTxInfo->state = TRAN_STATE_READY;					// Set to Waiting for Transmission

		}else{
			// --- Synchronous ---
			psTxInfo->state = TRAN_STATE_CMP;					// The state is changed without call the callback when at synchronization.
		}
		return STATUS_SUCCESS;;
	}

	//===============================
	// Transmit Next transmisssion data
	//===============================
	txStatus = UART_IFWriteData( psTxStatus->bChannel, (unsigned short)(psTxInfo->wReqSize - psTxInfo->wActSize), psTxInfo->pPutAddr, SendCallback );	// 1Byte transmission requeset
	if( txStatus != STATUS_SUCCESS ){
		// Error occured
		;
	}

	return STATUS_SUCCESS;
}

⌨️ 快捷键说明

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