- Main Page
- Modules
- Data Structures
- Files
- Related Pages

# USB endpoint drivers
[USB low level drivers]

These macros manage the common features of the endpoints. More...

## Defines
#define | Usb_select_endpoint(ep) (UENUM = (U8)ep )
| selects the endpoint number to interface with the CPU
#define | Usb_get_selected_endpoint() (UENUM )
| get the currently selected endpoint number
#define | Usb_reset_endpoint(ep) (UERST = 1 << (U8)ep, UERST = 0)
| resets the selected endpoint
#define | Usb_enable_endpoint() (UECONX |= (1<<EPEN))
| enables the current endpoint
#define | Usb_enable_stall_handshake() (UECONX |= (1<<STALLRQ))
| enables the STALL handshake for the next transaction
#define | Usb_reset_data_toggle() (UECONX |= (1<<RSTDT))
| resets the data toggle sequence
#define | Usb_disable_endpoint() (UECONX &= ~(1<<EPEN))
| disables the current endpoint
#define | Usb_disable_stall_handshake() (UECONX |= (1<<STALLRQC))
| disables the STALL handshake
#define | Usb_select_epnum_for_cpu() (UECONX &= ~(1<<EPNUMS))
| selects endpoint interface on CPU
#define | Is_usb_endpoint_enabled() ((UECONX & (1<<EPEN)) ? TRUE : FALSE)
| tests if the current endpoint is enabled
#define | Is_usb_endpoint_stall_requested() ((UECONX & (1<<STALLRQ)) ? TRUE : FALSE)
| tests if STALL handshake request is running
#define | Usb_configure_endpoint_type(type) (UECFG0X = (UECFG0X & ~(MSK_EPTYPE)) | ((U8)type << 6))
| configures the current endpoint
#define | Usb_configure_endpoint_direction(dir) (UECFG0X = (UECFG0X & ~(1<<EPDIR)) | ((U8)dir))
| configures the current endpoint direction
#define | Usb_configure_endpoint_size(size) (UECFG1X = (UECFG1X & ~MSK_EPSIZE) | ((U8)size << 4))
| configures the current endpoint size
#define | Usb_configure_endpoint_bank(bank) (UECFG1X = (UECFG1X & ~MSK_EPBK) | ((U8)bank << 2))
| configures the current endpoint number of banks
#define | Usb_allocate_memory() (UECFG1X |= (1<<ALLOC))
| allocates the current configuration in DPRAM memory
#define | Usb_unallocate_memory() (UECFG1X &= ~(1<<ALLOC))
| un-allocates the current configuration in DPRAM memory
#define | Usb_ack_overflow_interrupt() (UESTA0X &= ~(1<<OVERFI))
| acks endpoint overflow interrupt
#define | Usb_ack_underflow_interrupt() (UESTA0X &= ~(1<<UNDERFI))
| acks endpoint underflow memory
#define | Usb_ack_zlp() (UESTA0X &= ~(1<<ZLPSEEN))
| acks Zero Length Packet received
#define | Usb_data_toggle() ((UESTA0X&MSK_DTSEQ) >> 2)
| returns data toggle
#define | Usb_nb_busy_bank() (UESTA0X & MSK_NBUSYBK)
| returns the number of busy banks
#define | Is_usb_one_bank_busy() ((UESTA0X & MSK_NBUSYBK) == 0 ? FALSE : TRUE)
| tests if at least one bank is busy
#define | Is_endpoint_configured() ((UESTA0X & (1<<CFGOK)) ? TRUE : FALSE)
| tests if current endpoint is configured
#define | Is_usb_overflow() ((UESTA0X & (1<<OVERFI)) ? TRUE : FALSE)
| tests if an overflows occurs
#define | Is_usb_underflow() ((UESTA0X & (1<<UNDERFI)) ? TRUE : FALSE)
| tests if an underflow occurs
#define | Is_usb_zlp() ((UESTA0X & (1<<ZLPSEEN)) ? TRUE : FALSE)
| tests if a ZLP has been detected
#define | Usb_control_direction() ((UESTA1X & (1<<CTRLDIR)) >> 2)
| returns the control direction
#define | Usb_current_bank() ( UESTA1X & MSK_CURRBK)
| returns the number of the current bank
#define | Usb_ack_fifocon() (UEINTX &= ~(1<<FIFOCON))
| clears FIFOCON bit
#define | Usb_ack_nak_in() (UEINTX &= ~(1<<NAKINI))
| acks NAK IN received
#define | Usb_ack_nak_out() (UEINTX &= ~(1<<NAKOUTI))
| acks NAK OUT received
#define | Usb_ack_receive_setup() (UEINTX &= ~(1<<RXSTPI))
| acks receive SETUP
#define | Usb_ack_receive_out() (UEINTX &= ~(1<<RXOUTI), Usb_ack_fifocon())
| acks reveive OUT
#define | Usb_ack_stalled() (MSK_STALLEDI= 0)
| acks STALL sent
#define | Usb_ack_in_ready() (UEINTX &= ~(1<<TXINI), Usb_ack_fifocon())
| acks IN ready
#define | Usb_kill_last_in_bank() (UENTTX |= (1<<RXOUTI))
| Kills last bank.
#define | Is_usb_read_enabled() (UEINTX&(1<<RWAL))
| tests if endpoint read allowed
#define | Is_usb_write_enabled() (UEINTX&(1<<RWAL))
| tests if endpoint write allowed
#define | Is_usb_read_control_enabled() (UEINTX&(1<<TXINI))
| tests if read allowed on control endpoint
#define | Is_usb_nak_in_sent() (UEINTX&(1<<NAKINI))
| tests if a NAK has been sent on IN endpoint
#define | Is_usb_nak_out_sent() (UEINTX&(1<<NAKOUTI))
| tests if a NAK has been sent on OUT endpoint
#define | Is_usb_receive_setup() (UEINTX&(1<<RXSTPI))
| tests if SETUP received
#define | Is_usb_receive_out() (UEINTX&(1<<RXOUTI))
| tests if OUT received
#define | Is_usb_in_ready() (UEINTX&(1<<TXINI))
| tests if IN ready
#define | Usb_send_in() (UEINTX &= ~(1<<FIFOCON))
| sends IN
#define | Usb_send_control_in() (UEINTX &= ~(1<<TXINI))
| sends IN on control endpoint
#define | Usb_free_out_bank() (UEINTX &= ~(1<<FIFOCON))
| frees OUT bank
#define | Usb_ack_control_out() (UEINTX &= ~(1<<RXOUTI))
| acks OUT on control endpoint
#define | Usb_enable_flow_error_interrupt() (UEIENX |= (1<<FLERRE))
| enables flow error interrupt
#define | Usb_enable_nak_in_interrupt() (UEIENX |= (1<<NAKINE))
| enables NAK IN interrupt
#define | Usb_enable_nak_out_interrupt() (UEIENX |= (1<<NAKOUTE))
| enables NAK OUT interrupt
#define | Usb_enable_receive_setup_interrupt() (UEIENX |= (1<<RXSTPE))
| enables receive SETUP interrupt
#define | Usb_enable_receive_out_interrupt() (UEIENX |= (1<<RXOUTE))
| enables receive OUT interrupt
#define | Usb_enable_stalled_interrupt() (UEIENX |= (1<<STALLEDE))
| enables STALL sent interrupt
#define | Usb_enable_in_ready_interrupt() (UEIENX |= (1<<TXIN))
| enables IN ready interrupt
#define | Usb_disable_flow_error_interrupt() (UEIENX &= ~(1<<FLERRE))
| disables flow error interrupt
#define | Usb_disable_nak_in_interrupt() (UEIENX &= ~(1<<NAKINE))
| disables NAK IN interrupt
#define | Usb_disable_nak_out_interrupt() (UEIENX &= ~(1<<NAKOUTE))
| disables NAK OUT interrupt
#define | Usb_disable_receive_setup_interrupt() (UEIENX &= ~(1<<RXSTPE))
| disables receive SETUP interrupt
#define | Usb_disable_receive_out_interrupt() (UEIENX &= ~(1<<RXOUTE))
| disables receive OUT interrupt
#define | Usb_disable_stalled_interrupt() (UEIENX &= ~(1<<STALLEDE))
| disables STALL sent interrupt
#define | Usb_disable_in_ready_interrupt() (UEIENX &= ~(1<<TXIN))
| disables IN ready interrupt
#define | Usb_read_byte() (UEDATX)
| returns FIFO byte for current endpoint
#define | Usb_write_byte(byte) (UEDATX = (U8)byte)
| writes byte in FIFO for current endpoint
#define | Usb_byte_counter() ((((U16)UEBCHX) << 8) | (UEBCLX))
| returns number of bytes in FIFO current endpoint (16 bits)
#define | Usb_byte_counter_8() ((U8)UEBCLX)
| returns number of bytes in FIFO current endpoint (8 bits)
#define | Usb_interrupt_flags() (UEINT)
| tests the general endpoint interrupt flags
#define | Is_usb_endpoint_event() (Usb_interrupt_flags() != 0x00)
| tests the general endpoint interrupt flags

