📄 driver.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 : driver.c
//* Object : USART driver in C
//* Creation : ODi 07/11/2002
//*
//*----------------------------------------------------------------------------
#include "PRODUCT/AT91product.h"
#include "PRODUCT/lib_AT91product.h"
#include "SERVICE/SBUFFER/AT91_SVC_SBUFFER.h"
#include "SERVICE/TXUSART/AT91_SVC_TXUSART.h"
#ifndef AT91S_SVC_USDRIVER_H
#define AT91S_SVC_USDRIVER_H
typedef struct _AT91S_SVC_USDRIVER {
// Public Method:
// ==============
// Write is invoked to store data in the buffer (return number of bytes written)
int (*Write) (struct _AT91S_SVC_SBUFFER *, char *, unsigned int);
// Pointer to driver handler function
void (*DriverHandler) ();
// Private data:
// =============
// AT91S_SVC_SBUFFER instance
AT91S_SVC_SBUFFER svcBuffer;
// AT91S_SVC_TXUSART instance
AT91S_SVC_TXUSART svcTxUsart;
char semaphore;
} AT91S_SVC_USDRIVER, *AT91PS_SVC_USDRIVER;
typedef int (*AT91PF_SVC_USDRIVER_Write) (AT91PS_SVC_USDRIVER, char *, unsigned int);
typedef void (*AT91PF_SVC_USDRIVER_DriverHandler) ();
//* ====================================================================================
// This function is called by the application.
// Open SBUFFER service. Call with a buffer area pre-allocated to store data being written
extern AT91PS_SVC_USDRIVER AT91F_SVC_USDRIVER_Open(
AT91PS_SVC_USDRIVER, // \arg pointer to an USDRIVER allocated
AT91PS_USART, // \arg pointer to USART arguments
unsigned int, // \arg USART id
char *, // \arg TX buffer size (MUST BE > 2 BYTES)
unsigned int); // \arg TX buffer size (MUST BE > 2 BYTES)
// Following functions are supposed to be invoked through services function pointer
extern int AT91F_SVC_USDRIVER_Write(
AT91PS_SVC_USDRIVER, // \arg pointer to an USDRIVER allocated
char *, // \arg pointer on buffer to be sent
unsigned int); // \arg number of bytes to be written
// Driver handler
extern void AT91F_SVC_USDRIVER_DriverHandler();
#endif // AT91S_SVC_USDRIVER_H
//*----------------------------------------------------------------------------
//* \fn AT91F_SVC_USDRIVER_DataToSend
//* \brief This function is a wrapper used by AT91S_SVC_TXUSART service to invoke AT91S_SVC_SBUFFER service
//*----------------------------------------------------------------------------
static unsigned int AT91F_SVC_USDRIVER_DataToSend ( // \return number of bytes to send
char *pBuffer[]) // \arg reference to a pointer on the buffer to send
{
return svcBuffer.DataToSend(&svcBuffer, pBuffer);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_SVC_USDRIVER_LockData
//* \brief This function is a wrapper used by AT91S_SVC_TXUSART service to invoke AT91S_SVC_SBUFFER service
//*----------------------------------------------------------------------------
static void AT91F_SVC_USDRIVER_LockData (
char *pBuffer, // \arg pointer on the buffer to lock
unsigned int bufferSize) // \arg number of bytes to lock
{
svcBuffer.LockData(&svcBuffer, pBuffer, bufferSize);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_SVC_USDRIVER_ReleaseData
//* \brief This function is a wrapper used by AT91S_SVC_TXUSART service to invoke AT91S_SVC_SBUFFER service
//*----------------------------------------------------------------------------
static void AT91F_SVC_USDRIVER_ReleaseData (
char *pBuffer, // \arg pointer on the buffer to lock
unsigned int bufferSize) // \arg number of bytes to lock
{
svcBuffer.ReleaseData(&svcBuffer, pBuffer, bufferSize);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_SVC_USDRIVER_DriverHandler
//* \brief This function is the IT handler for USART
//*----------------------------------------------------------------------------
void AT91F_SVC_USDRIVER_DriverHandler()
{
volatile unsigned int csr = AT91C_BASE_US1->US_CSR;
svcTxUsart.TxHandler(&svcTxUsart, csr);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_SVC_USDRIVER_Open
//* \brief This function is the IT handler for USART
//*----------------------------------------------------------------------------
AT91PS_SVC_USDRIVER AT91F_SVC_USDRIVER_Open(
AT91PS_SVC_USDRIVER pDriver, // \arg Pointer to AT91S_SVC_USDRIVER service
AT91PS_USART pUsart, // \arg pointer to USART arguments
unsigned int usartId, // \arg USART id
char *pBuffer, // \arg TX buffer size (MUST BE > 2 BYTES)
unsigned int bufferSize) // \arg TX buffer size (MUST BE > 2 BYTES)
{
pDriver->semaphore = 0;
// Open a SBUFFER service
AT91F_SVC_SBUFFER_Open(
&(pDriver->svcBuffer),
pBuffer, bufferSize);
// Open a TXUSART service
AT91F_SVC_TXUSART_Open(
&(pDriver->svcBuffer),
pUsart,
(AT91PF_SVC_TXUSART_DataToSend) AT91F_SVC_USDRIVER_DataToSend,
(AT91PF_SVC_TXUSART_LockData) AT91F_SVC_USDRIVER_LockData,
(AT91PF_SVC_TXUSART_ReleaseData) AT91F_SVC_USDRIVER_ReleaseData);
// Configure Usart
AT91F_US_Configure (
pUsart, // DBGU base address
48000000, // 48 MHz
AT91C_US_ASYNC_MODE, // mode Register to be programmed
115200 , // baudrate to be programmed
0); // timeguard to be programmed
// Configure AIC controller to handle Usart interrupts
AT91F_AIC_ConfigureIt (
AT91C_BASE_AIC, // AIC base address
usartId, // System peripheral ID
AT91C_AIC_PRIOR_HIGHEST, // Max priority
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, // Level sensitive
AT91F_ASM_US0_Handler );
// Enable Usart interrupt in AIC
AT91F_AIC_EnableIt(
AT91C_BASE_AIC, // AIC base address
usartId); // System peripheral ID
// Enable Transmit
AT91F_US_EnableTx( pUsart);
AT91F_PDC_EnableTx((AT91PS_PDC) pUsart->US_RPR);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_SVC_DRIVER_Write
//* \brief This function is the IT handler for USART
//*----------------------------------------------------------------------------
void AT91F_SVC_USDRIVER_Write(
AT91PS_SVC_USDRIVER pDriver, // \arg Pointer to AT91S_SVC_USDRIVER service
char *pBuffer, // \arg pointer on buffer to be sent
unsigned int bufferSize) // \arg number of bytes to be written
{
unsigned int bytesWritten;
while (pDriver->semaphore);
pDriver->semaphore = 1;
while (bufferSize) {
bytesWritten = pDriver->svcBuffer.Write(&svcBuffer, pBuffer, bufferSize);
if (bytesWritten) {
pDriver->svcTxUsart.StartTx(&svcTxUsart);
pBuffer += bytesWritten;
bufferSize -= bytesWritten;
}
}
pDriver->semaphore = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -