summaryrefslogtreecommitdiff
path: root/tinyusb/device/romdriver/mw_usbd_hw.h
blob: 0fe2681c684dc7216e798788f4418b1463c97339 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
/***********************************************************************
* $Id:: mw_usbd_hw.h 202 2011-06-12 21:50:01Z usb06052                        $
*
* Project: USB device ROM Stack
*
* Description:
*     USB Hardware Function prototypes.
*
***********************************************************************
*   Copyright(C) 2011, NXP Semiconductor
*   All rights reserved.
*
* Software that is described herein is for illustrative purposes only
* which provides customers with programming information regarding the
* products. This software is supplied "AS IS" without any warranties.
* NXP Semiconductors assumes no responsibility or liability for the
* use of the software, conveys no license or title under any patent,
* copyright, or mask work right to the product. NXP Semiconductors
* reserves the right to make changes in the software without
* notification. NXP Semiconductors also make no representation or
* warranty that such application will be suitable for the specified
* use without further testing or modification.
**********************************************************************/
#ifndef __USBHW_H__
#define __USBHW_H__

#include "error.h"
#include "mw_usbd.h"
#include "mw_usbd_core.h"

/** \file
 *  \brief USB Hardware Function prototypes.
 *
 *  Definition of functions exported by ROM based Device Controller Driver (DCD).
 *
 */

/** \ingroup Group_USBD
 *  @defgroup USBD_HW USB Device Controller Driver 
 *  \section Sec_HWModDescription Module Description
 *  The Device Controller Driver Layer implements the routines to deal directly with the hardware. 
 */

/** \ingroup USBD_HW
*  USB Endpoint/class handler Callback Events. 
* 
*/
enum USBD_EVENT_T {
  USB_EVT_SETUP =1,    /**< 1   Setup Packet received */
  USB_EVT_OUT,         /**< 2   OUT Packet received */
  USB_EVT_IN,          /**< 3    IN Packet sent */
  USB_EVT_OUT_NAK,     /**< 4   OUT Packet - Not Acknowledged */
  USB_EVT_IN_NAK,      /**< 5    IN Packet - Not Acknowledged */
  USB_EVT_OUT_STALL,   /**< 6   OUT Packet - Stalled */
  USB_EVT_IN_STALL,    /**< 7    IN Packet - Stalled */
  USB_EVT_OUT_DMA_EOT, /**< 8   DMA OUT EP - End of Transfer */
  USB_EVT_IN_DMA_EOT,  /**< 9   DMA  IN EP - End of Transfer */
  USB_EVT_OUT_DMA_NDR, /**< 10  DMA OUT EP - New Descriptor Request */
  USB_EVT_IN_DMA_NDR,  /**< 11  DMA  IN EP - New Descriptor Request */
  USB_EVT_OUT_DMA_ERR, /**< 12  DMA OUT EP - Error */
  USB_EVT_IN_DMA_ERR,  /**< 13  DMA  IN EP - Error */
  USB_EVT_RESET,       /**< 14  Reset event recieved */
  USB_EVT_SOF,         /**< 15  Start of Frame event */
  USB_EVT_DEV_STATE,   /**< 16  Device status events */
  USB_EVT_DEV_ERROR   /**< 17  Device error events */
};

/** 
 *  \brief Hardware API functions structure.
 *  \ingroup USBD_HW
 *
 *  This module exposes functions which interact directly with USB device controller hardware.
 *
 */
typedef struct USBD_HW_API
{
  /** \fn uint32_t GetMemSize(USBD_API_INIT_PARAM_T* param)
   *  Function to determine the memory required by the USB device stack's DCD and core layers.
   * 
   *  This fuction is called by application layer before calling pUsbApi->hw->Init(), to allocate memory used 
   *  by DCD and core layers. The application should allocate the memory which is accessible by USB
   *  controller/DMA controller. 
   *  \note Some memory areas are not accessible by all bus masters.
   *
   *  \param[in] param Structure containing USB device stack initialization parameters.
   *  \return Returns the required memory size in bytes.
   */
  uint32_t (*GetMemSize)(USBD_API_INIT_PARAM_T* param);
  
  /** \fn ErrorCode_t Init(USBD_HANDLE_T* phUsb, USB_CORE_DESCS_T* pDesc, USBD_API_INIT_PARAM_T* param)
   *  Function to initialize USB device stack's DCD and core layers.
   * 
   *  This function is called by application layer to initialize USB hardware and core layers. 
   *  On successful initialization the function returns a handle to USB device stack which should
   *  be passed to the rest of the functions.  
   *
   *  \param[in,out] phUsb Pointer to the USB device stack handle of type USBD_HANDLE_T. 
   *  \param[in]  param Structure containing USB device stack initialization parameters.
   *  \return Returns \ref ErrorCode_t type to indicate success or error condition.
   *          \retval LPC_OK(0) On success
   *          \retval ERR_USBD_BAD_MEM_BUF(0x0004000b) When insufficient memory buffer is passed or memory
   *                                             is not aligned on 2048 boundary.
   */
  ErrorCode_t (*Init)(USBD_HANDLE_T* phUsb, USB_CORE_DESCS_T* pDesc, USBD_API_INIT_PARAM_T* param);
  
  /** \fn void Connect(USBD_HANDLE_T hUsb, uint32_t con)
   *  Function to make USB device visible/invisible on the USB bus.
   *
   *  This function is called after the USB initialization. This function uses the soft connect
   *  feature to make the device visible on the USB bus. This function is called only after the
   *  application is ready to handle the USB data. The enumeration process is started by the
   *  host after the device detection. The driver handles the enumeration process according to
   *  the USB descriptors passed in the USB initialization function.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] con  States whether to connect (1) or to disconnect (0).
   *  \return Nothing.
   */
  void (*Connect)(USBD_HANDLE_T hUsb, uint32_t con);
  
  /** \fn void ISR(USBD_HANDLE_T hUsb)
   *  Function to USB device controller interrupt events.
   *  
   *  When the user application is active the interrupt handlers are mapped in the user flash
   *  space. The user application must provide an interrupt handler for the USB interrupt and
   *  call this function in the interrupt handler routine. The driver interrupt handler takes
   *  appropriate action according to the data received on the USB bus. 
   *  
   *  \param[in]  hUsb Handle to the USB device stack. 
   *  \return Nothing.
   */
  void (*ISR)(USBD_HANDLE_T hUsb);

  /** \fn void Reset(USBD_HANDLE_T hUsb)
   *  Function to Reset USB device stack and hardware controller.
   *  
   *  Reset USB device stack and hardware controller. Disables all endpoints except EP0.
   *  Clears all pending interrupts and resets endpoint transfer queues.
   *  This function is called internally by pUsbApi->hw->init() and from reset event.
   *  
   *  \param[in]  hUsb Handle to the USB device stack. 
   *  \return Nothing.
   */
  void  (*Reset)(USBD_HANDLE_T hUsb);
  
  /** \fn void ForceFullSpeed(USBD_HANDLE_T hUsb, uint32_t cfg)
   *  Function to force high speed USB device to operate in full speed mode.
   *
   *  This function is useful for testing the behaviour of current device when connected
   *  to a full speed only hosts.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] cfg  When 1 - set force full-speed or 
   *                       0 - clear force full-speed.
   *  \return Nothing.
   */
  void  (*ForceFullSpeed )(USBD_HANDLE_T hUsb, uint32_t cfg);
  
  /** \fn void WakeUpCfg(USBD_HANDLE_T hUsb, uint32_t cfg)
   *  Function to configure USB device controller to wakeup host on remote events.
   *
   *  This function is called by application layer to configure the USB device controller 
   *  to wakeup on remote events. It is recommended to call this function from users's 
   *  USB_WakeUpCfg() callback routine registered with stack. 
   *  \note User's USB_WakeUpCfg() is registered with stack by setting the USB_WakeUpCfg member 
   *  of USBD_API_INIT_PARAM_T structure before calling pUsbApi->hw->Init() routine.
   *  Certain USB device controllers needed to keep some clocks always on to generate 
   *  resume signaling through pUsbApi->hw->WakeUp(). This hook is provided to support 
   *  such controllers. In most controllers cases this is an empty routine.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] cfg  When 1 - Configure controller to wake on remote events or 
   *                       0 - Configure controller not to wake on remote events.
   *  \return Nothing.
   */
  void  (*WakeUpCfg)(USBD_HANDLE_T hUsb, uint32_t  cfg);
  
  /** \fn void SetAddress(USBD_HANDLE_T hUsb, uint32_t adr)
   *  Function to set USB address assigned by host in device controller hardware.
   *
   *  This function is called automatically when USB_REQUEST_SET_ADDRESS request is received  
   *  by the stack from USB host.
   *  This interface is provided to users to invoke this function in other scenarios which are not 
   *  handle by current stack. In most user applications this function is not called directly.
   *  Also this function can be used by users who are selectively modifying the USB device stack's 
   *  standard handlers through callback interface exposed by the stack. 
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] adr  USB bus Address to which the device controller should respond. Usually 
   *                  assigned by the USB host.
   *  \return Nothing.
   */
  void  (*SetAddress)(USBD_HANDLE_T hUsb, uint32_t adr);

  /** \fn void Configure(USBD_HANDLE_T hUsb, uint32_t cfg)
   *  Function to configure device controller hardware with selected configuration.
   *
   *  This function is called automatically when USB_REQUEST_SET_CONFIGURATION request is received  
   *  by the stack from USB host.
   *  This interface is provided to users to invoke this function in other scenarios which are not 
   *  handle by current stack. In most user applications this function is not called directly.
   *  Also this function can be used by users who are selectively modifying the USB device stack's 
   *  standard handlers through callback interface exposed by the stack. 
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] cfg  Configuration index. 
   *  \return Nothing.
   */
  void  (*Configure)(USBD_HANDLE_T hUsb, uint32_t  cfg);

  /** \fn void ConfigEP(USBD_HANDLE_T hUsb, USB_ENDPOINT_DESCRIPTOR *pEPD)
   *  Function to configure USB Endpoint according to descriptor.
   *
   *  This function is called automatically when USB_REQUEST_SET_CONFIGURATION request is received  
   *  by the stack from USB host. All the endpoints associated with the selected configuration
   *  are configured.
   *  This interface is provided to users to invoke this function in other scenarios which are not 
   *  handle by current stack. In most user applications this function is not called directly.
   *  Also this function can be used by users who are selectively modifying the USB device stack's 
   *  standard handlers through callback interface exposed by the stack. 
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] pEPD Endpoint descriptor structure defined in USB 2.0 specification.
   *  \return Nothing.
   */
  void  (*ConfigEP)(USBD_HANDLE_T hUsb, USB_ENDPOINT_DESCRIPTOR *pEPD);

  /** \fn void DirCtrlEP(USBD_HANDLE_T hUsb, uint32_t dir)
   *  Function to set firection for USB control endpoint EP0.
   *
   *  This function is called automatically by the stack on need bassis. 
   *  This interface is provided to users to invoke this function in other scenarios which are not 
   *  handle by current stack. In most user applications this function is not called directly.
   *  Also this function can be used by users who are selectively modifying the USB device stack's 
   *  standard handlers through callback interface exposed by the stack. 
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] cfg  When 1 - Set EP0 in IN transfer mode 
   *                       0 - Set EP0 in OUT transfer mode
   *  \return Nothing.
   */
  void  (*DirCtrlEP)(USBD_HANDLE_T hUsb, uint32_t dir);

  /** \fn void EnableEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
   *  Function to enable selected USB endpoint.
   *
   *  This function enables interrupts on selected endpoint.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] EPNum  Endpoint number as per USB specification. 
   *                    ie. An EP1_IN is represented by 0x81 number.
   *  \return Nothing.
   */
  void  (*EnableEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);

  /** \fn void DisableEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
   *  Function to disable selected USB endpoint.
   *
   *  This function disables interrupts on selected endpoint.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] EPNum  Endpoint number as per USB specification. 
   *                    ie. An EP1_IN is represented by 0x81 number.
   *  \return Nothing.
   */
  void  (*DisableEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);

  /** \fn void ResetEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
   *  Function to reset selected USB endpoint.
   *
   *  This function flushes the endpoint buffers and resets data toggle logic.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] EPNum  Endpoint number as per USB specification. 
   *                    ie. An EP1_IN is represented by 0x81 number.
   *  \return Nothing.
  */
  void  (*ResetEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);

  /** \fn void SetStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
   *  Function to STALL selected USB endpoint.
   *
   *  Generates STALL signalling for requested endpoint.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] EPNum  Endpoint number as per USB specification. 
   *                    ie. An EP1_IN is represented by 0x81 number.
   *  \return Nothing.
   */
  void  (*SetStallEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);

  /** \fn void ClrStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
   *  Function to clear STALL state for the requested endpoint.
   *
   *  This function clears STALL state for the requested endpoint.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] EPNum  Endpoint number as per USB specification. 
   *                    ie. An EP1_IN is represented by 0x81 number.
   *  \return Nothing.
   */
  void  (*ClrStallEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);

  /** \fn ErrorCode_t SetTestMode(USBD_HANDLE_T hUsb, uint8_t mode)
   *  Function to set high speed USB device controller in requested test mode.
   *
   *  USB-IF requires the high speed device to be put in various test modes
   *  for electrical testing. This USB device stack calls this function whenever
   *  it receives USB_REQUEST_CLEAR_FEATURE request for USB_FEATURE_TEST_MODE. 
   *  Users can put the device in test mode by directly calling this function.
   *  Returns ERR_USBD_INVALID_REQ when device controller is full-speed only.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] mode  Test mode defined in USB 2.0 electrical testing specification.
   *  \return Returns \ref ErrorCode_t type to indicate success or error condition.
   *          \retval LPC_OK(0) - On success
   *          \retval ERR_USBD_INVALID_REQ(0x00040001) - Invalid test mode or 
   *                                             Device controller is full-speed only.
   */
  ErrorCode_t (*SetTestMode)(USBD_HANDLE_T hUsb, uint8_t mode); 

  /** \fn uint32_t ReadEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData)
   *  Function to read data received on the requested endpoint.
   *
   *  This function is called by USB stack and the application layer to read the data
   *  received on the requested endpoint.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] EPNum  Endpoint number as per USB specification. 
   *                    ie. An EP1_IN is represented by 0x81 number.
   *  \param[in,out] pData Pointer to the data buffer where data is to be copied. 
   *  \return Returns the number of bytes copied to the buffer.
   */
  uint32_t (*ReadEP)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData);

  /** \fn uint32_t ReadReqEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t len)
   *  Function to queue read request on the specified endpoint.
   *
   *  This function is called by USB stack and the application layer to queue a read request
   *  on the specified endpoint.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] EPNum  Endpoint number as per USB specification. 
   *                    ie. An EP1_IN is represented by 0x81 number.
   *  \param[in,out] pData Pointer to the data buffer where data is to be copied. This buffer
   *                       address should be accessible by USB DMA master.
   *  \param[in] len  Length of the buffer passed. 
   *  \return Returns the length of the requested buffer.
   */
  uint32_t (*ReadReqEP)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t len);

  /** \fn uint32_t ReadSetupPkt(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t *pData)
   *  Function to read setup packet data received on the requested endpoint.
   *
   *  This function is called by USB stack and the application layer to read setup packet data
   *  received on the requested endpoint.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] EPNum  Endpoint number as per USB specification. 
   *                    ie. An EP0_IN is represented by 0x80 number.
   *  \param[in,out] pData Pointer to the data buffer where data is to be copied. 
   *  \return Returns the number of bytes copied to the buffer.
   */
  uint32_t (*ReadSetupPkt)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t *pData);

  /** \fn uint32_t WriteEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t cnt)
   *  Function to write data to be sent on the requested endpoint.
   *
   *  This function is called by USB stack and the application layer to send data
   *  on the requested endpoint.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] EPNum  Endpoint number as per USB specification. 
   *                    ie. An EP1_IN is represented by 0x81 number.
   *  \param[in] pData Pointer to the data buffer from where data is to be copied. 
   *  \param[in] cnt  Number of bytes to write. 
   *  \return Returns the number of bytes written.
   */
  uint32_t (*WriteEP)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t cnt);

  /** \fn void WakeUp(USBD_HANDLE_T hUsb)
   *  Function to generate resume signaling on bus for remote host wakeup.
   *
   *  This function is called by application layer to remotely wakeup host controller 
   *  when system is in suspend state. Application should indicate this remote wakeup
   *  capability by setting USB_CONFIG_REMOTE_WAKEUP in bmAttributes of Configuration 
   *  Descriptor. Also this routine will generate resume signalling only if host
   *  enables USB_FEATURE_REMOTE_WAKEUP by sending SET_FEATURE request before suspending
   *  the bus.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \return Nothing.
   */
  void  (*WakeUp)(USBD_HANDLE_T hUsb);

  /** \fn void EnableEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
   *  Function to enable/disable selected USB event.
   *
   *  This function enables interrupts on selected endpoint.
   *  
   *  \param[in] hUsb Handle to the USB device stack. 
   *  \param[in] EPNum  Endpoint number corresponding to the eventas per USB specification. 
   *                    ie. An EP1_IN is represented by 0x81 number. For device events 
   *                    set this param to 0x0. 
   *  \param[in] event  Type of endpoint event. See \ref USBD_EVENT_T for more details.
   *  \param[in] enable  1 - enable event, 0 - disable event.
   *  \return Returns \ref ErrorCode_t type to indicate success or error condition.
   *          \retval LPC_OK(0) - On success
   *          \retval ERR_USBD_INVALID_REQ(0x00040001) - Invalid event type.
   */
  ErrorCode_t  (*EnableEvent)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t event_type, 
    uint32_t enable);

} USBD_HW_API_T;

