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

📄 obj_sbuffer.c

📁 AT91rm9200的引导代码
💻 C
字号:
//*----------------------------------------------------------------------------
//*      ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : obj_sbuffer.c
//* Object              : SimpleBuffer implementation (specialization of SBuffer)
//*
//* 1.0 23/03/01 	    : HI Creation
//* 1.0 20/06/01 	    : ODi Adaptation for DFU
//*----------------------------------------------------------------------------
#include "lib_debug.h"
#include "services\obj_sbuffer.h"
#include "services\obj_pipe.h"

#ifdef DBG_DRV_BUFFER
#include <assert.h>
const char *SBufferErrMsg[] = {
	"Buffer Success",
	"Periph has written more bytes than there is in the buffer",
	"Read buffer full",
	"Pipe Unknown error"
};
#endif

//*----------------------------------------------------------------------------
//* Function Name       : OpenSimpleBuffer()
//* Object              :
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
AT91PS_Buffer AT91F_OpenSBuffer(
	AT91PS_SBuffer pSimpleBuffer)
{
	AT91PS_Buffer pBuffer = &(pSimpleBuffer->parent);
#ifdef DBG_DRV_BUFFER
	assert(pSimpleBuffer);
	assert(pBuffer);
#endif

	// Init the base class members
	pBuffer->pPipe = (AT91PS_Pipe) 0;

	// Functions invoked by the pipe
	pBuffer->SetRdBuffer    = AT91F_SbSetRdBuffer;
	pBuffer->SetWrBuffer    = AT91F_SbSetWrBuffer;
	pBuffer->RstRdBuffer    = AT91F_SbRstRdBuffer;
	pBuffer->RstWrBuffer    = AT91F_SbRstWrBuffer;
	pBuffer->MsgWritten     = AT91F_SbMsgWritten;
	pBuffer->MsgRead        = AT91F_SbMsgRead;
	// Functions invoked by the peripheral
	pBuffer->GetWrBuffer    = AT91F_SbGetWrBuffer;
	pBuffer->GetRdBuffer    = AT91F_SbGetRdBuffer;
	pBuffer->EmptyWrBuffer  = AT91F_SbEmptyWrBuffer;
	pBuffer->FillRdBuffer   = AT91F_SbFillRdBuffer;
	pBuffer->pChild         = pSimpleBuffer;

	// Init class members
	pSimpleBuffer->szRdBuffer = 0;
	pSimpleBuffer->szWrBuffer = 0;
	pSimpleBuffer->pRdBuffer  = (char *) 0;
	pSimpleBuffer->pWrBuffer  = (char const *)0;
	return pBuffer;
}


//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbSetRdBuffer()
//* Object              : Prepare a new read buffer
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbSetRdBuffer(
	AT91PS_Buffer  pBuffer,
	char           *pData,
	unsigned int   dataSize)
{
	AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);

#ifdef DBG_DRV_BUFFER
	assert(pSBuffer);
#endif
	pSBuffer->pRdBuffer  = pData;
	pSBuffer->szRdBuffer = dataSize;
	return AT91C_BUFFER_SUCCESS;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbSetWrBuffer()
//* Object              : Prepare a new write buffer
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbSetWrBuffer(
	AT91PS_Buffer pBuffer,
	char const    *pData,
	unsigned int  dataSize)
{
	AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);

#ifdef DBG_DRV_BUFFER
	assert(pSBuffer);
#endif
	pSBuffer->pWrBuffer  = pData;
	pSBuffer->szWrBuffer = dataSize;
	return AT91C_BUFFER_SUCCESS;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbRstRdBuffer()
//* Object              : Empty the read buffer
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbRstRdBuffer(
	AT91PS_Buffer pBuffer)
{
		AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);

	#ifdef DBG_DRV_BUFFER
		assert(pSBuffer);
	#endif
		pSBuffer->pRdBuffer  = 0;
		pSBuffer->szRdBuffer = 0;
		return AT91C_BUFFER_SUCCESS;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbRstWrBuffer()
//* Object              : Empty the write buffer
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbRstWrBuffer(
	AT91PS_Buffer pBuffer)
{
		AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);

	#ifdef DBG_DRV_BUFFER
		assert(pSBuffer);
	#endif
		pSBuffer->pWrBuffer = (char *) 0;
		pSBuffer->szWrBuffer = 0;
		return AT91C_BUFFER_SUCCESS;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbMsgWritten()
