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:
parent
d7ae25360a
commit
009bc1b722
@ -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_*/
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user