1
0
mirror of https://github.com/arduino/Arduino.git synced 2025-02-18 12:54:25 +01:00

[sam] adding prototypes to USB_driver.h

This commit is contained in:
Thibaut VIARD 2012-03-29 11:37:35 +02:00
parent d7ae25360a
commit 009bc1b722
2 changed files with 111 additions and 57 deletions

View File

@ -19,4 +19,61 @@
#ifndef _USB_DRIVER_ #ifndef _USB_DRIVER_
#define _USB_DRIVER_ #define _USB_DRIVER_
#include <stdint.h>
extern inline void USBD_WaitIN( void ) ;
extern inline void USBD_ClearIN( void ) ;
extern inline void USBD_WaitOUT( void ) ;
extern inline uint8_t USBD_WaitForINOrOUT( void ) ;
extern inline void USBD_ClearOUT(void) ;
extern void USBD_ClearRxFlag( unsigned char bEndpoint ) ;
extern void USBD_Recv( volatile uint8_t* data, uint8_t count ) ;
extern inline uint8_t USBD_Recv8( void ) ;
extern inline void USBD_Send8( uint8_t d ) ;
extern inline void USBD_SetEP( uint8_t ep ) ;
extern inline u16 USBD_FifoByteCount( void ) ;
extern inline uint8_t USBD_ReceivedSetupInt( void ) ;
extern inline void USBD_ClearSetupInt( void ) ;
extern inline void USBD_Stall( void ) ;
extern inline uint8_t USBD_ReadWriteAllowed( void ) ;
extern inline uint8_t USBD_Stalled( void ) ;
extern uint8_t USBD_FifoFree( void ) ;
extern inline void USBD_ReleaseRX( void ) ;
extern inline void USBD_ReleaseTX( void ) ;
extern inline uint8_t USBD_FrameNumber( void ) ;
extern uint8_t USBD_GetConfiguration( void ) ;
// Number of bytes, assumes a rx endpoint
extern uint8_t USBD_Available( uint8_t ep ) ;
// Non Blocking receive
// Return number of bytes read
extern int USBD_Recv(uint8_t ep, void* d, int len) ;
// Recv 1 byte if ready
extern int USBD_Recv(uint8_t ep) ;
// Space in send EP
extern uint8_t USBD_SendSpace(uint8_t ep) ;
// Blocking Send of data to an endpoint
extern int USBD_Send(uint8_t ep, const void* d, int len) ;
extern void USBD_InitEP(uint8_t index, uint8_t type, uint8_t size) ;
extern void USBD_InitEndpoints() ;
// Handle CLASS_INTERFACE requests
extern bool USBD_ClassInterfaceRequest(Setup& setup) ;
extern void USBD_InitControl(int end) ;
extern void UDPHS_Handler( void ) ;
extern void USBD_Attach( void ) ;
extern void USBD_Detach( void ) ;
#endif /* _USB_DRIVER_*/ #endif /* _USB_DRIVER_*/

View File

