Microchip® Advanced Software Framework

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
USB Host Driver Implement (UHD)

USB low-level driver for USB Host mode.

Data Structures

struct  uhd_ctrl_request_t
 Structure to store the high level setup request. More...
 
struct  uhd_pipe_job_t
 Structure definition to store registered jobs on a pipe. More...
 

Macros

#define dbg_print(...)
 
#define UHD_ENDPOINT_MAX_TRANS   ((8 *1024 ) - 1)
 
#define USB_STATUS_PIPE_CRC16ER   (1 << 4)
 
#define USB_STATUS_PIPE_DAPIDER   (1 << 1)
 
#define USB_STATUS_PIPE_DTGLER   (1 << 0)
 
#define USB_STATUS_PIPE_PIDER   (1 << 2)
 
#define USB_STATUS_PIPE_TOUTER   (1 << 3)
 

Functions

static void _uhd_connect (struct usb_module *module_inst)
 Manages connection interrupt. More...
 
static void _uhd_ctrl_phase_data_in (uint16_t nb_byte_received)
 Manages the DATA IN phase on control endpoint. More...
 
static void _uhd_ctrl_phase_data_in_start (void)
 Starts the DATA IN phase on control endpoint. More...
 
static void _uhd_ctrl_phase_data_out (void)
 Manages the DATA OUT phase on control endpoint. More...
 
static void _uhd_ctrl_phase_setup (void)
 Sends a USB setup packet to start a control request sequence. More...
 
static void _uhd_ctrl_phase_zlp_in (void)
 Starts the ZLP IN phase on control endpoint. More...
 
static void _uhd_ctrl_phase_zlp_out (void)
 Starts the ZLP OUT phase on control endpoint. More...
 
static void _uhd_ctrl_request_end (uhd_trans_status_t status)
 Call the callback linked to control request and start the next request. More...
 
static void _uhd_disconnect (struct usb_module *module_inst)
 Manages disconnection interrupt. More...
 
static void _uhd_downstream_resume (struct usb_module *module_inst)
 Manages downstream resume interrupt. More...
 
static void _uhd_ep0_error (struct usb_module *module_inst, void *pointer)
 Manages endpoint 0 error interrupt. More...
 
static void _uhd_ep0_setup (struct usb_module *module_inst, void *null)
 Manages endpoint 0 setup interrupt. More...
 
static void _uhd_ep0_stall (struct usb_module *module_inst, void *null)
 Manages endpoint 0 stall interrupt. More...
 
static void _uhd_ep0_transfer_complete (struct usb_module *module_inst, void *pointer)
 Manages endpoint 0 transfer complete interrupt. More...
 
static void _uhd_ep_abort_pipe (uint8_t pipe, uhd_trans_status_t status)
 Aborts the on-going transfer on a pipe. More...
 
static void _uhd_ep_error (struct usb_module *module_inst, void *pointer)
 Manages pipe endpoint error callback. More...
 
static void _uhd_ep_stall (struct usb_module *module_inst, void *pointer)
 Manages pipe endpoint stall interrupt. More...
 
static uint8_t _uhd_get_pipe (usb_add_t add, usb_ep_t endp)
 Returns the pipe number matching a USB endpoint. More...
 
static void _uhd_pipe_finish_job (uint8_t pipe, uhd_trans_status_t status)
 Call the callback linked to the end of pipe transfer. More...
 
static void _uhd_pipe_trans_complete (struct usb_module *module_inst, void *pointer)
 Computes and starts the next transfer on a pipe. More...
 
static void _uhd_ram_error (struct usb_module *module_inst)
 Manages ram access error interrupt. More...
 
static void _uhd_reset (struct usb_module *module_inst)
 Manages bus reset interrupt. More...
 
static void _uhd_sof_interrupt (struct usb_module *module_inst)
 Manages timeouts and actions based on SOF events. More...
 
static void _uhd_upstream_resume (struct usb_module *module_inst)
 Manages upstream resume interrupt. More...
 
