Host and Device Drivers
Note
Please note that starting from version v1.1, the busid parameter has been added, while everything else remains unchanged, so API documentation is not updated
device controller(dcd)
usb_dc_init
usb_dc_init is used to initialize USB device controller registers, set USB pins, clock, interrupts, etc. This function is not open to users.
int usb_dc_init(void);
return Returns 0 for success, other values indicate error
usb_dc_deinit
usb_dc_deinit is used to de-initialize USB device controller registers. This function is not open to users.
int usb_dc_deinit(void);
return Returns 0 for success, other values indicate error
usbd_set_address
usbd_set_address sets the device address. This function is not open to users.
int usbd_set_address(const uint8_t addr);
addr Device address
return Returns 0 for success, other values indicate error
usbd_ep_open
usbd_ep_open sets endpoint properties and enables corresponding endpoint interrupts. This function is not open to users.
int usbd_ep_open(const struct usb_endpoint_descriptor *ep);
ep Endpoint descriptor
return Returns 0 for success, other values indicate error
usbd_ep_close
usbd_ep_close closes an endpoint. This function is not open to users.
int usbd_ep_close(const uint8_t ep);
ep Endpoint address
return Returns 0 for success, other values indicate error
usbd_ep_set_stall
usbd_ep_set_stall sets an endpoint to stall state and sends a stall handshake packet. This function is open to users.
int usbd_ep_set_stall(const uint8_t ep);
ep Endpoint address
return Returns 0 for success, other values indicate error
usbd_ep_clear_stall
usbd_ep_clear_stall clears the stall state of an endpoint. This function is not open to users.
int usbd_ep_clear_stall(const uint8_t ep);
ep Endpoint address
return Returns 0 for success, other values indicate error
usbd_ep_is_stalled
usbd_ep_is_stalled reads the current stall state of an endpoint. This function is not open to users.
int usbd_ep_is_stalled(const uint8_t ep, uint8_t *stalled);
ep Endpoint address
return Returns 1 for stalled, 0 for not stalled
usbd_ep_start_write
usbd_ep_start_write starts endpoint transmission. After transmission completion, it will call the registered IN endpoint transfer completion interrupt callback function. This function performs asynchronous transmission. This function is open to users.
int usbd_ep_start_write(const uint8_t ep, const uint8_t *data, uint32_t data_len);
ep IN endpoint address
data Transmission data buffer
data_len Transmission length, theoretically unlimited, recommended within 16K bytes
return Returns 0 for success, other values indicate error
usbd_ep_start_read
usbd_ep_start_read starts endpoint reception. After reception completion, it will call the registered OUT endpoint transfer completion interrupt callback function. This function performs asynchronous reception. This function is open to users.
int usbd_ep_start_read(const uint8_t ep, uint8_t *data, uint32_t data_len);
ep OUT endpoint address
data Reception data buffer
data_len Reception length, theoretically unlimited, recommended within 16K bytes, and preferably a multiple of maximum packet size
return Returns 0 for success, other values indicate error
Note
After starting reception, transfer completion interrupt will be triggered under two conditions: 1. Last packet is a short packet (less than EP MPS); 2. Total received length equals data_len
Note
For bulk transfers, data_len is usually designed as EP MPS. The following three cases can be modified to multiple EP MPS: fixed length; custom protocol with length information (MSC); host manually sends ZLP or short packet (RNDIS)
host controller(hcd)
usb_hc_init
usb_hc_init is used to initialize USB host controller registers, set USB pins, clock, interrupts, etc. This function is not open to users.
int usb_hc_init(void);
return Returns 0 for success, other values indicate error
usb_hc_deinit
usb_hc_deinit is used to de-initialize USB host controller registers. This function is not open to users.
int usb_hc_deinit(void);
return Returns 0 for success, other values indicate error
usbh_roothub_control
usbh_roothub_control is used to send requests to the root hub. This function is not open to users.
int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf);
setup Request
buf Reception buffer
return Returns 0 for success, other values indicate error
usbh_submit_urb
usbh_submit_urb performs data requests to endpoints at a specific address. This function is open to users.
int usbh_submit_urb(struct usbh_urb *urb);
urb USB request block
return Returns 0 for success, other values indicate error
Among them, the urb structure information is as follows:
struct usbh_urb {
usb_slist_t list;
void *hcpriv;
struct usbh_hubport *hport;
struct usb_endpoint_descriptor *ep;
uint8_t data_toggle;
uint8_t interval;
struct usb_setup_packet *setup;
uint8_t *transfer_buffer;
uint32_t transfer_buffer_length;
int transfer_flags;
uint32_t actual_length;
uint32_t timeout;
int errorcode;
uint32_t num_of_iso_packets;
uint32_t start_frame;
usbh_complete_callback_t complete;
void *arg;
#if defined(__ICCARM__) || defined(__ICCRISCV__) || defined(__ICCRX__)
struct usbh_iso_frame_packet *iso_packet;
#else
struct usbh_iso_frame_packet iso_packet[0];
#endif
};
hcpriv Host controller driver private member
hport The hport used by current URB
ep The endpoint used by current URB
data_toggle Current data toggle
interval URB transfer interval in microseconds. If interval is greater than 1000us, software timer needs to be used for maintenance
setup Setup request buffer, used by endpoint 0
transfer_buffer Transfer data buffer
transfer_buffer_length Transfer length
transfer_flags Flags carried during transfer
actual_length Actual transfer length
timeout Transfer timeout. If 0, the function is non-blocking and can be used in interrupts
errorcode Error code
num_of_iso_packets Number of ISO frames or microframes
complete Transfer completion callback function
arg Parameters carried when transfer completes
iso_packet ISO data packet
Note
If there are no special time requirements for timeout, it must be set to 0xffffffff. In principle, timeout is not allowed. If timeout occurs, generally cannot continue working
errorcode can return the following values:
#define USB_ERR_NOMEM 1
#define USB_ERR_INVAL 2
#define USB_ERR_NODEV 3
#define USB_ERR_NOTCONN 4
#define USB_ERR_NOTSUPP 5
#define USB_ERR_BUSY 6
#define USB_ERR_RANGE 7
#define USB_ERR_STALL 8
#define USB_ERR_BABBLE 9
#define USB_ERR_NAK 10
#define USB_ERR_DT 11
#define USB_ERR_IO 12
#define USB_ERR_SHUTDOWN 13
#define USB_ERR_TIMEOUT 14
Among them, the iso_packet structure information is as follows:
struct usbh_iso_frame_packet {
uint8_t *transfer_buffer;
uint32_t transfer_buffer_length;
uint32_t actual_length;
int errorcode;
};
transfer_buffer Transfer data buffer
transfer_buffer_length Transfer length
actual_length Actual transfer length
errorcode Error code