## Detailed Description

These macros manage the common features of the endpoints.

## Define Documentation

#define Usb_select_endpoint | ( | ep |  | ) | (UENUM = (U8)ep )

selects the endpoint number to interface with the CPU

Definition at line 495 of file usb_drv.h.

Referenced by storage_task(), usb_clear_feature(), usb_device_task(), usb_halt_endpoint(), usb_init_device(), usb_mass_storage_cbw(), usb_mass_storage_csw(), usb_read_packet(), usb_send_packet(), usb_set_feature(), usb_set_interface(), and usb_user_interface_reset().

#define Usb_get_selected_endpoint | ( |  | ) | (UENUM )

get the currently selected endpoint number

Definition at line 498 of file usb_drv.h.

#define Usb_reset_endpoint | ( | ep |  | ) | (UERST = 1 << (U8)ep, UERST = 0)

resets the selected endpoint

Definition at line 501 of file usb_drv.h.

Referenced by usb_clear_feature(), usb_device_task(), and usb_user_interface_reset().

#define Usb_enable_endpoint | ( |  | ) | (UECONX |= (1<<EPEN))

enables the current endpoint

Definition at line 504 of file usb_drv.h.

Referenced by usb_config_ep().

#define Usb_enable_stall_handshake | ( |  | ) | (UECONX |= (1<<STALLRQ))

