USB device controller driver
The USB Device Controller Driver Layer implements the low level control routines to deal directly with the hardware. All device controller drivers should implement the APIs described in include/drivers/usb/usb_dc.h. This allows the integration of new USB device controllers to be done without changing the upper layers. With this API it is not possible to support more than one controller instance at runtime.
API reference
- group _usb_device_controller_api
USB Device Controller API.
Typedefs
-
typedef void (*usb_dc_ep_callback)(uint8_t ep, enum usb_dc_ep_cb_status_code cb_status)
Callback function signature for the USB Endpoint status
-
typedef void (*usb_dc_status_callback)(enum usb_dc_status_code cb_status, const uint8_t *param)
Callback function signature for the device
Enums
-
enum usb_dc_status_code
USB Driver Status Codes.
Status codes reported by the registered device status callback.
Values:
-
enumerator USB_DC_ERROR
USB error reported by the controller
-
enumerator USB_DC_RESET
USB reset
-
enumerator USB_DC_CONNECTED
USB connection established, hardware enumeration is completed
-
enumerator USB_DC_CONFIGURED
USB configuration done
-
enumerator USB_DC_DISCONNECTED
USB connection lost
-
enumerator USB_DC_SUSPEND
USB connection suspended by the HOST
-
enumerator USB_DC_RESUME
USB connection resumed by the HOST
-
enumerator USB_DC_INTERFACE
USB interface selected
-
enumerator USB_DC_SET_HALT
Set Feature ENDPOINT_HALT received
-
enumerator USB_DC_CLEAR_HALT
Clear Feature ENDPOINT_HALT received
-
enumerator USB_DC_SOF
Start of Frame received
-
enumerator USB_DC_UNKNOWN
Initial USB connection status
-
enumerator USB_DC_ERROR
-
enum usb_dc_ep_cb_status_code
USB Endpoint Callback Status Codes.
Status Codes reported by the registered endpoint callback.
Values:
-
enumerator USB_DC_EP_SETUP
SETUP received
-
enumerator USB_DC_EP_DATA_OUT
Out transaction on this EP, data is available for read
-
enumerator USB_DC_EP_DATA_IN
In transaction done on this EP
-
enumerator USB_DC_EP_SETUP
-
enum usb_dc_ep_transfer_type
USB Endpoint Transfer Type.
Values:
-
enumerator USB_DC_EP_CONTROL = 0
Control type endpoint
-
enumerator USB_DC_EP_ISOCHRONOUS
Isochronous type endpoint
-
enumerator USB_DC_EP_BULK
Bulk type endpoint
-
enumerator USB_DC_EP_INTERRUPT
Interrupt type endpoint
-
enumerator USB_DC_EP_CONTROL = 0
-
enum usb_dc_ep_synchronozation_type
USB Endpoint Synchronization Type.
Note
Valid only for Isochronous Endpoints
Values:
-
enumerator USB_DC_EP_NO_SYNCHRONIZATION = (0U << 2U)
No Synchronization
-
enumerator USB_DC_EP_ASYNCHRONOUS = (1U << 2U)
Asynchronous
-
enumerator USB_DC_EP_ADAPTIVE = (2U << 2U)
Adaptive
-
enumerator USB_DC_EP_SYNCHRONOUS = (3U << 2U)
Synchronous
-
enumerator USB_DC_EP_NO_SYNCHRONIZATION = (0U << 2U)
Functions
-
int usb_dc_attach(void)
Attach USB for device connection.
Function to attach USB for device connection. Upon success, the USB PLL is enabled, and the USB device is now capable of transmitting and receiving on the USB bus and of generating interrupts.
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_detach(void)
Detach the USB device.
Function to detach the USB device. Upon success, the USB hardware PLL is powered down and USB communication is disabled.
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_reset(void)
Reset the USB device.
This function returns the USB device and firmware back to it’s initial state. N.B. the USB PLL is handled by the usb_detach function
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_set_address(const uint8_t addr)
Set USB device address.
- Parameters
addr – [in] Device address
- Returns
0 on success, negative errno code on fail.
-
void usb_dc_set_status_callback(const usb_dc_status_callback cb)
Set USB device controller status callback.
Function to set USB device controller status callback. The registered callback is used to report changes in the status of the device controller. The status code are described by the usb_dc_status_code enumeration.
- Parameters
cb – [in] Callback function
-
int usb_dc_ep_check_cap(const struct usb_dc_ep_cfg_data *const cfg)
check endpoint capabilities
Function to check capabilities of an endpoint. usb_dc_ep_cfg_data structure provides the endpoint configuration parameters: endpoint address, endpoint maximum packet size and endpoint type. The driver should check endpoint capabilities and return 0 if the endpoint configuration is possible.
- Parameters
cfg – [in] Endpoint config
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_configure(const struct usb_dc_ep_cfg_data *const cfg)
Configure endpoint.
Function to configure an endpoint. usb_dc_ep_cfg_data structure provides the endpoint configuration parameters: endpoint address, endpoint maximum packet size and endpoint type.
- Parameters
cfg – [in] Endpoint config
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_set_stall(const uint8_t ep)
Set stall condition for the selected endpoint.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_clear_stall(const uint8_t ep)
Clear stall condition for the selected endpoint.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_is_stalled(const uint8_t ep, uint8_t *const stalled)
Check if the selected endpoint is stalled.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
stalled – [out] Endpoint stall status
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_halt(const uint8_t ep)
Halt the selected endpoint.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_enable(const uint8_t ep)
Enable the selected endpoint.
Function to enable the selected endpoint. Upon success interrupts are enabled for the corresponding endpoint and the endpoint is ready for transmitting/receiving data.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_disable(const uint8_t ep)
Disable the selected endpoint.
Function to disable the selected endpoint. Upon success interrupts are disabled for the corresponding endpoint and the endpoint is no longer able for transmitting/receiving data.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_flush(const uint8_t ep)
Flush the selected endpoint.
This function flushes the FIFOs for the selected endpoint.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_write(const uint8_t ep, const uint8_t *const data, const uint32_t data_len, uint32_t *const ret_bytes)
Write data to the specified endpoint.
This function is called to write data to the specified endpoint. The supplied usb_ep_callback function will be called when data is transmitted out.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
data – [in] Pointer to data to write
data_len – [in] Length of the data requested to write. This may be zero for a zero length status packet.
ret_bytes – [out] Bytes scheduled for transmission. This value may be NULL if the application expects all bytes to be written
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_read(const uint8_t ep, uint8_t *const data, const uint32_t max_data_len, uint32_t *const read_bytes)
Read data from the specified endpoint.
This function is called by the endpoint handler function, after an OUT interrupt has been received for that EP. The application must only call this function through the supplied usb_ep_callback function. This function clears the ENDPOINT NAK, if all data in the endpoint FIFO has been read, so as to accept more data from host.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
data – [in] Pointer to data buffer to write to
max_data_len – [in] Max length of data to read
read_bytes – [out] Number of bytes read. If data is NULL and max_data_len is 0 the number of bytes available for read should be returned.
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_set_callback(const uint8_t ep, const usb_dc_ep_callback cb)
Set callback function for the specified endpoint.
Function to set callback function for notification of data received and available to application or transmit done on the selected endpoint, NULL if callback not required by application code. The callback status code is described by usb_dc_ep_cb_status_code.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
cb – [in] Callback function
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_read_wait(uint8_t ep, uint8_t *data, uint32_t max_data_len, uint32_t *read_bytes)
Read data from the specified endpoint.
This is similar to usb_dc_ep_read, the difference being that, it doesn’t clear the endpoint NAKs so that the consumer is not bogged down by further upcalls till he is done with the processing of the data. The caller should reactivate ep by invoking usb_dc_ep_read_continue() do so.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
data – [in] Pointer to data buffer to write to
max_data_len – [in] Max length of data to read
read_bytes – [out] Number of bytes read. If data is NULL and max_data_len is 0 the number of bytes available for read should be returned.
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_read_continue(uint8_t ep)
Continue reading data from the endpoint.
Clear the endpoint NAK and enable the endpoint to accept more data from the host. Usually called after usb_dc_ep_read_wait() when the consumer is fine to accept more data. Thus these calls together act as a flow control mechanism.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
- Returns
0 on success, negative errno code on fail.
-
int usb_dc_ep_mps(uint8_t ep)
Get endpoint max packet size.
- Parameters
ep – [in] Endpoint address corresponding to the one listed in the device configuration table
- Returns
Enpoint max packet size (mps)
-
int usb_dc_wakeup_request(void)
Start the host wake up procedure.
Function to wake up the host if it’s currently in sleep mode.
- Returns
0 on success, negative errno code on fail.
-
struct usb_dc_ep_cfg_data
- #include <usb_dc.h>
USB Endpoint Configuration.
Structure containing the USB endpoint configuration.
Public Members
-
uint8_t ep_addr
The number associated with the EP in the device configuration structure IN EP = 0x80 | <endpoint number> OUT EP = 0x00 | <endpoint number>
-
uint16_t ep_mps
Endpoint max packet size
-
enum usb_dc_ep_transfer_type ep_type
Endpoint Transfer Type. May be Bulk, Interrupt, Control or Isochronous
-
uint8_t ep_addr
-
typedef void (*usb_dc_ep_callback)(uint8_t ep, enum usb_dc_ep_cb_status_code cb_status)