1 /* 2 * Copyright (c) 2006-2018, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2012-10-01 Yi Qiu first version 9 * 2013-04-26 aozima add DEVICEQUALIFIER support. 10 * 2017-11-15 ZYH fix ep0 transform error 11 */ 12 13 #ifndef __USB_COMMON_H__ 14 #define __USB_COMMON_H__ 15 16 #ifdef __cplusplus 17 extern "C" { 18 #endif 19 20 #include <rtthread.h> 21 22 #define RT_DEBUG_USB 0x00 23 #define USB_DYNAMIC 0x00 24 25 #define USB_CLASS_DEVICE 0x00 26 #define USB_CLASS_AUDIO 0x01 27 #define USB_CLASS_CDC 0x02 28 #define USB_CLASS_HID 0x03 29 #define USB_CLASS_PHYSICAL 0x05 30 #define USB_CLASS_IMAGE 0x06 31 #define USB_CLASS_PRINTER 0x07 32 #define USB_CLASS_MASS_STORAGE 0x08 33 #define USB_CLASS_HUB 0x09 34 #define USB_CLASS_CDC_DATA 0x0a 35 #define USB_CLASS_SMART_CARD 0x0b 36 #define USB_CLASS_SECURITY 0x0d 37 #define USB_CLASS_VIDEO 0x0e 38 #define USB_CLASS_HEALTHCARE 0x0f 39 #define USB_CLASS_DIAG_DEVICE 0xdc 40 #define USB_CLASS_WIRELESS 0xe0 41 #define USB_CLASS_MISC 0xef 42 #define USB_CLASS_APP_SPECIFIC 0xfe 43 #define USB_CLASS_VEND_SPECIFIC 0xff 44 45 #define USB_DESC_TYPE_DEVICE 0x01 46 #define USB_DESC_TYPE_CONFIGURATION 0x02 47 #define USB_DESC_TYPE_STRING 0x03 48 #define USB_DESC_TYPE_INTERFACE 0x04 49 #define USB_DESC_TYPE_ENDPOINT 0x05 50 #define USB_DESC_TYPE_DEVICEQUALIFIER 0x06 51 #define USB_DESC_TYPE_OTHERSPEED 0x07 52 #define USB_DESC_TYPE_IAD 0x0b 53 #define USB_DESC_TYPE_HID 0x21 54 #define USB_DESC_TYPE_REPORT 0x22 55 #define USB_DESC_TYPE_PHYSICAL 0x23 56 #define USB_DESC_TYPE_HUB 0x29 57 58 #define USB_DESC_LENGTH_DEVICE 0x12 59 #define USB_DESC_LENGTH_CONFIG 0x9 60 #define USB_DESC_LENGTH_IAD 0x8 61 #define USB_DESC_LENGTH_STRING 0x4 62 #define USB_DESC_LENGTH_INTERFACE 0x9 63 #define USB_DESC_LENGTH_ENDPOINT 0x7 64 65 #define USB_REQ_TYPE_STANDARD 0x00 66 #define USB_REQ_TYPE_CLASS 0x20 67 #define USB_REQ_TYPE_VENDOR 0x40 68 #define USB_REQ_TYPE_MASK 0x60 69 70 #define USB_REQ_TYPE_DIR_OUT 0x00 71 #define USB_REQ_TYPE_DIR_IN 0x80 72 73 #define USB_REQ_TYPE_DEVICE 0x00 74 #define USB_REQ_TYPE_INTERFACE 0x01 75 #define USB_REQ_TYPE_ENDPOINT 0x02 76 #define USB_REQ_TYPE_OTHER 0x03 77 #define USB_REQ_TYPE_RECIPIENT_MASK 0x1f 78 79 #define USB_FEATURE_ENDPOINT_HALT 0x00 80 #define USB_FEATURE_DEV_REMOTE_WAKEUP 0x01 81 #define USB_FEATURE_TEST_MODE 0x02 82 83 #define USB_REQ_GET_STATUS 0x00 84 #define USB_REQ_CLEAR_FEATURE 0x01 85 #define USB_REQ_SET_FEATURE 0x03 86 #define USB_REQ_SET_ADDRESS 0x05 87 #define USB_REQ_GET_DESCRIPTOR 0x06 88 #define USB_REQ_SET_DESCRIPTOR 0x07 89 #define USB_REQ_GET_CONFIGURATION 0x08 90 #define USB_REQ_SET_CONFIGURATION 0x09 91 #define USB_REQ_GET_INTERFACE 0x0A 92 #define USB_REQ_SET_INTERFACE 0x0B 93 #define USB_REQ_SYNCH_FRAME 0x0C 94 #define USB_REQ_SET_ENCRYPTION 0x0D 95 #define USB_REQ_GET_ENCRYPTION 0x0E 96 #define USB_REQ_RPIPE_ABORT 0x0E 97 #define USB_REQ_SET_HANDSHAKE 0x0F 98 #define USB_REQ_RPIPE_RESET 0x0F 99 #define USB_REQ_GET_HANDSHAKE 0x10 100 #define USB_REQ_SET_CONNECTION 0x11 101 #define USB_REQ_SET_SECURITY_DATA 0x12 102 #define USB_REQ_GET_SECURITY_DATA 0x13 103 #define USB_REQ_SET_WUSB_DATA 0x14 104 #define USB_REQ_LOOPBACK_DATA_WRITE 0x15 105 #define USB_REQ_LOOPBACK_DATA_READ 0x16 106 #define USB_REQ_SET_INTERFACE_DS 0x17 107 108 #define USB_STRING_LANGID_INDEX 0x00 109 #define USB_STRING_MANU_INDEX 0x01 110 #define USB_STRING_PRODUCT_INDEX 0x02 111 #define USB_STRING_SERIAL_INDEX 0x03 112 #define USB_STRING_CONFIG_INDEX 0x04 113 #define USB_STRING_INTERFACE_INDEX 0x05 114 #define USB_STRING_OS_INDEX 0x06 115 #define USB_STRING_MAX USB_STRING_OS_INDEX 116 117 #define USB_STRING_OS "MSFT100A" 118 119 #define USB_PID_OUT 0x01 120 #define USB_PID_ACK 0x02 121 #define USB_PID_DATA0 0x03 122 #define USB_PID_SOF 0x05 123 #define USB_PID_IN 0x09 124 #define USB_PID_NACK 0x0A 125 #define USB_PID_DATA1 0x0B 126 #define USB_PID_PRE 0x0C 127 #define USB_PID_SETUP 0x0D 128 #define USB_PID_STALL 0x0E 129 130 #define USB_EP_DESC_OUT 0x00 131 #define USB_EP_DESC_IN 0x80 132 #define USB_EP_DESC_NUM_MASK 0x0f 133 134 #define USB_EP_ATTR_CONTROL 0x00 135 #define USB_EP_ATTR_ISOC 0x01 136 #define USB_EP_ATTR_BULK 0x02 137 #define USB_EP_ATTR_INT 0x03 138 #define USB_EP_ATTR_TYPE_MASK 0x03 139 140 #define USB_EPNO_MASK 0x7f 141 #define USB_DIR_OUT 0x00 142 #define USB_DIR_IN 0x80 143 #define USB_DIR_INOUT 0x40 144 #define USB_DIR_MASK 0x80 145 146 #define ID_UNASSIGNED 0 147 #define ID_ASSIGNED 1 148 149 #define RH_GET_PORT_STATUS 0 150 #define RH_SET_PORT_STATUS 1 151 #define RH_CLEAR_PORT_FEATURE 2 152 #define RH_SET_PORT_FEATURE 3 153 154 #define USB_BUS_POWERED 0 155 #define USB_SELF_POWERED 1 156 #define USB_REMOTE_WAKEUP 1 157 #define USB_EP_HALT 0 158 159 /* 160 * Port feature numbers 161 */ 162 #define PORT_FEAT_CONNECTION 0 163 #define PORT_FEAT_ENABLE 1 164 #define PORT_FEAT_SUSPEND 2 165 #define PORT_FEAT_OVER_CURRENT 3 166 #define PORT_FEAT_RESET 4 167 #define PORT_FEAT_POWER 8 168 #define PORT_FEAT_LOWSPEED 9 169 #define PORT_FEAT_HIGHSPEED 10 170 #define PORT_FEAT_C_CONNECTION 16 171 #define PORT_FEAT_C_ENABLE 17 172 #define PORT_FEAT_C_SUSPEND 18 173 #define PORT_FEAT_C_OVER_CURRENT 19 174 #define PORT_FEAT_C_RESET 20 175 176 /* 177 The HcRhPortStatus[1:NDP] register is used to control and report port events on a per-port 178 basis. NumberDownstreamPorts represents the number of HcRhPortStatus registers that are 179 implemented in hardware. The lower word is used to reflect the port status, whereas the upper 180 word reflects the status change bits. Some status bits are implemented with special write behavior 181 (see below). If a transaction (token through handshake) is in progress when a write to change 182 port status occurs, the resulting port status change must be postponed until the transaction 183 completes. Reserved bits should always be written '0'. 184 */ 185 #define PORT_CCS 0x00000001UL /* R:CurrentConnectStatus - W:ClearPortEnable */ 186 #define PORT_PES 0x00000002UL /* R:PortEnableStatus - W:SetPortEnable */ 187 #define PORT_PSS 0x00000004UL /* R:PortSuspendStatus - W:SetPortSuspend */ 188 #define PORT_POCI 0x00000008UL /* R:PortOverCurrentIndicator - W:ClearSuspendStatus */ 189 #define PORT_PRS 0x00000010UL /* R:PortResetStatus - W: SetPortReset */ 190 #define PORT_PPS 0x00000100UL /* R:PortPowerStatus - W: SetPortPower */ 191 #define PORT_LSDA 0x00000200UL /* R:LowSpeedDeviceAttached - W:ClearPortPower */ 192 #define PORT_CCSC 0x00010000UL 193 #define PORT_PESC 0x00020000UL 194 #define PORT_PSSC 0x00040000UL 195 #define PORT_POCIC 0x00080000UL 196 #define PORT_PRSC 0x00100000UL 197 198 /* 199 *Hub Status & Hub Change bit masks 200 */ 201 #define HUB_STATUS_LOCAL_POWER 0x0001 202 #define HUB_STATUS_OVERCURRENT 0x0002 203 204 #define HUB_CHANGE_LOCAL_POWER 0x0001 205 #define HUB_CHANGE_OVERCURRENT 0x0002 206 207 #define USB_EP_ATTR(attr) (attr & USB_EP_ATTR_TYPE_MASK) 208 #define USB_EP_DESC_NUM(addr) (addr & USB_EP_DESC_NUM_MASK) 209 #define USB_EP_DIR(addr) ((addr & USB_DIR_MASK)>>7) 210 211 #define HID_REPORT_ID_KEYBOARD1 1 212 #define HID_REPORT_ID_KEYBOARD2 2 213 #define HID_REPORT_ID_KEYBOARD3 3 214 #define HID_REPORT_ID_KEYBOARD4 7 215 #define HID_REPORT_ID_MEDIA 4 216 #define HID_REPORT_ID_GENERAL 5 217 #define HID_REPORT_ID_MOUSE 6 218 219 /* 220 * Time of usb timeout 221 */ 222 #ifndef USB_TIMEOUT_BASIC 223 #define USB_TIMEOUT_BASIC (RT_TICK_PER_SECOND) /* 1s */ 224 #endif 225 #ifndef USB_TIMEOUT_LONG 226 #define USB_TIMEOUT_LONG (RT_TICK_PER_SECOND * 5) /* 5s */ 227 #endif 228 #ifndef USB_DEBOUNCE_TIME 229 #define USB_DEBOUNCE_TIME (RT_TICK_PER_SECOND / 5) /* 0.2s */ 230 #endif 231 232 #define uswap_32(x) \ 233 ((((x) & 0xff000000) >> 24) | \ 234 (((x) & 0x00ff0000) >> 8) | \ 235 (((x) & 0x0000ff00) << 8) | \ 236 (((x) & 0x000000ff) << 24)) 237 238 #define uswap_8(x) \ 239 (((rt_uint16_t)(*((rt_uint8_t *)(x)))) + \ 240 (((rt_uint16_t)(*(((rt_uint8_t *)(x)) + 1))) << 8)) 241 242 typedef void (*func_callback)(void *context); 243 typedef enum 244 { 245 USB_STATE_NOTATTACHED = 0, 246 USB_STATE_ATTACHED, 247 USB_STATE_POWERED, 248 USB_STATE_RECONNECTING, 249 USB_STATE_UNAUTHENTICATED, 250 USB_STATE_DEFAULT, 251 USB_STATE_ADDRESS, 252 USB_STATE_CONFIGURED, 253 USB_STATE_SUSPENDED 254 }udevice_state_t; 255 256 typedef enum 257 { 258 STAGE_IDLE, 259 STAGE_SETUP, 260 STAGE_STATUS_IN, 261 STAGE_STATUS_OUT, 262 STAGE_DIN, 263 STAGE_DOUT 264 } uep0_stage_t; 265 266 #pragma pack(1) 267 268 struct usb_descriptor 269 { 270 rt_uint8_t bLength; 271 rt_uint8_t type; 272 }; 273 typedef struct usb_descriptor* udesc_t; 274 275 struct udevice_descriptor 276 { 277 rt_uint8_t bLength; 278 rt_uint8_t type; 279 rt_uint16_t bcdUSB; 280 rt_uint8_t bDeviceClass; 281 rt_uint8_t bDeviceSubClass; 282 rt_uint8_t bDeviceProtocol; 283 rt_uint8_t bMaxPacketSize0; 284 rt_uint16_t idVendor; 285 rt_uint16_t idProduct; 286 rt_uint16_t bcdDevice; 287 rt_uint8_t iManufacturer; 288 rt_uint8_t iProduct; 289 rt_uint8_t iSerialNumber; 290 rt_uint8_t bNumConfigurations; 291 }; 292 typedef struct udevice_descriptor* udev_desc_t; 293 294 struct uconfig_descriptor 295 { 296 rt_uint8_t bLength; 297 rt_uint8_t type; 298 rt_uint16_t wTotalLength; 299 rt_uint8_t bNumInterfaces; 300 rt_uint8_t bConfigurationValue; 301 rt_uint8_t iConfiguration; 302 rt_uint8_t bmAttributes; 303 rt_uint8_t MaxPower; 304 rt_uint8_t data[256]; 305 }; 306 typedef struct uconfig_descriptor* ucfg_desc_t; 307 308 struct uinterface_descriptor 309 { 310 rt_uint8_t bLength; 311 rt_uint8_t type; 312 rt_uint8_t bInterfaceNumber; 313 rt_uint8_t bAlternateSetting; 314 rt_uint8_t bNumEndpoints; 315 rt_uint8_t bInterfaceClass; 316 rt_uint8_t bInterfaceSubClass; 317 rt_uint8_t bInterfaceProtocol; 318 rt_uint8_t iInterface; 319 }; 320 typedef struct uinterface_descriptor* uintf_desc_t; 321 322 /* Interface Association Descriptor (IAD) */ 323 struct uiad_descriptor 324 { 325 rt_uint8_t bLength; 326 rt_uint8_t bDescriptorType; 327 rt_uint8_t bFirstInterface; 328 rt_uint8_t bInterfaceCount; 329 rt_uint8_t bFunctionClass; 330 rt_uint8_t bFunctionSubClass; 331 rt_uint8_t bFunctionProtocol; 332 rt_uint8_t iFunction; 333 }; 334 typedef struct uiad_descriptor* uiad_desc_t; 335 336 struct uendpoint_descriptor 337 { 338 rt_uint8_t bLength; 339 rt_uint8_t type; 340 rt_uint8_t bEndpointAddress; 341 rt_uint8_t bmAttributes; 342 rt_uint16_t wMaxPacketSize; 343 rt_uint8_t bInterval; 344 }; 345 typedef struct uendpoint_descriptor* uep_desc_t; 346 347 struct ustring_descriptor 348 { 349 rt_uint8_t bLength; 350 rt_uint8_t type; 351 rt_uint8_t String[64]; 352 }; 353 typedef struct ustring_descriptor* ustr_desc_t; 354 355 struct uhub_descriptor 356 { 357 rt_uint8_t length; 358 rt_uint8_t type; 359 rt_uint8_t num_ports; 360 rt_uint16_t characteristics; 361 rt_uint8_t pwron_to_good; /* power on to power good */ 362 rt_uint8_t current; 363 rt_uint8_t removable[8]; 364 rt_uint8_t pwr_ctl[8]; 365 }; 366 typedef struct uhub_descriptor* uhub_desc_t; 367 368 /* USB_DESC_TYPE_DEVICEQUALIFIER: Device Qualifier descriptor */ 369 struct usb_qualifier_descriptor 370 { 371 rt_uint8_t bLength; 372 rt_uint8_t bDescriptorType; 373 374 rt_uint16_t bcdUSB; // TODO: big-endian. 375 rt_uint8_t bDeviceClass; 376 rt_uint8_t bDeviceSubClass; 377 rt_uint8_t bDeviceProtocol; 378 rt_uint8_t bMaxPacketSize0; 379 rt_uint8_t bNumConfigurations; 380 rt_uint8_t bRESERVED; 381 } __attribute__ ((packed)); 382 383 struct usb_os_header_comp_id_descriptor 384 { 385 rt_uint32_t dwLength; 386 rt_uint16_t bcdVersion; 387 rt_uint16_t wIndex; 388 rt_uint8_t bCount; 389 rt_uint8_t reserved[7]; 390 }; 391 typedef struct usb_os_header_comp_id_descriptor * usb_os_header_desc_t; 392 393 struct usb_os_function_comp_id_descriptor 394 { 395 rt_list_t list; 396 rt_uint8_t bFirstInterfaceNumber; 397 rt_uint8_t reserved1; 398 rt_uint8_t compatibleID[8]; 399 rt_uint8_t subCompatibleID[8]; 400 rt_uint8_t reserved2[6]; 401 }; 402 typedef struct usb_os_function_comp_id_descriptor * usb_os_func_comp_id_desc_t; 403 404 struct usb_os_comp_id_descriptor 405 { 406 struct usb_os_header_comp_id_descriptor head_desc; 407 rt_list_t func_desc; 408 }; 409 typedef struct usb_os_comp_id_descriptor * usb_os_comp_id_desc_t; 410 411 struct usb_os_property_header 412 { 413 rt_uint32_t dwLength; 414 rt_uint16_t bcdVersion; 415 rt_uint16_t wIndex; 416 rt_uint16_t wCount; 417 }; 418 typedef struct usb_os_property_header * usb_os_property_header_t; 419 struct usb_os_proerty 420 { 421 rt_uint32_t dwSize; 422 rt_uint32_t dwPropertyDataType; 423 rt_uint16_t wPropertyNameLength; 424 const char * bPropertyName; 425 rt_uint32_t dwPropertyDataLength; 426 const char * bPropertyData; 427 }; 428 typedef struct usb_os_proerty * usb_os_proerty_t; 429 430 // Value Description 431 // 1 A NULL-terminated Unicode String (REG_SZ) 432 // 2 A NULL-terminated Unicode String that includes environment variables (REG_EXPAND_SZ) 433 // 3 Free-form binary (REG_BINARY) 434 // 4 A little-endian 32-bit integer (REG_DWORD_LITTLE_ENDIAN) 435 // 5 A big-endian 32-bit integer (REG_DWORD_BIG_ENDIAN) 436 // 6 A NULL-terminated Unicode string that contains a symbolic link (REG_LINK) 437 // 7 Multiple NULL-terminated Unicode strings (REG_MULTI_SZ) 438 #define USB_OS_PROERTY_TYPE_REG_SZ 0x01UL 439 #define USB_OS_PROERTY_TYPE_REG_EXPAND_SZ 0x02UL 440 #define USB_OS_PROERTY_TYPE_REG_BINARY 0x03UL 441 #define USB_OS_PROERTY_TYPE_REG_DWORD_LITTLE_ENDIAN 0x04UL 442 #define USB_OS_PROERTY_TYPE_REG_DWORD_BIG_ENDIAN 0x05UL 443 #define USB_OS_PROERTY_TYPE_REG_LINK 0x06UL 444 #define USB_OS_PROERTY_TYPE_REG_MULTI_SZ 0x07UL 445 446 #define USB_OS_PROERTY_DESC(PropertyDataType,PropertyName,PropertyData) \ 447 {\ 448 .dwSize = sizeof(struct usb_os_proerty)-sizeof(const char *)*2\ 449 +sizeof(PropertyName)*2+sizeof(PropertyData)*2,\ 450 .dwPropertyDataType = PropertyDataType,\ 451 .wPropertyNameLength = sizeof(PropertyName)*2,\ 452 .bPropertyName = PropertyName,\ 453 .dwPropertyDataLength = sizeof(PropertyData)*2,\ 454 .bPropertyData = PropertyData\ 455 } 456 457 458 #ifndef HID_SUB_DESCRIPTOR_MAX 459 #define HID_SUB_DESCRIPTOR_MAX 1 460 #endif 461 462 struct uhid_descriptor 463 { 464 rt_uint8_t bLength; 465 rt_uint8_t type; 466 rt_uint16_t bcdHID; 467 rt_uint8_t bCountryCode; 468 rt_uint8_t bNumDescriptors; 469 struct hid_descriptor_list 470 { 471 rt_uint8_t type; 472 rt_uint16_t wLength; 473 }Descriptor[HID_SUB_DESCRIPTOR_MAX]; 474 }; 475 typedef struct uhid_descriptor* uhid_desc_t; 476 477 struct hid_report 478 { 479 rt_uint8_t report_id; 480 rt_uint8_t report[63]; 481 rt_uint8_t size; 482 }; 483 typedef struct hid_report* hid_report_t; 484 extern void HID_Report_Received(hid_report_t report); 485 486 struct urequest 487 { 488 rt_uint8_t request_type; 489 rt_uint8_t bRequest; 490 rt_uint16_t wValue; 491 rt_uint16_t wIndex; 492 rt_uint16_t wLength; 493 }; 494 typedef struct urequest* ureq_t; 495 496 #ifndef MIN 497 #define MIN(a, b) (a < b ? a : b) 498 #endif 499 #ifndef MAX 500 #define MAX(a, b) (a > b ? a : b) 501 #endif 502 503 /* 504 * the define related to mass storage 505 */ 506 #define USBREQ_GET_MAX_LUN 0xfe 507 #define USBREQ_MASS_STORAGE_RESET 0xff 508 509 #define SIZEOF_CSW 0x0d 510 #define SIZEOF_CBW 0x1f 511 #define SIZEOF_INQUIRY_CMD 0x24 512 #define SIZEOF_MODE_SENSE_6 0x4 513 #define SIZEOF_READ_CAPACITIES 0xc 514 #define SIZEOF_READ_CAPACITY 0x8 515 #define SIZEOF_REQUEST_SENSE 0x12 516 517 #define CBWFLAGS_DIR_M 0x80 518 #define CBWFLAGS_DIR_IN 0x80 519 #define CBWFLAGS_DIR_OUT 0x00 520 521 #define SCSI_TEST_UNIT_READY 0x00 522 #define SCSI_REQUEST_SENSE 0x03 523 #define SCSI_INQUIRY_CMD 0x12 524 #define SCSI_ALLOW_REMOVAL 0x1e 525 #define SCSI_MODE_SENSE_6 0x1a 526 #define SCSI_START_STOP 0x1b 527 #define SCSI_READ_CAPACITIES 0x23 528 #define SCSI_READ_CAPACITY 0x25 529 #define SCSI_READ_10 0x28 530 #define SCSI_WRITE_10 0x2a 531 #define SCSI_VERIFY_10 0x2f 532 533 #define CBW_SIGNATURE 0x43425355 534 #define CSW_SIGNATURE 0x53425355 535 #define CBW_TAG_VALUE 0x12345678 536 537 struct ustorage_cbw 538 { 539 rt_uint32_t signature; 540 rt_uint32_t tag; 541 rt_uint32_t xfer_len; 542 rt_uint8_t dflags; 543 rt_uint8_t lun; 544 rt_uint8_t cb_len; 545 rt_uint8_t cb[16]; 546 }; 547 typedef struct ustorage_cbw* ustorage_cbw_t; 548 549 struct ustorage_csw 550 { 551 rt_uint32_t signature; 552 rt_uint32_t tag; 553 rt_int32_t data_reside; 554 rt_uint8_t status; 555 }; 556 typedef struct ustorage_csw* ustorage_csw_t; 557 558 #pragma pack() 559 560 /* 561 * USB device event loop thread configurations 562 */ 563 /* the stack size of USB thread */ 564 #ifndef RT_USBD_THREAD_STACK_SZ 565 #define RT_USBD_THREAD_STACK_SZ 512 566 #endif 567 568 /* the priority of USB thread */ 569 #ifndef RT_USBD_THREAD_PRIO 570 #define RT_USBD_THREAD_PRIO 8 571 #endif 572 573 574 #ifdef __cplusplus 575 } 576 #endif 577 578 #endif 579