enables the STALL handshake for the next transaction

Definition at line 506 of file usb_drv.h.

Referenced by usb_halt_endpoint(), usb_mass_storage_cbw(), usb_process_request(), and usb_set_feature().

#define Usb_reset_data_toggle | ( |  | ) | (UECONX |= (1<<RSTDT))

resets the data toggle sequence

Definition at line 508 of file usb_drv.h.

Referenced by usb_clear_feature(), and usb_user_interface_reset().

#define Usb_disable_endpoint | ( |  | ) | (UECONX &= ~(1<<EPEN))

disables the current endpoint

Definition at line 510 of file usb_drv.h.

#define Usb_disable_stall_handshake | ( |  | ) | (UECONX |= (1<<STALLRQC))

disables the STALL handshake

Definition at line 512 of file usb_drv.h.

Referenced by usb_clear_feature(), and usb_user_interface_reset().

#define Usb_select_epnum_for_cpu | ( |  | ) | (UECONX &= ~(1<<EPNUMS))

selects endpoint interface on CPU

Definition at line 514 of file usb_drv.h.

#define Is_usb_endpoint_enabled | ( |  | ) | ((UECONX & (1<<EPEN)) ? TRUE : FALSE)

tests if the current endpoint is enabled

Definition at line 516 of file usb_drv.h.

Referenced by df_read_sector(), df_write_sector(), usb_clear_feature(), usb_init_device(), usb_mass_storage_csw(), and usb_set_feature().

#define Is_usb_endpoint_stall_requested | ( |  | ) | ((UECONX & (1<<STALLRQ)) ? TRUE : FALSE)

tests if STALL handshake request is running

Definition at line 518 of file usb_drv.h.

Referenced by usb_mass_storage_csw().

#define Usb_configure_endpoint_type | ( | type |  | ) | (UECFG0X = (UECFG0X & ~(MSK_EPTYPE)) | ((U8)type << 6))

configures the current endpoint

Definition at line 521 of file usb_drv.h.

#define Usb_configure_endpoint_direction | ( | dir |  | ) | (UECFG0X = (UECFG0X & ~(1<<EPDIR)) | ((U8)dir))

configures the current endpoint direction

Definition at line 523 of file usb_drv.h.

#define Usb_configure_endpoint_size | ( | size |  | ) | (UECFG1X = (UECFG1X & ~MSK_EPSIZE) | ((U8)size << 4))