/*-----------------------------------------------------------------------------
 *  Private functions & structures prototypes used by stack internally
 *-----------------------------------------------------------------------------*/
/** @cond  DIRECT_API */

/* Driver functions */
uint32_t hwUSB_GetMemSize(USBD_API_INIT_PARAM_T* param);
ErrorCode_t hwUSB_Init(USBD_HANDLE_T* phUsb, USB_CORE_DESCS_T* pDesc, USBD_API_INIT_PARAM_T* param);
void hwUSB_Connect(USBD_HANDLE_T hUsb, uint32_t con);
void hwUSB_ISR(USBD_HANDLE_T hUsb);

/* USB Hardware Functions */
extern void  hwUSB_Reset(USBD_HANDLE_T hUsb);
extern void  hwUSB_ForceFullSpeed (USBD_HANDLE_T hUsb, uint32_t con);
extern void  hwUSB_WakeUpCfg(USBD_HANDLE_T hUsb, uint32_t  cfg);
extern void  hwUSB_SetAddress(USBD_HANDLE_T hUsb, uint32_t adr);
extern void  hwUSB_Configure(USBD_HANDLE_T hUsb, uint32_t  cfg);
extern void  hwUSB_ConfigEP(USBD_HANDLE_T hUsb, USB_ENDPOINT_DESCRIPTOR *pEPD);
extern void  hwUSB_DirCtrlEP(USBD_HANDLE_T hUsb, uint32_t dir);
extern void  hwUSB_EnableEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
extern void  hwUSB_DisableEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
extern void  hwUSB_ResetEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
extern void  hwUSB_SetStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
extern void  hwUSB_ClrStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
extern ErrorCode_t hwUSB_SetTestMode(USBD_HANDLE_T hUsb, uint8_t mode); /* for FS only devices return ERR_USBD_INVALID_REQ */
extern uint32_t hwUSB_ReadEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData);
extern uint32_t hwUSB_ReadReqEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t len);
extern uint32_t hwUSB_ReadSetupPkt(USBD_HANDLE_T hUsb, uint32_t, uint32_t *);
extern uint32_t hwUSB_WriteEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t cnt);

/* generate resume signalling on the bus */
extern void  hwUSB_WakeUp(USBD_HANDLE_T hUsb);
extern ErrorCode_t  hwUSB_EnableEvent(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t event_type, uint32_t enable);
/* TODO implement following routines
- function to program TD and queue them to ep Qh
*/

/** @endcond */


#endif  /* __USBHW_H__ */