| Line No. | Rev | Author | Line |
|---|---|---|---|
| 1 | 32 | kaklik | /******************************************************************************* |
| 2 | |||
| 3 | USB Device header file |
||
| 4 | |||
| 5 | Summary: |
||
| 6 | This file, with its associated C source file, provides the main substance of |
||
| 7 | the USB device side stack. These files will receive, transmit, and process |
||
| 8 | various USB commands as well as take action when required for various events |
||
| 9 | that occur on the bus. |
||
| 10 | |||
| 11 | Description: |
||
| 12 | This file, with its associated C source file, provides the main substance of |
||
| 13 | the USB device side stack. These files will receive, transmit, and process |
||
| 14 | various USB commands as well as take action when required for various events |
||
| 15 | that occur on the bus. |
||
| 16 | |||
| 17 | This file is located in the "\<Install Directory\>\\Microchip\\Include\\USB" |
||
| 18 | directory. |
||
| 19 | |||
| 20 | When including this file in a new project, this file can either be |
||
| 21 | referenced from the directory in which it was installed or copied |
||
| 22 | directly into the user application folder. If the first method is |
||
| 23 | chosen to keep the file located in the folder in which it is installed |
||
| 24 | then include paths need to be added so that the library and the |
||
| 25 | application both know where to reference each others files. If the |
||
| 26 | application folder is located in the same folder as the Microchip |
||
| 27 | folder (like the current demo folders), then the following include |
||
| 28 | paths need to be added to the application's project: |
||
| 29 | |||
| 30 | ..\\..\\Microchip\\Include |
||
| 31 | |||
| 32 | . |
||
| 33 | |||
| 34 | If a different directory structure is used, modify the paths as |
||
| 35 | required. An example using absolute paths instead of relative paths |
||
| 36 | would be the following: |
||
| 37 | |||
| 38 | C:\\Microchip Solutions\\Microchip\\Include |
||
| 39 | |||
| 40 | C:\\Microchip Solutions\\My Demo Application |
||
| 41 | |||
| 42 | ******************************************************************************/ |
||
| 43 | //DOM-IGNORE-BEGIN |
||
| 44 | /****************************************************************************** |
||
| 45 | FileName: usb_device.h |
||
| 46 | Dependencies: See INCLUDES section |
||
| 47 | Processor: PIC18 or PIC24 USB Microcontrollers |
||
| 48 | Hardware: The code is natively intended to be used on the following |
||
| 49 | hardware platforms: PICDEM FS USB Demo Board, |
||
| 50 | PIC18F87J50 FS USB Plug-In Module, or |
||
| 51 | Explorer 16 + PIC24 USB PIM. The firmware may be |
||
| 52 | modified for use on other USB platforms by editing the |
||
| 53 | HardwareProfile.h file. |
||
| 54 | Complier: Microchip C18 (for PIC18) or C30 (for PIC24) |
||
| 55 | Company: Microchip Technology, Inc. |
||
| 56 | |||
| 57 | Software License Agreement: |
||
| 58 | |||
| 59 | The software supplied herewith by Microchip Technology Incorporated |
||
| 60 | (the Company) for its PIC® Microcontroller is intended and |
||
| 61 | supplied to you, the Companys customer, for use solely and |
||
| 62 | exclusively on Microchip PIC Microcontroller products. The |
||
| 63 | software is owned by the Company and/or its supplier, and is |
||
| 64 | protected under applicable copyright laws. All rights are reserved. |
||
| 65 | Any use in violation of the foregoing restrictions may subject the |
||
| 66 | user to criminal sanctions under applicable laws, as well as to |
||
| 67 | civil liability for the breach of the terms and conditions of this |
||
| 68 | license. |
||
| 69 | |||
| 70 | THIS SOFTWARE IS PROVIDED IN AN AS IS CONDITION. NO WARRANTIES, |
||
| 71 | WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED |
||
| 72 | TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
||
| 73 | PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, |
||
| 74 | IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR |
||
| 75 | CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. |
||
| 76 | *******************************************************************/ |
||
| 77 | |||
| 78 | /******************************************************************** |
||
| 79 | Change History: |
||
| 80 | Rev Description |
||
| 81 | ---- ----------- |
||
| 82 | 2.1 Added "(" & ")" to EP definitions |
||
| 83 | updated for simplicity and to use common |
||
| 84 | coding style |
||
| 85 | |||
| 86 | 2.6 Removed many of the device specific information to the |
||
| 87 | HAL layer files. Moved many of the CH9 defintions to the |
||
| 88 | CH9 file. |
||
| 89 | |||
| 90 | 2.6a No Change |
||
| 91 | |||
| 92 | 2.7 Fixed error where USBHandleGetAddr() didn't convert the |
||
| 93 | return address from a physical address to a virtual address |
||
| 94 | for PIC32. |
||
| 95 | |||
| 96 | Added macro versions of USBDeviceAttach() and USBDeviceDetach() |
||
| 97 | so they will compile without error when using polling mode. |
||
| 98 | |||
| 99 | 2.7a No Change |
||
| 100 | |||
| 101 | ********************************************************************/ |
||
| 102 | |||
| 103 | #ifndef USBDEVICE_H |
||
| 104 | #define USBDEVICE_H |
||
| 105 | //DOM-IGNORE-END |
||
| 106 | |||
| 107 | /** DEFINITIONS ****************************************************/ |
||
| 108 | |||
| 109 | //USB_HANDLE is a pointer to an entry in the BDT. This pointer can be used |
||
| 110 | // to read the length of the last transfer, the status of the last transfer, |
||
| 111 | // and various other information. Insure to initialize USB_HANDLE objects |
||
| 112 | // to NULL so that they are in a known state during their first usage. |
||
| 113 | #define USB_HANDLE void* |
||
| 114 | |||
| 115 | #define USB_EP0_ROM 0x00 //Data comes from RAM |
||
| 116 | #define USB_EP0_RAM 0x01 //Data comes from ROM |
||
| 117 | #define USB_EP0_BUSY 0x80 //The PIPE is busy |
||
| 118 | #define USB_EP0_INCLUDE_ZERO 0x40 //include a trailing zero packet |
||
| 119 | #define USB_EP0_NO_DATA 0x00 //no data to send |
||
| 120 | #define USB_EP0_NO_OPTIONS 0x00 //no options set |
||
| 121 | |||
| 122 | /******************************************************************** |
||
| 123 | * Standard Request Codes |
||
| 124 | * USB 2.0 Spec Ref Table 9-4 |
||
| 125 | *******************************************************************/ |
||
| 126 | |||
| 127 | /* USB Device States as returned by USBGetDeviceState(). Only the defintions |
||
| 128 | for these states should be used. The actual value for each state should |
||
| 129 | not be relied upon as constant and may change based on the implementation. */ |
||
| 130 | typedef enum |
||
| 131 | { |
||
| 132 | /* Detached is the state in which the device is not attached to the bus. When |
||
| 133 | in the detached state a device should not have any pull-ups attached to either |
||
| 134 | the D+ or D- line. */ |
||
| 135 | DETACHED_STATE |
||
| 136 | /*DOM-IGNORE-BEGIN*/ = 0x00 /*DOM-IGNORE-END*/, |
||
| 137 | /* Attached is the state in which the device is attached ot the bus but the |
||
| 138 | hub/port that it is attached to is not yet configured. */ |
||
| 139 | ATTACHED_STATE |
||
| 140 | /*DOM-IGNORE-BEGIN*/ = 0x01 /*DOM-IGNORE-END*/, |
||
| 141 | /* Powered is the state in which the device is attached to the bus and the |
||
| 142 | hub/port that it is attached to is configured. */ |
||
| 143 | POWERED_STATE |
||
| 144 | /*DOM-IGNORE-BEGIN*/ = 0x02 /*DOM-IGNORE-END*/, |
||
| 145 | /* Default state is the state after the device receives a RESET command from |
||
| 146 | the host. */ |
||
| 147 | DEFAULT_STATE |
||
| 148 | /*DOM-IGNORE-BEGIN*/ = 0x04 /*DOM-IGNORE-END*/, |
||
| 149 | /* Address pending state is not an official state of the USB defined states. |
||
| 150 | This state is internally used to indicate that the device has received a |
||
| 151 | SET_ADDRESS command but has not received the STATUS stage of the transfer yet. |
||
| 152 | The device is should not switch addresses until after the STATUS stage is |
||
| 153 | complete. */ |
||
| 154 | ADR_PENDING_STATE |
||
| 155 | /*DOM-IGNORE-BEGIN*/ = 0x08 /*DOM-IGNORE-END*/, |
||
| 156 | /* Address is the state in which the device has its own specific address on the |
||
| 157 | bus. */ |
||
| 158 | ADDRESS_STATE |
||
| 159 | /*DOM-IGNORE-BEGIN*/ = 0x10 /*DOM-IGNORE-END*/, |
||
| 160 | /* Configured is the state where the device has been fully enumerated and is |
||
| 161 | operating on the bus. The device is now allowed to excute its application |
||
| 162 | specific tasks. It is also allowed to increase its current consumption to the |
||
| 163 | value specified in the configuration descriptor of the current configuration. |
||
| 164 | */ |
||
| 165 | CONFIGURED_STATE |
||
| 166 | /*DOM-IGNORE-BEGIN*/ = 0x20 /*DOM-IGNORE-END*/ |
||
| 167 | } USB_DEVICE_STATE; |
||
| 168 | |||
| 169 | |||
| 170 | /* USB device stack events description here - DWF */ |
||
| 171 | typedef enum |
||
| 172 | { |
||
| 173 | // Notification that a SET_CONFIGURATION() command was received (device) |
||
| 174 | EVENT_CONFIGURED |
||
| 175 | /*DOM-IGNORE-BEGIN*/ = EVENT_DEVICE_STACK_BASE /*DOM-IGNORE-END*/, |
||
| 176 | |||
| 177 | // A SET_DESCRIPTOR request was received (device) |
||
| 178 | EVENT_SET_DESCRIPTOR, |
||
| 179 | |||
| 180 | // An endpoint 0 request was received that the stack did not know how to |
||
| 181 | // handle. This is most often a request for one of the class drivers. |
||
| 182 | // Please refer to the class driver documenation for information related |
||
| 183 | // to what to do if this request is received. (device) |
||
| 184 | EVENT_EP0_REQUEST, |
||
| 185 | |||
| 186 | // // A USB transfer has completed. The data associated with this event is of |
||
| 187 | // // the data type HOST_TRANSFER_DATA if the event is generated from the host |
||
| 188 | // // stack. |
||
| 189 | // EVENT_TRANSFER, |
||
| 190 | // |
||
| 191 | // // A USB Start of Frame token has been received. This event is not |
||
| 192 | // // used by the Host stack. |
||
| 193 | // EVENT_SOF, |
||
| 194 | // |
||
| 195 | // // Device-mode resume received. This event is not used by the Host stack. |
||
| 196 | // EVENT_RESUME, |
||
| 197 | // |
||
| 198 | // // Device-mode suspend/idle event received. This event is not used by the |
||
| 199 | // // Host stack. |
||
| 200 | // EVENT_SUSPEND, |
||
| 201 | // |
||
| 202 | // // Device-mode bus reset received. This event is not used by the Host |
||
| 203 | // // stack. |
||
| 204 | // EVENT_RESET, |
||
| 205 | |||
| 206 | // // Device Mode: A setup packet received (data: SETUP_PKT). This event is |
||
| 207 | // // not used by the Host stack. |
||
| 208 | // EVENT_SETUP, |
||
| 209 | |||
| 210 | // Device-mode USB cable has been attached. This event is not used by the |
||
| 211 | // Host stack. The client driver may provide an application event when a |
||
| 212 | // device attaches. |
||
| 213 | EVENT_ATTACH |
||
| 214 | |||
| 215 | } USB_DEVICE_STACK_EVENTS; |
||
| 216 | |||
| 217 | /** Function Prototypes **********************************************/ |
||
| 218 | |||
| 219 | /************************************************************************** |
||
| 220 | Function: |
||
| 221 | void USBDeviceTasks(void) |
||
| 222 | |||
| 223 | Summary: |
||
| 224 | This function is the main state machine of the USB device side stack. |
||
| 225 | This function should be called periodically to receive and transmit |
||
| 226 | packets through the stack. This function should be called preferably |
||
| 227 | once every 100us during the enumeration process. After the enumeration |
||
| 228 | process this function still needs to be called periodically to respond |
||
| 229 | to various situations on the bus but is more relaxed in its time |
||
| 230 | requirements. This function should also be called at least as fast as |
||
| 231 | the OUT data expected from the PC. |
||
| 232 | |||
| 233 | Description: |
||
| 234 | This function is the main state machine of the USB device side stack. |
||
| 235 | This function should be called periodically to receive and transmit |
||
| 236 | packets through the stack. This function should be called preferably |
||
| 237 | once every 100us during the enumeration process. After the enumeration |
||
| 238 | process this function still needs to be called periodically to respond |
||
| 239 | to various situations on the bus but is more relaxed in its time |
||
| 240 | requirements. This function should also be called at least as fast as |
||
| 241 | the OUT data expected from the PC. |
||
| 242 | |||
| 243 | Typical usage: |
||
| 244 | <code> |
||
| 245 | void main(void) |
||
| 246 | { |
||
| 247 | USBDeviceInit() |
||
| 248 | while(1) |
||
| 249 | { |
||
| 250 | USBDeviceTasks(); |
||
| 251 | if((USBGetDeviceState() \< CONFIGURED_STATE) || |
||
| 252 | (USBIsDeviceSuspended() == TRUE)) |
||
| 253 | { |
||
| 254 | //Either the device is not configured or we are suspended |
||
| 255 | // so we don't want to do execute any application code |
||
| 256 | continue; //go back to the top of the while loop |
||
| 257 | } |
||
| 258 | else |
||
| 259 | { |
||
| 260 | //Otherwise we are free to run user application code. |
||
| 261 | UserApplication(); |
||
| 262 | } |
||
| 263 | } |
||
| 264 | } |
||
| 265 | </code> |
||
| 266 | |||
| 267 | Conditions: |
||
| 268 | None |
||
| 269 | Remarks: |
||
| 270 | This function should be called preferably once every 100us during the |
||
| 271 | enumeration process. After the enumeration process this function still |
||
| 272 | needs to be called periodically to respond to various situations on the |
||
| 273 | bus but is more relaxed in its time requirements. |
||
| 274 | **************************************************************************/ |
||
| 275 | void USBDeviceTasks(void); |
||
| 276 | |||
| 277 | /************************************************************************** |
||
| 278 | Function: |
||
| 279 | void USBDeviceInit(void) |
||
| 280 | |||
| 281 | Description: |
||
| 282 | This function initializes the device stack it in the default state. The |
||
| 283 | USB module will be completely reset including all of the internal |
||
| 284 | variables, registers, and interrupt flags. |
||
| 285 | |||
| 286 | Precondition: |
||
| 287 | This function must be called before any of the other USB Device |
||
| 288 | functions can be called, including USBDeviceTasks(). |
||
| 289 | |||
| 290 | Parameters: |
||
| 291 | None |
||
| 292 | |||
| 293 | Return Values: |
||
| 294 | None |
||
| 295 | |||
| 296 | Remarks: |
||
| 297 | None |
||
| 298 | |||
| 299 | **************************************************************************/ |
||
| 300 | void USBDeviceInit(void); |
||
| 301 | |||
| 302 | /******************************************************************** |
||
| 303 | Function: |
||
| 304 | BOOL USBGetRemoteWakeupStatus(void) |
||
| 305 | |||
| 306 | Summary: |
||
| 307 | This function indicates if remote wakeup has been enabled by the host. |
||
| 308 | Devices that support remote wakeup should use this function to |
||
| 309 | determine if it should send a remote wakeup. |
||
| 310 | |||
| 311 | Description: |
||
| 312 | This function indicates if remote wakeup has been enabled by the host. |
||
| 313 | Devices that support remote wakeup should use this function to |
||
| 314 | determine if it should send a remote wakeup. |
||
| 315 | |||
| 316 | If a device does not support remote wakeup (the Remote wakeup bit, bit |
||
| 317 | 5, of the bmAttributes field of the Configuration descriptor is set to |
||
| 318 | 1), then it should not send a remote wakeup command to the PC and this |
||
| 319 | function is not of any use to the device. If a device does support |
||
| 320 | remote wakeup then it should use this function as described below. |
||
| 321 | |||
| 322 | If this function returns FALSE and the device is suspended, it should |
||
| 323 | not issue a remote wakeup (resume). |
||
| 324 | |||
| 325 | If this function returns TRUE and the device is suspended, it should |
||
| 326 | issue a remote wakeup (resume). |
||
| 327 | |||
| 328 | A device can add remote wakeup support by having the _RWU symbol added |
||
| 329 | in the configuration descriptor (located in the usb_descriptors.c file |
||
| 330 | in the project). This done in the 8th byte of the configuration |
||
| 331 | descriptor. For example: |
||
| 332 | |||
| 333 | <code lang="c"> |
||
| 334 | ROM BYTE configDescriptor1[]={ |
||
| 335 | 0x09, // Size |
||
| 336 | USB_DESCRIPTOR_CONFIGURATION, // descriptor type |
||
| 337 | DESC_CONFIG_WORD(0x0022), // Total length |
||
| 338 | 1, // Number of interfaces |
||
| 339 | 1, // Index value of this cfg |
||
| 340 | 0, // Configuration string index |
||
| 341 | _DEFAULT | _SELF | _RWU, // Attributes, see usb_device.h |
||
| 342 | 50, // Max power consumption in 2X mA(100mA) |
||
| 343 | |||
| 344 | //The rest of the configuration descriptor should follow |
||
| 345 | </code> |
||
| 346 | |||
| 347 | For more information about remote wakeup, see the following section of |
||
| 348 | the USB v2.0 specification available at www.usb.org: |
||
| 349 | * Section 9.2.5.2 |
||
| 350 | * Table 9-10 |
||
| 351 | * Section 7.1.7.7 |
||
| 352 | * Section 9.4.5 |
||
| 353 | |||
| 354 | Conditions: |
||
| 355 | None |
||
| 356 | |||
| 357 | Return Values: |
||
| 358 | TRUE - Remote Wakeup has been enabled by the host |
||
| 359 | FALSE - Remote Wakeup is not currently enabled |
||
| 360 | |||
| 361 | Remarks: |
||
| 362 | None |
||
| 363 | |||
| 364 | *******************************************************************/ |
||
| 365 | BOOL USBGetRemoteWakeupStatus(void); |
||
| 366 | /*DOM-IGNORE-BEGIN*/ |
||
| 367 | #define USBGetRemoteWakeupStatus() RemoteWakeup |
||
| 368 | /*DOM-IGNORE-END*/ |
||
| 369 | |||
| 370 | /*************************************************************************** |
||
| 371 | Function: |
||
| 372 | USB_DEVICE_STATE USBGetDeviceState(void) |
||
| 373 | |||
| 374 | Summary: |
||
| 375 | This function will return the current state of the device on the USB. |
||
| 376 | This function should return CONFIGURED_STATE before an application |
||
| 377 | tries to send information on the bus. |
||
| 378 | Description: |
||
| 379 | This function returns the current state of the device on the USB. This |
||
| 380 | \function is used to determine when the device is ready to communicate |
||
| 381 | on the bus. Applications should not try to send or receive data until |
||
| 382 | this function returns CONFIGURED_STATE. |
||
| 383 | |||
| 384 | It is also important that applications yield as much time as possible |
||
| 385 | to the USBDeviceTasks() function as possible while the this function |
||
| 386 | \returns any value between ATTACHED_STATE through CONFIGURED_STATE. |
||
| 387 | |||
| 388 | For more information about the various device states, please refer to |
||
| 389 | the USB specification section 9.1 available from www.usb.org. |
||
| 390 | |||
| 391 | Typical usage: |
||
| 392 | <code> |
||
| 393 | void main(void) |
||
| 394 | { |
||
| 395 | USBDeviceInit() |
||
| 396 | while(1) |
||
| 397 | { |
||
| 398 | USBDeviceTasks(); |
||
| 399 | if((USBGetDeviceState() \< CONFIGURED_STATE) || |
||
| 400 | (USBIsDeviceSuspended() == TRUE)) |
||
| 401 | { |
||
| 402 | //Either the device is not configured or we are suspended |
||
| 403 | // so we don't want to do execute any application code |
||
| 404 | continue; //go back to the top of the while loop |
||
| 405 | } |
||
| 406 | else |
||
| 407 | { |
||
| 408 | //Otherwise we are free to run user application code. |
||
| 409 | UserApplication(); |
||
| 410 | } |
||
| 411 | } |
||
| 412 | } |
||
| 413 | </code> |
||
| 414 | Conditions: |
||
| 415 | None |
||
| 416 | Return Values: |
||
| 417 | USB_DEVICE_STATE - the current state of the device on the bus |
||
| 418 | |||
| 419 | Remarks: |
||
| 420 | None |
||
| 421 | ***************************************************************************/ |
||
| 422 | USB_DEVICE_STATE USBGetDeviceState(void); |
||
| 423 | /*DOM-IGNORE-BEGIN*/ |
||
| 424 | #define USBGetDeviceState() USBDeviceState |
||
| 425 | /*DOM-IGNORE-END*/ |
||
| 426 | |||
| 427 | /*************************************************************************** |
||
| 428 | Function: |
||
| 429 | BOOL USBGetSuspendState(void) |
||
| 430 | |||
| 431 | Summary: |
||
| 432 | This function indicates if this device is currently suspended. When a |
||
| 433 | device is suspended it will not be able to transfer data over the bus. |
||
| 434 | Description: |
||
| 435 | This function indicates if this device is currently suspended. When a |
||
| 436 | device is suspended it will not be able to transfer data over the bus. |
||
| 437 | This function can be used by the application to skip over section of |
||
| 438 | code that do not need to exectute if the device is unable to send data |
||
| 439 | over the bus. |
||
| 440 | |||
| 441 | Typical usage: |
||
| 442 | <code> |
||
| 443 | void main(void) |
||
| 444 | { |
||
| 445 | USBDeviceInit() |
||
| 446 | while(1) |
||
| 447 | { |
||
| 448 | USBDeviceTasks(); |
||
| 449 | if((USBGetDeviceState() \< CONFIGURED_STATE) || |
||
| 450 | (USBIsDeviceSuspended() == TRUE)) |
||
| 451 | { |
||
| 452 | //Either the device is not configured or we are suspended |
||
| 453 | // so we don't want to do execute any application code |
||
| 454 | continue; //go back to the top of the while loop |
||
| 455 | } |
||
| 456 | else |
||
| 457 | { |
||
| 458 | //Otherwise we are free to run user application code. |
||
| 459 | UserApplication(); |
||
| 460 | } |
||
| 461 | } |
||
| 462 | } |
||
| 463 | </code> |
||
| 464 | Conditions: |
||
| 465 | None |
||
| 466 | Return Values: |
||
| 467 | TRUE - this device is suspended. |
||
| 468 | FALSE - this device is not suspended. |
||
| 469 | Remarks: |
||
| 470 | None |
||
| 471 | ***************************************************************************/ |
||
| 472 | BOOL USBGetSuspendState(void); |
||
| 473 | |||
| 474 | /******************************************************************************* |
||
| 475 | Function: |
||
| 476 | void USBEnableEndpoint(BYTE ep, BYTE options) |
||
| 477 | |||
| 478 | Summary: |
||
| 479 | This function will enable the specified endpoint with the specified |
||
| 480 | options |
||
| 481 | Description: |
||
| 482 | This function will enable the specified endpoint with the specified |
||
| 483 | options. |
||
| 484 | |||
| 485 | Typical Usage: |
||
| 486 | <code> |
||
| 487 | void USBCBInitEP(void) |
||
| 488 | { |
||
| 489 | USBEnableEndpoint(MSD_DATA_IN_EP,USB_IN_ENABLED|USB_OUT_ENABLED|USB_HANDSHAKE_ENABLED|USB_DISALLOW_SETUP); |
||
| 490 | USBMSDInit(); |
||
| 491 | } |
||
| 492 | </code> |
||
| 493 | |||
| 494 | In the above example endpoint number MSD_DATA_IN_EP is being configured |
||
| 495 | for both IN and OUT traffic with handshaking enabled. Also since |
||
| 496 | MSD_DATA_IN_EP is not endpoint 0 (MSD does not allow this), then we can |
||
| 497 | explicitly disable SETUP packets on this endpoint. |
||
| 498 | Conditions: |
||
| 499 | None |
||
| 500 | Input: |
||
| 501 | BYTE ep - the endpoint to be configured |
||
| 502 | BYTE options - optional settings for the endpoint. The options should |
||
| 503 | be ORed together to form a single options string. The |
||
| 504 | available optional settings for the endpoint. The |
||
| 505 | options should be ORed together to form a single options |
||
| 506 | string. The available options are the following\: |
||
| 507 | * USB_HANDSHAKE_ENABLED enables USB handshaking (ACK, |
||
| 508 | NAK) |
||
| 509 | * USB_HANDSHAKE_DISABLED disables USB handshaking (ACK, |
||
| 510 | NAK) |
||
| 511 | * USB_OUT_ENABLED enables the out direction |
||
| 512 | * USB_OUT_DISABLED disables the out direction |
||
| 513 | * USB_IN_ENABLED enables the in direction |
||
| 514 | * USB_IN_DISABLED disables the in direction |
||
| 515 | * USB_ALLOW_SETUP enables control transfers |
||
| 516 | * USB_DISALLOW_SETUP disables control transfers |
||
| 517 | * USB_STALL_ENDPOINT STALLs this endpoint |
||
| 518 | Return: |
||
| 519 | None |
||
| 520 | Remarks: |
||
| 521 | None |
||
| 522 | *****************************************************************************/ |
||
| 523 | void USBEnableEndpoint(BYTE ep, BYTE options); |
||
| 524 | |||
| 525 | /******************************************************************************* |
||
| 526 | Function: |
||
| 527 | BOOL USBIsDeviceSuspended(void) |
||
| 528 | |||
| 529 | Summary: |
||
| 530 | This function indicates if the USB module is in suspend mode. |
||
| 531 | |||
| 532 | Description: |
||
| 533 | This function indicates if the USB module is in suspend mode. This function |
||
| 534 | does NOT indicate that a suspend request has been received. It only |
||
| 535 | reflects the state of the USB module. |
||
| 536 | |||
| 537 | Typical Usage: |
||
| 538 | <code> |
||
| 539 | if(USBIsDeviceSuspended() == TRUE) |
||
| 540 | { |
||
| 541 | return; |
||
| 542 | } |
||
| 543 | // otherwise do some application specific tasks |
||
| 544 | </code> |
||
| 545 | |||
| 546 | Conditions: |
||
| 547 | None |
||
| 548 | Input: |
||
| 549 | None |
||
| 550 | Return: |
||
| 551 | None |
||
| 552 | Remarks: |
||
| 553 | None |
||
| 554 | *****************************************************************************/ |
||
| 555 | BOOL USBIsDeviceSuspended(void); |
||
| 556 | /*DOM-IGNORE-BEGIN*/ |
||
| 557 | #define USBIsDeviceSuspended() USBSuspendControl |
||
| 558 | /*DOM-IGNORE-END*/ |
||
| 559 | |||
| 560 | /******************************************************************************* |
||
| 561 | Function: |
||
| 562 | void USBSoftDetach(void); |
||
| 563 | |||
| 564 | Summary: |
||
| 565 | This function performs a detach from the USB bus via software. |
||
| 566 | |||
| 567 | Description: |
||
| 568 | This function performs a detach from the USB bus via software. |
||
| 569 | |||
| 570 | Conditions: |
||
| 571 | None |
||
| 572 | Input: |
||
| 573 | None |
||
| 574 | Return: |
||
| 575 | None |
||
| 576 | Remarks: |
||
| 577 | Caution should be used when detaching from the bus. Some PC drivers and |
||
| 578 | programs may require additional time after a detach before a device can be |
||
| 579 | reattached to the bus. |
||
| 580 | *****************************************************************************/ |
||
| 581 | void USBSoftDetach(void); |
||
| 582 | /*DOM-IGNORE-BEGIN*/ |
||
| 583 | #define USBSoftDetach() U1CON = 0; U1IE = 0; USBDeviceState = DETACHED_STATE; |
||
| 584 | /*DOM-IGNORE-END*/ |
||
| 585 | |||
| 586 | /************************************************************************* |
||
| 587 | Function: |
||
| 588 | USB_HANDLE USBTransferOnePacket(BYTE ep, BYTE dir, BYTE* data, BYTE len) |
||
| 589 | |||
| 590 | Summary: |
||
| 591 | Transfers a single packet (one transaction) of data on the USB bus. |
||
| 592 | |||
| 593 | Description: |
||
| 594 | The USBTransferOnePacket() function prepares a USB endpoint |
||
| 595 | so that it may send data to the host (an IN transaction), or |
||
| 596 | receive data from the host (an OUT transaction). The |
||
| 597 | USBTransferOnePacket() function can be used both to receive and |
||
| 598 | send data to the host. This function is the primary API function |
||
| 599 | provided by the USB stack firmware for sending or receiving application |
||
| 600 | data over the USB port. |
||
| 601 | |||
| 602 | The USBTransferOnePacket() is intended for use with all application |
||
| 603 | endpoints. It is not used for sending or receiving applicaiton data |
||
| 604 | through endpoint 0 by using control transfers. Separate API |
||
| 605 | functions, such as USBEP0Receive(), USBEP0SendRAMPtr(), and |
||
| 606 | USBEP0SendROMPtr() are provided for this purpose. |
||
| 607 | |||
| 608 | The USBTransferOnePacket() writes to the Buffer Descriptor Table (BDT) |
||
| 609 | entry associated with an endpoint buffer, and sets the UOWN bit, which |
||
| 610 | prepares the USB hardware to allow the transaction to complete. The |
||
| 611 | application firmware can use the USBHandleBusy() macro to check the |
||
| 612 | status of the transaction, to see if the data has been successfully |
||
| 613 | transmitted yet. |
||
| 614 | |||
| 615 | |||
| 616 | Typical Usage |
||
| 617 | <code> |
||
| 618 | //make sure that the we are in the configured state |
||
| 619 | if(USBGetDeviceState() == CONFIGURED_STATE) |
||
| 620 | { |
||
| 621 | //make sure that the last transaction isn't busy by checking the handle |
||
| 622 | if(!USBHandleBusy(USBInHandle)) |
||
| 623 | { |
||
| 624 | //Write the new data that we wish to send to the host to the INPacket[] array |
||
| 625 | INPacket[0] = USEFUL_APPLICATION_VALUE1; |
||
| 626 | INPacket[1] = USEFUL_APPLICATION_VALUE2; |
||
| 627 | //INPacket[2] = ... (fill in the rest of the packet data) |
||
| 628 | |||
| 629 | //Send the data contained in the INPacket[] array through endpoint "EP_NUM" |
||
| 630 | USBInHandle = USBTransferOnePacket(EP_NUM,IN_TO_HOST,(BYTE*)&INPacket[0],sizeof(INPacket)); |
||
| 631 | } |
||
| 632 | } |
||
| 633 | </code> |
||
| 634 | |||
| 635 | Conditions: |
||
| 636 | Before calling USBTransferOnePacket(), the following should be true. |
||
| 637 | 1. The USB stack has already been initialized (USBDeviceInit() was called). |
||
| 638 | 2. A transaction is not already pending on the specified endpoint. This |
||
| 639 | is done by checking the previous request using the USBHandleBusy() |
||
| 640 | macro (see the typical usage example). |
||
| 641 | 3. The host has already sent a set configuration request and the |
||
| 642 | enumeration process is complete. |
||
| 643 | This can be checked by verifying that the USBGetDeviceState() |
||
| 644 | macro returns "CONFIGURED_STATE", prior to calling |
||
| 645 | USBTransferOnePacket(). |
||
| 646 | |||
| 647 | Input: |
||
| 648 | BYTE ep - The endpoint number that the data will be transmitted or |
||
| 649 | received on |
||
| 650 | BYTE dir - The direction of the transfer |
||
| 651 | This value is either OUT_FROM_HOST or IN_TO_HOST |
||
| 652 | BYTE* data - For IN transactions: pointer to the RAM buffer containing |
||
| 653 | the data to be sent to the host. For OUT transactions: pointer |
||
| 654 | to the RAM buffer that the received data should get written to. |
||
| 655 | BYTE len - Length of the data needing to be sent (for IN transactions). |
||
| 656 | For OUT transactions, the len parameter should normally be set |
||
| 657 | to the endpoint size specified in the endpoint descriptor. |
||
| 658 | |||
| 659 | Return Values: |
||
| 660 | USB_HANDLE - handle to the transfer. The handle is a pointer to |
||
| 661 | the BDT entry associated with this transaction. The |
||
| 662 | status of the transaction (ex: if it is complete or still |
||
| 663 | pending) can be checked using the USBHandleBusy() macro |
||
| 664 | and supplying the USB_HANDLE provided by |
||
| 665 | USBTransferOnePacket(). |
||
| 666 | |||
| 667 | Remarks: |
||
| 668 | If calling the USBTransferOnePacket() function from within the USBCBInitEP() |
||
| 669 | callback function, the set configuration is still being processed and the |
||
| 670 | USBDeviceState may not be == CONFIGURED_STATE yet. In this special case, |
||
| 671 | the USBTransferOnePacket() may still be called, but make sure that the |
||
| 672 | endpoint has been enabled and initialized by the USBEnableEndpoint() |
||
| 673 | function first. |
||
| 674 | |||
| 675 | *************************************************************************/ |
||
| 676 | USB_HANDLE USBTransferOnePacket(BYTE ep,BYTE dir,BYTE* data,BYTE len); |
||
| 677 | |||
| 678 | /************************************************************************* |
||
| 679 | Function: |
||
| 680 | BOOL USBHandleBusy(USB_HANDLE handle) |
||
| 681 | |||
| 682 | Summary: |
||
| 683 | Checks to see if the input handle is busy |
||
| 684 | |||
| 685 | Description: |
||
| 686 | Checks to see if the input handle is busy |
||
| 687 | |||
| 688 | Typical Usage |
||
| 689 | <code> |
||
| 690 | //make sure that the last transfer isn't busy by checking the handle |
||
| 691 | if(!USBHandleBusy(USBGenericInHandle)) |
||
| 692 | { |
||
| 693 | //Send the data contained in the INPacket[] array out on |
||
| 694 | // endpoint USBGEN_EP_NUM |
||
| 695 | USBGenericInHandle = USBGenWrite(USBGEN_EP_NUM,(BYTE*)&INPacket[0],sizeof(INPacket)); |
||
| 696 | } |
||
| 697 | </code> |
||
| 698 | |||
| 699 | Conditions: |
||
| 700 | None |
||
| 701 | Input: |
||
| 702 | USB_HANDLE handle - handle of the transfer that you want to check the |
||
| 703 | status of |
||
| 704 | Return Values: |
||
| 705 | TRUE - The specified handle is busy |
||
| 706 | FALSE - The specified handle is free and available for a transfer |
||
| 707 | Remarks: |
||
| 708 | None |
||
| 709 | *************************************************************************/ |
||
| 710 | BOOL USBHandleBusy(USB_HANDLE handle); |
||
| 711 | /*DOM-IGNORE-BEGIN*/ |
||
| 712 | #define USBHandleBusy(handle) (handle==0?0:((volatile BDT_ENTRY*)handle)->STAT.UOWN) |
||
| 713 | /*DOM-IGNORE-END*/ |
||
| 714 | |||
| 715 | /******************************************************************** |
||
| 716 | Function: |
||
| 717 | WORD USBHandleGetLength(USB_HANDLE handle) |
||
| 718 | |||
| 719 | Summary: |
||
| 720 | Retrieves the length of the destination buffer of the input |
||
| 721 | handle |
||
| 722 | |||
| 723 | Description: |
||
| 724 | Retrieves the length of the destination buffer of the input |
||
| 725 | handle |
||
| 726 | |||
| 727 | PreCondition: |
||
| 728 | None |
||
| 729 | |||
| 730 | Parameters: |
||
| 731 | USB_HANDLE handle - the handle to the transfer you want the |
||
| 732 | address for. |
||
| 733 | |||
| 734 | Return Values: |
||
| 735 | WORD - length of the current buffer that the input handle |
||
| 736 | points to. If the transfer is complete then this is the |
||
| 737 | length of the data transmitted or the length of data |
||
| 738 | actually received. |
||
| 739 | |||
| 740 | Remarks: |
||
| 741 | None |
||
| 742 | |||
| 743 | *******************************************************************/ |
||
| 744 | WORD USBHandleGetLength(USB_HANDLE handle); |
||
| 745 | /*DOM-IGNORE-BEGIN*/ |
||
| 746 | #define USBHandleGetLength(handle) (((volatile BDT_ENTRY*)handle)->CNT) |
||
| 747 | /*DOM-IGNORE-END*/ |
||
| 748 | |||
| 749 | /******************************************************************** |
||
| 750 | Function: |
||
| 751 | WORD USBHandleGetAddr(USB_HANDLE) |
||
| 752 | |||
| 753 | Summary: |
||
| 754 | Retrieves the address of the destination buffer of the input |
||
| 755 | handle |
||
| 756 | |||
| 757 | Description: |
||
| 758 | Retrieves the address of the destination buffer of the input |
||
| 759 | handle |
||
| 760 | |||
| 761 | PreCondition: |
||
| 762 | None |
||
| 763 | |||
| 764 | Parameters: |
||
| 765 | USB_HANDLE handle - the handle to the transfer you want the |
||
| 766 | address for. |
||
| 767 | |||
| 768 | Return Values: |
||
| 769 | WORD - address of the current buffer that the input handle |
||
| 770 | points to. |
||
| 771 | |||
| 772 | Remarks: |
||
| 773 | None |
||
| 774 | |||
| 775 | *******************************************************************/ |
||
| 776 | WORD USBHandleGetAddr(USB_HANDLE); |
||
| 777 | /*DOM-IGNORE-BEGIN*/ |
||
| 778 | #define USBHandleGetAddr(handle) ConvertToVirtualAddress((((volatile BDT_ENTRY*)handle)->ADR)) |
||
| 779 | /*DOM-IGNORE-END*/ |
||
| 780 | |||
| 781 | /******************************************************************** |
||
| 782 | Function: |
||
| 783 | void USBEP0Transmit(BYTE options) |
||
| 784 | |||
| 785 | Summary: |
||
| 786 | Sets the address of the data to send over the |
||
| 787 | control endpoint |
||
| 788 | |||
| 789 | PreCondition: |
||
| 790 | None |
||
| 791 | |||
| 792 | Paramters: |
||
| 793 | options - the various options that you want |
||
| 794 | when sending the control data. Options are: |
||
| 795 | USB_EP0_ROM |
||
| 796 | USB_EP0_RAM |
||
| 797 | USB_EP0_BUSY |
||
| 798 | USB_EP0_INCLUDE_ZERO |
||
| 799 | USB_EP0_NO_DATA |
||
| 800 | USB_EP0_NO_OPTIONS |
||
| 801 | |||
| 802 | Return Values: |
||
| 803 | None |
||
| 804 | |||
| 805 | Remarks: |
||
| 806 | None |
||
| 807 | |||
| 808 | *******************************************************************/ |
||
| 809 | void USBEP0Transmit(BYTE options); |
||
| 810 | /*DOM-IGNORE-BEGIN*/ |
||
| 811 | #define USBEP0Transmit(options) inPipes[0].info.Val = options | USB_EP0_BUSY |
||
| 812 | /*DOM-IGNORE-END*/ |
||
| 813 | |||
| 814 | /************************************************************************* |
||
| 815 | Function: |
||
| 816 | void USBEP0SendRAMPtr(BYTE* src, WORD size, BYTE Options) |
||
| 817 | |||
| 818 | Summary: |
||
| 819 | Sets the source, size, and options of the data you wish to send from a |
||
| 820 | RAM source |
||
| 821 | Conditions: |
||
| 822 | None |
||
| 823 | Input: |
||
| 824 | src - address of the data to send |
||
| 825 | size - the size of the data needing to be transmitted |
||
| 826 | options - the various options that you want when sending the control |
||
| 827 | data. Options are\: |
||
| 828 | * USB_EP0_ROM |
||
| 829 | * USB_EP0_RAM |
||
| 830 | * USB_EP0_BUSY |
||
| 831 | * USB_EP0_INCLUDE_ZERO |
||
| 832 | * USB_EP0_NO_DATA |
||
| 833 | * USB_EP0_NO_OPTIONS |
||
| 834 | Remarks: |
||
| 835 | None |
||
| 836 | *************************************************************************/ |
||
| 837 | void USBEP0SendRAMPtr(BYTE* src, WORD size, BYTE Options); |
||
| 838 | /*DOM-IGNORE-BEGIN*/ |
||
| 839 | #define USBEP0SendRAMPtr(src,size,options) {\ |
||
| 840 | inPipes[0].pSrc.bRam = src;\ |
||
| 841 | inPipes[0].wCount.Val = size;\ |
||
| 842 | inPipes[0].info.Val = options | USB_EP0_BUSY | USB_EP0_RAM;\ |
||
| 843 | } |
||
| 844 | /*DOM-IGNORE-END*/ |
||
| 845 | |||
| 846 | /************************************************************************** |
||
| 847 | Function: |
||
| 848 | void USBEP0SendROMPtr(BYTE* src, WORD size, BYTE Options) |
||
| 849 | |||
| 850 | Summary: |
||
| 851 | Sets the source, size, and options of the data you wish to send from a |
||
| 852 | ROM source |
||
| 853 | Conditions: |
||
| 854 | None |
||
| 855 | Input: |
||
| 856 | src - address of the data to send |
||
| 857 | size - the size of the data needing to be transmitted |
||
| 858 | options - the various options that you want when sending the control |
||
| 859 | data. Options are\: |
||
| 860 | * USB_EP0_ROM |
||
| 861 | * USB_EP0_RAM |
||
| 862 | * USB_EP0_BUSY |
||
| 863 | * USB_EP0_INCLUDE_ZERO |
||
| 864 | * USB_EP0_NO_DATA |
||
| 865 | * USB_EP0_NO_OPTIONS |
||
| 866 | Remarks: |
||
| 867 | None |
||
| 868 | **************************************************************************/ |
||
| 869 | void USBEP0SendROMPtr(BYTE* src, WORD size, BYTE Options); |
||
| 870 | /*DOM-IGNORE-BEGIN*/ |
||
| 871 | #define USBEP0SendROMPtr(src,size,options) {\ |
||
| 872 | inPipes[0].pSrc.bRom = src;\ |
||
| 873 | inPipes[0].wCount.Val = size;\ |
||
| 874 | inPipes[0].info.Val = options | USB_EP0_BUSY | USB_EP0_ROM;\ |
||
| 875 | } |
||
| 876 | /*DOM-IGNORE-END*/ |
||
| 877 | |||
| 878 | /*************************************************************************** |
||
| 879 | Function: |
||
| 880 | void USBEP0Receive(BYTE* dest, WORD size, void (*function)) |
||
| 881 | Summary: |
||
| 882 | Sets the destination, size, and a function to call on the completion of |
||
| 883 | the next control write. |
||
| 884 | Conditions: |
||
| 885 | None |
||
| 886 | Input: |
||
| 887 | dest - address of where the incoming data will go (make sure that this |
||
| 888 | address is directly accessable by the USB module for parts with |
||
| 889 | dedicated USB RAM this address must be in that space) |
||
| 890 | size - the size of the data being received (is almost always going tobe |
||
| 891 | presented by the preceeding setup packet SetupPkt.wLength) |
||
| 892 | (*function) - a function that you want called once the data is received. If |
||
| 893 | this is specificed as NULL then no function is called. |
||
| 894 | Remarks: |
||
| 895 | None |
||
| 896 | ***************************************************************************/ |
||
| 897 | void USBEP0Receive(BYTE* dest, WORD size, void (*function)); |
||
| 898 | /*DOM-IGNORE-BEGIN*/ |
||
| 899 | #define USBEP0Receive(dest,size,function) {outPipes[0].pDst.bRam = dest;outPipes[0].wCount.Val = size;outPipes[0].pFunc = function;outPipes[0].info.bits.busy = 1; } |
||
| 900 | /*DOM-IGNORE-END*/ |
||
| 901 | |||
| 902 | /******************************************************************** |
||
| 903 | Function: |
||
| 904 | USB_HANDLE USBTxOnePacket(BYTE ep, BYTE* data, WORD len) |
||
| 905 | |||
| 906 | Summary: |
||
| 907 | Sends the specified data out the specified endpoint |
||
| 908 | |||
| 909 | PreCondition: |
||
| 910 | None |
||
| 911 | |||
| 912 | Parameters: |
||
| 913 | ep - the endpoint you want to send the data out of |
||
| 914 | data - the data that you wish to send |
||
| 915 | len - the length of the data that you wish to send |
||
| 916 | |||
| 917 | Return Values: |
||
| 918 | USB_HANDLE - a handle for the transfer. This information |
||
| 919 | should be kept to track the status of the transfer |
||
| 920 | |||
| 921 | Remarks: |
||
| 922 | None |
||
| 923 | |||
| 924 | *******************************************************************/ |
||
| 925 | USB_HANDLE USBTxOnePacket(BYTE ep, BYTE* data, WORD len); |
||
| 926 | /*DOM-IGNORE-BEGIN*/ |
||
| 927 | #define USBTxOnePacket(ep,data,len) USBTransferOnePacket(ep,IN_TO_HOST,data,len) |
||
| 928 | /*DOM-IGNORE-END*/ |
||
| 929 | |||
| 930 | /******************************************************************** |
||
| 931 | Function: |
||
| 932 | USB_HANDLE USBRxOnePacket(BYTE ep, BYTE* data, WORD len) |
||
| 933 | |||
| 934 | Summary: |
||
| 935 | Receives the specified data out the specified endpoint |
||
| 936 | |||
| 937 | PreCondition: |
||
| 938 | None |
||
| 939 | |||
| 940 | Parameters: |
||
| 941 | ep - the endpoint you want to receive the data into |
||
| 942 | data - where the data will go when it arrives |
||
| 943 | len - the length of the data that you wish to receive |
||
| 944 | |||
| 945 | Return Values: |
||
| 946 | None |
||
| 947 | |||
| 948 | Remarks: |
||
| 949 | None |
||
| 950 | |||
| 951 | *******************************************************************/ |
||
| 952 | USB_HANDLE USBRxOnePacket(BYTE ep, BYTE* data, WORD len); |
||
| 953 | /*DOM-IGNORE-BEGIN*/ |
||
| 954 | #define USBRxOnePacket(ep,data,len) USBTransferOnePacket(ep,OUT_FROM_HOST,data,len) |
||
| 955 | /*DOM-IGNORE-END*/ |
||
| 956 | |||
| 957 | /******************************************************************** |
||
| 958 | Function: |
||
| 959 | void USBStallEndpoint(BYTE ep, BYTE dir) |
||
| 960 | |||
| 961 | Summary: |
||
| 962 | STALLs the specified endpoint |
||
| 963 | |||
| 964 | PreCondition: |
||
| 965 | None |
||
| 966 | |||
| 967 | Parameters: |
||
| 968 | BYTE ep - the endpoint the data will be transmitted on |
||
| 969 | BYTE dir - the direction of the transfer |
||
| 970 | |||
| 971 | Return Values: |
||
| 972 | None |
||
| 973 | |||
| 974 | Remarks: |
||
| 975 | None |
||
| 976 | |||
| 977 | *******************************************************************/ |
||
| 978 | void USBStallEndpoint(BYTE ep, BYTE dir); |
||
| 979 | |||
| 980 | /************************************************************************** |
||
| 981 | Function: |
||
| 982 | void USBDeviceDetach(void) |
||
| 983 | |||
| 984 | Summary: |
||
| 985 | This function indicates to the USB module that the USB device has been |
||
| 986 | detached from the bus. |
||
| 987 | |||
| 988 | Description: |
||
| 989 | This function indicates to the USB module that the USB device has been |
||
| 990 | detached from the bus. This function needs to be called in order for the |
||
| 991 | device to start to properly prepare for the next attachment. |
||
| 992 | |||
| 993 | Precondition: |
||
| 994 | Should only be called when USB_INTERRUPT is defined. |
||
| 995 | |||
| 996 | Parameters: |
||
| 997 | None |
||
| 998 | |||
| 999 | Return Values: |
||
| 1000 | None |
||
| 1001 | |||
| 1002 | Remarks: |
||
| 1003 | None |
||
| 1004 | |||
| 1005 | **************************************************************************/ |
||
| 1006 | void USBDeviceDetach(void); |
||
| 1007 | |||
| 1008 | /*DOM-IGNORE-BEGIN*/ |
||
| 1009 | #if !defined(USB_INTERRUPT) |
||
| 1010 | #define USBDeviceDetach() |
||
| 1011 | #endif |
||
| 1012 | /*DOM-IGNORE-END*/ |
||
| 1013 | |||
| 1014 | /************************************************************************** |
||
| 1015 | Function: |
||
| 1016 | void USBDeviceAttach(void) |
||
| 1017 | |||
| 1018 | Summary: |
||
| 1019 | This function indicates to the USB module that the USB device has been |
||
| 1020 | attached to the bus. |
||
| 1021 | |||
| 1022 | Description: |
||
| 1023 | This function indicates to the USB module that the USB device has been |
||
| 1024 | attached to the bus. This function needs to be called in order for the |
||
| 1025 | device to start to enumerate on the bus. |
||
| 1026 | |||
| 1027 | Precondition: |
||
| 1028 | Should only be called when USB_INTERRUPT is defined. |
||
| 1029 | |||
| 1030 | For normal USB devices: |
||
| 1031 | Make sure that if the module was previously on, that it has been turned off |
||
| 1032 | for a long time (ex: 100ms+) before calling this function to re-enable the module. |
||
| 1033 | If the device turns off the D+ (for full speed) or D- (for low speed) ~1.5k ohm |
||
| 1034 | pull up resistor, and then turns it back on very quickly, common hosts will sometimes |
||
| 1035 | reject this event, since no human could ever unplug and reattach a USB device in a |
||
| 1036 | microseconds (or nanoseconds) timescale. The host could simply treat this as some kind |
||
| 1037 | of glitch and ignore the event altogether. |
||
| 1038 | Parameters: |
||
| 1039 | None |
||
| 1040 | |||
| 1041 | Return Values: |
||
| 1042 | None |
||
| 1043 | ****************************************************************************/ |
||
| 1044 | void USBDeviceAttach(void); |
||
| 1045 | |||
| 1046 | /*DOM-IGNORE-BEGIN*/ |
||
| 1047 | #if !defined(USB_INTERRUPT) |
||
| 1048 | #define USBDeviceAttach() |
||
| 1049 | #endif |
||
| 1050 | /*DOM-IGNORE-END*/ |
||
| 1051 | |||
| 1052 | /******************************************************************************* |
||
| 1053 | Function: |
||
| 1054 | BOOL USB_APPLICATION_EVENT_HANDLER(BYTE address, USB_EVENT event, void *pdata, WORD size); |
||
| 1055 | |||
| 1056 | Summary: |
||
| 1057 | This function is called whenever the USB stack wants to notify the user of |
||
| 1058 | an event. |
||
| 1059 | |||
| 1060 | Description: |
||
| 1061 | This function is called whenever the USB stack wants to notify the user of |
||
| 1062 | an event. This function should be implemented by the user. |
||
| 1063 | |||
| 1064 | Example Usage: |
||
| 1065 | Conditions: |
||
| 1066 | None |
||
| 1067 | |||
| 1068 | Input: |
||
| 1069 | BYTE address - the address of the device when the event happened |
||
| 1070 | BYTE event - The event input specifies which event happened. The |
||
| 1071 | possible options are listed in the USB_DEVICE_STACK_EVENTS |
||
| 1072 | enumeration. |
||
| 1073 | |||
| 1074 | Return: |
||
| 1075 | None |
||
| 1076 | Remarks: |
||
| 1077 | None |
||
| 1078 | *****************************************************************************/ |
||
| 1079 | BOOL USB_APPLICATION_EVENT_HANDLER(BYTE address, USB_EVENT event, void *pdata, WORD size); |
||
| 1080 | |||
| 1081 | /******************************************************************************* |
||
| 1082 | Function: |
||
| 1083 | ROM void *USBDeviceCBGetDescriptor (UINT16 *length, DESCRIPTOR_ID *id); |
||
| 1084 | |||
| 1085 | Summary: |
||
| 1086 | This function is called whenever the USB stack gets a USB GET_DESCRIPTOR |
||
| 1087 | request. |
||
| 1088 | |||
| 1089 | Description: |
||
| 1090 | This function is called whenever the USB stack gets a USB GET_DESCRIPTOR |
||
| 1091 | request. This function is responsible for returning a pointer to the |
||
| 1092 | requested descriptor and setting that the length for the that descriptor. |
||
| 1093 | |||
| 1094 | This function should be implemented by the user. This function might be |
||
| 1095 | generated automatically by the USB configuration tool. |
||
| 1096 | |||
| 1097 | Conditions: |
||
| 1098 | None |
||
| 1099 | |||
| 1100 | Input: |
||
| 1101 | BYTE *length - pointer to a variable that should be set to the length of |
||
| 1102 | the requested descriptor. |
||
| 1103 | BYTE *id - This structure contains information about the requested |
||
| 1104 | descriptor |
||
| 1105 | |||
| 1106 | Return: |
||
| 1107 | ROM void* - pointer to the requested descriptor. |
||
| 1108 | Remarks: |
||
| 1109 | None |
||
| 1110 | *****************************************************************************/ |
||
| 1111 | ROM void *USBDeviceCBGetDescriptor (UINT16 *length, DESCRIPTOR_ID *id); |
||
| 1112 | |||
| 1113 | /************************************************************************** |
||
| 1114 | Function: |
||
| 1115 | void USBCancelIO(BYTE endpoint) |
||
| 1116 | |||
| 1117 | Description: |
||
| 1118 | This function cancels the transfers pending on the specified endpoint. |
||
| 1119 | This function can only be used after a SETUP packet is received and |
||
| 1120 | before that setup packet is handled. This is the time period in which |
||
| 1121 | the EVENT_EP0_REQUEST is thrown, before the event handler function |
||
| 1122 | returns to the stack. |
||
| 1123 | |||
| 1124 | Precondition: |
||
| 1125 | |||
| 1126 | Parameters: |
||
| 1127 | BYTE endpoint - the endpoint number you wish to cancel the transfers for |
||
| 1128 | |||
| 1129 | Return Values: |
||
| 1130 | None |
||
| 1131 | |||
| 1132 | Remarks: |
||
| 1133 | None |
||
| 1134 | |||
| 1135 | **************************************************************************/ |
||
| 1136 | void USBCancelIO(BYTE endpoint); |
||
| 1137 | |||
| 1138 | |||
| 1139 | /** Section: MACROS ******************************************************/ |
||
| 1140 | |||
| 1141 | /* The DESC_CONFIG_WORD() macro is implemented for convinence. Since the |
||
| 1142 | configuration descriptor array is a BYTE array, each entry needs to be a |
||
| 1143 | BYTE in LSB format. The DESC_CONFIG_WORD() macro breaks up a WORD into |
||
| 1144 | the appropriate BYTE entries in LSB. |
||
| 1145 | Typical Usage: |
||
| 1146 | <code> |
||
| 1147 | ROM BYTE configDescriptor1[]={ |
||
| 1148 | 0x09, // Size of this descriptor in bytes |
||
| 1149 | USB_DESCRIPTOR_CONFIGURATION, // CONFIGURATION descriptor type |
||
| 1150 | DESC_CONFIG_WORD(0x0022), // Total length of data for this cfg |
||
| 1151 | </code> |
||
| 1152 | */ |
||
| 1153 | #define DESC_CONFIG_WORD(a) (a&0xFF),((a>>8)&0xFF) |
||
| 1154 | |||
| 1155 | /* The DESC_CONFIG_DWORD() macro is implemented for convinence. Since the |
||
| 1156 | configuration descriptor array is a BYTE array, each entry needs to be a |
||
| 1157 | BYTE in LSB format. The DESC_CONFIG_DWORD() macro breaks up a DWORD into |
||
| 1158 | the appropriate BYTE entries in LSB. |
||
| 1159 | */ |
||
| 1160 | #define DESC_CONFIG_DWORD(a) (a&0xFF),((a>>8)&0xFF),((a>>16)&0xFF),((a>>24)&0xFF) |
||
| 1161 | |||
| 1162 | /* The DESC_CONFIG_BYTE() macro is implemented for convinence. The |
||
| 1163 | DESC_CONFIG_BYTE() macro provides a consistant macro for use with a byte |
||
| 1164 | when generating a configuratin descriptor when using either the |
||
| 1165 | DESC_CONFIG_WORD() or DESC_CONFIG_DWORD() macros. |
||
| 1166 | */ |
||
| 1167 | #define DESC_CONFIG_BYTE(a) (a) |
||
| 1168 | |||
| 1169 | |||
| 1170 | |||
| 1171 | |||
| 1172 | |||
| 1173 | |||
| 1174 | |||
| 1175 | |||
| 1176 | |||
| 1177 | |||
| 1178 | |||
| 1179 | |||
| 1180 | |||
| 1181 | |||
| 1182 | |||
| 1183 | |||
| 1184 | |||
| 1185 | /* DOM-IGNORE-BEGIN */ |
||
| 1186 | /******************************************************************************* |
||
| 1187 | ******************************************************************************** |
||
| 1188 | ******************************************************************************** |
||
| 1189 | This section contains implementation specific information that may vary |
||
| 1190 | between releases as the implementation needs to change. This section is |
||
| 1191 | included for compilation reasons only. |
||
| 1192 | ******************************************************************************** |
||
| 1193 | ******************************************************************************** |
||
| 1194 | *******************************************************************************/ |
||
| 1195 | |||
| 1196 | #if defined(USB_POLLING) |
||
| 1197 | #define USB_VOLATILE |
||
| 1198 | #else |
||
| 1199 | #define USB_VOLATILE volatile |
||
| 1200 | #endif |
||
| 1201 | |||
| 1202 | #define CTRL_TRF_RETURN void |
||
| 1203 | #define CTRL_TRF_PARAMS void |
||
| 1204 | |||
| 1205 | // Defintion of the PIPE structure |
||
| 1206 | // This structure is used to keep track of data that is sent out |
||
| 1207 | // of the stack automatically. |
||
| 1208 | typedef struct __attribute__ ((packed)) |
||
| 1209 | { |
||
| 1210 | union __attribute__ ((packed)) |
||
| 1211 | { |
||
| 1212 | //Various options of pointers that are available to |
||
| 1213 | // get the data from |
||
| 1214 | BYTE *bRam; |
||
| 1215 | ROM BYTE *bRom; |
||
| 1216 | WORD *wRam; |
||
| 1217 | ROM WORD *wRom; |
||
| 1218 | }pSrc; |
||
| 1219 | union __attribute__ ((packed)) |
||
| 1220 | { |
||
| 1221 | struct __attribute__ ((packed)) |
||
| 1222 | { |
||
| 1223 | //is this transfer from RAM or ROM? |
||
| 1224 | BYTE ctrl_trf_mem :1; |
||
| 1225 | BYTE reserved :5; |
||
| 1226 | //include a zero length packet after |
||
| 1227 | //data is done if data_size%ep_size = 0? |
||
| 1228 | BYTE includeZero :1; |
||
| 1229 | //is this PIPE currently in use |
||
| 1230 | BYTE busy :1; |
||
| 1231 | }bits; |
||
| 1232 | BYTE Val; |
||
| 1233 | }info; |
||
| 1234 | WORD_VAL wCount; |
||
| 1235 | }IN_PIPE; |
||
| 1236 | |||
| 1237 | extern USB_VOLATILE IN_PIPE inPipes[]; |
||
| 1238 | |||
| 1239 | typedef struct __attribute__ ((packed)) |
||
| 1240 | { |
||
| 1241 | union __attribute__ ((packed)) |
||
| 1242 | { |
||
| 1243 | //Various options of pointers that are available to |
||
| 1244 | // get the data from |
||
| 1245 | BYTE *bRam; |
||
| 1246 | WORD *wRam; |
||
| 1247 | }pDst; |
||
| 1248 | union __attribute__ ((packed)) |
||
| 1249 | { |
||
| 1250 | struct __attribute__ ((packed)) |
||
| 1251 | { |
||
| 1252 | BYTE reserved :7; |
||
| 1253 | //is this PIPE currently in use |
||
| 1254 | BYTE busy :1; |
||
| 1255 | }bits; |
||
| 1256 | BYTE Val; |
||
| 1257 | }info; |
||
| 1258 | WORD_VAL wCount; |
||
| 1259 | CTRL_TRF_RETURN (*pFunc)(CTRL_TRF_PARAMS); |
||
| 1260 | }OUT_PIPE; |
||
| 1261 | |||
| 1262 | /************* DWF - SHOULD BE REIMPLEMENTED AS AN EVENT *******************/ |
||
| 1263 | //#if defined(ENABLE_EP0_DATA_RECEIVED_CALLBACK) |
||
| 1264 | // void USBCBEP0DataReceived(void); |
||
| 1265 | // #define USBCB_EP0_DATA_RECEIVED() USBCBEP0DataReceived() |
||
| 1266 | //#else |
||
| 1267 | // #define USBCB_EP0_DATA_RECEIVED() |
||
| 1268 | //#endif |
||
| 1269 | |||
| 1270 | extern USB_VOLATILE BOOL RemoteWakeup; |
||
| 1271 | extern USB_VOLATILE USB_DEVICE_STATE USBDeviceState; |
||
| 1272 | extern USB_VOLATILE BYTE USBActiveConfiguration; |
||
| 1273 | /******************************************************************************/ |
||
| 1274 | /* DOM-IGNORE-END */ |
||
| 1275 | |||
| 1276 | #endif //USBD_H |
Powered by WebSVN v2.8.3