The UHD driver provides a low-level abstraction of the host controller hardware.
Most events coming from the hardware such as interrupts may cause the UHD performing function call in UHC and UHI.
Typedefs | |
typedef void(* | uhd_callback_reset_t )(void) |
End of reset callback function type. More... | |
typedef void(* | uhd_callback_setup_end_t )(usb_add_t add, uhd_trans_status_t status, uint16_t payload_trans) |
End of setup callback function type. More... | |
typedef bool(* | uhd_callback_setup_run_t )(usb_add_t add, uint8_t **payload, uint16_t *payload_size) |
Data setup transfer callback function type. More... | |
typedef void(* | uhd_callback_trans_t )(usb_add_t add, usb_ep_t ep, uhd_trans_status_t status, iram_size_t nb_transfered) |
End of transfer callback function type. More... | |
Enumerations | |
enum | uhd_speed_t { UHD_SPEED_LOW = 0, UHD_SPEED_FULL = 1, UHD_SPEED_HIGH = 2 } |
Device speed. More... | |
enum | uhd_trans_status_t { UHD_TRANS_NOERROR = 0, UHD_TRANS_DISCONNECT, UHD_TRANS_CRC, UHD_TRANS_DT_MISMATCH, UHD_TRANS_STALL, UHD_TRANS_NOTRESPONDING, UHD_TRANS_PIDFAILURE, UHD_TRANS_TIMEOUT, UHD_TRANS_ABORTED } |
Endpoint transfer status The status field is updated after each transaction attempt, whether successful or not. More... | |
Functions | |
void | uhd_disable (bool b_id_stop) |
Disables the USB host mode. More... | |
void | uhd_enable (void) |
Enables the USB host mode Start the ID pin management if the ID pin is available. More... | |
uint16_t | uhd_get_frame_number (void) |
Returns the current Start Of Frame (SOF) number. More... | |
uint16_t | uhd_get_microframe_number (void) |
Returns the current micro start of frame number. More... | |
uhd_speed_t | uhd_get_speed (void) |
Returns the speed of connected device. More... | |
bool | uhd_is_suspend (void) |
Test if the suspend state is enabled on the USB line. More... | |
void | uhd_resume (void) |
Enables the IDLE state on the USB line. More... | |
void | uhd_send_reset (uhd_callback_reset_t callback) |
Enables the Reset state on the USB line. More... | |
bool | uhd_setup_request (usb_add_t add, usb_setup_req_t *req, uint8_t *payload, uint16_t payload_size, uhd_callback_setup_run_t callback_run, uhd_callback_setup_end_t callback_end) |
Add a setup request in the control endpoint setup queue. More... | |
void | uhd_suspend (void) |
Enables the suspend state on the USB line. More... | |
bool | uhd_suspend_lpm (bool b_remotewakeup, uint8_t hird) |
Enables the suspend L1 state on the USB line. More... | |
Endpoint Management | |
The following functions allow drivers to create and remove endpoints, as well as set, clear and query their "halted" and "wedged" states. | |
bool | uhd_ep0_alloc (usb_add_t add, uint8_t ep_size) |
Configures and enables a control endpoint 0. More... | |
bool | uhd_ep_alloc (usb_add_t add, usb_ep_desc_t *ep_desc, uhd_speed_t speed) |
Configures and enables an endpoint. More... | |
void | uhd_ep_free (usb_add_t add, usb_ep_t endp) |
Disables an endpoint or all endpoint of a device. More... | |
bool | uhd_ep_run (usb_add_t add, usb_ep_t endp, bool b_shortpacket, uint8_t *buf, iram_size_t buf_size, uint16_t timeout, uhd_callback_trans_t callback) |
Allows to receive or send data on an endpoint. More... | |
void | uhd_ep_abort (usb_add_t add, usb_ep_t endp) |
Aborts an on-going transfer on an endpoint. More... | |
High speed test mode management | |
The following functions allow the host to jump to a specific test mode required in high speed mode. | |
void | uhd_test_mode_j (void) |
void | uhd_test_mode_k (void) |
void | uhd_test_mode_se0_nak (void) |
void | uhd_test_mode_packet (void) |
UHC callbacks to provide for UHD | |
void | uhc_start (void) |
Starts the host mode. More... | |
void | uhc_stop (bool b_id_stop) |
Stops the host mode. More... | |
void | uhc_notify_connection (bool b_plug) |
Notify device connection or disconnection. More... | |
void | uhc_notify_sof (bool b_micro) |
Notify each start of frame sent by driver. More... | |
void | uhc_notify_resume (void) |
Notify that a resume bus occurs A resume can occur after a downstream or an upstream resume. More... | |
void | uhc_notify_resume_lpm (void) |
Notify that a resume bus occurs after a L1 state A resume can occur after a downstream or an upstream resume. More... | |
typedef void(* uhd_callback_reset_t)(void) |
End of reset callback function type.
Registered by uhd_send_reset() Callback called when reset event is completed.
typedef void(* uhd_callback_setup_end_t)(usb_add_t add, uhd_trans_status_t status, uint16_t payload_trans) |
End of setup callback function type.
Registered by uhd_setup_request() Called when the setup request is completed.
add | USB address of the setup request |
status | Transfer status |
payload_trans | Number of data transfered during DATA phase |
Data setup transfer callback function type.
Registered by uhd_setup_request() Called during DATA phase when the (payload) buffer is full or empty. Then the setup request is halted. A new buffer can be provided to continue the DATA phase or abort DATA phase.
add | USB address of the setup request |
payload | To return the next buffer address |
payload_size | To return the size of next buffer |
true
, if a new buffer is available, otherwise stop the request. typedef void(* uhd_callback_trans_t)(usb_add_t add, usb_ep_t ep, uhd_trans_status_t status, iram_size_t nb_transfered) |
End of transfer callback function type.
Registered by uhd_ep_run() Callback called by USB interrupt after data transfer or abort (reset,...).
add | USB address used by the transfer |
status | Transfer status |
nb_transfered | Number of data transfered |
enum uhd_speed_t |
enum uhd_trans_status_t |
Endpoint transfer status The status field is updated after each transaction attempt, whether successful or not.
void uhc_notify_connection | ( | bool | b_plug | ) |
Notify device connection or disconnection.
b_plug | Device connection, if true |
References Assert, g_uhc_device_root, uhc_connection_tree(), uhc_power_running, and UHC_USB_ADD_NOT_VALID.
Referenced by _uhd_connect(), _uhd_disconnect(), and uhd_disable().
void uhc_notify_resume | ( | void | ) |
Notify that a resume bus occurs A resume can occur after a downstream or an upstream resume.
References uhc_remotewakeup(), and UHC_WAKEUP_EVENT.
Referenced by _uhd_sof_interrupt().
void uhc_notify_resume_lpm | ( | void | ) |
Notify that a resume bus occurs after a L1 state A resume can occur after a downstream or an upstream resume.
References UHC_WAKEUP_EVENT.
Referenced by _uhd_downstream_resume(), _uhd_upstream_resume(), and _uhd_wakeup().
void uhc_notify_sof | ( | bool | b_micro | ) |
Notify each start of frame sent by driver.
b_micro | It is a micro start of frame, if true |
References uhi_api_t::sof_notify, UHC_NB_UHI, uhc_sof_timeout, and uhc_sof_timeout_callback.
Referenced by _uhd_sof_interrupt().
void uhc_start | ( | void | ) |
Starts the host mode.
References g_uhc_device_root, uhc_sof_timeout, UHC_USB_ADD_NOT_VALID, and uhd_enable().
Referenced by main(), and usb_dual_enable().
void uhc_stop | ( | bool | b_id_stop | ) |
Stops the host mode.
References uhd_disable().
void uhd_disable | ( | bool | b_id_stop | ) |
Disables the USB host mode.
b_id_stop | Stop ID pin management, if true. |
References cpu_irq_restore(), cpu_irq_save(), dev, EXTINT_CALLBACK_TYPE_DETECT, extint_chan_disable_callback(), uhc_notify_connection(), uhd_sleep_mode(), UHD_STATE_WAIT_ID_HOST, UNUSED, usb_dual_disable(), USB_HOST_CALLBACK_CONNECT, USB_HOST_CALLBACK_DISCONNECT, USB_HOST_CALLBACK_RAMACER, USB_HOST_CALLBACK_RESET, USB_HOST_CALLBACK_SOF, usb_host_disable_callback(), and USB_VBUS_EIC_LINE.
Referenced by uhc_stop().
void uhd_enable | ( | void | ) |
Enables the USB host mode Start the ID pin management if the ID pin is available.
References _uhd_connect(), _uhd_disconnect(), _uhd_downstream_resume(), _uhd_ram_error(), _uhd_reset(), _uhd_sof_interrupt(), _uhd_upstream_resume(), _uhd_vbus_handler(), _uhd_wakeup(), _usb_vbus_config(), cpu_irq_restore(), cpu_irq_save(), dbg_print, dev, is_usb_vbus_high, usb_config::select_host_mode, uhd_b_suspend_requested, uhd_ctrl_request_timeout, uhd_resume_start, uhd_sleep_mode(), UHD_STATE_DISCONNECT, UHD_STATE_NO_VBUS, uhd_suspend_start, usb_dual_enable(), usb_enable(), usb_get_config_defaults(), USB_HOST_CALLBACK_CONNECT, USB_HOST_CALLBACK_DISCONNECT, USB_HOST_CALLBACK_DNRSM, USB_HOST_CALLBACK_RAMACER, USB_HOST_CALLBACK_RESET, USB_HOST_CALLBACK_SOF, USB_HOST_CALLBACK_UPRSM, USB_HOST_CALLBACK_WAKEUP, usb_host_enable_callback(), usb_host_register_callback(), and usb_init().
Referenced by uhc_start().
Configures and enables a control endpoint 0.
add | USB address of endpoint |
ep_size | Endpoint control maximum size |
1
if the endpoint is enabled, otherwise 0
. References _uhd_ep0_error(), _uhd_ep0_setup(), _uhd_ep0_stall(), _uhd_ep0_transfer_complete(), usb_host_pipe_config::binterval, dev, usb_host_pipe_config::device_address, usb_host_pipe_config::size, USB_HOST_PIPE_CALLBACK_ERROR, USB_HOST_PIPE_CALLBACK_SETUP, USB_HOST_PIPE_CALLBACK_STALL, USB_HOST_PIPE_CALLBACK_TRANSFER_COMPLETE, usb_host_pipe_enable_callback(), usb_host_pipe_get_config_defaults(), usb_host_pipe_register_callback(), and usb_host_pipe_set_config().
Referenced by uhc_enumeration_step11(), uhc_enumeration_step5(), and uhc_enumeration_step9().
Aborts an on-going transfer on an endpoint.
If a transfer is on going, then it is stopped and the callback registered is called to signal the end of transfer. Note: The control endpoint is not authorized.
add | USB address of endpoint |
endp | Endpoint to abort |
References _uhd_ep_abort_pipe(), _uhd_get_pipe(), and UHD_TRANS_ABORTED.
bool uhd_ep_alloc | ( | usb_add_t | add, |
usb_ep_desc_t * | ep_desc, | ||
uhd_speed_t | speed | ||
) |
Configures and enables an endpoint.
add | USB address of endpoint |
ep_desc | Endpoint descriptor |
speed | Endpoint working speed |
1
if the endpoint is enabled, otherwise 0
. References _uhd_ep_error(), _uhd_ep_stall(), _uhd_pipe_trans_complete(), usb_ep_desc_t::bEndpointAddress, usb_host_pipe_config::binterval, usb_ep_desc_t::bInterval, usb_ep_desc_t::bmAttributes, dev, usb_host_pipe_config::device_address, usb_host_pipe_config::endpoint_address, le16_to_cpu, usb_host_pipe_config::pipe_type, usb_host_pipe_config::size, USB_EP_TYPE_MASK, USB_HOST_PIPE_CALLBACK_ERROR, USB_HOST_PIPE_CALLBACK_STALL, USB_HOST_PIPE_CALLBACK_TRANSFER_COMPLETE, usb_host_pipe_enable_callback(), usb_host_pipe_get_config(), usb_host_pipe_get_config_defaults(), usb_host_pipe_register_callback(), usb_host_pipe_set_config(), USB_HOST_PIPE_TYPE_DISABLE, and usb_ep_desc_t::wMaxPacketSize.
Referenced by uhi_hid_mouse_install().
Disables an endpoint or all endpoint of a device.
add | USB address of endpoint |
endp | Endpoint number and direction (USB_EP_DIR_IN/OUT). Remove all endpoints of USB address, if 0xFF. |
References _uhd_ctrl_request_end(), _uhd_pipe_finish_job(), dev, usb_host_pipe_config::device_address, usb_host_pipe_config::endpoint_address, usb_host_pipe_config::pipe_type, uhd_ctrl_request_timeout, UHD_TRANS_DISCONNECT, usb_host_pipe_get_config(), and USB_HOST_PIPE_TYPE_DISABLE.
Referenced by uhc_connection_tree(), uhc_enumeration_error(), uhc_enumeration_step11(), uhc_enumeration_step14(), uhc_enumeration_step5(), and uhc_enumeration_step9().
bool uhd_ep_run | ( | usb_add_t | add, |
usb_ep_t | endp, | ||
bool | b_shortpacket, | ||
uint8_t * | buf, | ||
iram_size_t | buf_size, | ||
uint16_t | timeout, | ||
uhd_callback_trans_t | callback | ||
) |
Allows to receive or send data on an endpoint.
If a USB DMA is available, the driver uses it to transfer endpoint data from or to internal RAM. When the transfer is finished or aborted (stall, reset, ...), the callback is called. This callback returns the transfer status and eventually the number of byte transfered. Note: The control endpoint is not authorized.
add | USB address of endpoint |
endp | Endpoint number |
b_shortpacket | Enabled automatic short packet |
buf | Buffer on Internal RAM to send or fill. It must be align, then use COMPILER_WORD_ALIGNED. |
buf_size | Buffer size to send or fill |
timeout | Transfer timeout (ms) |
callback | NULL or function to call at the end of transfer |
1
if function was successfully done, otherwise 0
. References _uhd_get_pipe(), _uhd_pipe_trans_complete(), uhd_pipe_job_t::b_shortpacket, uhd_pipe_job_t::buf, uhd_pipe_job_t::buf_size, uhd_pipe_job_t::busy, uhd_pipe_job_t::call_end, cpu_irq_restore(), cpu_irq_save(), dev, uhd_pipe_job_t::nb_trans, usb_pipe_callback_parameter::pipe_num, usb_pipe_callback_parameter::required_size, uhd_pipe_job_t::timeout, and usb_pipe_callback_parameter::transfered_size.
Referenced by uhi_hid_mouse_start_trans_report().
uint16_t uhd_get_frame_number | ( | void | ) |
Returns the current Start Of Frame (SOF) number.
References dev.
uint16_t uhd_get_microframe_number | ( | void | ) |
Returns the current micro start of frame number.
uhd_speed_t uhd_get_speed | ( | void | ) |
Returns the speed of connected device.
References Assert, dev, UHD_SPEED_FULL, UHD_SPEED_LOW, USB_SPEED_FULL, and USB_SPEED_LOW.
Referenced by uhc_enumeration_step4().
bool uhd_is_suspend | ( | void | ) |
Test if the suspend state is enabled on the USB line.
References dev.
Referenced by uhc_is_suspend().
void uhd_resume | ( | void | ) |
Enables the IDLE state on the USB line.
The IDLE state is enable when SOF are present on USB line. A Downstream Resume signal can be sent.
References dbg_print, dev, usb_host_pipe_config::pipe_type, uhd_lpm_suspend, uhd_resume_start, uhd_sleep_mode(), UHD_STATE_IDLE, uhd_suspend_start, usb_host_pipe_get_config(), and USB_HOST_PIPE_TYPE_EXTENDED.
Referenced by uhc_resume().
void uhd_send_reset | ( | uhd_callback_reset_t | callback | ) |
Enables the Reset state on the USB line.
callback | Callback when reset sequence is finished |
References dev, and uhd_reset_callback.
Referenced by uhc_enumeration_reset().
bool uhd_setup_request | ( | usb_add_t | add, |
usb_setup_req_t * | req, | ||
uint8_t * | payload, | ||
uint16_t | payload_size, | ||
uhd_callback_setup_run_t | callback_run, | ||
uhd_callback_setup_end_t | callback_end | ||
) |
Add a setup request in the control endpoint setup queue.
Note: Request timeout is 5s.
add | USB address of control endpoint |
req | Setup request definition |
payload | Buffer to use in setup DATA phase |
payload_size | Size of buffer used in DATA phase |
callback_run | Callback to call if buffer is empty or full |
callback_end | Callback to call when request is finish |
true
if the request has been accepted, otherwise false
. Note: The swap of "req.wValues" from uin16_t to le16_t is done by UHD. References _uhd_ctrl_phase_setup(), uhd_ctrl_request_t::add, Assert, uhd_ctrl_request_t::callback_end, uhd_ctrl_request_t::callback_run, cpu_irq_restore(), cpu_irq_save(), uhd_ctrl_request_t::next_request, uhd_ctrl_request_t::payload, uhd_ctrl_request_t::payload_size, and uhd_ctrl_request_t::req.
Referenced by uhc_dev_get_string(), uhc_dev_is_high_speed_support(), uhc_enumeration_step11(), uhc_enumeration_step12(), uhc_enumeration_step13(), uhc_enumeration_step14(), uhc_enumeration_step5(), uhc_enumeration_step9(), uhc_remotewakeup(), and uhc_request_bos_desc().
void uhd_suspend | ( | void | ) |
Enables the suspend state on the USB line.
The SUSPEND state is enable when SOF are disabled on USB line.
References dev, uhd_b_suspend_requested, uhd_ctrl_request_timeout, uhd_pipes_unfreeze, and uhd_suspend_start.
Referenced by _uhd_ctrl_request_end(), uhc_enumeration_suspend(), and uhc_suspend().
Enables the suspend L1 state on the USB line.
The SUSPEND LPM state is enable when a LPM transaction is done.
b_remotewakeup | Authorize the remote wakeup features, if true |
hird | Host Initiated Resume Duration |
References dbg_print, dev, uhd_ctrl_request_timeout, and usb_host_pipe_lpm_job().
Referenced by uhc_suspend_lpm().
void uhd_test_mode_j | ( | void | ) |
void uhd_test_mode_k | ( | void | ) |
void uhd_test_mode_packet | ( | void | ) |
void uhd_test_mode_se0_nak | ( | void | ) |