@ -34,19 +34,19 @@ int _cend;
unsigned int NumEndpoint=0; unsigned int NumEndpoint=0;
inline void usbd_WaitIN( void ) inline void USBD_WaitIN( void )
{ {
// while (!(UEINTX & (1<<TXINI))); // while (!(UEINTX & (1<<TXINI)));
while (!(UDPHS->UDPHS_EPT[0].UDPHS_EPTSTA & UDPHS_EPTSTA_TX_PK_RDY)); while (!(UDPHS->UDPHS_EPT[0].UDPHS_EPTSTA & UDPHS_EPTSTA_TX_PK_RDY));
} }
inline void ClearIN( void ) inline void USBD_ClearIN( void )
{ {
// UEINTX = ~(1<<TXINI); // UEINTX = ~(1<<TXINI);
UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTCLRSTA = UDPHS_EPTCLRSTA_TX_COMPLT; UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTCLRSTA = UDPHS_EPTCLRSTA_TX_COMPLT;
} }
inline void WaitOUT( void ) inline void USBD_WaitOUT( void )
{ {
// while (!(UEINTX & (1<<RXOUTI))) // while (!(UEINTX & (1<<RXOUTI)))
// ; // ;
@ -54,7 +54,7 @@ inline void WaitOUT( void )
while (UDPHS_EPTSTA_RX_BK_RDY != (UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & UDPHS_EPTSTA_RX_BK_RDY)); while (UDPHS_EPTSTA_RX_BK_RDY != (UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & UDPHS_EPTSTA_RX_BK_RDY));
} }
inline u8 WaitForINOrOUT( void ) inline uint8_t USBD_WaitForINOrOUT( void )
{ {
// while (!(UEINTX & ((1<<TXINI)|(1<<RXOUTI)))) // while (!(UEINTX & ((1<<TXINI)|(1<<RXOUTI))))
// ; // ;
@ -63,24 +63,24 @@ inline u8 WaitForINOrOUT( void )
return (UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & UDPHS_EPTSTA_RX_BK_RDY) == 0; return (UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & UDPHS_EPTSTA_RX_BK_RDY) == 0;
} }
inline void ClearOUT(void) inline void USBD_ClearOUT(void)
{ {
// UEINTX = ~(1<<RXOUTI); // UEINTX = ~(1<<RXOUTI);
UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTCLRSTA = UDPHS_EPTCLRSTA_RX_BK_RDY; UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTCLRSTA = UDPHS_EPTCLRSTA_RX_BK_RDY;
} }
/* /*
void UDPHS_ClearRxFlag( unsigned char bEndpoint ) void USBD_ClearRxFlag( unsigned char bEndpoint )
{ {
UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTCLRSTA = UDPHS_EPTCLRSTA_RX_BK_RDY; UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTCLRSTA = UDPHS_EPTCLRSTA_RX_BK_RDY;
} }
*/ */
void Recv(volatile u8* data, u8 count) void USBD_Recv(volatile uint8_t* data, uint8_t count)
{ {
u8 *pFifo; uint8_t *pFifo;
pFifo = (u8*)((u32 *)UDPHS_EPTFIFO + (EPT_VIRTUAL_SIZE * NumEndpoint)); pFifo = (uint8_t*)((u32 *)UDPHS_EPTFIFO + (EPT_VIRTUAL_SIZE * NumEndpoint));
while (count--) while (count--)
*data++ = pFifo[0]; // UEDATX; *data++ = pFifo[0]; // UEDATX;
@ -90,34 +90,34 @@ void Recv(volatile u8* data, u8 count)
} }
inline u8 Recv8() inline uint8_t USBD_Recv8( void )
{ {
u8 *pFifo; uint8_t *pFifo;
RXLED1; // light the RX LED RXLED1; // light the RX LED
RxLEDPulse = TX_RX_LED_PULSE_MS; RxLEDPulse = TX_RX_LED_PULSE_MS;
pFifo = (u8*)((u32 *)UDPHS_EPTFIFO + (EPT_VIRTUAL_SIZE * NumEndpoint)); pFifo = (uint8_t*)((u32 *)UDPHS_EPTFIFO + (EPT_VIRTUAL_SIZE * NumEndpoint));
// return UEDATX; // return UEDATX;
return (pFifo[0]); return (pFifo[0]);
} }
inline void Send8(u8 d) inline void USBD_Send8(uint8_t d)
{ {
u8 *pFifo; uint8_t *pFifo;
pFifo = (u8*)((u32 *)UDPHS_EPTFIFO + (EPT_VIRTUAL_SIZE * NumEndpoint)); pFifo = (uint8_t*)((u32 *)UDPHS_EPTFIFO + (EPT_VIRTUAL_SIZE * NumEndpoint));
// UEDATX = d; // UEDATX = d;
pFifo[0] =d; pFifo[0] =d;
} }
inline void SetEP(u8 ep) inline void USBD_SetEP(uint8_t ep)
{ {
// UENUM = ep; // UENUM = ep;
NumEndpoint = ep & 7; NumEndpoint = ep & 7;
} }
inline u16 FifoByteCount() inline u16 USBD_FifoByteCount()
{ {
// return UEBCLX; // return UEBCLX;
// SAM3X // SAM3X
@ -126,65 +126,65 @@ inline u16 FifoByteCount()
return ((UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & (0x7FF << 20)) >> 20); return ((UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & (0x7FF << 20)) >> 20);
} }
inline u8 ReceivedSetupInt() inline uint8_t USBD_ReceivedSetupInt()
{ {
// return UEINTX & (1<<RXSTPI); // return UEINTX & (1<<RXSTPI);
return ( UDPHS_EPTSTA_RX_SETUP == (UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & UDPHS_EPTSTA_RX_SETUP) ); return ( UDPHS_EPTSTA_RX_SETUP == (UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & UDPHS_EPTSTA_RX_SETUP) );
} }
inline void ClearSetupInt() inline void USBD_ClearSetupInt()
{ {
// UEINTX = ~((1<<RXSTPI) | (1<<RXOUTI) | (1<<TXINI)); // UEINTX = ~((1<<RXSTPI) | (1<<RXOUTI) | (1<<TXINI));
UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTCLRSTA = UDPHS_EPTSTA_RX_SETUP | UDPHS_EPTCLRSTA_RX_BK_RDY | UDPHS_EPTCLRSTA_TX_COMPLT; UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTCLRSTA = UDPHS_EPTSTA_RX_SETUP | UDPHS_EPTCLRSTA_RX_BK_RDY | UDPHS_EPTCLRSTA_TX_COMPLT;
} }
inline void Stall() inline void USBD_Stall()
{ {
// UECONX = (1<<STALLRQ) | (1<<EPEN); // UECONX = (1<<STALLRQ) | (1<<EPEN);
UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSETSTA = UDPHS_EPTSETSTA_FRCESTALL; UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSETSTA = UDPHS_EPTSETSTA_FRCESTALL;
} }
inline u8 ReadWriteAllowed() inline uint8_t USBD_ReadWriteAllowed()
{ {
//return UEINTX & (1<<RWAL); //return UEINTX & (1<<RWAL);
return 1; return 1;
} }
inline u8 Stalled() inline uint8_t USBD_Stalled()
{ {
// return UEINTX & (1<<STALLEDI); // return UEINTX & (1<<STALLEDI);
// Check if the data has been STALLed // Check if the data has been STALLed
return ( UDPHS_EPTSTA_FRCESTALL == (UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & UDPHS_EPTSTA_FRCESTALL)); return ( UDPHS_EPTSTA_FRCESTALL == (UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & UDPHS_EPTSTA_FRCESTALL));
} }
u8 FifoFree() uint8_t USBD_FifoFree()
{ {
// return UEINTX & (1<<FIFOCON); // return UEINTX & (1<<FIFOCON);
return( 0 != (UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & UDPHS_EPTSTA_TX_PK_RDY )); return( 0 != (UDPHS->UDPHS_EPT[NumEndpoint].UDPHS_EPTSTA & UDPHS_EPTSTA_TX_PK_RDY ));
} }
//inline void ReleaseRX() //inline void USBD_ReleaseRX()
//{ //{
// UEINTX = 0x6B; // FIFOCON=0 NAKINI=1 RWAL=1 NAKOUTI=0 RXSTPI=1 RXOUTI=0 STALLEDI=1 TXINI=1 // UEINTX = 0x6B; // FIFOCON=0 NAKINI=1 RWAL=1 NAKOUTI=0 RXSTPI=1 RXOUTI=0 STALLEDI=1 TXINI=1
//} //}
//inline void ReleaseTX() //inline void USBD_ReleaseTX()
//{ //{
// UEINTX = 0x3A; // FIFOCON=0 NAKINI=0 RWAL=1 NAKOUTI=1 RXSTPI=1 RXOUTI=0 STALLEDI=1 TXINI=0 // UEINTX = 0x3A; // FIFOCON=0 NAKINI=0 RWAL=1 NAKOUTI=1 RXSTPI=1 RXOUTI=0 STALLEDI=1 TXINI=0
//} //}
inline u8 FrameNumber() inline uint8_t USBD_FrameNumber()
{ {
return UDFNUML; return UDFNUML;
} }
u8 USBGetConfiguration(void) uint8_t USBD_GetConfiguration(void)
{ {
return _usbConfiguration; return _usbConfiguration;
} }
// Number of bytes, assumes a rx endpoint // Number of bytes, assumes a rx endpoint
u8 USB_Available(u8 ep) uint8_t USBD_Available(uint8_t ep)
{ {
SetEP(ep); SetEP(ep);
return FifoByteCount(); return FifoByteCount();
@ -192,16 +192,16 @@ u8 USB_Available(u8 ep)
// Non Blocking receive // Non Blocking receive
// Return number of bytes read // Return number of bytes read
int USBD_Recv(u8 ep, void* d, int len) int USBD_Recv(uint8_t ep, void* d, int len)
{ {
if (!_usbConfiguration || len < 0) if (!_usbConfiguration || len < 0)
return -1; return -1;
SetEP(ep); SetEP(ep);
u8 n = FifoByteCount(); uint8_t n = FifoByteCount();
len = min(n,len); len = min(n,len);
n = len; n = len;
u8* dst = (u8*)d; uint8_t* dst = (uint8_t*)d;
while (n--) while (n--)
*dst++ = Recv8(); *dst++ = Recv8();
// if (len && !FifoByteCount()) // release empty buffer // if (len && !FifoByteCount()) // release empty buffer
@ -211,16 +211,16 @@ int USBD_Recv(u8 ep, void* d, int len)
} }
// Recv 1 byte if ready // Recv 1 byte if ready
int USBD_Recv(u8 ep) int USBD_Recv(uint8_t ep)
{ {
u8 c; uint8_t c;
if (USB_Recv(ep,&c,1) != 1) if (USB_Recv(ep,&c,1) != 1)
return -1; return -1;
return c; return c;
} }
// Space in send EP // Space in send EP
u8 USB_SendSpace(u8 ep) uint8_t USBD_SendSpace(uint8_t ep)
{ {
SetEP(ep); SetEP(ep);
if (!ReadWriteAllowed()) if (!ReadWriteAllowed())
@ -229,18 +229,18 @@ u8 USB_SendSpace(u8 ep)
} }
// Blocking Send of data to an endpoint // Blocking Send of data to an endpoint
int USB_Send(u8 ep, const void* d, int len) int USBD_Send(uint8_t ep, const void* d, int len)
{ {
if (!_usbConfiguration) if (!_usbConfiguration)
return -1; return -1;
int r = len; int r = len;
const u8* data = (const u8*)d; const uint8_t* data = (const uint8_t*)d;
u8 zero = ep & TRANSFER_ZERO; uint8_t zero = ep & TRANSFER_ZERO;
u8 timeout = 250; // 250ms timeout on send? TODO uint8_t timeout = 250; // 250ms timeout on send? TODO
while (len) while (len)
{ {
u8 n = USB_SendSpace(ep); uint8_t n = USB_SendSpace(ep);
if (n == 0) if (n == 0)
{ {
if (!(--timeout)) if (!(--timeout))
@ -279,20 +279,18 @@ int USB_Send(u8 ep, const void* d, int len)
} }
//static void USBD_InitEP(uint8_t index, uint8_t type, uint8_t size)
//void InitEP(u8 index, u8 type, u8 size)
//{
// UENUM = index;
// UECONX = 1;
// UECFG0X = type;
// UECFG1X = size;
//}
static
void InitEndpoints()
{ {
for (u8 i = 1; i < sizeof(_initEndpoints); i++) UENUM = index;
UECONX = 1;
UECFG0X = type;
UECFG1X = size;
}
void USBD_InitEndpoints()
{
for (uint8_t i = 1; i < sizeof(_initEndpoints); i++)
{ {
// Reset Endpoint Fifos // Reset Endpoint Fifos
UDPHS->UDPHS_EPT[i].UDPHS_EPTCLRSTA = UDPHS_EPTCLRSTA_TOGGLESQ | UDPHS_EPTCLRSTA_FRCESTALL; UDPHS->UDPHS_EPT[i].UDPHS_EPTCLRSTA = UDPHS_EPTCLRSTA_TOGGLESQ | UDPHS_EPTCLRSTA_FRCESTALL;
@ -313,10 +311,9 @@ void InitEndpoints()
} }
// Handle CLASS_INTERFACE requests // Handle CLASS_INTERFACE requests
static bool USBD_ClassInterfaceRequest(Setup& setup)
bool ClassInterfaceRequest(Setup& setup)
{ {
u8 i = setup.wIndex; uint8_t i = setup.wIndex;
#ifdef CDC_ENABLED #ifdef CDC_ENABLED
if (CDC_ACM_INTERFACE == i) if (CDC_ACM_INTERFACE == i)
@ -450,7 +447,7 @@ void UDPHS_Handler( void )
} }
} }
void usbd_attach( void ) void USBD_Attach( void )
{/* {/*
_usbConfiguration = 0; _usbConfiguration = 0;
@ -494,7 +491,7 @@ void usbd_attach( void )
TX_RX_LED_INIT; TX_RX_LED_INIT;
*/} */}
void usbd_detach( void ) void USBD_Detach( void )
{ {
UDPHS->UDPHS_CTRL |= UDPHS_CTRL_DETACH; // detach UDPHS->UDPHS_CTRL |= UDPHS_CTRL_DETACH; // detach
UDPHS->UDPHS_CTRL &= ~UDPHS_CTRL_PULLD_DIS; // Enable Pull Down UDPHS->UDPHS_CTRL &= ~UDPHS_CTRL_PULLD_DIS; // Enable Pull Down