1 /* ----------------------------------------------------------------------------
\r
2 * ATMEL Microcontroller Software Support
\r
3 * ----------------------------------------------------------------------------
\r
4 * Copyright (c) 2008, Atmel Corporation
\r
6 * All rights reserved.
\r
8 * Redistribution and use in source and binary forms, with or without
\r
9 * modification, are permitted provided that the following conditions are met:
\r
11 * - Redistributions of source code must retain the above copyright notice,
\r
12 * this list of conditions and the disclaimer below.
\r
14 * Atmel's name may not be used to endorse or promote products derived from
\r
15 * this software without specific prior written permission.
\r
17 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
\r
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
\r
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
\r
20 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
\r
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
\r
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
\r
23 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
\r
24 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
\r
25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
\r
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
27 * ----------------------------------------------------------------------------
\r
35 * Collection of methods for using the USB device controller on AT91
\r
40 * Please refer to the corresponding application note.
\r
41 * - \ref usbd_framework AT91 USB device framework
\r
42 * - \ref usbd_api USBD API
\r
49 /*----------------------------------------------------------------------------
\r
51 *----------------------------------------------------------------------------*/
\r
54 #include "USBDescriptors.h"
\r
55 #include "USBRequests.h"
\r
57 #include "USBLib_Types.h"
\r
61 /*------------------------------------------------------------------------------
\r
63 *------------------------------------------------------------------------------*/
\r
65 /* Define attribute */
\r
66 #if defined ( __CC_ARM ) /* Keil ¦ÌVision 4 */
\r
67 #define WEAK __attribute__ ((weak))
\r
68 #elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
\r
70 #elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */
\r
71 #define WEAK __attribute__ ((weak))
\r
74 /* Define NO_INIT attribute */
\r
75 #if defined ( __CC_ARM )
\r
77 #elif defined ( __ICCARM__ )
\r
78 #define NO_INIT __no_init
\r
79 #elif defined ( __GNUC__ )
\r
84 /** \addtogroup usbd_interface
\r
88 * \addtogroup usbd_rc USB device API return codes
\r
90 * This section lists the return codes for the USB device driver API
\r
91 * - \ref USBD_STATUS_SUCCESS
\r
92 * - \ref USBD_STATUS_LOCKED
\r
93 * - \ref USBD_STATUS_ABORTED
\r
94 * - \ref USBD_STATUS_RESET
\r
97 /** Indicates the operation was successful. */
\r
98 #define USBD_STATUS_SUCCESS USBRC_SUCCESS
\r
99 /** Endpoint/device is already busy. */
\r
100 #define USBD_STATUS_LOCKED USBRC_BUSY
\r
101 /** Operation has been aborted (error or stall). */
\r
102 #define USBD_STATUS_ABORTED USBRC_ABORTED
\r
103 /** Operation has been canceled (by user). */
\r
104 #define USBD_STATUS_CANCELED USBRC_CANCELED
\r
105 /** Operation has been aborted because the device init/reset/un-configure. */
\r
106 #define USBD_STATUS_RESET USBRC_RESET
\r
107 /** Part ot operation successfully done. */
\r
108 #define USBD_STATUS_PARTIAL_DONE USBRC_PARTIAL_DONE
\r
109 /** Operation failed because parameter error */
\r
110 #define USBD_STATUS_INVALID_PARAMETER USBRC_PARAM_ERR
\r
111 /** Operation failed because in unexpected state */
\r
112 #define USBD_STATUS_WRONG_STATE USBRC_STATE_ERR
\r
113 /** Operation failed because SW not supported */
\r
114 #define USBD_STATUS_SW_NOT_SUPPORTED USBRC_SW_NOT_SUPPORTED
\r
115 /** Operation failed because HW not supported */
\r
116 #define USBD_STATUS_HW_NOT_SUPPORTED USBRC_HW_NOT_SUPPORTED
\r
119 /** \addtogroup usbd_states USB device states
\r
121 * This section lists the device states of the USB device driver.
\r
122 * - \ref USBD_STATE_SUSPENDED
\r
123 * - \ref USBD_STATE_ATTACHED
\r
124 * - \ref USBD_STATE_POWERED
\r
125 * - \ref USBD_STATE_DEFAULT
\r
126 * - \ref USBD_STATE_ADDRESS
\r
127 * - \ref USBD_STATE_CONFIGURED
\r
130 /** The device is currently suspended. */
\r
131 #define USBD_STATE_SUSPENDED 0
\r
132 /** USB cable is plugged into the device. */
\r
133 #define USBD_STATE_ATTACHED 1
\r
134 /** Host is providing +5V through the USB cable. */
\r
135 #define USBD_STATE_POWERED 2
\r
136 /** Device has been reset. */
\r
137 #define USBD_STATE_DEFAULT 3
\r
138 /** The device has been given an address on the bus. */
\r
139 #define USBD_STATE_ADDRESS 4
\r
140 /** A valid configuration has been selected. */
\r
141 #define USBD_STATE_CONFIGURED 5
\r
144 /*----------------------------------------------------------------------------
\r
146 *----------------------------------------------------------------------------*/
\r
149 * \brief Buffer struct used for multi-buffer-listed transfer.
\r
151 * The driver can process 255 bytes of buffers or buffer list window.
\r
153 typedef struct _USBDTransferBuffer {
\r
154 /** Pointer to frame buffer */
\r
156 /** Size of the frame (up to 64K-1) */
\r
158 /** Bytes transferred */
\r
159 uint16_t transferred;
\r
160 /** Bytes in FIFO */
\r
162 /** Bytes remaining */
\r
163 uint16_t remaining;
\r
164 } USBDTransferBuffer;
\r
167 #if defined ( __CC_ARM ) /* Keil ¦ÌVision 4 */
\r
168 #elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
\r
169 #define __attribute__(...)
\r
170 #elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */
\r
174 * \brief Struct used for USBD DMA Link List Transfer Descriptor, must be 16-bytes
\r
177 * (For USB, DMA transfer is linked to EPs and FIFO address is EP defined)
\r
179 typedef struct _USBDDmaDescriptor {
\r
180 /** Pointer to Next Descriptor */
\r
182 /** Pointer to data buffer address */
\r
184 /** DMA Control setting register value */
\r
185 uint32_t ctrlSettings:8, /** Control settings */
\r
186 reserved:8, /** Not used */
\r
187 bufferLength:16; /** Length of buffer */
\r
188 /** Loaded to DMA register, OK to modify */
\r
190 } __attribute__((aligned(16))) USBDDmaDescriptor;
\r
195 * Callback used by transfer functions (USBD_Read & USBD_Write) to notify
\r
196 * that a transaction is complete.
\r
198 typedef void (*TransferCallback)(void *pArg,
\r
200 uint32_t transferred,
\r
201 uint32_t remaining);
\r
204 * Callback used by MBL transfer functions (USBD_Read & USBD_Write) to notify
\r
205 * that a transaction is complete.
\r
206 * \param pArg Pointer to callback arguments.
\r
207 * \param status USBD status.
\r
209 typedef void (*MblTransferCallback)(void *pArg,
\r
214 /*------------------------------------------------------------------------------
\r
215 * Exported functions
\r
216 *------------------------------------------------------------------------------*/
\r
218 //extern void USBD_IrqHandler(void);
\r
220 extern void USBD_Init(void);
\r
222 extern void USBD_ConfigureSpeed(uint8_t forceFS);
\r
224 extern void USBD_Connect(void);
\r
226 extern void USBD_Disconnect(void);
\r
228 extern uint8_t USBD_Write(
\r
232 TransferCallback callback,
\r
235 extern uint8_t USBD_Read(
\r
239 TransferCallback fCallback,
\r
242 extern uint8_t USBD_Stall(uint8_t bEndpoint);
\r
244 extern void USBD_Halt(uint8_t bEndpoint);
\r
246 extern void USBD_Unhalt(uint8_t bEndpoint);
\r
248 extern void USBD_ConfigureEndpoint(const USBEndpointDescriptor *pDescriptor);
\r
250 extern uint8_t USBD_IsHalted(uint8_t bEndpoint);
\r
252 extern void USBD_RemoteWakeUp(void);
\r
254 extern void USBD_SetAddress(uint8_t address);
\r
256 extern void USBD_SetConfiguration(uint8_t cfgnum);
\r
258 extern uint8_t USBD_GetState(void);
\r
260 extern uint8_t USBD_IsHighSpeed(void);
\r
262 extern void USBD_Test(uint8_t bIndex);
\r
264 extern void USBD_SuspendHandler(void);
\r
265 extern void USBD_ResumeHandler(void);
\r
266 extern void USBD_ResetHandler(void);
\r
267 extern void USBD_RequestHandler(uint8_t bEndpoint,
\r
268 const USBGenericRequest * pRequest);
\r
271 extern void USBDCallbacks_Initialized(void);
\r
272 extern void USBDCallbacks_Reset(void);
\r
273 extern void USBDCallbacks_Suspended(void);
\r
274 extern void USBDCallbacks_Resumed(void);
\r
275 extern void USBDCallbacks_RequestReceived(const USBGenericRequest *request);
\r
277 #endif /*#ifndef USBD_H*/
\r