configures the current endpoint size

Definition at line 526 of file usb_drv.h.

#define Usb_configure_endpoint_bank | ( | bank |  | ) | (UECFG1X = (UECFG1X & ~MSK_EPBK) | ((U8)bank << 2))

configures the current endpoint number of banks

Definition at line 528 of file usb_drv.h.

#define Usb_allocate_memory | ( |  | ) | (UECFG1X |= (1<<ALLOC))

allocates the current configuration in DPRAM memory

Definition at line 530 of file usb_drv.h.

Referenced by usb_config_ep().

#define Usb_unallocate_memory | ( |  | ) | (UECFG1X &= ~(1<<ALLOC))

un-allocates the current configuration in DPRAM memory

Definition at line 532 of file usb_drv.h.

#define Usb_ack_overflow_interrupt | ( |  | ) | (UESTA0X &= ~(1<<OVERFI))

acks endpoint overflow interrupt

Definition at line 535 of file usb_drv.h.

#define Usb_ack_underflow_interrupt | ( |  | ) | (UESTA0X &= ~(1<<UNDERFI))

acks endpoint underflow memory

Definition at line 537 of file usb_drv.h.

#define Usb_ack_zlp | ( |  | ) | (UESTA0X &= ~(1<<ZLPSEEN))

acks Zero Length Packet received

Definition at line 539 of file usb_drv.h.

#define Usb_data_toggle | ( |  | ) | ((UESTA0X&MSK_DTSEQ) >> 2)

returns data toggle

Definition at line 541 of file usb_drv.h.

#define Usb_nb_busy_bank | ( |  | ) | (UESTA0X & MSK_NBUSYBK)

returns the number of busy banks

Definition at line 543 of file usb_drv.h.

#define Is_usb_one_bank_busy | ( |  | ) | ((UESTA0X & MSK_NBUSYBK) == 0 ? FALSE : TRUE)

tests if at least one bank is busy

Definition at line 545 of file usb_drv.h.

#define Is_endpoint_configured | ( |  | ) | ((UESTA0X & (1<<CFGOK)) ? TRUE : FALSE)

tests if current endpoint is configured

Definition at line 547 of file usb_drv.h.

Referenced by usb_config_ep().

#define Is_usb_overflow | ( |  | ) | ((UESTA0X & (1<<OVERFI)) ? TRUE : FALSE)

tests if an overflows occurs

Definition at line 549 of file usb_drv.h.

#define Is_usb_underflow | ( |  | ) | ((UESTA0X & (1<<UNDERFI)) ? TRUE : FALSE)

tests if an underflow occurs

Definition at line 551 of file usb_drv.h.

#define Is_usb_zlp | ( |  | ) | ((UESTA0X & (1<<ZLPSEEN)) ? TRUE : FALSE)

tests if a ZLP has been detected

Definition at line 553 of file usb_drv.h.

#define Usb_control_direction | ( |  | ) | ((UESTA1X & (1<<CTRLDIR)) >> 2)

returns the control direction

Definition at line 556 of file usb_drv.h.

#define Usb_current_bank | ( |  | ) | ( UESTA1X & MSK_CURRBK)

returns the number of the current bank

Definition at line 558 of file usb_drv.h.

#define Usb_ack_fifocon | ( |  | ) | (UEINTX &= ~(1<<FIFOCON))

clears FIFOCON bit

Definition at line 561 of file usb_drv.h.

#define Usb_ack_nak_in | ( |  | ) | (UEINTX &= ~(1<<NAKINI))

acks NAK IN received

Definition at line 563 of file usb_drv.h.

#define Usb_ack_nak_out | ( |  | ) | (UEINTX &= ~(1<<NAKOUTI))

acks NAK OUT received

Definition at line 565 of file usb_drv.h.

Referenced by usb_get_descriptor().

#define Usb_ack_receive_setup | ( |  | ) | (UEINTX &= ~(1<<RXSTPI))

acks receive SETUP

Definition at line 567 of file usb_drv.h.

Referenced by usb_clear_feature(), usb_get_configuration(), usb_get_descriptor(), usb_get_interface(), usb_get_status(), usb_process_request(), usb_set_address(), usb_set_configuration(), usb_set_feature(), usb_set_interface(), and usb_user_read_request().

