📄 obj_pipe.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 : DfuPipe.c
//* Object : Application pipe interface
//*
//* 1.0 23/03/01 : HI Creation
//* 1.0 20/06/01 : ODi Review for DFU
//*----------------------------------------------------------------------------
#include "lib_debug.h"
#include "services/obj_pipe.h"
#ifdef DBG_DRV_PIPE
#include <assert.h>
const char *PipeErrMsg[] = {
"Pipe Success",
"Pipe Open failed",
"Pipe Write failed",
"Pipe Read failed",
"Pipe Abort failed",
"Pipe Reset failed",
"Pipe Unknown error"
};
char const *AT91F_PipeGetError(AT91S_PipeStatus msgId)
{
switch (msgId & AT91C_PIPE_ERROR) {
case AT91C_PIPE_SUCCESS: return (PipeErrMsg[0]);
case AT91C_PIPE_OPEN_FAILED: return (PipeErrMsg[1]);
case AT91C_PIPE_WRITE_FAILED: return (PipeErrMsg[2]);
case AT91C_PIPE_READ_FAILED: return (PipeErrMsg[3]);
case AT91C_PIPE_ABORT_FAILED: return (PipeErrMsg[4]);
case AT91C_PIPE_RESET_FAILED: return (PipeErrMsg[5]);
default: return (PipeErrMsg[6]);
}
}
#endif
//*----------------------------------------------------------------------------
//* Function Name : AT91F_PipeOpen()
//* Object :
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91PS_Pipe AT91F_OpenPipe(
AT91PS_Pipe pPipe,
AT91PS_SvcComm pSvcComm,
AT91PS_Buffer pBuffer)
{
AT91S_BufferStatus status;
#ifdef DBG_DRV_PIPE
assert(pBuffer);
assert(pSvcComm);
assert(pBuffer->RstRdBuffer);
assert(pBuffer->RstWrBuffer);
#endif
// Init pipe members
pPipe->pSvcComm = pSvcComm;
pPipe->pBuffer = pBuffer;
// Init the API with default functions
pPipe->Write = AT91F_PipeWrite;
pPipe->Read = AT91F_PipeRead;
pPipe->AbortWrite = AT91F_PipeAbortWrite;
pPipe->AbortRead = AT91F_PipeAbortRead;
pPipe->Reset = AT91F_PipeReset;
pPipe->IsWritten = AT91F_PipeMsgWritten;
pPipe->IsReceived = AT91F_PipeMsgReceived;
pPipe->WriteCallback = (AT91PF_PipeWriteCallBack) 0;
pPipe->ReadCallback = (AT91PF_PipeReadCallBack) 0;
pPipe->pPrivateReadData = (void *) 0;
pPipe->pPrivateWriteData = (void *) 0;
// Update pSvcComm fields
pSvcComm->pBuffer = pBuffer;
// Init pBuffer members
pBuffer->pPipe = pPipe;
// Reset the read and write buffer
pBuffer->RstRdBuffer(pBuffer);
if ( status ) return ((AT91PS_Pipe) 0);
status = pBuffer->RstWrBuffer(pBuffer);
if ( status ) return ((AT91PS_Pipe) 0);
return pPipe;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_PipeWrite()
//* Object :
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_PipeStatus AT91F_PipeWrite(
AT91PS_Pipe pPipe,
char const *pVoid,
unsigned int size,
AT91PF_PipeReadCallBack callback,
void *privateData)
{
AT91PS_SvcComm pSvcComm = pPipe->pSvcComm;
AT91PS_Buffer pBuffer = pPipe->pBuffer;
AT91S_PipeStatus status = AT91C_PIPE_SUCCESS;
#ifdef DBG_DRV_PIPE
assert(pBuffer);
assert(pBuffer->SetWrBuffer);
assert(pSvcComm);
assert(pSvcComm->TxReady);
#endif
// Initialize callback
pPipe->pPrivateWriteData = privateData;
pPipe->WriteCallback = callback;
// Check the periph is ready to accept transfer
if ( !(pSvcComm->TxReady(pSvcComm)) )
return (AT91C_PIPE_WRITE_FAILED);
// Initialize the buffer
status = pBuffer->SetWrBuffer(pBuffer, pVoid, size);
if ( status )
return (AT91C_PIPE_WRITE_FAILED | status);
// Initialize the peripheral
if ( pSvcComm->StartTx ) {
status = pSvcComm->StartTx(pSvcComm);
if ( status )
return (AT91C_PIPE_WRITE_FAILED | status);
}
return AT91C_PIPE_SUCCESS;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_PipeRead()
//* Object :
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_PipeStatus AT91F_PipeRead(
AT91PS_Pipe pPipe,
char *pVoid,
unsigned int size,
AT91PF_PipeReadCallBack callback,
void *privateData)
{
AT91PS_SvcComm pSvcComm = pPipe->pSvcComm;
AT91PS_Buffer pBuffer = pPipe->pBuffer;
AT91S_PipeStatus status = AT91C_PIPE_SUCCESS;
#ifdef DBG_DRV_PIPE
assert(pBuffer);
assert(pBuffer->SetRdBuffer);
assert(pSvcComm);
#endif
// Initialize the callback
pPipe->pPrivateReadData = privateData;
pPipe->ReadCallback = callback;
// Initialize the buffer
status = pBuffer->SetRdBuffer(pBuffer, pVoid, size);
if ( status )
return (AT91C_PIPE_READ_FAILED | status);
// Initialize the peripheral
if ( pSvcComm->StartRx) {
status = pSvcComm->StartRx(pSvcComm);
if ( status )
return (AT91C_PIPE_READ_FAILED | status);
}
return AT91C_PIPE_SUCCESS;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_PipeAbortWrite()
//* Object :
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_PipeStatus AT91F_PipeAbortWrite(
AT91PS_Pipe pPipe)
{
AT91PS_SvcComm pSvcComm = pPipe->pSvcComm;
AT91PS_Buffer pBuffer = pPipe->pBuffer;
AT91S_PipeStatus status = AT91C_PIPE_SUCCESS;
#ifdef DBG_DRV_PIPE
assert(pBuffer);
assert(pBuffer->RstWrBuffer);
assert(pSvcComm);
#endif
// Reset the write Buffer
status = pBuffer->RstWrBuffer(pBuffer);
if ( status )
return (AT91C_PIPE_ABORT_FAILED | status);
// Reset the peripheral
if ( pSvcComm->StopTx) {
status = pSvcComm->StopTx(pSvcComm);
if ( !status )
return (AT91C_PIPE_ABORT_FAILED | status);
}
// Invoke the callback
if (pPipe->WriteCallback)
pPipe->WriteCallback(AT91C_PIPE_WRITE_ABORTED, pPipe->pPrivateWriteData);
return AT91C_PIPE_SUCCESS;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_PipeAbortRead()
//* Object :
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_PipeStatus AT91F_PipeAbortRead(
AT91PS_Pipe pPipe)
{
AT91PS_SvcComm pSvcComm = pPipe->pSvcComm;
AT91PS_Buffer pBuffer = pPipe->pBuffer;
AT91S_PipeStatus status = AT91C_PIPE_SUCCESS;
#ifdef DBG_DRV_PIPE
assert(pBuffer);
assert(pBuffer->RstRdBuffer);
assert(pSvcComm);
#endif
// Reset the read Buffer
status = pBuffer->RstRdBuffer(pBuffer);
if ( status )
return (AT91C_PIPE_ABORT_FAILED | status);
// Reset the peripheral
if ( pSvcComm->StopRx) {
status = pSvcComm->StopRx(pSvcComm);
if ( status )
return (AT91C_PIPE_ABORT_FAILED | status);
}
// Invoke the callback
if (pPipe->ReadCallback)
pPipe->ReadCallback(AT91C_PIPE_READ_ABORTED, pPipe->pPrivateReadData);
return AT91C_PIPE_SUCCESS;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_PipeReset()
//* Object :
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
AT91S_PipeStatus AT91F_PipeReset(
AT91PS_Pipe pPipe)
{
AT91PS_SvcComm pSvcComm = pPipe->pSvcComm;
AT91PS_Buffer pBuffer = pPipe->pBuffer;
AT91S_PipeStatus status = AT91C_PIPE_SUCCESS;
#ifdef DBG_DRV_PIPE
assert(pBuffer);
assert(pSvcComm);
#endif
// Reset the read and write buffer
if ( pBuffer->RstRdBuffer) {
status = pBuffer->RstRdBuffer(pBuffer);
if ( status )
return (AT91C_PIPE_RESET_FAILED | status);
}
if ( pBuffer->RstWrBuffer) {
status = pBuffer->RstWrBuffer(pBuffer);
if ( status )
return (AT91C_PIPE_RESET_FAILED | status);
}
// Reset the peripheral
if ( pSvcComm->Reset) {
status = pSvcComm->Reset(pSvcComm);
if ( status )
return (AT91C_PIPE_RESET_FAILED | status);
}
return AT91C_PIPE_SUCCESS;
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_PipeMsgWritten()
//* Object :
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
char AT91F_PipeMsgWritten(
AT91PS_Pipe pPipe,
char const *pVoid)
{
AT91PS_Buffer pBuffer = pPipe->pBuffer;
return (pBuffer->MsgWritten(pBuffer, pVoid));
}
//*----------------------------------------------------------------------------
//* Function Name : AT91F_PipeMsgReceived()
//* Object :
//* Input Parameters :
//* Output Parameters :
//*----------------------------------------------------------------------------
char AT91F_PipeMsgReceived(
AT91PS_Pipe pPipe,
char const *pVoid)
{
AT91PS_Buffer pBuffer = pPipe->pBuffer;
return (pBuffer->MsgRead(pBuffer, pVoid));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -