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

📄 driver.c

📁 AT91RM9200的USB相关ACM CDC的源代码包! AT91RM9200-BasicUSBPipe-ARM1_2-2_0.zip
💻 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 + -