#define Usb_ack_receive_out | ( |  | ) | (UEINTX &= ~(1<<RXOUTI), Usb_ack_fifocon())

acks reveive OUT

Definition at line 569 of file usb_drv.h.

Referenced by df_write_sector(), usb_get_configuration(), usb_get_interface(), usb_get_status(), and usb_mass_storage_cbw().

#define Usb_ack_stalled | ( |  | ) | (MSK_STALLEDI= 0)

acks STALL sent

Definition at line 571 of file usb_drv.h.

#define Usb_ack_in_ready | ( |  | ) | (UEINTX &= ~(1<<TXINI), Usb_ack_fifocon())

acks IN ready

Definition at line 573 of file usb_drv.h.

Referenced by usb_get_configuration().

#define Usb_kill_last_in_bank | ( |  | ) | (UENTTX |= (1<<RXOUTI))

Kills last bank.

Definition at line 575 of file usb_drv.h.

#define Is_usb_read_enabled | ( |  | ) | (UEINTX&(1<<RWAL))

tests if endpoint read allowed

Definition at line 577 of file usb_drv.h.

Referenced by df_write_sector(), and usb_read_packet().

#define Is_usb_write_enabled | ( |  | ) | (UEINTX&(1<<RWAL))

tests if endpoint write allowed

Definition at line 579 of file usb_drv.h.

Referenced by df_read_sector(), usb_mass_storage_csw(), and usb_send_packet().

#define Is_usb_read_control_enabled | ( |  | ) | (UEINTX&(1<<TXINI))

tests if read allowed on control endpoint

Definition at line 581 of file usb_drv.h.

Referenced by usb_get_descriptor().

#define Is_usb_nak_in_sent | ( |  | ) | (UEINTX&(1<<NAKINI))

tests if a NAK has been sent on IN endpoint

Definition at line 583 of file usb_drv.h.

#define Is_usb_nak_out_sent | ( |  | ) | (UEINTX&(1<<NAKOUTI))

tests if a NAK has been sent on OUT endpoint

Definition at line 585 of file usb_drv.h.

Referenced by usb_get_descriptor().

#define Is_usb_receive_setup | ( |  | ) | (UEINTX&(1<<RXSTPI))

tests if SETUP received

Definition at line 587 of file usb_drv.h.

Referenced by usb_device_task(), and usb_mass_storage_csw().

#define Is_usb_receive_out | ( |  | ) | (UEINTX&(1<<RXOUTI))

tests if OUT received

Definition at line 589 of file usb_drv.h.

Referenced by storage_task(), usb_get_configuration(), usb_get_interface(), and usb_get_status().

#define Is_usb_in_ready | ( |  | ) | (UEINTX&(1<<TXINI))

tests if IN ready

Definition at line 591 of file usb_drv.h.

Referenced by usb_set_address(), and usb_set_interface().

#define Usb_send_in | ( |  | ) | (UEINTX &= ~(1<<FIFOCON))

sends IN

Definition at line 593 of file usb_drv.h.

Referenced by df_read_sector(), and usb_mass_storage_csw().

#define Usb_send_control_in | ( |  | ) | (UEINTX &= ~(1<<TXINI))

sends IN on control endpoint

Definition at line 595 of file usb_drv.h.

Referenced by usb_clear_feature(), usb_get_descriptor(), usb_get_interface(), usb_get_status(), usb_set_address(), usb_set_configuration(), usb_set_feature(), usb_set_interface(), and usb_user_read_request().

#define Usb_free_out_bank | ( |  | ) | (UEINTX &= ~(1<<FIFOCON))

frees OUT bank

Definition at line 597 of file usb_drv.h.

#define Usb_ack_control_out | ( |  | ) | (UEINTX &= ~(1<<RXOUTI))

acks OUT on control endpoint

Definition at line 599 of file usb_drv.h.

Referenced by usb_get_descriptor(), and usb_process_request().

#define Usb_enable_flow_error_interrupt | ( |  | ) | (UEIENX |= (1<<FLERRE))

enables flow error interrupt

Definition at line 602 of file usb_drv.h.

#define Usb_enable_nak_in_interrupt | ( |  | ) | (UEIENX |= (1<<NAKINE))

enables NAK IN interrupt

Definition at line 604 of file usb_drv.h.