static void _uhd_wakeup (struct usb_module *module_inst)
 Manages wakeup interrupt. More...
 
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...
 
bool uhd_ep0_alloc (usb_add_t add, uint8_t ep_size)
 Configures and enables a control endpoint 0. More...
 
void uhd_ep_abort (usb_add_t add, usb_ep_t endp)
 Aborts an on-going transfer on an endpoint. 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...
 
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...
 

Variables

struct usb_module dev
 
static bool uhd_lpm_suspend = false
 Notify that USB Host is enter in suspend LPM state. More...
 
static uhd_callback_reset_t uhd_reset_callback = NULL
 Store the callback to be called at the end of reset signal. More...
 

Power management

enum  uhd_usb_state_enum {
  UHD_STATE_OFF = 0,
  UHD_STATE_WAIT_ID_HOST = 1,
  UHD_STATE_NO_VBUS = 2,
  UHD_STATE_DISCONNECT = 3,
  UHD_STATE_SUSPEND = 4,
  UHD_STATE_SUSPEND_LPM = 5,
  UHD_STATE_IDLE = 6
}
 States of USB interface. More...
 
enum sleepmgr_mode sleep_mode []
 
static enum uhd_usb_state_enum uhd_state = UHD_STATE_OFF
 
static void uhd_sleep_mode (enum uhd_usb_state_enum new_state)
 Manages the sleep mode following the USB state. More...
 

Control endpoint low level management routine.

This function performs control endpoint management.

It handles the SETUP/DATA/HANDSHAKE phases of a control transaction.

enum  uhd_ctrl_request_phase_t {
  UHD_CTRL_REQ_PHASE_SETUP = 0,
  UHD_CTRL_REQ_PHASE_DATA_OUT = 1,
  UHD_CTRL_REQ_PHASE_DATA_IN = 2,
  UHD_CTRL_REQ_PHASE_ZLP_IN = 3,
  UHD_CTRL_REQ_PHASE_ZLP_OUT = 4
}
 Bit definitions to store setup request state machine. More...
 
uint8_t uhd_ctrl_buffer [64]
 Buffer to store the sent/received data on control endpoint. More...
 
struct uhd_ctrl_request_tuhd_ctrl_request_first
 Entry points of setup request list. More...
 
struct uhd_ctrl_request_tuhd_ctrl_request_last
 
volatile uint16_t uhd_ctrl_request_timeout
 Remaining time for on-going setup request (No request on-going if equal 0) More...
 
uint16_t uhd_ctrl_nb_trans
 Number of transfered byte on DATA phase of current setup request. More...
 
static bool uhd_b_suspend_requested
 Flag to delay a suspend request after all on-going setup request. More...
 
uhd_ctrl_request_phase_t uhd_ctrl_request_phase
 

Management of bulk/interrupt/isochronous endpoints

The UHD manages the data transfer on endpoints:

  • Start data transfer on endpoint with USB DMA
  • Send a ZLP packet if requested
  • Call registered callback to signal end of transfer The transfer abort and stall feature are supported.
static uhd_pipe_job_t uhd_pipe_job [USB_PIPE_NUM-1]
 Array to register a job on bulk/interrupt/isochronous endpoint. More...
 
static uint8_t uhd_suspend_start
 Variables to manage the suspend/resume sequence. More...
 
static uint8_t uhd_resume_start
 
static uint8_t uhd_pipes_unfreeze
 

#define UHD_ENDPOINT_MAX_TRANS   ((8 *1024 ) - 1)
#define USB_STATUS_PIPE_CRC16ER   (1 << 4)

Referenced by _uhd_ep0_error(), and _uhd_ep_error().

#define USB_STATUS_PIPE_DAPIDER   (1 << 1)

Referenced by _uhd_ep0_error(), and _uhd_ep_error().

#define USB_STATUS_PIPE_DTGLER   (1 << 0)

Referenced by _uhd_ep0_error(), and _uhd_ep_error().

#define USB_STATUS_PIPE_PIDER   (1 << 2)

Referenced by _uhd_ep0_error(), and _uhd_ep_error().

#define USB_STATUS_PIPE_TOUTER   (1 << 3)

Referenced by _uhd_ep0_error(), and _uhd_ep_error().

Bit definitions to store setup request state machine.

Enumerator
UHD_CTRL_REQ_PHASE_SETUP 

Wait a SETUP packet.

UHD_CTRL_REQ_PHASE_DATA_OUT 

Wait a OUT data packet.

UHD_CTRL_REQ_PHASE_DATA_IN 

Wait a IN data packet.

UHD_CTRL_REQ_PHASE_ZLP_IN 

Wait a IN ZLP packet.

UHD_CTRL_REQ_PHASE_ZLP_OUT 

Wait a OUT ZLP packet.

States of USB interface.

Enumerator
UHD_STATE_OFF 
UHD_STATE_WAIT_ID_HOST 
UHD_STATE_NO_VBUS 
UHD_STATE_DISCONNECT 
UHD_STATE_SUSPEND 
UHD_STATE_SUSPEND_LPM 
UHD_STATE_IDLE 

static void _uhd_connect ( struct usb_module module_inst)
static
static void _uhd_ctrl_phase_data_in ( uint16_t  nb_byte_received)
static

Manages the DATA IN phase on control endpoint.

Parameters
nb_byte_receivedNumber of bytes received

In HUB mode, the control pipe is always configured to 64B

thus the short packet flag must be computed

References _uhd_ctrl_phase_zlp_out(), uhd_ctrl_request_t::callback_run, dev, usb_host_pipe_config::device_address, uhd_ctrl_request_t::payload, uhd_ctrl_request_t::payload_size, uhd_ctrl_request_t::req, usb_host_pipe_config::size, uhd_ctrl_buffer, uhd_ctrl_nb_trans, usb_host_pipe_get_config(), usb_host_pipe_read_job(), and usb_setup_req_t::wLength.

Referenced by _uhd_ep0_transfer_complete().

static void _uhd_ctrl_phase_data_in_start ( void  )
static
static void _uhd_ctrl_phase_zlp_in ( void  )
static

Starts the ZLP IN phase on control endpoint.

References dev, uhd_ctrl_buffer, UHD_CTRL_REQ_PHASE_ZLP_IN, uhd_ctrl_request_phase, and usb_host_pipe_read_job().

Referenced by _uhd_ctrl_phase_data_out(), and _uhd_ep0_setup().

static void _uhd_ctrl_phase_zlp_out ( void  )
static

Starts the ZLP OUT phase on control endpoint.

References dev, uhd_ctrl_buffer, UHD_CTRL_REQ_PHASE_ZLP_OUT, uhd_ctrl_request_phase, and usb_host_pipe_write_job().

Referenced by _uhd_ctrl_phase_data_in().

static void _uhd_disconnect ( struct usb_module module_inst)
static
static void _uhd_downstream_resume ( struct usb_module module_inst)
static

Manages downstream resume interrupt.

Parameters
module_instPointer to USB module instance

References dbg_print, dev, uhc_notify_resume_lpm(), uhd_lpm_suspend, uhd_resume_start, uhd_sleep_mode(), UHD_STATE_IDLE, USB_HOST_CALLBACK_DNRSM, USB_HOST_CALLBACK_UPRSM, USB_HOST_CALLBACK_WAKEUP, and usb_host_disable_callback().

Referenced by uhd_enable().

static void _uhd_ep0_error ( struct usb_module module_inst,
void *  pointer 
)
static
static void _uhd_ep0_setup ( struct usb_module module_inst,
void *  null 
)
static
static void _uhd_ep0_stall ( struct usb_module module_inst,
void *  null 
)
static

Manages endpoint 0 stall interrupt.

Parameters
module_instPointer to USB module instance
nullNot used

References _uhd_ctrl_request_end(), dbg_print, dev, usb_host_pipe_config::pipe_type, UHD_TRANS_STALL, usb_host_pipe_get_config(), usb_host_pipe_set_config(), USB_HOST_PIPE_TYPE_CONTROL, and USB_HOST_PIPE_TYPE_EXTENDED.

Referenced by uhd_ep0_alloc().

static void _uhd_ep_abort_pipe ( uint8_t  pipe,
uhd_trans_status_t  status 
)
static

Aborts the on-going transfer on a pipe.

Parameters
pipePipe number
statusReason of abort

References _uhd_pipe_finish_job(), and dev.

Referenced by _uhd_ep_error(), _uhd_ep_stall(), _uhd_sof_interrupt(), and uhd_ep_abort().

static void _uhd_ep_error ( struct usb_module module_inst,
void *  pointer 
)
static
static void _uhd_ep_stall ( struct usb_module module_inst,
void *  pointer 
)
static

Manages pipe endpoint stall interrupt.

Parameters
module_instPointer to USB module instance
pointerPointer to USB pipe transfer callback status parameters

References _uhd_ep_abort_pipe(), dbg_print, dev, usb_pipe_callback_parameter::pipe_num, and UHD_TRANS_STALL.

Referenced by uhd_ep_alloc().

static uint8_t _uhd_get_pipe ( usb_add_t  add,
usb_ep_t  endp 
)
static

Returns the pipe number matching a USB endpoint.

Parameters
addUSB device address
endpEndpoint Address
Returns
Pipe number

References dev, usb_host_pipe_config::device_address, usb_host_pipe_config::endpoint_address, and usb_host_pipe_get_config().

Referenced by uhd_ep_abort(), and uhd_ep_run().

static void _uhd_pipe_finish_job ( uint8_t  pipe,
uhd_trans_status_t  status 
)
static
static void _uhd_pipe_trans_complete ( struct usb_module module_inst,
void *  pointer 
)
static

Computes and starts the next transfer on a pipe.

Parameters
module_instPointer to USB module instance
pointerPointer to USB pipe transfer callback status parameters

The USB hardware supports a maximum transfer size of UHD_ENDPOINT_MAX_TRANS Bytes

If all previous requested data have been received and user buffer not full then need to receive other data

References _uhd_pipe_finish_job(), Assert, uhd_pipe_job_t::b_shortpacket, uhd_pipe_job_t::buf, uhd_pipe_job_t::buf_internal, uhd_pipe_job_t::buf_size, uhd_pipe_job_t::busy, cpu_irq_restore(), cpu_irq_save(), dev, usb_host_pipe_config::endpoint_address, uhd_pipe_job_t::nb_trans, usb_pipe_callback_parameter::pipe_num, usb_pipe_callback_parameter::required_size, usb_host_pipe_config::size, usb_pipe_callback_parameter::transfered_size, UHD_ENDPOINT_MAX_TRANS, UHD_TRANS_NOERROR, USB_EP_DIR_IN, USB_HOST_PIPE_CALLBACK_TRANSFER_COMPLETE, usb_host_pipe_enable_callback(), usb_host_pipe_get_config(), usb_host_pipe_read_job(), usb_host_pipe_set_auto_zlp(), and usb_host_pipe_write_job().

Referenced by uhd_ep_alloc(), and uhd_ep_run().

static void _uhd_ram_error ( struct usb_module module_inst)
static

Manages ram access error interrupt.

Parameters
module_instPointer to USB module instance

References dbg_print.

Referenced by uhd_enable().

static void _uhd_reset ( struct usb_module module_inst)
static

Manages bus reset interrupt.

Parameters
module_instPointer to USB module instance

References uhd_reset_callback.

Referenced by uhd_enable().

static void _uhd_sof_interrupt ( struct usb_module module_inst)
static

Manages timeouts and actions based on SOF events.

  • Suspend delay
  • Resume delay
  • Setup packet delay
  • Timeout on endpoint control transfer
  • Timeouts on bulk/interrupt/isochronous endpoint transfers
  • UHC user notification
  • SOF user notification