//* Object              : Check that the message has been written
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
char AT91F_SbMsgWritten(
	AT91PS_Buffer pBuffer,
	char const *pMsg)
{
	AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);

	#ifdef DBG_DRV_BUFFER
		assert(pSBuffer);
	#endif

	return ( !(pSBuffer->szWrBuffer > 0) );
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbMsgRead()
//* Object              : Check that the message has been read
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
char AT91F_SbMsgRead(
	AT91PS_Buffer pBuffer,
	char const *pMsg)
{
	AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);

	#ifdef DBG_DRV_BUFFER
		assert(pSBuffer);
	#endif

	return ( !(pSBuffer->szRdBuffer > 0) );
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbGetWrBuffer()
//* Object              : Check that the message has been read
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbGetWrBuffer(
	AT91PS_Buffer pBuffer,
	char const ** pData,
	unsigned int  *pSize)
{
	AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);

	#ifdef DBG_DRV_BUFFER
		assert(pSBuffer);
	#endif
	*pData = pSBuffer->pWrBuffer;
	*pSize = pSBuffer->szWrBuffer;

	return AT91C_BUFFER_SUCCESS;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbGetRdBuffer()
//* Object              : Check that the message has been read
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbGetRdBuffer(
	AT91PS_Buffer pBuffer,
	char          **pData,
	unsigned int  *pSize)
{
	AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);

	#ifdef DBG_DRV_BUFFER
		assert(pSBuffer);
	#endif
	*pData = pSBuffer->pRdBuffer;
	*pSize = pSBuffer->szRdBuffer;

	return AT91C_BUFFER_SUCCESS;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbEmptyWrBuffer()
//* Object              : A message has been written
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbEmptyWrBuffer(
	AT91PS_Buffer pBuffer,
	unsigned int size)
{
	AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
	AT91PS_Pipe    pPipe;
	AT91S_BufferStatus status    = AT91C_BUFFER_SUCCESS;

	#ifdef DBG_DRV_BUFFER
		assert(pSBuffer);
	#endif
	// Update data pointer
	pSBuffer->pWrBuffer += size;
	// Update data counter
	if (pSBuffer->szWrBuffer < size) {
		pSBuffer->szWrBuffer = 0;
		status =  AT91C_BUFFER_UNDERRUN;
	}
	else {
		pSBuffer->szWrBuffer -= size;
	}

	// Invoke the callback
	if (pSBuffer->szWrBuffer == 0) {
		pPipe = pBuffer->pPipe;
		if (pPipe->WriteCallback)
			pPipe->WriteCallback(status, pPipe->pPrivateWriteData);
	}
	return status;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbFillRdBuffer()
//* Object              : A message has been read
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
AT91S_BufferStatus AT91F_SbFillRdBuffer(
	AT91PS_Buffer pBuffer,
	unsigned int  size)
{
	AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pChild);
	AT91PS_Pipe    pPipe;
	AT91S_BufferStatus status = AT91C_BUFFER_SUCCESS;

	#ifdef DBG_DRV_BUFFER
		assert(pSBuffer);
	#endif
	// Update data pointer
	pSBuffer->pRdBuffer += size;
	// Update data counter
	if (pSBuffer->szRdBuffer < size) {
		pSBuffer->szRdBuffer = 0;
		status = AT91C_BUFFER_OVERFLOW;
	}
	else
		pSBuffer->szRdBuffer -= size;

	// Invoke the callback
	if (pSBuffer->szRdBuffer == 0) {
		pPipe = pBuffer->pPipe;
		if (pPipe->ReadCallback)
			pPipe->ReadCallback(status, pPipe->pPrivateReadData);
	}
	return status;
}

//*----------------------------------------------------------------------------
//* Function Name       : SbGetRdBuffer()
//* Object              : Check that the message has been read
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
#ifdef DBG_DRV_BUFFER
char const *AT91F_SbGetError(AT91S_BufferStatus errorNumber)
{
	switch(errorNumber & AT91C_BUFFER_ERROR) {
	case AT91C_BUFFER_SUCCESS:  return (SBufferErrMsg[0]);
	case AT91C_BUFFER_UNDERRUN: return (SBufferErrMsg[1]);
	case AT91C_BUFFER_OVERFLOW: return (SBufferErrMsg[2]);
	default:                    return (SBufferErrMsg[3]);
	}
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbIsWrEmpty()
//* Object              : Check that the message has been written
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
char AT91F_SbIsWrEmpty(
	AT91PS_Buffer pBuffer)
{
	AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pPrivateData);

	#ifdef DBG_DRV_BUFFER
		assert(pSBuffer);
	#endif

	return ( !(pSBuffer->szWrBuffer > 0) );
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SbIsRdFull()
//* Object              : Check that the message has been read
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
char AT91F_SbIsRdFull(
	AT91PS_Buffer pBuffer)
{
	AT91PS_SBuffer pSBuffer = (AT91PS_SBuffer)(pBuffer->pPrivateData);

	#ifdef DBG_DRV_BUFFER
		assert(pSBuffer);
	#endif

	return ( !(pSBuffer->szRdBuffer > 0) );
}

#endif

⌨️ 快捷键说明

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