#define Usb_enable_nak_out_interrupt | ( |  | ) | (UEIENX |= (1<<NAKOUTE))

enables NAK OUT interrupt

Definition at line 606 of file usb_drv.h.

#define Usb_enable_receive_setup_interrupt | ( |  | ) | (UEIENX |= (1<<RXSTPE))

enables receive SETUP interrupt

Definition at line 608 of file usb_drv.h.

#define Usb_enable_receive_out_interrupt | ( |  | ) | (UEIENX |= (1<<RXOUTE))

enables receive OUT interrupt

Definition at line 610 of file usb_drv.h.

#define Usb_enable_stalled_interrupt | ( |  | ) | (UEIENX |= (1<<STALLEDE))

enables STALL sent interrupt

Definition at line 612 of file usb_drv.h.

#define Usb_enable_in_ready_interrupt | ( |  | ) | (UEIENX |= (1<<TXIN))

enables IN ready interrupt

Definition at line 614 of file usb_drv.h.

#define Usb_disable_flow_error_interrupt | ( |  | ) | (UEIENX &= ~(1<<FLERRE))

disables flow error interrupt

Definition at line 616 of file usb_drv.h.

#define Usb_disable_nak_in_interrupt | ( |  | ) | (UEIENX &= ~(1<<NAKINE))

disables NAK IN interrupt

Definition at line 618 of file usb_drv.h.

#define Usb_disable_nak_out_interrupt | ( |  | ) | (UEIENX &= ~(1<<NAKOUTE))

disables NAK OUT interrupt

Definition at line 620 of file usb_drv.h.

#define Usb_disable_receive_setup_interrupt | ( |  | ) | (UEIENX &= ~(1<<RXSTPE))

disables receive SETUP interrupt

Definition at line 622 of file usb_drv.h.

#define Usb_disable_receive_out_interrupt | ( |  | ) | (UEIENX &= ~(1<<RXOUTE))

disables receive OUT interrupt

Definition at line 624 of file usb_drv.h.

#define Usb_disable_stalled_interrupt | ( |  | ) | (UEIENX &= ~(1<<STALLEDE))

disables STALL sent interrupt

Definition at line 626 of file usb_drv.h.

#define Usb_disable_in_ready_interrupt | ( |  | ) | (UEIENX &= ~(1<<TXIN))

disables IN ready interrupt

Definition at line 628 of file usb_drv.h.

#define Usb_read_byte | ( |  | ) | (UEDATX)

returns FIFO byte for current endpoint

Definition at line 631 of file usb_drv.h.

Referenced by df_host_write_sector(), df_write_sector(), usb_clear_feature(), usb_get_descriptor(), usb_get_interface(), usb_get_status(), usb_mass_storage_cbw(), usb_process_request(), usb_read_packet(), usb_set_address(), usb_set_configuration(), usb_set_feature(), usb_set_interface(), and usb_user_read_request().

#define Usb_write_byte | ( | byte |  | ) | (UEDATX = (U8)byte)

writes byte in FIFO for current endpoint

Definition at line 633 of file usb_drv.h.

Referenced by df_host_read_sector(), df_read_sector(), sbc_header_mode_sense(), sbc_inquiry(), sbc_read_capacity(), sbc_request_sense(), send_informational_exceptions_page(), send_read_write_error_recovery_page(), usb_get_configuration(), usb_get_descriptor(), usb_get_interface(), usb_get_status(), usb_mass_storage_csw(), usb_send_packet(), and usb_user_read_request().

#define Usb_byte_counter | ( |  | ) | ((((U16)UEBCHX) << 8) | (UEBCLX))

returns number of bytes in FIFO current endpoint (16 bits)

Definition at line 636 of file usb_drv.h.

#define Usb_byte_counter_8 | ( |  | ) | ((U8)UEBCLX)

returns number of bytes in FIFO current endpoint (8 bits)

Definition at line 638 of file usb_drv.h.

#define Usb_interrupt_flags | ( |  | ) | (UEINT)

tests the general endpoint interrupt flags

Definition at line 641 of file usb_drv.h.

Referenced by usb_select_enpoint_interrupt().

#define Is_usb_endpoint_event | ( |  | ) | (Usb_interrupt_flags() != 0x00)

tests the general endpoint interrupt flags

Definition at line 643 of file usb_drv.h.