| Line No. | Rev | Author | Line |
|---|---|---|---|
| 1 | 32 | kaklik | /******************************************************************************* |
| 2 | |||
| 3 | USB Host Driver (Header File) |
||
| 4 | |||
| 5 | Description: |
||
| 6 | This file provides the hardware interface for a USB Embedded Host |
||
| 7 | application. Most applications will not make direct use of the functions |
||
| 8 | in this file. Instead, one or more client driver files should also be |
||
| 9 | included in the project to support the devices that will be attached to the |
||
| 10 | host. Application interface will be through the client drivers. |
||
| 11 | |||
| 12 | This header file must be included after the application-specific |
||
| 13 | usb_config.h file, as usb_config.h configures parts of this file. |
||
| 14 | |||
| 15 | Summary: |
||
| 16 | This file provides the hardware interface for a USB Embedded Host |
||
| 17 | application. |
||
| 18 | |||
| 19 | *******************************************************************************/ |
||
| 20 | //DOM-IGNORE-BEGIN |
||
| 21 | /****************************************************************************** |
||
| 22 | |||
| 23 | * FileName: usb_host.h |
||
| 24 | * Dependencies: None |
||
| 25 | * Processor: PIC24/dsPIC30/dsPIC33/PIC32MX |
||
| 26 | * Compiler: C30 v2.01/C32 v0.00.18 |
||
| 27 | * Company: Microchip Technology, Inc. |
||
| 28 | |||
| 29 | Software License Agreement |
||
| 30 | |||
| 31 | The software supplied herewith by Microchip Technology Incorporated |
||
| 32 | (the Company) for its PICmicro® Microcontroller is intended and |
||
| 33 | supplied to you, the Companys customer, for use solely and |
||
| 34 | exclusively on Microchip PICmicro Microcontroller products. The |
||
| 35 | software is owned by the Company and/or its supplier, and is |
||
| 36 | protected under applicable copyright laws. All rights are reserved. |
||
| 37 | Any use in violation of the foregoing restrictions may subject the |
||
| 38 | user to criminal sanctions under applicable laws, as well as to |
||
| 39 | civil liability for the breach of the terms and conditions of this |
||
| 40 | license. |
||
| 41 | |||
| 42 | THIS SOFTWARE IS PROVIDED IN AN AS IS CONDITION. NO WARRANTIES, |
||
| 43 | WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED |
||
| 44 | TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
||
| 45 | PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, |
||
| 46 | IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR |
||
| 47 | CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. |
||
| 48 | |||
| 49 | Change History |
||
| 50 | Rev Description |
||
| 51 | ----- ---------------------------------- |
||
| 52 | 2.6a- No change |
||
| 53 | 2.7 |
||
| 54 | |||
| 55 | 2.7a Added USB_HOST_APP_DATA_EVENT_HANDLER(). |
||
| 56 | *******************************************************************************/ |
||
| 57 | |||
| 58 | #ifndef __USBHOST_H__ |
||
| 59 | #define __USBHOST_H__ |
||
| 60 | //DOM-IGNORE-END |
||
| 61 | |||
| 62 | #include <limits.h> |
||
| 63 | #include "GenericTypeDefs.h" |
||
| 64 | |||
| 65 | // ***************************************************************************** |
||
| 66 | // ***************************************************************************** |
||
| 67 | // Section: Host Firmware Version |
||
| 68 | // ***************************************************************************** |
||
| 69 | // ***************************************************************************** |
||
| 70 | |||
| 71 | #define USB_HOST_FW_MAJOR_VER 1 // Firmware version, major release number. |
||
| 72 | #define USB_HOST_FW_MINOR_VER 0 // Firmware version, minor release number. |
||
| 73 | #define USB_HOST_FW_DOT_VER 0 // Firmware version, dot release number. |
||
| 74 | |||
| 75 | |||
| 76 | // ***************************************************************************** |
||
| 77 | // ***************************************************************************** |
||
| 78 | // Section: Set Default Configuration Constants |
||
| 79 | // ***************************************************************************** |
||
| 80 | // ***************************************************************************** |
||
| 81 | |||
| 82 | #ifndef USB_NUM_BULK_NAKS |
||
| 83 | #define USB_NUM_BULK_NAKS 10000 // Define how many NAK's are allowed |
||
| 84 | // during a bulk transfer before erroring. |
||
| 85 | #endif |
||
| 86 | |||
| 87 | #ifndef USB_NUM_COMMAND_TRIES |
||
| 88 | #define USB_NUM_COMMAND_TRIES 3 // During enumeration, define how many |
||
| 89 | // times each command will be tried before |
||
| 90 | // giving up and resetting the device. |
||
| 91 | #endif |
||
| 92 | |||
| 93 | #ifndef USB_NUM_CONTROL_NAKS |
||
| 94 | #define USB_NUM_CONTROL_NAKS 20 // Define how many NAK's are allowed |
||
| 95 | // during a control transfer before erroring. |
||
| 96 | #endif |
||
| 97 | |||
| 98 | #ifndef USB_NUM_ENUMERATION_TRIES |
||
| 99 | #define USB_NUM_ENUMERATION_TRIES 3 // Define how many times the host will try |
||
| 100 | // to enumerate the device before giving |
||
| 101 | // up and setting the state to DETACHED. |
||
| 102 | #endif |
||
| 103 | |||
| 104 | #ifndef USB_NUM_INTERRUPT_NAKS |
||
| 105 | #define USB_NUM_INTERRUPT_NAKS 3 // Define how many NAK's are allowed |
||
| 106 | // during an interrupt OUT transfer before |
||
| 107 | // erroring. Interrupt IN transfers that |
||
| 108 | // are NAK'd are terminated without error. |
||
| 109 | #endif |
||
| 110 | |||
| 111 | |||
| 112 | #ifndef USB_INITIAL_VBUS_CURRENT |
||
| 113 | #error The application must define USB_INITIAL_VBUS_CURRENT as 100 mA for Host or 8-100 mA for OTG. |
||
| 114 | #endif |
||
| 115 | |||
| 116 | #if defined (USB_SUPPORT_HOST) |
||
| 117 | #if defined (USB_SUPPORT_OTG) |
||
| 118 | #if (USB_INITIAL_VBUS_CURRENT < 8/2) || (USB_INITIAL_VBUS_CURRENT > 100/2) |
||
| 119 | #warning USB_INITIAL_VBUS_CURRENT is in violation of the USB specification. |
||
| 120 | #endif |
||
| 121 | #else |
||
| 122 | #if (USB_INITIAL_VBUS_CURRENT != 100/2) |
||
| 123 | #warning USB_INITIAL_VBUS_CURRENT is in violation of the USB specification. |
||
| 124 | #endif |
||
| 125 | #endif |
||
| 126 | #endif |
||
| 127 | |||
| 128 | |||
| 129 | // ***************************************************************************** |
||
| 130 | // ***************************************************************************** |
||
| 131 | // Section: USB Constants |
||
| 132 | // ***************************************************************************** |
||
| 133 | // ***************************************************************************** |
||
| 134 | |||
| 135 | // Section: Values for USBHostIssueDeviceRequest(), dataDirection |
||
| 136 | |||
| 137 | #define USB_DEVICE_REQUEST_SET 0 // USBHostIssueDeviceRequest() will set information. |
||
| 138 | #define USB_DEVICE_REQUEST_GET 1 // USBHostIssueDeviceRequest() will get information. |
||
| 139 | |||
| 140 | // Section: Dummy Device ID's |
||
| 141 | |||
| 142 | #define USB_ROOT_HUB 255 // Invalid Device ID used to indicate the root hub. |
||
| 143 | |||
| 144 | |||
| 145 | // ***************************************************************************** |
||
| 146 | // ***************************************************************************** |
||
| 147 | // Section: USB Data Structures |
||
| 148 | // ***************************************************************************** |
||
| 149 | // ***************************************************************************** |
||
| 150 | |||
| 151 | // ***************************************************************************** |
||
| 152 | /* Transfer Attributes |
||
| 153 | |||
| 154 | This structure describes the transfer attributes of an endpoint. |
||
| 155 | */ |
||
| 156 | typedef union |
||
| 157 | { |
||
| 158 | BYTE val; // |
||
| 159 | struct |
||
| 160 | { |
||
| 161 | BYTE bfTransferType : 2; // See USB_TRANSFER_TYPE_* for values. |
||
| 162 | BYTE bfSynchronizationType : 2; // For isochronous endpoints only. |
||
| 163 | BYTE bfUsageType : 2; // For isochronous endpoints only. |
||
| 164 | }; |
||
| 165 | } TRANSFER_ATTRIBUTES; |
||
| 166 | |||
| 167 | |||
| 168 | // ***************************************************************************** |
||
| 169 | /* Host Transfer Information |
||
| 170 | |||
| 171 | This structure is used when the event handler is used to notify the upper layer |
||
| 172 | of transfer completion. |
||
| 173 | */ |
||
| 174 | |||
| 175 | typedef struct _HOST_TRANSFER_DATA |
||
| 176 | { |
||
| 177 | DWORD dataCount; // Count of bytes transferred. |
||
| 178 | BYTE *pUserData; // Pointer to transfer data. |
||
| 179 | BYTE bEndpointAddress; // Transfer endpoint. |
||
| 180 | BYTE bErrorCode; // Transfer error code. |
||
| 181 | TRANSFER_ATTRIBUTES bmAttributes; // INTERNAL USE ONLY - Endpoint transfer attributes. |
||
| 182 | BYTE clientDriver; // INTERNAL USE ONLY - Client driver index for sending the event. |
||
| 183 | } HOST_TRANSFER_DATA; |
||
| 184 | |||
| 185 | |||
| 186 | // ***************************************************************************** |
||
| 187 | /* Isochronous Data Buffer |
||
| 188 | |||
| 189 | Isochronous data transfers are continuous, until they are explicitly terminated. |
||
| 190 | The maximum transfer size is given in the endpoint descriptor, but a single |
||
| 191 | transfer may contain less data than the maximum. Also, the USB peripheral can |
||
| 192 | store data to RAM in a linear fashion only. Therefore, we cannot use a simple |
||
| 193 | circular buffer for the data. Instead, the application or client driver must |
||
| 194 | allocate multiple independent data buffers. These buffers must be the |
||
| 195 | maximum transfer size. This structure contains a pointer to an allocated |
||
| 196 | buffer, plus the valid data length of the buffer. |
||
| 197 | */ |
||
| 198 | |||
| 199 | typedef struct _ISOCHRONOUS_DATA_BUFFER |
||
| 200 | { |
||
| 201 | BYTE *pBuffer; // Data buffer pointer. |
||
| 202 | WORD dataLength; // Amount of valid data in the buffer. |
||
| 203 | BYTE bfDataLengthValid : 1; // dataLength value is valid. |
||
| 204 | } ISOCHRONOUS_DATA_BUFFER; |
||
| 205 | |||
| 206 | |||
| 207 | // ***************************************************************************** |
||
| 208 | /* Isochronous Data |
||
| 209 | |||
| 210 | Isochronous data transfers are continuous, until they are explicitly terminated. |
||
| 211 | This requires a tighter integration between the host layer and the application |
||
| 212 | layer to manage the streaming data. |
||
| 213 | |||
| 214 | If an application uses isochronous transfers, it must allocate one variable |
||
| 215 | of type ISOCHRONOUS_DATA for each concurrent transfer. When the device |
||
| 216 | attaches, the client driver must inform the application layer of the maximum |
||
| 217 | transfer size. At this point, the application must allocate space for the |
||
| 218 | data buffers, and set the data buffer points in this structure to point to them. |
||
| 219 | */ |
||
| 220 | |||
| 221 | #if !defined( USB_MAX_ISOCHRONOUS_DATA_BUFFERS ) |
||
| 222 | #define USB_MAX_ISOCHRONOUS_DATA_BUFFERS 2 |
||
| 223 | #endif |
||
| 224 | #if USB_MAX_ISOCHRONOUS_DATA_BUFFERS < 2 |
||
| 225 | #error At least two buffers must be defined for isochronous data. |
||
| 226 | #endif |
||
| 227 | |||
| 228 | typedef struct _ISOCHRONOUS_DATA |
||
| 229 | { |
||
| 230 | BYTE totalBuffers; // Total number of buffers available. |
||
| 231 | BYTE currentBufferUSB; // The current buffer the USB peripheral is accessing. |
||
| 232 | BYTE currentBufferUser; // The current buffer the user is reading/writing. |
||
| 233 | BYTE *pDataUser; // User pointer for accessing data. |
||
| 234 | |||
| 235 | ISOCHRONOUS_DATA_BUFFER buffers[USB_MAX_ISOCHRONOUS_DATA_BUFFERS]; // Data buffer information. |
||
| 236 | } ISOCHRONOUS_DATA; |
||
| 237 | |||
| 238 | |||
| 239 | // ***************************************************************************** |
||
| 240 | /* Targeted Peripheral List |
||
| 241 | |||
| 242 | This structure is used to define the devices that this host can support. If the |
||
| 243 | host is a USB Embedded Host or Dual Role Device that does not support OTG, the |
||
| 244 | TPL may contain both specific devices and generic classes. If the host supports |
||
| 245 | OTG, then the TPL may contain ONLY specific devices. |
||
| 246 | */ |
||
| 247 | typedef struct _USB_TPL |
||
| 248 | { |
||
| 249 | union |
||
| 250 | { |
||
| 251 | DWORD val; // |
||
| 252 | struct |
||
| 253 | { |
||
| 254 | WORD idVendor; // Vendor ID |
||
| 255 | WORD idProduct; // Product ID |
||
| 256 | }; |
||
| 257 | struct |
||
| 258 | { |
||
| 259 | BYTE bClass; // Class ID |
||
| 260 | BYTE bSubClass; // SubClass ID |
||
| 261 | BYTE bProtocol; // Protocol ID |
||
| 262 | }; |
||
| 263 | } device; // |
||
| 264 | BYTE bConfiguration; // Initial device configuration |
||
| 265 | BYTE ClientDriver; // Index of client driver in the Client Driver table |
||
| 266 | union |
||
| 267 | { |
||
| 268 | BYTE val; // |
||
| 269 | struct |
||
| 270 | { |
||
| 271 | BYTE bfAllowHNP : 1; // Is HNP allowed? |
||
| 272 | BYTE bfIsClassDriver : 1; // Client driver is a class-level driver |
||
| 273 | BYTE bfSetConfiguration : 1; // bConfiguration is valid |
||
| 274 | }; |
||
| 275 | } flags; // |
||
| 276 | } USB_TPL; |
||
| 277 | |||
| 278 | // Section: TPL Initializers |
||
| 279 | #define INIT_VID_PID(v,p) {((v)|((p)<<16))} // Set VID/PID support in the TPL. |
||
| 280 | #define INIT_CL_SC_P(c,s,p) {((c)|((s)<<8)|((p)<<16))} // Set class support in the TPL (non-OTG only). |
||
| 281 | |||
| 282 | // Section: TPL Flags |
||
| 283 | #define TPL_ALLOW_HNP 0x01 // Bitmask for Host Negotiation Protocol. |
||
| 284 | #define TPL_CLASS_DRV 0x02 // Bitmask for class driver support. |
||
| 285 | #define TPL_SET_CONFIG 0x04 // Bitmask for setting the configuration. |
||
| 286 | |||
| 287 | |||
| 288 | // ***************************************************************************** |
||
| 289 | // ***************************************************************************** |
||
| 290 | // Section: USB Host - Client Driver Interface |
||
| 291 | // ***************************************************************************** |
||
| 292 | // ***************************************************************************** |
||
| 293 | |||
| 294 | /**************************************************************************** |
||
| 295 | Function: |
||
| 296 | BOOL (*USB_CLIENT_EVENT_HANDLER) ( BYTE address, USB_EVENT event, |
||
| 297 | void *data, DWORD size ) |
||
| 298 | |||
| 299 | Summary: |
||
| 300 | This is a typedef to use when defining a client driver event handler. |
||
| 301 | |||
| 302 | Description: |
||
| 303 | This data type defines a pointer to a call-back function that must be |
||
| 304 | implemented by a client driver if it needs to be aware of events on the |
||
| 305 | USB. When an event occurs, the Host layer will call the client driver |
||
| 306 | via this pointer to handle the event. Events are identified by the |
||
| 307 | "event" parameter and may have associated data. If the client driver was |
||
| 308 | able to handle the event, it should return TRUE. If not (or if |
||
| 309 | additional processing is required), it should return FALSE. |
||
| 310 | |||
| 311 | Precondition: |
||
| 312 | The client must have been initialized. |
||
| 313 | |||
| 314 | Parameters: |
||
| 315 | BYTE address - Address of device where event occurred |
||
| 316 | USB_EVENT event - Identifies the event that occured |
||
| 317 | void *data - Pointer to event-specific data |
||
| 318 | DWORD size - Size of the event-specific data |
||
| 319 | |||
| 320 | Return Values: |
||
| 321 | TRUE - The event was handled |
||
| 322 | FALSE - The event was not handled |
||
| 323 | |||
| 324 | Remarks: |
||
| 325 | The application may also implement an event handling routine if it |
||
| 326 | requires knowledge of events. To do so, it must implement a routine that |
||
| 327 | matches this function signature and define the USB_HOST_APP_EVENT_HANDLER |
||
| 328 | macro as the name of that function. |
||
| 329 | ***************************************************************************/ |
||
| 330 | |||
| 331 | typedef BOOL (*USB_CLIENT_EVENT_HANDLER) ( BYTE address, USB_EVENT event, void *data, DWORD size ); |
||
| 332 | |||
| 333 | |||
| 334 | /**************************************************************************** |
||
| 335 | Function: |
||
| 336 | BOOL (*USB_CLIENT_INIT) ( BYTE address, DWORD flags, BYTE clientDriverID ) |
||
| 337 | |||
| 338 | Summary: |
||
| 339 | This is a typedef to use when defining a client driver initialization |
||
| 340 | handler. |
||
| 341 | |||
| 342 | Description: |
||
| 343 | This routine is a call out from the host layer to a USB client driver. |
||
| 344 | It is called when the system has been configured as a USB host and a new |
||
| 345 | device has been attached to the bus. Its purpose is to initialize and |
||
| 346 | activate the client driver. |
||
| 347 | |||
| 348 | Precondition: |
||
| 349 | The device has been configured. |
||
| 350 | |||
| 351 | Parameters: |
||
| 352 | BYTE address - Device's address on the bus |
||
| 353 | DWORD flags - Initialization flags |
||
| 354 | BYTE clientDriverID - ID to send when issuing a Device Request via |
||
| 355 | USBHostIssueDeviceRequest() or USBHostSetDeviceConfiguration(). |
||
| 356 | |||
| 357 | Return Values: |
||
| 358 | TRUE - Successful |
||
| 359 | FALSE - Not successful |
||
| 360 | |||
| 361 | Remarks: |
||
| 362 | There may be multiple client drivers. If so, the USB host layer will |
||
| 363 | call the initialize routine for each of the clients that are in the |
||
| 364 | selected configuration. |
||
| 365 | ***************************************************************************/ |
||
| 366 | |||
| 367 | typedef BOOL (*USB_CLIENT_INIT) ( BYTE address, DWORD flags, BYTE clientDriverID ); |
||
| 368 | |||
| 369 | |||
| 370 | /**************************************************************************** |
||
| 371 | Function: |
||
| 372 | BOOL USB_HOST_APP_EVENT_HANDLER ( BYTE address, USB_EVENT event, |
||
| 373 | void *data, DWORD size ) |
||
| 374 | |||
| 375 | Summary: |
||
| 376 | This is a typedef to use when defining the application level events |
||
| 377 | handler. |
||
| 378 | |||
| 379 | Description: |
||
| 380 | This function is implemented by the application. The function name can |
||
| 381 | be anything - the macro USB_HOST_APP_EVENT_HANDLER must be set in |
||
| 382 | usb_config.h to the name of the application function. |
||
| 383 | |||
| 384 | In the application layer, this function is responsible for handling all |
||
| 385 | application-level events that are generated by the stack. See the |
||
| 386 | enumeration USB_EVENT for a complete list of all events that can occur. |
||
| 387 | Note that some of these events are intended for client drivers |
||
| 388 | (e.g. EVENT_TRANSFER), while some are intended for for the application |
||
| 389 | layer (e.g. EVENT_UNSUPPORTED_DEVICE). |
||
| 390 | |||
| 391 | If the application can handle the event successfully, the function |
||
| 392 | should return TRUE. For example, if the function receives the event |
||
| 393 | EVENT_VBUS_REQUEST_POWER and the system can allocate that much power to |
||
| 394 | an attached device, the function should return TRUE. If, however, the |
||
| 395 | system cannot allocate that much power to an attached device, the |
||
| 396 | function should return FALSE. |
||
| 397 | |||
| 398 | Precondition: |
||
| 399 | None |
||
| 400 | |||
| 401 | Parameters: |
||
| 402 | BYTE address - Address of the USB device generating the event |
||
| 403 | USB_EVENT event - Event that occurred |
||
| 404 | void *data - Optional pointer to data for the event |
||
| 405 | DWORD size - Size of the data pointed to by *data |
||
| 406 | |||
| 407 | Return Values: |
||
| 408 | TRUE - Event was processed successfully |
||
| 409 | FALSE - Event was not processed successfully |
||
| 410 | |||
| 411 | Remarks: |
||
| 412 | If this function is not provided by the application, then all application |
||
| 413 | events are assumed to function without error. |
||
| 414 | ***************************************************************************/ |
||
| 415 | #if defined( USB_HOST_APP_EVENT_HANDLER ) |
||
| 416 | BOOL USB_HOST_APP_EVENT_HANDLER ( BYTE address, USB_EVENT event, void *data, DWORD size ); |
||
| 417 | #else |
||
| 418 | // If the application does not provide an event handler, then we will |
||
| 419 | // assume that all events function without error. |
||
| 420 | #define USB_HOST_APP_EVENT_HANDLER(a,e,d,s) TRUE |
||
| 421 | #endif |
||
| 422 | |||
| 423 | |||
| 424 | /**************************************************************************** |
||
| 425 | Function: |
||
| 426 | BOOL USB_HOST_APP_DATA_EVENT_HANDLER ( BYTE address, USB_EVENT event, |
||
| 427 | void *data, DWORD size ) |
||
| 428 | |||
| 429 | Summary: |
||
| 430 | This is a typedef to use when defining the application level data events |
||
| 431 | handler. |
||
| 432 | |||
| 433 | Description: |
||
| 434 | This function is implemented by the application. The function name can |
||
| 435 | be anything - the macro USB_HOST_APP_EVENT_HANDLER must be set in |
||
| 436 | usb_config.h to the name of the application function. |
||
| 437 | |||
| 438 | In the application layer, this function is responsible for handling all |
||
| 439 | application-level data events that are generated by the stack. See the |
||
| 440 | enumeration USB_EVENT for a complete list of all events that can occur. |
||
| 441 | Note that only data events, such as EVENT_DATA_ISOC_READ, will be |
||
| 442 | passed to this event handler. |
||
| 443 | |||
| 444 | If the application can handle the event successfully, the function |
||
| 445 | should return TRUE. |
||
| 446 | |||
| 447 | Precondition: |
||
| 448 | None |
||
| 449 | |||
| 450 | Parameters: |
||
| 451 | BYTE address - Address of the USB device generating the event |
||
| 452 | USB_EVENT event - Event that occurred |
||
| 453 | void *data - Optional pointer to data for the event |
||
| 454 | DWORD size - Size of the data pointed to by *data |
||
| 455 | |||
| 456 | Return Values: |
||
| 457 | TRUE - Event was processed successfully |
||
| 458 | FALSE - Event was not processed successfully |
||
| 459 | |||
| 460 | Remarks: |
||
| 461 | If this function is not provided by the application, then all application |
||
| 462 | events are assumed to function without error. |
||
| 463 | ***************************************************************************/ |
||
| 464 | #if defined( USB_HOST_APP_DATA_EVENT_HANDLER ) |
||
| 465 | BOOL USB_HOST_APP_DATA_EVENT_HANDLER ( BYTE address, USB_EVENT event, void *data, DWORD size ); |
||
| 466 | #else |
||
| 467 | // If the application does not provide an event handler, then we will |
||
| 468 | // assume that all events function without error. |
||
| 469 | #define USB_HOST_APP_DATA_EVENT_HANDLER(a,e,d,s) TRUE |
||
| 470 | #endif |
||
| 471 | |||
| 472 | |||
| 473 | // ***************************************************************************** |
||
| 474 | /* Client Driver Table Structure |
||
| 475 | |||
| 476 | This structure is used to define an entry in the client-driver table. |
||
| 477 | Each entry provides the information that the Host layer needs to |
||
| 478 | manage a particular USB client driver, including pointers to the |
||
| 479 | interface routines that the Client Driver must implement. |
||
| 480 | */ |
||
| 481 | |||
| 482 | typedef struct _CLIENT_DRIVER_TABLE |
||
| 483 | { |
||
| 484 | USB_CLIENT_INIT Initialize; // Initialization routine |
||
| 485 | USB_CLIENT_EVENT_HANDLER EventHandler; // Event routine |
||
| 486 | |||
| 487 | #ifdef USB_HOST_APP_DATA_EVENT_HANDLER |
||
| 488 | USB_CLIENT_EVENT_HANDLER DataEventHandler; // Data Event routine |
||
| 489 | #endif |
||
| 490 | |||
| 491 | DWORD flags; // Initialization flags |
||
| 492 | |||
| 493 | } CLIENT_DRIVER_TABLE; |
||
| 494 | |||
| 495 | |||
| 496 | // ***************************************************************************** |
||
| 497 | // ***************************************************************************** |
||
| 498 | // Section: USB Host - Device Information Hooks |
||
| 499 | // ***************************************************************************** |
||
| 500 | // ***************************************************************************** |
||
| 501 | |||
| 502 | extern BYTE *pCurrentConfigurationDescriptor; // Pointer to the current Configuration Descriptor of the attached device. |
||
| 503 | extern BYTE *pDeviceDescriptor; // Pointer to the Device Descriptor of the attached device. |
||
| 504 | extern USB_TPL usbTPL[]; // Application's Targeted Peripheral List. |
||
| 505 | extern CLIENT_DRIVER_TABLE usbClientDrvTable[]; // Application's client driver table. |
||
| 506 | |||
| 507 | |||
| 508 | // ***************************************************************************** |
||
| 509 | // ***************************************************************************** |
||
| 510 | // Section: Function Prototypes and Macro Functions |
||
| 511 | // ***************************************************************************** |
||
| 512 | // ***************************************************************************** |
||
| 513 | |||
| 514 | /**************************************************************************** |
||
| 515 | Function: |
||
| 516 | BYTE USBHostClearEndpointErrors( BYTE deviceAddress, BYTE endpoint ) |
||
| 517 | |||
| 518 | Summary: |
||
| 519 | This function clears an endpoint's internal error condition. |
||
| 520 | |||
| 521 | Description: |
||
| 522 | This function is called to clear the internal error condition of a device's |
||
| 523 | endpoint. It should be called after the application has dealt with the |
||
| 524 | error condition on the device. This routine clears internal status only; |
||
| 525 | it does not interact with the device. |
||
| 526 | |||
| 527 | Precondition: |
||
| 528 | None |
||
| 529 | |||
| 530 | Parameters: |
||
| 531 | BYTE deviceAddress - Address of device |
||
| 532 | BYTE endpoint - Endpoint to clear error condition |
||
| 533 | |||
| 534 | Return Values: |
||
| 535 | USB_SUCCESS - Errors cleared |
||
| 536 | USB_UNKNOWN_DEVICE - Device not found |
||
| 537 | USB_ENDPOINT_NOT_FOUND - Specified endpoint not found |
||
| 538 | |||
| 539 | Remarks: |
||
| 540 | None |
||
| 541 | ***************************************************************************/ |
||
| 542 | |||
| 543 | BYTE USBHostClearEndpointErrors( BYTE deviceAddress, BYTE endpoint ); |
||
| 544 | |||
| 545 | |||
| 546 | /**************************************************************************** |
||
| 547 | Function: |
||
| 548 | BOOL USBHostDeviceSpecificClientDriver( BYTE deviceAddress ) |
||
| 549 | |||
| 550 | Summary: |
||
| 551 | This function indicates if the specified device has explicit client |
||
| 552 | driver support specified in the TPL. |
||
| 553 | |||
| 554 | Description: |
||
| 555 | This function indicates if the specified device has explicit client |
||
| 556 | driver support specified in the TPL. It is used in client drivers' |
||
| 557 | USB_CLIENT_INIT routines to indicate that the client driver should be |
||
| 558 | used even though the class, subclass, and protocol values may not match |
||
| 559 | those normally required by the class. For example, some printing devices |
||
| 560 | do not fulfill all of the requirements of the printer class, so their |
||
| 561 | class, subclass, and protocol fields indicate a custom driver rather than |
||
| 562 | the printer class. But the printer class driver can still be used, with |
||
| 563 | minor limitations. |
||
| 564 | |||
| 565 | Precondition: |
||
| 566 | None |
||
| 567 | |||
| 568 | Parameters: |
||
| 569 | BYTE deviceAddress - Address of device |
||
| 570 | |||
| 571 | Return Values: |
||
| 572 | TRUE - This device is listed in the TPL by VID andPID, and has explicit |
||
| 573 | client driver support. |
||
| 574 | FALSE - This device is not listed in the TPL by VID and PID. |
||
| 575 | |||
| 576 | Remarks: |
||
| 577 | This function is used so client drivers can allow certain |
||
| 578 | devices to enumerate. For example, some printer devices indicate a custom |
||
| 579 | class rather than the printer class, even though the device has only minor |
||
| 580 | limitations from the full printer class. The printer client driver will |
||
| 581 | fail to initialize the device if it does not indicate printer class support |
||
| 582 | in its interface descriptor. The printer client driver could allow any |
||
| 583 | device with an interface that matches the printer class endpoint |
||
| 584 | configuration, but both printer and mass storage devices utilize one bulk |
||
| 585 | IN and one bulk OUT endpoint. So a mass storage device would be |
||
| 586 | erroneously initialized as a printer device. This function allows a |
||
| 587 | client driver to know that the client driver support was specified |
||
| 588 | explicitly in the TPL, so for this particular device only, the class, |
||
| 589 | subclass, and protocol fields can be safely ignored. |
||
| 590 | ***************************************************************************/ |
||
| 591 | |||
| 592 | BOOL USBHostDeviceSpecificClientDriver( BYTE deviceAddress ); |
||
| 593 | |||
| 594 | |||
| 595 | /**************************************************************************** |
||
| 596 | Function: |
||
| 597 | BYTE USBHostDeviceStatus( BYTE deviceAddress ) |
||
| 598 | |||
| 599 | Summary: |
||
| 600 | This function returns the current status of a device. |
||
| 601 | |||
| 602 | Description: |
||
| 603 | This function returns the current status of a device. If the device is |
||
| 604 | in a holding state due to an error, the error is returned. |
||
| 605 | |||
| 606 | Precondition: |
||
| 607 | None |
||
| 608 | |||
| 609 | Parameters: |
||
| 610 | BYTE deviceAddress - Device address |
||
| 611 | |||
| 612 | Return Values: |
||
| 613 | USB_DEVICE_ATTACHED - Device is attached and running |
||
| 614 | USB_DEVICE_DETACHED - No device is attached |
||
| 615 | USB_DEVICE_ENUMERATING - Device is enumerating |
||
| 616 | USB_HOLDING_OUT_OF_MEMORY - Not enough heap space available |
||
| 617 | USB_HOLDING_UNSUPPORTED_DEVICE - Invalid configuration or |
||
| 618 | unsupported class |
||
| 619 | USB_HOLDING_UNSUPPORTED_HUB - Hubs are not supported |
||
| 620 | USB_HOLDING_INVALID_CONFIGURATION - Invalid configuration requested |
||
| 621 | USB_HOLDING_PROCESSING_CAPACITY - Processing requirement excessive |
||
| 622 | USB_HOLDING_POWER_REQUIREMENT - Power requirement excessive |
||
| 623 | USB_HOLDING_CLIENT_INIT_ERROR - Client driver failed to initialize |
||
| 624 | Other - Device is holding in an error |
||
| 625 | state. The return value |
||
| 626 | indicates the error. |
||
| 627 | |||
| 628 | Remarks: |
||
| 629 | None |
||
| 630 | ***************************************************************************/ |
||
| 631 | |||
| 632 | BYTE USBHostDeviceStatus( BYTE deviceAddress ); |
||
| 633 | |||
| 634 | |||
| 635 | /**************************************************************************** |
||
| 636 | Function: |
||
| 637 | BYTE * USBHostGetCurrentConfigurationDescriptor( BYTE deviceAddress ) |
||
| 638 | |||
| 639 | Description: |
||
| 640 | This function returns a pointer to the current configuration descriptor |
||
| 641 | of the requested device. |
||
| 642 | |||
| 643 | Precondition: |
||
| 644 | None |
||
| 645 | |||
| 646 | Parameters: |
||
| 647 | BYTE deviceAddress - Address of device |
||
| 648 | |||
| 649 | Returns: |
||
| 650 | BYTE * - Pointer to the Configuration Descriptor. |
||
| 651 | |||
| 652 | Remarks: |
||
| 653 | This will need to be expanded to a full function when multiple device |
||
| 654 | support is added. |
||
| 655 | ***************************************************************************/ |
||
| 656 | |||
| 657 | #define USBHostGetCurrentConfigurationDescriptor( deviceAddress) ( pCurrentConfigurationDescriptor ) |
||
| 658 | |||
| 659 | |||
| 660 | /**************************************************************************** |
||
| 661 | Function: |
||
| 662 | BYTE * USBHostGetDeviceDescriptor( BYTE deviceAddress ) |
||
| 663 | |||
| 664 | Description: |
||
| 665 | This function returns a pointer to the device descriptor of the |
||
| 666 | requested device. |
||
| 667 | |||
| 668 | Precondition: |
||
| 669 | None |
||
| 670 | |||
| 671 | Parameters: |
||
| 672 | BYTE deviceAddress - Address of device |
||
| 673 | |||
| 674 | Returns: |
||
| 675 | BYTE * - Pointer to the Device Descriptor. |
||
| 676 | |||
| 677 | Remarks: |
||
| 678 | This will need to be expanded to a full function when multiple device |
||
| 679 | support is added. |
||
| 680 | ***************************************************************************/ |
||
| 681 | |||
| 682 | #define USBHostGetDeviceDescriptor( deviceAddress ) ( pDeviceDescriptor ) |
||
| 683 | |||
| 684 | |||
| 685 | /**************************************************************************** |
||
| 686 | Function: |
||
| 687 | BYTE USBHostGetStringDescriptor ( BYTE deviceAddress, BYTE stringNumber, |
||
| 688 | BYTE LangID, BYTE *stringDescriptor, BYTE stringLength, |
||
| 689 | BYTE clientDriverID ) |
||
| 690 | |||
| 691 | Summary: |
||
| 692 | This routine initiates a request to obtains the requested string |
||
| 693 | descriptor. |
||
| 694 | |||
| 695 | Description: |
||
| 696 | This routine initiates a request to obtains the requested string |
||
| 697 | descriptor. If the request cannot be started, the routine returns an |
||
| 698 | error. Otherwise, the request is started, and the requested string |
||
| 699 | descriptor is stored in the designated location. |
||
| 700 | |||
| 701 | Example Usage: |
||
| 702 | <code> |
||
| 703 | USBHostGetStringDescriptor( |
||
| 704 | deviceAddress, |
||
| 705 | stringDescriptorNum, |
||
| 706 | LangID, |
||
| 707 | stringDescriptorBuffer, |
||
| 708 | sizeof(stringDescriptorBuffer), |
||
| 709 | 0xFF |
||
| 710 | ); |
||
| 711 | |||
| 712 | while(1) |
||
| 713 | { |
||
| 714 | if(USBHostTransferIsComplete( deviceAddress , 0, &errorCode, &byteCount)) |
||
| 715 | { |
||
| 716 | if(errorCode) |
||
| 717 | { |
||
| 718 | //There was an error reading the string, bail out of loop |
||
| 719 | } |
||
| 720 | else |
||
| 721 | { |
||
| 722 | //String is located in specified buffer, do something with it. |
||
| 723 | |||
| 724 | //The length of the string is both in the byteCount variable |
||
| 725 | // as well as the first byte of the string itself |
||
| 726 | } |
||
| 727 | break; |
||
| 728 | } |
||
| 729 | USBTasks(); |
||
| 730 | } |
||
| 731 | </code> |
||
| 732 | |||
| 733 | Precondition: |
||
| 734 | None |
||
| 735 | |||
| 736 | Parameters: |
||
| 737 | deviceAddress - Address of the device |
||
| 738 | stringNumber - Index of the desired string descriptor |
||
| 739 | LangID - The Language ID of the string to read (should be 0 |
||
| 740 | if trying to read the language ID list |
||
| 741 | *stringDescriptor - Pointer to where to store the string. |
||
| 742 | stringLength - Maximum length of the returned string. |
||
| 743 | clientDriverID - Client driver to return the completion event to. |
||
| 744 | |||
| 745 | Return Values: |
||
| 746 | USB_SUCCESS - The request was started successfully. |
||
| 747 | USB_UNKNOWN_DEVICE - Device not found |
||
| 748 | USB_INVALID_STATE - We must be in a normal running state. |
||
| 749 | USB_ENDPOINT_BUSY - The endpoint is currently processing a request. |
||
| 750 | |||
| 751 | Remarks: |
||
| 752 | The returned string descriptor will be in the exact format as obtained |
||
| 753 | from the device. The length of the entire descriptor will be in the |
||
| 754 | first byte, and the descriptor type will be in the second. The string |
||
| 755 | itself is represented in UNICODE. Refer to the USB 2.0 Specification |
||
| 756 | for more information about the format of string descriptors. |
||
| 757 | ***************************************************************************/ |
||
| 758 | |||
| 759 | #define USBHostGetStringDescriptor( deviceAddress, stringNumber, LangID, stringDescriptor, stringLength, clientDriverID ) \ |
||
| 760 | USBHostIssueDeviceRequest( deviceAddress, USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_DEVICE, \ |
||
| 761 | USB_REQUEST_GET_DESCRIPTOR, (USB_DESCRIPTOR_STRING << 8) | stringNumber, \ |
||
| 762 | LangID, stringLength, stringDescriptor, USB_DEVICE_REQUEST_GET, clientDriverID ) |
||
| 763 | |||
| 764 | |||
| 765 | /**************************************************************************** |
||
| 766 | Function: |
||
| 767 | BOOL USBHostInit( unsigned long flags ) |
||
| 768 | |||
| 769 | Summary: |
||
| 770 | This function initializes the variables of the USB host stack. |
||
| 771 | |||
| 772 | Description: |
||
| 773 | This function initializes the variables of the USB host stack. It does |
||
| 774 | not initialize the hardware. The peripheral itself is initialized in one |
||
| 775 | of the state machine states. Therefore, USBHostTasks() should be called |
||
| 776 | soon after this function. |
||
| 777 | |||
| 778 | Precondition: |
||
| 779 | None |
||
| 780 | |||
| 781 | Parameters: |
||
| 782 | flags - reserved |
||
| 783 | |||
| 784 | Return Values: |
||
| 785 | TRUE - Initialization successful |
||
| 786 | FALSE - Could not allocate memory. |
||
| 787 | |||
| 788 | Remarks: |
||
| 789 | If the endpoint list is empty, an entry is created in the endpoint list |
||
| 790 | for EP0. If the list is not empty, free all allocated memory other than |
||
| 791 | the EP0 node. This allows the routine to be called multiple times by the |
||
| 792 | application. |
||
| 793 | ***************************************************************************/ |
||
| 794 | |||
| 795 | BOOL USBHostInit( unsigned long flags ); |
||
| 796 | |||
| 797 | |||
| 798 | /**************************************************************************** |
||
| 799 | Function: |
||
| 800 | BOOL USBHostIsochronousBuffersCreate( ISOCHRONOUS_DATA * isocData, |
||
| 801 | BYTE numberOfBuffers, WORD bufferSize ) |
||
| 802 | |||
| 803 | Description: |
||
| 804 | This function initializes the isochronous data buffer information and |
||
| 805 | allocates memory for each buffer. This function will not allocate memory |
||
| 806 | if the buffer pointer is not NULL. |
||
| 807 | |||
| 808 | Precondition: |
||
| 809 | None |
||
| 810 | |||
| 811 | Parameters: |
||
| 812 | None |
||
| 813 | |||
| 814 | Return Values: |
||
| 815 | TRUE - All buffers are allocated successfully. |
||
| 816 | FALSE - Not enough heap space to allocate all buffers - adjust the |
||
| 817 | project to provide more heap space. |
||
| 818 | |||
| 819 | Remarks: |
||
| 820 | This function is available only if USB_SUPPORT_ISOCHRONOUS_TRANSFERS |
||
| 821 | is defined in usb_config.h. |
||
| 822 | ***************************************************************************/ |
||
| 823 | |||
| 824 | #ifdef USB_SUPPORT_ISOCHRONOUS_TRANSFERS |
||
| 825 | BOOL USBHostIsochronousBuffersCreate( ISOCHRONOUS_DATA * isocData, BYTE numberOfBuffers, WORD bufferSize ); |
||
| 826 | #endif |
||
| 827 | |||
| 828 | |||
| 829 | /**************************************************************************** |
||
| 830 | Function: |
||
| 831 | void USBHostIsochronousBuffersDestroy( ISOCHRONOUS_DATA * isocData, BYTE numberOfBuffers ) |
||
| 832 | |||
| 833 | Description: |
||
| 834 | This function releases all of the memory allocated for the isochronous |
||
| 835 | data buffers. It also resets all other information about the buffers. |
||
| 836 | |||
| 837 | Precondition: |
||
| 838 | None |
||
| 839 | |||
| 840 | Parameters: |
||
| 841 | None |
||
| 842 | |||
| 843 | Returns: |
||
| 844 | None |
||
| 845 | |||
| 846 | Remarks: |
||
| 847 | This function is available only if USB_SUPPORT_ISOCHRONOUS_TRANSFERS |
||
| 848 | is defined in usb_config.h. |
||
| 849 | ***************************************************************************/ |
||
| 850 | |||
| 851 | #ifdef USB_SUPPORT_ISOCHRONOUS_TRANSFERS |
||
| 852 | void USBHostIsochronousBuffersDestroy( ISOCHRONOUS_DATA * isocData, BYTE numberOfBuffers ); |
||
| 853 | #endif |
||
| 854 | |||
| 855 | |||
| 856 | /**************************************************************************** |
||
| 857 | Function: |
||
| 858 | void USBHostIsochronousBuffersReset( ISOCHRONOUS_DATA * isocData, BYTE numberOfBuffers ) |
||
| 859 | |||
| 860 | Description: |
||
| 861 | This function resets all the isochronous data buffers. It does not do |
||
| 862 | anything with the space allocated for the buffers. |
||
| 863 | |||
| 864 | Precondition: |
||
| 865 | None |
||
| 866 | |||
| 867 | Parameters: |
||
| 868 | None |
||
| 869 | |||
| 870 | Returns: |
||
| 871 | None |
||
| 872 | |||
| 873 | Remarks: |
||
| 874 | This function is available only if USB_SUPPORT_ISOCHRONOUS_TRANSFERS |
||
| 875 | is defined in usb_config.h. |
||
| 876 | ***************************************************************************/ |
||
| 877 | |||
| 878 | #ifdef USB_SUPPORT_ISOCHRONOUS_TRANSFERS |
||
| 879 | void USBHostIsochronousBuffersReset( ISOCHRONOUS_DATA * isocData, BYTE numberOfBuffers ); |
||
| 880 | #endif |
||
| 881 | |||
| 882 | |||
| 883 | /**************************************************************************** |
||
| 884 | Function: |
||
| 885 | BYTE USBHostIssueDeviceRequest( BYTE deviceAddress, BYTE bmRequestType, |
||
| 886 | BYTE bRequest, WORD wValue, WORD wIndex, WORD wLength, |
||
| 887 | BYTE *data, BYTE dataDirection, BYTE clientDriverID ) |
||
| 888 | |||
| 889 | Summary: |
||
| 890 | This function sends a standard device request to the attached device. |
||
| 891 | |||
| 892 | Description: |
||
| 893 | This function sends a standard device request to the attached device. |
||
| 894 | The user must pass in the parameters of the device request. If there is |
||
| 895 | input or output data associated with the request, a pointer to the data |
||
| 896 | must be provided. The direction of the associated data (input or output) |
||
| 897 | must also be indicated. |
||
| 898 | |||
| 899 | This function does no special processing in regards to the request except |
||
| 900 | for three requests. If SET INTERFACE is sent, then DTS is reset for all |
||
| 901 | endpoints. If CLEAR FEATURE (ENDPOINT HALT) is sent, then DTS is reset |
||
| 902 | for that endpoint. If SET CONFIGURATION is sent, the request is aborted |
||
| 903 | with a failure. The function USBHostSetDeviceConfiguration() must be |
||
| 904 | called to change the device configuration, since endpoint definitions may |
||
| 905 | change. |
||
| 906 | |||
| 907 | Precondition: |
||
| 908 | The host state machine should be in the running state, and no reads or |
||
| 909 | writes to EP0 should be in progress. |
||
| 910 | |||
| 911 | Parameters: |
||
| 912 | BYTE deviceAddress - Device address |
||
| 913 | BYTE bmRequestType - The request type as defined by the USB |
||
| 914 | specification. |
||
| 915 | BYTE bRequest - The request as defined by the USB specification. |
||
| 916 | WORD wValue - The value for the request as defined by the USB |
||
| 917 | specification. |
||
| 918 | WORD wIndex - The index for the request as defined by the USB |
||
| 919 | specification. |
||
| 920 | WORD wLength - The data length for the request as defined by the |
||
| 921 | USB specification. |
||
| 922 | BYTE *data - Pointer to the data for the request. |
||
| 923 | BYTE dataDirection - USB_DEVICE_REQUEST_SET or USB_DEVICE_REQUEST_GET |
||
| 924 | BYTE clientDriverID - Client driver to send the event to. |
||
| 925 | |||
| 926 | Return Values: |
||
| 927 | USB_SUCCESS - Request processing started |
||
| 928 | USB_UNKNOWN_DEVICE - Device not found |
||
| 929 | USB_INVALID_STATE - The host must be in a normal running state |
||
| 930 | to do this request |
||
| 931 | USB_ENDPOINT_BUSY - A read or write is already in progress |
||
| 932 | USB_ILLEGAL_REQUEST - SET CONFIGURATION cannot be performed with |
||
| 933 | this function. |
||
| 934 | |||
| 935 | Remarks: |
||
| 936 | DTS reset is done before the command is issued. |
||
| 937 | ***************************************************************************/ |
||
| 938 | |||
| 939 | BYTE USBHostIssueDeviceRequest( BYTE deviceAddress, BYTE bmRequestType, BYTE bRequest, |
||
| 940 | WORD wValue, WORD wIndex, WORD wLength, BYTE *data, BYTE dataDirection, |
||
| 941 | BYTE clientDriverID ); |
||
| 942 | |||
| 943 | |||
| 944 | /**************************************************************************** |
||
| 945 | Function: |
||
| 946 | BYTE USBHostRead( BYTE deviceAddress, BYTE endpoint, BYTE *pData, |
||
| 947 | DWORD size ) |
||
| 948 | Summary: |
||
| 949 | This function initiates a read from the attached device. |
||
| 950 | |||
| 951 | Description: |
||
| 952 | This function initiates a read from the attached device. |
||
| 953 | |||
| 954 | If the endpoint is isochronous, special conditions apply. The pData and |
||
| 955 | size parameters have slightly different meanings, since multiple buffers |
||
| 956 | are required. Once started, an isochronous transfer will continue with |
||
| 957 | no upper layer intervention until USBHostTerminateTransfer() is called. |
||
| 958 | The ISOCHRONOUS_DATA_BUFFERS structure should not be manipulated until |
||
| 959 | the transfer is terminated. |
||
| 960 | |||
| 961 | To clarify parameter usage and to simplify casting, use the macro |
||
| 962 | USBHostReadIsochronous() when reading from an isochronous endpoint. |
||
| 963 | |||
| 964 | Precondition: |
||
| 965 | None |
||
| 966 | |||
| 967 | Parameters: |
||
| 968 | BYTE deviceAddress - Device address |
||
| 969 | BYTE endpoint - Endpoint number |
||
| 970 | BYTE *pData - Pointer to where to store the data. If the endpoint |
||
| 971 | is isochronous, this points to an |
||
| 972 | ISOCHRONOUS_DATA_BUFFERS structure, with multiple |
||
| 973 | data buffer pointers. |
||
| 974 | DWORD size - Number of data bytes to read. If the endpoint is |
||
| 975 | isochronous, this is the number of data buffer |
||
| 976 | pointers pointed to by pData. |
||
| 977 | |||
| 978 | Return Values: |
||
| 979 | USB_SUCCESS - Read started successfully. |
||
| 980 | USB_UNKNOWN_DEVICE - Device with the specified address not found. |
||
| 981 | USB_INVALID_STATE - We are not in a normal running state. |
||
| 982 | USB_ENDPOINT_ILLEGAL_TYPE - Must use USBHostControlRead to read |
||
| 983 | from a control endpoint. |
||
| 984 | USB_ENDPOINT_ILLEGAL_DIRECTION - Must read from an IN endpoint. |
||
| 985 | USB_ENDPOINT_STALLED - Endpoint is stalled. Must be cleared |
||
| 986 | by the application. |
||
| 987 | USB_ENDPOINT_ERROR - Endpoint has too many errors. Must be |
||
| 988 | cleared by the application. |
||
| 989 | USB_ENDPOINT_BUSY - A Read is already in progress. |
||
| 990 | USB_ENDPOINT_NOT_FOUND - Invalid endpoint. |
||
| 991 | |||
| 992 | Remarks: |
||
| 993 | None |
||
| 994 | ***************************************************************************/ |
||
| 995 | |||
| 996 | BYTE USBHostRead( BYTE deviceAddress, BYTE endpoint, BYTE *data, DWORD size ); |
||
| 997 | |||
| 998 | |||
| 999 | /**************************************************************************** |
||
| 1000 | Function: |
||
| 1001 | BYTE USBHostReadIsochronous( BYTE deviceAddress, BYTE endpoint, |
||
| 1002 | ISOCHRONOUS_DATA *pIsochronousData ) |
||
| 1003 | |||
| 1004 | Summary: |
||
| 1005 | This function initiates a read from an isochronous endpoint on the |
||
| 1006 | attached device. |
||
| 1007 | |||
| 1008 | Description: |
||
| 1009 | This function initiates a read from an isochronous endpoint on the |
||
| 1010 | attached device. If the endpoint is not isochronous, use USBHostRead(). |
||
| 1011 | |||
| 1012 | Once started, an isochronous transfer will continue with no upper layer |
||
| 1013 | intervention until USBHostTerminateTransfer() is called. |
||
| 1014 | |||
| 1015 | Precondition: |
||
| 1016 | None |
||
| 1017 | |||
| 1018 | Parameters: |
||
| 1019 | BYTE deviceAddress - Device address |
||
| 1020 | BYTE endpoint - Endpoint number |
||
| 1021 | ISOCHRONOUS_DATA *pIsochronousData - Pointer to an ISOCHRONOUS_DATA |
||
| 1022 | structure, containing information for the |
||
| 1023 | application and the host driver for the |
||
| 1024 | isochronous transfer. |
||
| 1025 | |||
| 1026 | Return Values: |
||
| 1027 | USB_SUCCESS - Read started successfully. |
||
| 1028 | USB_UNKNOWN_DEVICE - Device with the specified address not found. |
||
| 1029 | USB_INVALID_STATE - We are not in a normal running state. |
||
| 1030 | USB_ENDPOINT_ILLEGAL_TYPE - Must use USBHostControlRead to read |
||
| 1031 | from a control endpoint. |
||
| 1032 | USB_ENDPOINT_ILLEGAL_DIRECTION - Must read from an IN endpoint. |
||
| 1033 | USB_ENDPOINT_STALLED - Endpoint is stalled. Must be cleared |
||
| 1034 | by the application. |
||
| 1035 | USB_ENDPOINT_ERROR - Endpoint has too many errors. Must be |
||
| 1036 | cleared by the application. |
||
| 1037 | USB_ENDPOINT_BUSY - A Read is already in progress. |
||
| 1038 | USB_ENDPOINT_NOT_FOUND - Invalid endpoint. |
||
| 1039 | |||
| 1040 | Remarks: |
||
| 1041 | None |
||
| 1042 | ***************************************************************************/ |
||
| 1043 | |||
| 1044 | #define USBHostReadIsochronous( a, e, p ) USBHostRead( a, e, (BYTE *)p, (DWORD)0 ); |
||
| 1045 | |||
| 1046 | |||
| 1047 | /**************************************************************************** |
||
| 1048 | Function: |
||
| 1049 | BYTE USBHostResetDevice( BYTE deviceAddress ) |
||
| 1050 | |||
| 1051 | Summary: |
||
| 1052 | This function resets an attached device. |
||
| 1053 | |||
| 1054 | Description: |
||
| 1055 | This function places the device back in the RESET state, to issue RESET |
||
| 1056 | signaling. It can be called only if the state machine is not in the |
||
| 1057 | DETACHED state. |
||
| 1058 | |||
| 1059 | Precondition: |
||
| 1060 | None |
||
| 1061 | |||
| 1062 | Parameters: |
||
| 1063 | BYTE deviceAddress - Device address |
||
| 1064 | |||
| 1065 | Return Values: |
||
| 1066 | USB_SUCCESS - Success |
||
| 1067 | USB_UNKNOWN_DEVICE - Device not found |
||
| 1068 | USB_ILLEGAL_REQUEST - Device cannot RESUME unless it is suspended |
||
| 1069 | |||
| 1070 | Remarks: |
||
| 1071 | In order to do a full clean-up, the state is set back to STATE_DETACHED |
||
| 1072 | rather than a reset state. The ATTACH interrupt will automatically be |
||
| 1073 | triggered when the module is re-enabled, and the proper reset will be |
||
| 1074 | performed. |
||
| 1075 | ***************************************************************************/ |
||
| 1076 | |||
| 1077 | BYTE USBHostResetDevice( BYTE deviceAddress ); |
||
| 1078 | |||
| 1079 | |||
| 1080 | /**************************************************************************** |
||
| 1081 | Function: |
||
| 1082 | BYTE USBHostResumeDevice( BYTE deviceAddress ) |
||
| 1083 | |||
| 1084 | Summary: |
||
| 1085 | This function issues a RESUME to the attached device. |
||
| 1086 | |||
| 1087 | Description: |
||
| 1088 | This function issues a RESUME to the attached device. It can called only |
||
| 1089 | if the state machine is in the suspend state. |
||
| 1090 | |||
| 1091 | Precondition: |
||
| 1092 | None |
||
| 1093 | |||
| 1094 | Parameters: |
||
| 1095 | BYTE deviceAddress - Device address |
||
| 1096 | |||
| 1097 | Return Values: |
||
| 1098 | USB_SUCCESS - Success |
||
| 1099 | USB_UNKNOWN_DEVICE - Device not found |
||
| 1100 | USB_ILLEGAL_REQUEST - Device cannot RESUME unless it is suspended |
||
| 1101 | |||
| 1102 | Remarks: |
||
| 1103 | None |
||
| 1104 | ***************************************************************************/ |
||
| 1105 | |||
| 1106 | BYTE USBHostResumeDevice( BYTE deviceAddress ); |
||
| 1107 | |||
| 1108 | |||
| 1109 | /**************************************************************************** |
||
| 1110 | Function: |
||
| 1111 | BYTE USBHostSetDeviceConfiguration( BYTE deviceAddress, BYTE configuration ) |
||
| 1112 | |||
| 1113 | Summary: |
||
| 1114 | This function changes the device's configuration. |
||
| 1115 | |||
| 1116 | Description: |
||
| 1117 | This function is used by the application to change the device's |
||
| 1118 | Configuration. This function must be used instead of |
||
| 1119 | USBHostIssueDeviceRequest(), because the endpoint definitions may change. |
||
| 1120 | |||
| 1121 | To see when the reconfiguration is complete, use the USBHostDeviceStatus() |
||
| 1122 | function. If configuration is still in progress, this function will |
||
| 1123 | return USB_DEVICE_ENUMERATING. |
||
| 1124 | |||
| 1125 | Precondition: |
||
| 1126 | The host state machine should be in the running state, and no reads or |
||
| 1127 | writes should be in progress. |
||
| 1128 | |||
| 1129 | Parameters: |
||
| 1130 | BYTE deviceAddress - Device address |
||
| 1131 | BYTE configuration - Index of the new configuration |
||
| 1132 | |||
| 1133 | Return Values: |
||
| 1134 | USB_SUCCESS - Process of changing the configuration was started |
||
| 1135 | successfully. |
||
| 1136 | USB_UNKNOWN_DEVICE - Device not found |
||
| 1137 | USB_INVALID_STATE - This function cannot be called during enumeration |
||
| 1138 | or while performing a device request. |
||
| 1139 | USB_BUSY - No IN or OUT transfers may be in progress. |
||
| 1140 | |||
| 1141 | Example: |
||
| 1142 | <code> |
||
| 1143 | rc = USBHostSetDeviceConfiguration( attachedDevice, configuration ); |
||
| 1144 | if (rc) |
||
| 1145 | { |
||
| 1146 | // Error - cannot set configuration. |
||
| 1147 | } |
||
| 1148 | else |
||
| 1149 | { |
||
| 1150 | while (USBHostDeviceStatus( attachedDevice ) == USB_DEVICE_ENUMERATING) |
||
| 1151 | { |
||
| 1152 | USBHostTasks(); |
||
| 1153 | } |
||
| 1154 | } |
||
| 1155 | if (USBHostDeviceStatus( attachedDevice ) != USB_DEVICE_ATTACHED) |
||
| 1156 | { |
||
| 1157 | // Error - cannot set configuration. |
||
| 1158 | } |
||
| 1159 | </code> |
||
| 1160 | |||
| 1161 | Remarks: |
||
| 1162 | If an invalid configuration is specified, this function cannot return |
||
| 1163 | an error. Instead, the event USB_UNSUPPORTED_DEVICE will the sent to the |
||
| 1164 | application layer and the device will be placed in a holding state with a |
||
| 1165 | USB_HOLDING_UNSUPPORTED_DEVICE error returned by USBHostDeviceStatus(). |
||
| 1166 | ***************************************************************************/ |
||
| 1167 | |||
| 1168 | BYTE USBHostSetDeviceConfiguration( BYTE deviceAddress, BYTE configuration ); |
||
| 1169 | |||
| 1170 | |||
| 1171 | /**************************************************************************** |
||
| 1172 | Function: |
||
| 1173 | BYTE USBHostSetNAKTimeout( BYTE deviceAddress, BYTE endpoint, WORD flags, |
||
| 1174 | WORD timeoutCount ) |
||
| 1175 | |||
| 1176 | Summary: |
||
| 1177 | This function specifies NAK timeout capability. |
||
| 1178 | |||
| 1179 | Description: |
||
| 1180 | This function is used to set whether or not an endpoint on a device |
||
| 1181 | should time out a transaction based on the number of NAKs received, and |
||
| 1182 | if so, how many NAKs are allowed before the timeout. |
||
| 1183 | |||
| 1184 | Precondition: |
||
| 1185 | None |
||
| 1186 | |||
| 1187 | Parameters: |
||
| 1188 | BYTE deviceAddress - Device address |
||
| 1189 | BYTE endpoint - Endpoint number to configure |
||
| 1190 | WORD flags - Bit 0: |
||
| 1191 | * 0 = disable NAK timeout |
||
| 1192 | * 1 = enable NAK timeout |
||
| 1193 | WORD timeoutCount - Number of NAKs allowed before a timeout |
||
| 1194 | |||
| 1195 | Return Values: |
||
| 1196 | USB_SUCCESS - NAK timeout was configured successfully. |
||
| 1197 | USB_UNKNOWN_DEVICE - Device not found. |
||
| 1198 | USB_ENDPOINT_NOT_FOUND - The specified endpoint was not found. |
||
| 1199 | |||
| 1200 | Remarks: |
||
| 1201 | None |
||
| 1202 | ***************************************************************************/ |
||
| 1203 | |||
| 1204 | BYTE USBHostSetNAKTimeout( BYTE deviceAddress, BYTE endpoint, WORD flags, WORD timeoutCount ); |
||
| 1205 | |||
| 1206 | |||
| 1207 | /**************************************************************************** |
||
| 1208 | Function: |
||
| 1209 | void USBHostShutdown( void ) |
||
| 1210 | |||
| 1211 | Description: |
||
| 1212 | This function turns off the USB module and frees all unnecessary memory. |
||
| 1213 | This routine can be called by the application layer to shut down all |
||
| 1214 | USB activity, which effectively detaches all devices. The event |
||
| 1215 | EVENT_DETACH will be sent to the client drivers for the attached device, |
||
| 1216 | and the event EVENT_VBUS_RELEASE_POWER will be sent to the application |
||
| 1217 | layer. |
||
| 1218 | |||
| 1219 | Precondition: |
||
| 1220 | None |
||
| 1221 | |||
| 1222 | Parameters: |
||
| 1223 | None - None |
||
| 1224 | |||
| 1225 | Returns: |
||
| 1226 | None |
||
| 1227 | |||
| 1228 | Remarks: |
||
| 1229 | None |
||
| 1230 | ***************************************************************************/ |
||
| 1231 | |||
| 1232 | void USBHostShutdown( void ); |
||
| 1233 | |||
| 1234 | |||
| 1235 | /**************************************************************************** |
||
| 1236 | Function: |
||
| 1237 | BYTE USBHostSuspendDevice( BYTE deviceAddress ) |
||
| 1238 | |||
| 1239 | Summary: |
||
| 1240 | This function suspends a device. |
||
| 1241 | |||
| 1242 | Description: |
||
| 1243 | This function put a device into an IDLE state. It can only be called |
||
| 1244 | while the state machine is in normal running mode. After 3ms, the |
||
| 1245 | attached device should go into SUSPEND mode. |
||
| 1246 | |||
| 1247 | Precondition: |
||
| 1248 | None |
||
| 1249 | |||
| 1250 | Parameters: |
||
| 1251 | BYTE deviceAddress - Device to suspend |
||
| 1252 | |||
| 1253 | Return Values: |
||
| 1254 | USB_SUCCESS - Success |
||
| 1255 | USB_UNKNOWN_DEVICE - Device not found |
||
| 1256 | USB_ILLEGAL_REQUEST - Cannot suspend unless device is in normal run mode |
||
| 1257 | |||
| 1258 | Remarks: |
||
| 1259 | None |
||
| 1260 | ****************************************************************************/ |
||
| 1261 | |||
| 1262 | BYTE USBHostSuspendDevice( BYTE deviceAddress ); |
||
| 1263 | |||
| 1264 | |||
| 1265 | /**************************************************************************** |
||
| 1266 | Function: |
||
| 1267 | void USBHostTasks( void ) |
||
| 1268 | |||
| 1269 | Summary: |
||
| 1270 | This function executes the host tasks for USB host operation. |
||
| 1271 | |||
| 1272 | Description: |
||
| 1273 | This function executes the host tasks for USB host operation. It must be |
||
| 1274 | executed on a regular basis to keep everything functioning. |
||
| 1275 | |||
| 1276 | The primary purpose of this function is to handle device attach/detach |
||
| 1277 | and enumeration. It does not handle USB packet transmission or |
||
| 1278 | reception; that must be done in the USB interrupt handler to ensure |
||
| 1279 | timely operation. |
||
| 1280 | |||
| 1281 | This routine should be called on a regular basis, but there is no |
||
| 1282 | specific time requirement. Devices will still be able to attach, |
||
| 1283 | enumerate, and detach, but the operations will occur more slowly as the |
||
| 1284 | calling interval increases. |
||
| 1285 | |||
| 1286 | Precondition: |
||
| 1287 | USBHostInit() has been called. |
||
| 1288 | |||
| 1289 | Parameters: |
||
| 1290 | None |
||
| 1291 | |||
| 1292 | Returns: |
||
| 1293 | None |
||
| 1294 | |||
| 1295 | Remarks: |
||
| 1296 | None |
||
| 1297 | ***************************************************************************/ |
||
| 1298 | |||
| 1299 | void USBHostTasks( void ); |
||
| 1300 | |||
| 1301 | |||
| 1302 | /**************************************************************************** |
||
| 1303 | Function: |
||
| 1304 | void USBHostTerminateTransfer( BYTE deviceAddress, BYTE endpoint ) |
||
| 1305 | |||
| 1306 | |||
| 1307 | Summary: |
||
| 1308 | This function terminates the current transfer for the given endpoint. |
||
| 1309 | |||
| 1310 | Description: |
||
| 1311 | This function terminates the current transfer for the given endpoint. It |
||
| 1312 | can be used to terminate reads or writes that the device is not |
||
| 1313 | responding to. It is also the only way to terminate an isochronous |
||
| 1314 | transfer. |
||
| 1315 | |||
| 1316 | Precondition: |
||
| 1317 | None |
||
| 1318 | |||
| 1319 | Parameters: |
||
| 1320 | BYTE deviceAddress - Device address |
||
| 1321 | BYTE endpoint - Endpoint number |
||
| 1322 | |||
| 1323 | Returns: |
||
| 1324 | None |
||
| 1325 | |||
| 1326 | Remarks: |
||
| 1327 | None |
||
| 1328 | ***************************************************************************/ |
||
| 1329 | |||
| 1330 | void USBHostTerminateTransfer( BYTE deviceAddress, BYTE endpoint ); |
||
| 1331 | |||
| 1332 | |||
| 1333 | /**************************************************************************** |
||
| 1334 | Function: |
||
| 1335 | BOOL USBHostTransferIsComplete( BYTE deviceAddress, BYTE endpoint, |
||
| 1336 | BYTE *errorCode, DWORD *byteCount ) |
||
| 1337 | |||
| 1338 | Summary: |
||
| 1339 | This function initiates whether or not the last endpoint transaction is |
||
| 1340 | complete. |
||
| 1341 | |||
| 1342 | Description: |
||
| 1343 | This function initiates whether or not the last endpoint transaction is |
||
| 1344 | complete. If it is complete, an error code and the number of bytes |
||
| 1345 | transferred are returned. |
||
| 1346 | |||
| 1347 | For isochronous transfers, byteCount is not valid. Instead, use the |
||
| 1348 | returned byte counts for each EVENT_TRANSFER event that was generated |
||
| 1349 | during the transfer. |
||
| 1350 | |||
| 1351 | Precondition: |
||
| 1352 | None |
||
| 1353 | |||
| 1354 | Parameters: |
||
| 1355 | BYTE deviceAddress - Device address |
||
| 1356 | BYTE endpoint - Endpoint number |
||
| 1357 | BYTE *errorCode - Error code indicating the status of the transfer. |
||
| 1358 | Only valid if the transfer is complete. |
||
| 1359 | DWORD *byteCount - The number of bytes sent or received. Invalid |
||
| 1360 | for isochronous transfers. |
||
| 1361 | |||
| 1362 | Return Values: |
||
| 1363 | TRUE - Transfer is complete. |
||
| 1364 | FALSE - Transfer is not complete. |
||
| 1365 | |||
| 1366 | Remarks: |
||
| 1367 | Possible values for errorCode are: |
||
| 1368 | * USB_SUCCESS - Transfer successful |
||
| 1369 | * USB_UNKNOWN_DEVICE - Device not attached |
||
| 1370 | * USB_ENDPOINT_STALLED - Endpoint STALL'd |
||
| 1371 | * USB_ENDPOINT_ERROR_ILLEGAL_PID - Illegal PID returned |
||
| 1372 | * USB_ENDPOINT_ERROR_BIT_STUFF |
||
| 1373 | * USB_ENDPOINT_ERROR_DMA |
||
| 1374 | * USB_ENDPOINT_ERROR_TIMEOUT |
||
| 1375 | * USB_ENDPOINT_ERROR_DATA_FIELD |
||
| 1376 | * USB_ENDPOINT_ERROR_CRC16 |
||
| 1377 | * USB_ENDPOINT_ERROR_END_OF_FRAME |
||
| 1378 | * USB_ENDPOINT_ERROR_PID_CHECK |
||
| 1379 | * USB_ENDPOINT_ERROR - Other error |
||
| 1380 | ***************************************************************************/ |
||
| 1381 | |||
| 1382 | BOOL USBHostTransferIsComplete( BYTE deviceAddress, BYTE endpoint, BYTE *errorCode, DWORD *byteCount ); |
||
| 1383 | |||
| 1384 | |||
| 1385 | /**************************************************************************** |
||
| 1386 | Function: |
||
| 1387 | BYTE USBHostVbusEvent( USB_EVENT vbusEvent, BYTE hubAddress, |
||
| 1388 | BYTE portNumber) |
||
| 1389 | |||
| 1390 | Summary: |
||
| 1391 | This function handles Vbus events that are detected by the application. |
||
| 1392 | |||
| 1393 | Description: |
||
| 1394 | This function handles Vbus events that are detected by the application. |
||
| 1395 | Since Vbus management is application dependent, the application is |
||
| 1396 | responsible for monitoring Vbus and detecting overcurrent conditions |
||
| 1397 | and removal of the overcurrent condition. If the application detects |
||
| 1398 | an overcurrent condition, it should call this function with the event |
||
| 1399 | EVENT_VBUS_OVERCURRENT with the address of the hub and port number that |
||
| 1400 | has the condition. When a port returns to normal operation, the |
||
| 1401 | application should call this function with the event |
||
| 1402 | EVENT_VBUS_POWER_AVAILABLE so the stack knows that it can allow devices |
||
| 1403 | to attach to that port. |
||
| 1404 | |||
| 1405 | Precondition: |
||
| 1406 | None |
||
| 1407 | |||
| 1408 | Parameters: |
||
| 1409 | USB_EVENT vbusEvent - Vbus event that occured. Valid events: |
||
| 1410 | * EVENT_VBUS_OVERCURRENT |
||
| 1411 | * EVENT_VBUS_POWER_AVAILABLE |
||
| 1412 | BYTE hubAddress - Address of the hub device (USB_ROOT_HUB for the |
||
| 1413 | root hub) |
||
| 1414 | BYTE portNumber - Number of the physical port on the hub (0 - based) |
||
| 1415 | |||
| 1416 | Return Values: |
||
| 1417 | USB_SUCCESS - Event handled |
||
| 1418 | USB_ILLEGAL_REQUEST - Invalid event, hub, or port |
||
| 1419 | |||
| 1420 | Remarks: |
||
| 1421 | None |
||
| 1422 | ***************************************************************************/ |
||
| 1423 | |||
| 1424 | BYTE USBHostVbusEvent(USB_EVENT vbusEvent, BYTE hubAddress, BYTE portNumber); |
||
| 1425 | |||
| 1426 | |||
| 1427 | /**************************************************************************** |
||
| 1428 | Function: |
||
| 1429 | BYTE USBHostWrite( BYTE deviceAddress, BYTE endpoint, BYTE *data, |
||
| 1430 | DWORD size ) |
||
| 1431 | |||
| 1432 | Summary: |
||
| 1433 | This function initiates a write to the attached device. |
||
| 1434 | |||
| 1435 | Description: |
||
| 1436 | This function initiates a write to the attached device. The data buffer |
||
| 1437 | pointed to by *data must remain valid during the entire time that the |
||
| 1438 | write is taking place; the data is not buffered by the stack. |
||
| 1439 | |||
| 1440 | If the endpoint is isochronous, special conditions apply. The pData and |
||
| 1441 | size parameters have slightly different meanings, since multiple buffers |
||
| 1442 | are required. Once started, an isochronous transfer will continue with |
||
| 1443 | no upper layer intervention until USBHostTerminateTransfer() is called. |
||
| 1444 | The ISOCHRONOUS_DATA_BUFFERS structure should not be manipulated until |
||
| 1445 | the transfer is terminated. |
||
| 1446 | |||
| 1447 | To clarify parameter usage and to simplify casting, use the macro |
||
| 1448 | USBHostWriteIsochronous() when writing to an isochronous endpoint. |
||
| 1449 | |||
| 1450 | Precondition: |
||
| 1451 | None |
||
| 1452 | |||
| 1453 | Parameters: |
||
| 1454 | BYTE deviceAddress - Device address |
||
| 1455 | BYTE endpoint - Endpoint number |
||
| 1456 | BYTE *data - Pointer to where the data is stored. If the endpoint |
||
| 1457 | is isochronous, this points to an |
||
| 1458 | ISOCHRONOUS_DATA_BUFFERS structure, with multiple |
||
| 1459 | data buffer pointers. |
||
| 1460 | DWORD size - Number of data bytes to send. If the endpoint is |
||
| 1461 | isochronous, this is the number of data buffer |
||
| 1462 | pointers pointed to by pData. |
||
| 1463 | |||
| 1464 | Return Values: |
||
| 1465 | USB_SUCCESS - Write started successfully. |
||
| 1466 | USB_UNKNOWN_DEVICE - Device with the specified address not found. |
||
| 1467 | USB_INVALID_STATE - We are not in a normal running state. |
||
| 1468 | USB_ENDPOINT_ILLEGAL_TYPE - Must use USBHostControlWrite to write |
||
| 1469 | to a control endpoint. |
||
| 1470 | USB_ENDPOINT_ILLEGAL_DIRECTION - Must write to an OUT endpoint. |
||
| 1471 | USB_ENDPOINT_STALLED - Endpoint is stalled. Must be cleared |
||
| 1472 | by the application. |
||
| 1473 | USB_ENDPOINT_ERROR - Endpoint has too many errors. Must be |
||
| 1474 | cleared by the application. |
||
| 1475 | USB_ENDPOINT_BUSY - A Write is already in progress. |
||
| 1476 | USB_ENDPOINT_NOT_FOUND - Invalid endpoint. |
||
| 1477 | |||
| 1478 | Remarks: |
||
| 1479 | None |
||
| 1480 | ***************************************************************************/ |
||
| 1481 | |||
| 1482 | BYTE USBHostWrite( BYTE deviceAddress, BYTE endpoint, BYTE *data, DWORD size ); |
||
| 1483 | |||
| 1484 | |||
| 1485 | /**************************************************************************** |
||
| 1486 | Function: |
||
| 1487 | BYTE USBHostWriteIsochronous( BYTE deviceAddress, BYTE endpoint, |
||
| 1488 | ISOCHRONOUS_DATA *pIsochronousData ) |
||
| 1489 | |||
| 1490 | Summary: |
||
| 1491 | This function initiates a write to an isochronous endpoint on the |
||
| 1492 | attached device. |
||
| 1493 | |||
| 1494 | Description: |
||
| 1495 | This function initiates a write to an isochronous endpoint on the |
||
| 1496 | attached device. If the endpoint is not isochronous, use USBHostWrite(). |
||
| 1497 | |||
| 1498 | Once started, an isochronous transfer will continue with |
||
| 1499 | no upper layer intervention until USBHostTerminateTransfer() is called. |
||
| 1500 | |||
| 1501 | Precondition: |
||
| 1502 | None |
||
| 1503 | |||
| 1504 | Parameters: |
||
| 1505 | BYTE deviceAddress - Device address |
||
| 1506 | BYTE endpoint - Endpoint number |
||
| 1507 | ISOCHRONOUS_DATA *pIsochronousData - Pointer to an ISOCHRONOUS_DATA |
||
| 1508 | structure, containing information for the |
||
| 1509 | application and the host driver for the |
||
| 1510 | isochronous transfer. |
||
| 1511 | |||
| 1512 | Return Values: |
||
| 1513 | USB_SUCCESS - Write started successfully. |
||
| 1514 | USB_UNKNOWN_DEVICE - Device with the specified address not found. |
||
| 1515 | USB_INVALID_STATE - We are not in a normal running state. |
||
| 1516 | USB_ENDPOINT_ILLEGAL_TYPE - Must use USBHostControlWrite to write |
||
| 1517 | to a control endpoint. |
||
| 1518 | USB_ENDPOINT_ILLEGAL_DIRECTION - Must write to an OUT endpoint. |
||
| 1519 | USB_ENDPOINT_STALLED - Endpoint is stalled. Must be cleared |
||
| 1520 | by the application. |
||
| 1521 | USB_ENDPOINT_ERROR - Endpoint has too many errors. Must be |
||
| 1522 | cleared by the application. |
||
| 1523 | USB_ENDPOINT_BUSY - A Write is already in progress. |
||
| 1524 | USB_ENDPOINT_NOT_FOUND - Invalid endpoint. |
||
| 1525 | |||
| 1526 | Remarks: |
||
| 1527 | None |
||
| 1528 | ***************************************************************************/ |
||
| 1529 | |||
| 1530 | #define USBHostWriteIsochronous( a, e, p ) USBHostWrite( a, e, (BYTE *)p, (DWORD)0 ); |
||
| 1531 | |||
| 1532 | |||
| 1533 | #endif |
||
| 1534 | |||
| 1535 | // ***************************************************************************** |
||
| 1536 | // EOF |
||
| 1537 | |||
| 1538 |
Powered by WebSVN v2.8.3