Parameters
module_instPointer to USB module instance

References _uhd_ctrl_request_end(), _uhd_ep_abort_pipe(), uhd_pipe_job_t::busy, dbg_print, dev, uhd_pipe_job_t::timeout, uhc_notify_resume(), uhc_notify_sof(), UHC_SOF_EVENT, uhd_ctrl_request_timeout, uhd_pipes_unfreeze, uhd_resume_start, uhd_sleep_mode(), UHD_STATE_SUSPEND, uhd_suspend_start, UHD_TRANS_TIMEOUT, usb_get_state_machine_status(), USB_HOST_CALLBACK_DNRSM, USB_HOST_CALLBACK_UPRSM, USB_HOST_CALLBACK_WAKEUP, and usb_host_enable_callback().

Referenced by uhd_enable().

static void _uhd_upstream_resume ( struct usb_module module_inst)
static

Manages upstream resume interrupt.

Parameters
module_instPointer to USB module instance

References dbg_print, dev, uhc_notify_resume_lpm(), uhd_lpm_suspend, uhd_resume_start, uhd_sleep_mode(), UHD_STATE_IDLE, USB_HOST_CALLBACK_DNRSM, USB_HOST_CALLBACK_UPRSM, USB_HOST_CALLBACK_WAKEUP, and usb_host_disable_callback().

Referenced by uhd_enable().

static void _uhd_wakeup ( struct usb_module module_inst)
static
void uhd_ep_abort ( usb_add_t  add,
usb_ep_t  endp 
)

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.

Parameters
addUSB address of endpoint
endpEndpoint to abort

References _uhd_ep_abort_pipe(), _uhd_get_pipe(), and UHD_TRANS_ABORTED.

void uhd_ep_free ( usb_add_t  add,
usb_ep_t  endp 
)
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.

Parameters
addUSB address of endpoint
endpEndpoint number
b_shortpacketEnabled automatic short packet
bufBuffer on Internal RAM to send or fill. It must be align, then use COMPILER_WORD_ALIGNED.
buf_sizeBuffer size to send or fill
timeoutTransfer timeout (ms)
callbackNULL or function to call at the end of transfer
Warning
About b_shortpacket, for OUT endpoint it means that a short packet or a Zero Length Packet (ZLP) must be sent to the USB line to properly close the USB transfer at the end of the data transfer. For Bulk and Interrupt IN endpoint, it will automatically stop the transfer at the end of the data transfer (received short packet).
About buf_size, for OUT endpoint the data is sent packet by packet until size is achieved. If the size is multiple of endpoint size ZLP may be sent according to the b_shortpacket setting. For IN endpoint the data is received packet by packet, if the last packet exceeds the buffer size, the overflow data will be discarded. So for IN endpoint it's better to allocate buffer size aligned to endpoint size so no returned data is lost.
About timeout, for BULK endpoint with timeout set to zero, it means that the transfer will never be stopped before transfer done. Since most of USB embedded peripherals do not manage the transfer bandwidth by peripheral hardware, such a BULK transfer will occupy all USB non-periodic transfer bandwidth. In this case, other BULK transfers started later will be pending until this transfer is done and bandwidth released. So it is better to use BULK transfers with none zero timeout.
Returns
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_msc_transfer().

uint16_t uhd_get_frame_number ( void  )

Returns the current Start Of Frame (SOF) number.

Returns
current start of frame number.

References dev.

uint16_t uhd_get_microframe_number ( void  )

Returns the current micro start of frame number.

Returns
current micro start of frame number required in high speed mode.
uhd_speed_t uhd_get_speed ( void  )

Returns the speed of connected device.

Returns
Device speed

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.

Returns
USB line in SUSPEND state, if true

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.

Parameters
callbackCallback 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.

Parameters
addUSB address of control endpoint
reqSetup request definition
payloadBuffer to use in setup DATA phase
payload_sizeSize of buffer used in DATA phase
callback_runCallback to call if buffer is empty or full
callback_endCallback to call when request is finish
Returns
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(), uhc_request_bos_desc(), uhi_msc_enable_step1(), and uhi_msc_reset_endpoint().

static void uhd_sleep_mode ( enum uhd_usb_state_enum  new_state)
static
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().

bool uhd_suspend_lpm ( bool  b_remotewakeup,
uint8_t  hird 
)

Enables the suspend L1 state on the USB line.

The SUSPEND LPM state is enable when a LPM transaction is done.

Parameters
b_remotewakeupAuthorize the remote wakeup features, if true
hirdHost Initiated Resume Duration
Returns
USB line in SUSPEND state, if true

References dbg_print, dev, uhd_ctrl_request_timeout, and usb_host_pipe_lpm_job().

Referenced by uhc_suspend_lpm().

enum sleepmgr_mode sleep_mode[]
Initial value:
= {
}
Idle 0 mode.
Definition: samd/sleepmgr.h:62
Standby mode.
Definition: samd/sleepmgr.h:80
Idle 2 mode.
Definition: samd/sleepmgr.h:74

Referenced by sleepmgr_enter_sleep(), sleepmgr_get_sleep_mode(), system_set_sleepmode(), and uhd_sleep_mode().

bool uhd_b_suspend_requested
static

Flag to delay a suspend request after all on-going setup request.

Referenced by _uhd_ctrl_request_end(), uhd_enable(), and uhd_suspend().

uint8_t uhd_ctrl_buffer[64]

Buffer to store the sent/received data on control endpoint.

Used to avoid a RAM buffer overflow when the payload buffer is smaller than control endpoint size. Also used when payload buffer is not word aligned.

Referenced by _uhd_ctrl_phase_data_in(), _uhd_ctrl_phase_data_in_start(), _uhd_ctrl_phase_data_out(), _uhd_ctrl_phase_setup(), _uhd_ctrl_phase_zlp_in(), and _uhd_ctrl_phase_zlp_out().

uint16_t uhd_ctrl_nb_trans

Number of transfered byte on DATA phase of current setup request.

Referenced by _uhd_ctrl_phase_data_in(), _uhd_ctrl_phase_data_out(), _uhd_ctrl_phase_setup(), and _uhd_ctrl_request_end().

struct uhd_ctrl_request_t* uhd_ctrl_request_first

Entry points of setup request list.

Referenced by _uhd_ctrl_request_end().

struct uhd_ctrl_request_t* uhd_ctrl_request_last
volatile uint16_t uhd_ctrl_request_timeout

Remaining time for on-going setup request (No request on-going if equal 0)

Referenced by _uhd_ctrl_phase_setup(), _uhd_ctrl_request_end(), _uhd_sof_interrupt(), uhd_enable(), uhd_ep_free(), uhd_suspend(), and uhd_suspend_lpm().

bool uhd_lpm_suspend = false
static

Notify that USB Host is enter in suspend LPM state.

Referenced by _uhd_downstream_resume(), _uhd_ep0_transfer_complete(), _uhd_upstream_resume(), _uhd_wakeup(), and uhd_resume().

uhd_pipe_job_t uhd_pipe_job[USB_PIPE_NUM-1]
static

Array to register a job on bulk/interrupt/isochronous endpoint.

uint8_t uhd_pipes_unfreeze
static

Referenced by _uhd_sof_interrupt(), and uhd_suspend().

uhd_callback_reset_t uhd_reset_callback = NULL
static

Store the callback to be called at the end of reset signal.

Referenced by _uhd_reset(), and uhd_send_reset().

enum uhd_usb_state_enum uhd_state = UHD_STATE_OFF
static

Referenced by uhd_sleep_mode().

uint8_t uhd_suspend_start
static

Variables to manage the suspend/resume sequence.

Referenced by _uhd_connect(), _uhd_disconnect(), _uhd_sof_interrupt(), uhd_enable(), uhd_resume(), and uhd_suspend().