Microchip® Advanced Software Framework

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
USB Device Port Driver

UDP low-level driver for USB device mode.

UDP Custom configuration

The following UDP driver configuration must be included in the conf_usb.h file of the application.

UDD_USB_INT_LEVEL
Option to change the interrupt priority (0 to 15) by default 5 (recommended).

UDD_USB_INT_FUN
Option to fit interrupt function to what defined in exception table.

UDD_NO_SLEEP_MGR
Feature to work without sleep manager module. Default not defined. Note that with this feature defined sleep manager must not be used in application.

management

The USB driver is fully managed by interrupt and does not request periodic task. Thereby, the USB events use callbacks to transfer the information. The callbacks are declared in static during compilation or in variable during code execution.

Static declarations defined in conf_usb.h:

Dynamic callbacks, called "endpoint job" , are registered in udd_ep_job_t structure via the following functions:

mode management

The Sleep modes authorized :

Data Structures

struct  udd_ep_job_t
 Structure definition about job registered on an endpoint. More...
 

Macros

#define UDD_USB_INT_FUN   UDP_Handler
 

Functions

 ISR (UDD_USB_INT_FUN)
 Function called by UDP interrupt to manage USB Device interrupts. More...
 
void udd_attach (void)
 Attach device to the bus when possible. More...
 
void udd_detach (void)
 Detaches the device from the bus. More...
 
void udd_disable (void)
 Disables the USB Device mode. More...
 
void udd_enable (void)
 Enables the USB Device mode. More...
 
void udd_ep_abort (udd_ep_id_t ep)
 Aborts transfer on going on endpoint. More...
 
bool udd_ep_alloc (udd_ep_id_t ep, uint8_t bmAttributes, uint16_t MaxEndpointSize)
 Configures and enables an endpoint. More...
 
bool udd_ep_clear_halt (udd_ep_id_t ep)
 Clear the halted state of the endpoint ep. More...
 
void udd_ep_free (udd_ep_id_t ep)
 Disables an endpoint. More...
 
bool udd_ep_is_halted (udd_ep_id_t ep)
 Check if the endpoint ep is halted. More...
 
bool udd_ep_run (udd_ep_id_t ep, bool b_shortpacket, uint8_t *buf, iram_size_t buf_size, udd_callback_trans_t callback)
 Allows to receive or send data on an endpoint. More...
 
bool udd_ep_set_halt (udd_ep_id_t ep)
 Set the halted state of the endpoint ep. More...
 
bool udd_ep_wait_stall_clear (udd_ep_id_t ep, udd_callback_halt_cleared_t callback)
 Registers a callback to call when endpoint halt is cleared. More...
 
uint16_t udd_get_frame_number (void)
 Returns the current start of frame number. More...
 
uint16_t udd_get_micro_frame_number (void)
 Returns the current micro start of frame number. More...
 
uint8_t udd_getaddress (void)
 Returns the USB address of device. More...
 
bool udd_include_vbus_monitoring (void)
 Authorizes the VBUS event. More...
 
bool udd_is_high_speed (void)
 Test whether the USB Device Controller is running at high speed or not. More...
 
void udd_send_remotewakeup (void)
 The USB driver sends a resume signal called Upstream Resume. More...
 
void udd_set_address (uint8_t address)
 Changes the USB address of device. More...
 
void udd_set_setup_payload (uint8_t *payload, uint16_t payload_size)
 Load setup payload. More...
 

Power management routine.

static bool udd_b_idle
 State of USB line. More...
 
static void udd_sleep_mode (bool b_idle)
 Authorize or not the CPU powerdown mode. More...
 
#define UDP_SLEEP_MODE_USB_SUSPEND   SLEEPMGR_ACTIVE
 Definition of sleep levels. More...
 
#define UDP_SLEEP_MODE_USB_IDLE   SLEEPMGR_ACTIVE
 

VBus monitor routine

static void udd_vbus_handler (uint32_t id, uint32_t mask)
 USB VBus pin change handler. More...
 
#define udd_vbus_monitor_sleep_mode(lock)
 

Control endpoint low level management routine.

This function performs control endpoint management.

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

enum  udd_ctrl_ep_state_t {
  UDD_EPCTRL_SETUP = 0,
  UDD_EPCTRL_DATA_OUT = 1,
  UDD_EPCTRL_DATA_IN = 2,
  UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP = 3,
  UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP = 4,
  UDD_EPCTRL_STALL_REQ = 5
}
 Bit definitions about endpoint control state machine for udd_ep_control_state. More...
 
COMPILER_WORD_ALIGNED
udd_ctrl_request_t 
udd_g_ctrlreq
 Global variable to give and record information about setup request management. More...
 
static udd_ctrl_ep_state_t udd_ep_control_state
 State of the endpoint control management. More...
 
static uint16_t udd_ctrl_prev_payload_nb_trans
 Total number of data received/sent during data packet phase with previous payload buffers. More...
 
static uint16_t udd_ctrl_payload_nb_trans
 Number of data received/sent to/from udd_g_ctrlreq.payload buffer. More...
 
static void udd_reset_ep_ctrl (void)
 Reset control endpoint. More...
 
static void udd_ctrl_init (void)
 Reset control endpoint management. More...
 
static void udd_ctrl_setup_received (void)
 Managed reception of SETUP packet on control endpoint. More...
 
static void udd_ctrl_in_sent (void)
 Managed reception of IN packet on control endpoint. More...
 
static void udd_ctrl_out_received (void)
 Managed reception of OUT packet on control endpoint. More...
 
static void udd_ctrl_stall_data (void)
 Managed stall event of IN/OUT packet on control endpoint. More...
 
static void udd_ctrl_send_zlp_in (void)
 Send a ZLP IN on control endpoint. More...
 
static void udd_ctrl_send_zlp_out (void)
 Send a ZLP OUT on control endpoint. More...
 
static void udd_ctrl_endofrequest (void)
 Call callback associated to setup request. More...
 
static bool udd_ctrl_interrupt (void)
 Main interrupt routine for control endpoint. More...
 

Management of bulk/interrupt/isochronous endpoints

The UDD manages the data transfer on endpoints:

  • Start data transfer on endpoint with USB Device DMA
  • Send a ZLP packet if requested
  • Call callback registered to signal end of transfer The transfer abort and stall feature are supported.
static udd_ep_job_t udd_ep_job [USB_DEVICE_MAX_EP]
 Array to register a job on bulk/interrupt/isochronous endpoint. More...
 
static void udd_ep_job_table_reset (void)
 Reset all job table. More...
 
static void udd_ep_job_table_kill (void)
 Abort all endpoint jobs on going. More...
 
static bool udd_ep_in_sent (udd_ep_id_t ep, bool b_tx)
 Fill banks and send them. More...
 
static void udd_ep_out_received (udd_ep_id_t ep)
 Store received banks. More...
 
static void udd_ep_abort_job (udd_ep_id_t ep)
 Abort endpoint job on going. More...
 
static void udd_ep_finish_job (udd_ep_job_t *ptr_job, int status, uint8_t ep_num)
 Call the callback associated to the job which is finished. More...
 
static void udd_ep_ack_out_received (udd_ep_id_t ep)
 Ack OUT received event. More...
 
static bool udd_ep_write_fifo (udd_ep_id_t ep)
 Fill transmit data into FIFO. More...
 
static bool udd_ep_interrupt (void)
 Main interrupt routine for bulk/interrupt/isochronous endpoints. More...
 
#define UDD_EP_TRANSFER_BUFFER_END   0x2
 Job status to finish the job. More...
 

UDP Device properties

These macros give IP properties (from datasheets)

#define udd_get_endpoint_max_nbr()   (7)
 Get maximal number of endpoints (3S 4S 4E, 0~7) More...
 
#define UDD_MAX_PEP_NB   (udd_get_endpoint_max_nbr()+1)
 
#define udd_get_endpoint_bank_max_nbr(ep)   (((ep)==0||(ep)==3)?1:2)
 Get maximal number of banks of endpoint (3S, 1~2) More...
 
#define udd_get_endpoint_size_max(ep)   (((ep)==4||(ep)==5)?512:64)
 Get maximal size of endpoint (3S, 512/64) More...
 
#define udd_is_endpoint_support_iso(ep)   (((ep)==0||(ep)==3)?false:true)
 Get isochronous support (3S, endpoints 0 and 3 not support) More...
 
#define Is_udd_endpoint_dma_supported(ep)   (false)
 Get DMA support of endpoints (3S, always false) More...
 
#define Is_udd_endpoint_high_bw_supported(ep)   (false)
 Get High Band Width support of endpoints (3S, always false) More...
 

UDP Device vbus pin management

UDP peripheral does not support vbus management and it's monitored by a PIO pin.

This feature is optional, and it is enabled if USB_VBUS_PIN is defined in board.h and CONF_BOARD_USB_VBUS_DETECT defined in conf_board.h.

Note
ioport_init() must be invoked before using vbus pin functions since they use IOPORT API,
See Also
Common IOPORT API.
#define UDD_VBUS_DETECT
 
#define UDD_VBUS_IO   (defined(USB_VBUS_PIN) && UDD_VBUS_DETECT)
 
#define USB_VBUS_WKUP   0
 
#define udd_vbus_init(handler)
 
#define Is_udd_vbus_high()   ioport_get_pin_level(USB_VBUS_PIN)
 
#define Is_udd_vbus_low()   (!Is_udd_vbus_high())
 
#define udd_enable_vbus_interrupt()   pio_enable_pin_interrupt(USB_VBUS_PIN)
 
#define udd_disable_vbus_interrupt()   pio_disable_pin_interrupt(USB_VBUS_PIN)
 
#define udd_ack_vbus_interrupt(high)
 

UDP peripheral enable/disable

Warning
The UDP peripheral clock in the Power Management Controller (PMC) must be enabled before any read/write operations to the UDP registers including the UDP_TXVC register.
#define udd_enable_periph_ck()   pmc_enable_periph_clk(ID_UDP)
 
#define udd_disable_periph_ck()   pmc_disable_periph_clk(ID_UDP)
 
#define Is_udd_periph_ck_enabled()   pmc_is_periph_clk_enabled(ID_UDP)
 

UDP device attach control (by Pull-up)

These macros manage the UDP Device attach.

#define udd_detach_device()   ( Clr_bits(UDP->UDP_TXVC, UDP_TXVC_PUON))
 detaches from USB bus More...
 
#define udd_attach_device()   ( Set_bits(UDP->UDP_TXVC, UDP_TXVC_PUON))
 attaches to USB bus More...
 
#define Is_udd_detached()   (!Tst_bits(UDP->UDP_TXVC, UDP_TXVC_PUON))
 test if the device is detached More...
 

USBB UDP transceiver management

These macros allows to enable/disable pad and USBB hardware

#define udd_enable_transceiver()   ( Clr_bits(UDP->UDP_TXVC, UDP_TXVC_TXVDIS))
 
#define udd_disable_transceiver()   ( Set_bits(UDP->UDP_TXVC, UDP_TXVC_TXVDIS))
 
#define Is_udd_transceiver_enabled()   (!Tst_bits(UDP->UDP_TXVC, UDP_TXVC_TXVDIS))
 

UDP device bus events control

These macros manage the UDP Device bus events.

#define udd_disable_all_events()   (UDP->IDR = 0xFFFF)
 Manage misc events. More...
 
#define udd_disable_endpoint_events()   (UDP->IDR = 0xFF)
 
#define udd_enable_wakeups()   (UDP->UDP_IER = (UDP_IER_RXRSM|UDP_IER_EXTRSM|UDP_IER_WAKEUP))
 
#define udd_disable_wakeups()   (UDP->UDP_IDR = (UDP_IDR_RXRSM|UDP_IDR_EXTRSM|UDP_IDR_WAKEUP))
 
#define udd_ack_wakeups()   (UDP->UDP_ICR = (UDP_ICR_RXRSM|UDP_ICR_EXTRSM|UDP_ICR_WAKEUP))
 
#define Is_udd_any_wakeup()   (Tst_bits(UDP->UDP_ISR, (UDP_ICR_RXRSM|UDP_ICR_EXTRSM|UDP_ICR_WAKEUP)))
 
#define Is_udd_expected_wakeup()   ((UDP->UDP_ISR & (UDP_ICR_RXRSM|UDP_ICR_EXTRSM|UDP_ICR_WAKEUP)) & UDP->UDP_IMR)
 
#define udd_enable_remote_wake_up()   ( Set_bits(UDP->UDP_GLB_STAT, UDP_GLB_STAT_RMWUPE))
 Manage remote wake-up event. More...
 
#define udd_disable_remote_wake_up()   ( Clr_bits(UDP->UDP_GLB_STAT, UDP_GLB_STAT_RMWUPE))
 
#define Is_udd_remote_wake_up_enabled()   ( Tst_bits(UDP->UDP_GLB_STAT, UDP_GLB_STAT_RMWUPE))
 
#define udd_initiate_remote_wake_up()
 
#define Is_udd_pending_remote_wake_up()   ( Tst_bits(UDP->UDP_GLB_STAT, UDP_GLB_STAT_RSMINPR))
 
#define udd_enable_ext_resume_interrupt()   (UDP->UDP_IER = UDP_IER_EXTRSM)
 Manage end of resume event (ext/rx resume) The USB controller detects a valid "End of Resume" signal initiated by the host or detects a external "Resume" signal. More...
 
#define udd_disable_ext_resume_interrupt()   (UDP->UDP_IDR = UDP_IER_EXTRSM)
 
#define Is_udd_ext_resume_interrupt_enabled()   (Tst_bits(UDP->UDP_IMR, UDP_IMR_EXTRSM))
 
#define udd_ack_ext_resume()   (UDP->UDP_ICR = UDP_IER_EXTRSM)
 
#define Is_udd_ext_resume()   (Tst_bits(UDP->UDP_ISR, UDP_IER_EXTRSM))
 
#define udd_enable_resume_interrupt()   (UDP->UDP_IER = UDP_IER_RXRSM)
 
#define udd_disable_resume_interrupt()   (UDP->UDP_IDR = UDP_IDR_RXRSM)
 
#define Is_udd_resume_interrupt_enabled()   (Tst_bits(UDP->UDP_IMR, UDP_IMR_RXRSM))
 
#define udd_ack_resume()   (UDP->UDP_ICR = UDP_ICR_RXRSM)
 
#define Is_udd_resume()   (Tst_bits(UDP->UDP_ISR, UDP_ISR_RXRSM))
 
#define udd_enable_wake_up_interrupt()   (UDP->UDP_IER = UDP_IER_WAKEUP)
 Manage wake-up event (=usb line activity) The USB controller is reactivated by a filtered non-idle signal from the lines. More...
 
#define udd_disable_wake_up_interrupt()   (UDP->UDP_IDR = UDP_IDR_WAKEUP)
 
#define Is_udd_wake_up_interrupt_enabled()   (Tst_bits(UDP->UDP_IMR, UDP_IMR_WAKEUP))
 
#define udd_ack_wake_up()   (UDP->UDP_ICR = UDP_ICR_WAKEUP)
 
#define Is_udd_wake_up()   (Tst_bits(UDP->UDP_ISR, UDP_ISR_WAKEUP))
 
#define udd_ack_reset()   (UDP->UDP_ICR = UDP_ISR_ENDBUSRES)
 Manage reset event Set when a USB "End of Reset" has been detected. More...
 
#define Is_udd_reset()   (Tst_bits(UDP->UDP_ISR, UDP_ISR_ENDBUSRES))
 
#define udd_enable_sof_interrupt()   (UDP->UDP_IER = UDP_ISR_SOFINT)
 Manage start of frame event. More...
 
#define udd_disable_sof_interrupt()   (UDP->UDP_IDR = UDP_ISR_SOFINT)
 
#define Is_udd_sof_interrupt_enabled()   (Tst_bits(UDP->UDP_IMR, UDP_ISR_SOFINT))
 
#define udd_ack_sof()   (UDP->UDP_ICR = UDP_ISR_SOFINT)
 
#define Is_udd_sof()   (Tst_bits(UDP->UDP_ISR, UDP_ISR_SOFINT))
 
#define udd_frame_number()   (Rd_bitfield(UDP->UDP_FRM_NUM, UDP_FRM_NUM_FRM_NUM_Msk))
 
#define Is_udd_frame_number_crc_error()   (Tst_bits(UDP->UDP_FRM_NUM, UDP_FRM_NUM_FRM_ERR))
 
#define udd_enable_suspend_interrupt()   (UDP->UDP_IER = UDP_ISR_RXSUSP)
 Manage suspend event. More...
 
#define udd_disable_suspend_interrupt()   (UDP->UDP_IDR = UDP_ISR_RXSUSP)
 
#define Is_udd_suspend_interrupt_enabled()   (Tst_bits(UDP->UDP_IMR, UDP_ISR_RXSUSP))
 
#define udd_ack_suspend()   (UDP->UDP_ICR = UDP_ISR_RXSUSP)
 
#define udd_raise_suspend()   (UDP->UDP_ISR = UDP_ISR_RXSUSP)
 
#define Is_udd_suspend()   (Tst_bits(UDP->UDP_ISR, UDP_ISR_RXSUSP))
 

#define Is_udd_any_wakeup ( )    (Tst_bits(UDP->UDP_ISR, (UDP_ICR_RXRSM|UDP_ICR_EXTRSM|UDP_ICR_WAKEUP)))
#define Is_udd_detached ( )    (!Tst_bits(UDP->UDP_TXVC, UDP_TXVC_PUON))

test if the device is detached

#define Is_udd_endpoint_dma_supported (   ep)    (false)

Get DMA support of endpoints (3S, always false)

#define Is_udd_endpoint_high_bw_supported (   ep)    (false)

Get High Band Width support of endpoints (3S, always false)

#define Is_udd_expected_wakeup ( )    ((UDP->UDP_ISR & (UDP_ICR_RXRSM|UDP_ICR_EXTRSM|UDP_ICR_WAKEUP)) & UDP->UDP_IMR)
#define Is_udd_ext_resume ( )    (Tst_bits(UDP->UDP_ISR, UDP_IER_EXTRSM))

Referenced by ISR().

#define Is_udd_ext_resume_interrupt_enabled ( )    (Tst_bits(UDP->UDP_IMR, UDP_IMR_EXTRSM))

Referenced by ISR().

#define Is_udd_frame_number_crc_error ( )    (Tst_bits(UDP->UDP_FRM_NUM, UDP_FRM_NUM_FRM_ERR))
#define Is_udd_pending_remote_wake_up ( )    ( Tst_bits(UDP->UDP_GLB_STAT, UDP_GLB_STAT_RSMINPR))
#define Is_udd_periph_ck_enabled ( )    pmc_is_periph_clk_enabled(ID_UDP)
#define Is_udd_remote_wake_up_enabled ( )    ( Tst_bits(UDP->UDP_GLB_STAT, UDP_GLB_STAT_RMWUPE))
#define Is_udd_reset ( )    (Tst_bits(UDP->UDP_ISR, UDP_ISR_ENDBUSRES))

Referenced by ISR().

#define Is_udd_resume ( )    (Tst_bits(UDP->UDP_ISR, UDP_ISR_RXRSM))

Referenced by ISR().

#define Is_udd_resume_interrupt_enabled ( )    (Tst_bits(UDP->UDP_IMR, UDP_IMR_RXRSM))

Referenced by ISR().

#define Is_udd_sof ( )    (Tst_bits(UDP->UDP_ISR, UDP_ISR_SOFINT))

Referenced by ISR().

#define Is_udd_sof_interrupt_enabled ( )    (Tst_bits(UDP->UDP_IMR, UDP_ISR_SOFINT))

Referenced by ISR().

#define Is_udd_suspend ( )    (Tst_bits(UDP->UDP_ISR, UDP_ISR_RXSUSP))

Referenced by ISR().

#define Is_udd_suspend_interrupt_enabled ( )    (Tst_bits(UDP->UDP_IMR, UDP_ISR_RXSUSP))

Referenced by ISR().

#define Is_udd_transceiver_enabled ( )    (!Tst_bits(UDP->UDP_TXVC, UDP_TXVC_TXVDIS))
#define Is_udd_vbus_high ( )    ioport_get_pin_level(USB_VBUS_PIN)

Referenced by udd_enable(), and udd_vbus_handler().

#define Is_udd_vbus_low ( )    (!Is_udd_vbus_high())
#define Is_udd_wake_up ( )    (Tst_bits(UDP->UDP_ISR, UDP_ISR_WAKEUP))

Referenced by ISR().

#define Is_udd_wake_up_interrupt_enabled ( )    (Tst_bits(UDP->UDP_IMR, UDP_IMR_WAKEUP))

Referenced by ISR().

#define udd_ack_ext_resume ( )    (UDP->UDP_ICR = UDP_IER_EXTRSM)
#define udd_ack_reset ( )    (UDP->UDP_ICR = UDP_ISR_ENDBUSRES)

Manage reset event Set when a USB "End of Reset" has been detected.

Referenced by ISR().

#define udd_ack_resume ( )    (UDP->UDP_ICR = UDP_ICR_RXRSM)
#define udd_ack_sof ( )    (UDP->UDP_ICR = UDP_ISR_SOFINT)

Referenced by ISR().

#define udd_ack_suspend ( )    (UDP->UDP_ICR = UDP_ISR_RXSUSP)

Referenced by ISR().

#define udd_ack_vbus_interrupt (   high)
Value:
high ? IOPORT_SENSE_LEVEL_LOW : IOPORT_SENSE_LEVEL_HIGH)
static void ioport_set_pin_sense_mode(ioport_pin_t pin, enum ioport_sense pin_sense)
Set the pin sense mode of a single IOPORT pin.
Definition: ioport.h:350

Referenced by udd_vbus_handler().

#define udd_ack_wake_up ( )    (UDP->UDP_ICR = UDP_ICR_WAKEUP)
#define udd_ack_wakeups ( )    (UDP->UDP_ICR = (UDP_ICR_RXRSM|UDP_ICR_EXTRSM|UDP_ICR_WAKEUP))

Referenced by ISR().

#define udd_attach_device ( )    ( Set_bits(UDP->UDP_TXVC, UDP_TXVC_PUON))

attaches to USB bus

Referenced by udd_attach().

#define udd_detach_device ( )    ( Clr_bits(UDP->UDP_TXVC, UDP_TXVC_PUON))

detaches from USB bus

Referenced by udd_detach().

#define udd_disable_all_events ( )    (UDP->IDR = 0xFFFF)

Manage misc events.

#define udd_disable_endpoint_events ( )    (UDP->IDR = 0xFF)
#define udd_disable_ext_resume_interrupt ( )    (UDP->UDP_IDR = UDP_IER_EXTRSM)
#define udd_disable_periph_ck ( )    pmc_disable_periph_clk(ID_UDP)

Referenced by ISR().

#define udd_disable_remote_wake_up ( )    ( Clr_bits(UDP->UDP_GLB_STAT, UDP_GLB_STAT_RMWUPE))
#define udd_disable_resume_interrupt ( )    (UDP->UDP_IDR = UDP_IDR_RXRSM)
#define udd_disable_sof_interrupt ( )    (UDP->UDP_IDR = UDP_ISR_SOFINT)
#define udd_disable_suspend_interrupt ( )    (UDP->UDP_IDR = UDP_ISR_RXSUSP)

Referenced by ISR().

#define udd_disable_transceiver ( )    ( Set_bits(UDP->UDP_TXVC, UDP_TXVC_TXVDIS))

Referenced by udd_detach().

#define udd_disable_vbus_interrupt ( )    pio_disable_pin_interrupt(USB_VBUS_PIN)
#define udd_disable_wake_up_interrupt ( )    (UDP->UDP_IDR = UDP_IDR_WAKEUP)
#define udd_disable_wakeups ( )    (UDP->UDP_IDR = (UDP_IDR_RXRSM|UDP_IDR_EXTRSM|UDP_IDR_WAKEUP))

Referenced by ISR().

#define udd_enable_ext_resume_interrupt ( )    (UDP->UDP_IER = UDP_IER_EXTRSM)

Manage end of resume event (ext/rx resume) The USB controller detects a valid "End of Resume" signal initiated by the host or detects a external "Resume" signal.

Referenced by ISR(), and udd_attach().

#define udd_enable_periph_ck ( )    pmc_enable_periph_clk(ID_UDP)
#define udd_enable_remote_wake_up ( )    ( Set_bits(UDP->UDP_GLB_STAT, UDP_GLB_STAT_RMWUPE))

Manage remote wake-up event.

#define udd_enable_resume_interrupt ( )    (UDP->UDP_IER = UDP_IER_RXRSM)

Referenced by ISR(), and udd_attach().

#define udd_enable_sof_interrupt ( )    (UDP->UDP_IER = UDP_ISR_SOFINT)

Manage start of frame event.

Referenced by ISR(), and udd_attach().

#define udd_enable_suspend_interrupt ( )    (UDP->UDP_IER = UDP_ISR_RXSUSP)

Manage suspend event.

Referenced by ISR(), and udd_attach().

#define udd_enable_transceiver ( )    ( Clr_bits(UDP->UDP_TXVC, UDP_TXVC_TXVDIS))

Referenced by udd_attach().

#define udd_enable_vbus_interrupt ( )    pio_enable_pin_interrupt(USB_VBUS_PIN)
#define udd_enable_wake_up_interrupt ( )    (UDP->UDP_IER = UDP_IER_WAKEUP)

Manage wake-up event (=usb line activity) The USB controller is reactivated by a filtered non-idle signal from the lines.

Referenced by ISR(), and udd_attach().

#define udd_enable_wakeups ( )    (UDP->UDP_IER = (UDP_IER_RXRSM|UDP_IER_EXTRSM|UDP_IER_WAKEUP))
#define UDD_EP_TRANSFER_BUFFER_END   0x2

Job status to finish the job.

#define udd_frame_number ( )    (Rd_bitfield(UDP->UDP_FRM_NUM, UDP_FRM_NUM_FRM_NUM_Msk))

Referenced by udd_get_frame_number().

#define udd_get_endpoint_bank_max_nbr (   ep)    (((ep)==0||(ep)==3)?1:2)

Get maximal number of banks of endpoint (3S, 1~2)

Referenced by udd_ep_abort(), udd_ep_ack_out_received(), udd_ep_in_sent(), and udd_ep_interrupt().

#define udd_get_endpoint_max_nbr ( )    (7)

Get maximal number of endpoints (3S 4S 4E, 0~7)

#define udd_get_endpoint_size_max (   ep)    (((ep)==4||(ep)==5)?512:64)

Get maximal size of endpoint (3S, 512/64)

Referenced by udd_ep_alloc().

#define udd_initiate_remote_wake_up ( )
Value:
do { \
Set_bits(UDP->UDP_GLB_STAT, UDP_GLB_STAT_ESR);\
Clr_bits(UDP->UDP_GLB_STAT, UDP_GLB_STAT_ESR);\
} while(0)
#define Clr_bits(lvalue, mask)
Clears the bits of a C lvalue specified by a given bit-mask.
Definition: compiler.h:512
#define Set_bits(lvalue, mask)
Sets the bits of a C lvalue specified by a given bit-mask.
Definition: compiler.h:521

Referenced by udd_send_remotewakeup().

#define udd_is_endpoint_support_iso (   ep)    (((ep)==0||(ep)==3)?false:true)

Get isochronous support (3S, endpoints 0 and 3 not support)

Referenced by udd_ep_alloc().

#define UDD_MAX_PEP_NB   (udd_get_endpoint_max_nbr()+1)
#define udd_raise_suspend ( )    (UDP->UDP_ISR = UDP_ISR_RXSUSP)
#define UDD_USB_INT_FUN   UDP_Handler
#define UDD_VBUS_DETECT
Value:
(defined(CONF_BOARD_USB_PORT) && \
defined(CONF_BOARD_USB_VBUS_DETECT))
#define udd_vbus_init (   handler)
Value:
io_pin_init(USB_VBUS_PIN, USB_VBUS_FLAGS, \
USB_VBUS_PIN_IRQn, UDD_USB_INT_LEVEL, handler, USB_VBUS_WKUP)
#define UDD_USB_INT_LEVEL
Definition: udp_device.c:56
#define USB_VBUS_WKUP
Definition: udp_device.h:109
static __always_inline void io_pin_init(uint32_t pin, uint32_t flags, IRQn_Type port_irqn, uint8_t irq_level, void(*handler)(uint32_t, uint32_t), uint32_t wkup)
Definition: udp_device.h:50

Referenced by udd_enable().

#define UDD_VBUS_IO   (defined(USB_VBUS_PIN) && UDD_VBUS_DETECT)
#define udd_vbus_monitor_sleep_mode (   lock)
#define UDP_SLEEP_MODE_USB_IDLE   SLEEPMGR_ACTIVE

Referenced by udd_sleep_mode().

#define UDP_SLEEP_MODE_USB_SUSPEND   SLEEPMGR_ACTIVE

Definition of sleep levels.

Referenced by udd_disable(), and udd_enable().

#define USB_VBUS_WKUP   0

Bit definitions about endpoint control state machine for udd_ep_control_state.

Enumerator
UDD_EPCTRL_SETUP 

Wait a SETUP packet.

UDD_EPCTRL_DATA_OUT 

Wait a OUT data packet.

UDD_EPCTRL_DATA_IN 

Wait a IN data packet.

UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP 

Wait a IN ZLP packet.

UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP 

Wait a OUT ZLP packet.

UDD_EPCTRL_STALL_REQ 

STALL enabled on IN & OUT.

void udd_attach ( void  )

Attach device to the bus when possible.

Warning
If a VBus control is included in driver, then it will attach device when an acceptable Vbus level from the host is detected.

References cpu_irq_restore(), cpu_irq_save(), udd_attach_device, udd_enable_ext_resume_interrupt, udd_enable_periph_ck, udd_enable_resume_interrupt, udd_enable_sof_interrupt, udd_enable_suspend_interrupt, udd_enable_transceiver, udd_enable_wake_up_interrupt, and udd_sleep_mode().

Referenced by udc_attach(), udd_enable(), and udd_vbus_handler().

static void udd_ctrl_endofrequest ( void  )
static

Call callback associated to setup request.

Referenced by udd_ctrl_in_sent(), udd_ctrl_out_received(), and udd_ctrl_setup_received().

static void udd_ctrl_init ( void  )
static

Reset control endpoint management.

Called after a USB line reset or at the end of SETUP request (after ZLP)

References UDD_EPCTRL_SETUP.

Referenced by ISR(), udd_ctrl_in_sent(), udd_ctrl_out_received(), and udd_ctrl_setup_received().

static bool udd_ctrl_interrupt ( void  )
static

Main interrupt routine for control endpoint.

This switches control endpoint events to correct sub function.

Returns
1 if an event about control endpoint is occurred, otherwise 0.

References Is_udd_bank0_received, Is_udd_endpoint_interrupt, Is_udd_in_sent, Is_udd_setup_received, Is_udd_stall, udd_ack_stall, udd_ctrl_in_sent(), udd_ctrl_out_received(), and udd_ctrl_setup_received().

Referenced by ISR().

static void udd_ctrl_send_zlp_in ( void  )
static

Send a ZLP IN on control endpoint.

References UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP, and udd_set_transmit_ready.

Referenced by udd_ctrl_out_received(), and udd_ctrl_setup_received().

static void udd_ctrl_send_zlp_out ( void  )
static

Send a ZLP OUT on control endpoint.

References UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP.

Referenced by udd_ctrl_in_sent().

static void udd_ctrl_stall_data ( void  )
static

Managed stall event of IN/OUT packet on control endpoint.

References udd_enable_stall_handshake, and UDD_EPCTRL_STALL_REQ.

Referenced by udd_ctrl_out_received(), and udd_ctrl_setup_received().

void udd_detach ( void  )

Detaches the device from the bus.

The driver must remove pull-up on USB line D- or D+.

References udd_detach_device, udd_disable_transceiver, and udd_sleep_mode().

Referenced by udc_detach(), udd_disable(), and udd_vbus_handler().

void udd_disable ( void  )
void udd_ep_abort ( udd_ep_id_t  ep)

Aborts transfer on going on 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
epEndpoint to abort

References udd_ep_job_t::bank, cpu_irq_restore(), cpu_irq_save(), Is_udd_any_bank_received, Is_udd_transmit_ready, udd_ack_in_sent, udd_disable_endpoint_interrupt, udd_ep_abort_job(), udd_ep_ack_out_received(), udd_get_endpoint_bank_max_nbr, udd_kill_data_in_fifo, udd_reset_endpoint, USB_DEVICE_MAX_EP, USB_EP_ADDR_MASK, and USB_EP_DIR_IN.

Referenced by udc_req_std_ep_set_feature(), and udi_msc_setup().

static void udd_ep_abort_job ( udd_ep_id_t  ep)
static

Abort endpoint job on going.

Parameters
ependpoint number of job to abort

References udd_ep_finish_job(), UDD_EP_TRANSFER_ABORT, and USB_EP_ADDR_MASK.

Referenced by udd_ep_abort(), and udd_ep_free().

static void udd_ep_ack_out_received ( udd_ep_id_t  ep)
static

Ack OUT received event.

This acks the right bank when multiple banks are used.

Parameters
ependpoint number without direction flag

References udd_ep_job_t::bank, Is_udd_bank0_received, Is_udd_bank1_received, udd_ack_bank0_received, udd_ack_bank1_received, and udd_get_endpoint_bank_max_nbr.

Referenced by udd_ep_abort(), and udd_ep_out_received().

bool udd_ep_alloc ( udd_ep_id_t  ep,
uint8_t  bmAttributes,
uint16_t  MaxEndpointSize 
)

Configures and enables an endpoint.

Parameters
epEndpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT).
bmAttributesAttributes of endpoint declared in the descriptor.
MaxEndpointSizeEndpoint maximum size
Returns
1 if the endpoint is enabled, otherwise 0.

References udd_ep_job_t::b_buf_end, udd_ep_job_t::b_stall_requested, udd_ep_job_t::bank, Is_udd_endpoint_enabled, udd_ep_job_t::size, udd_configure_endpoint, udd_get_endpoint_size_max, udd_is_endpoint_support_iso, udd_reset_endpoint, USB_DEVICE_MAX_EP, USB_EP_ADDR_MASK, USB_EP_DIR_IN, USB_EP_TYPE_ISOCHRONOUS, and USB_EP_TYPE_MASK.

Referenced by udc_iface_enable().

bool udd_ep_clear_halt ( udd_ep_id_t  ep)

Clear the halted state of the endpoint ep.

After calling this function, any transaction on ep will be handled normally, i.e. a STALL handshake will not be sent, and the data toggle sequence will start at DATA0.

Parameters
epThe ID of the endpoint to be un-halted
Returns
1 if function was successfully done, otherwise 0.

References udd_ep_job_t::b_stall_requested, udd_ep_job_t::busy, udd_ep_job_t::call_nohalt, Is_udd_endpoint_stall_requested, udd_ack_stall, udd_disable_stall_handshake, udd_reset_endpoint, USB_DEVICE_MAX_EP, and USB_EP_ADDR_MASK.

Referenced by udc_req_std_ep_clear_feature().

static void udd_ep_finish_job ( udd_ep_job_t ptr_job,
int  status,
uint8_t  ep_num 
)
static

Call the callback associated to the job which is finished.

Parameters
ptr_jobjob to complete
statusjob status

References udd_ep_job_t::buf_size, udd_ep_job_t::busy, udd_ep_job_t::call_trans, Is_udd_endpoint_type_in, UDD_EP_TRANSFER_ABORT, UDD_EP_TRANSFER_OK, and USB_EP_DIR_IN.

Referenced by udd_ep_abort_job(), udd_ep_interrupt(), udd_ep_job_table_kill(), and udd_ep_out_received().

void udd_ep_free ( udd_ep_id_t  ep)

Disables an endpoint.

Parameters
epEndpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT).

References udd_disable_endpoint, udd_ep_abort_job(), USB_DEVICE_MAX_EP, and USB_EP_ADDR_MASK.

Referenced by udc_iface_disable().

static bool udd_ep_in_sent ( udd_ep_id_t  ep,
bool  b_tx 
)
static

Fill banks and send them.

Parameters
ependpoint number without direction flag
b_txtrue if data is ready to send
Returns
true if data buffer is in transmitting

References udd_ep_job_t::b_buf_end, udd_ep_job_t::b_shortpacket, udd_ep_job_t::bank, udd_ep_job_t::buf_cnt, udd_ep_job_t::buf_size, udd_ep_write_fifo(), udd_get_endpoint_bank_max_nbr, and udd_set_transmit_ready.

Referenced by udd_ep_interrupt(), and udd_ep_run().

bool udd_ep_is_halted ( udd_ep_id_t  ep)

Check if the endpoint ep is halted.

Parameters
epThe ID of the endpoint to check.
Returns
1 if ep is halted, otherwise 0.

References udd_ep_job_t::b_stall_requested, Is_udd_endpoint_stall_pending, USB_DEVICE_MAX_EP, and USB_EP_ADDR_MASK.

Referenced by udc_req_std_ep_get_status().

static void udd_ep_job_table_kill ( void  )
static

Abort all endpoint jobs on going.

References udd_ep_finish_job(), UDD_EP_TRANSFER_ABORT, and USB_DEVICE_MAX_EP.

Referenced by ISR().

static void udd_ep_job_table_reset ( void  )
static
bool udd_ep_run ( udd_ep_id_t  ep,
bool  b_shortpacket,
uint8_t *  buf,
iram_size_t  buf_size,
udd_callback_trans_t  callback 
)

Allows to receive or send data on an endpoint.

The driver uses a specific DMA USB to transfer data from internal RAM to endpoint, if this one is available. When the transfer is finished or aborted (stall, reset, ...), the callback is called. The callback returns the transfer status and eventually the number of byte transfered. Note: The control endpoint is not authorized.

Parameters
epThe ID of the endpoint to use
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
callbackNULL or function to call at the end of transfer
Warning
About b_shortpacket, for IN endpoint it means that a short packet (or a Zero Length Packet) will be sent to the USB line to properly close the usb transfer at the end of the data transfer. For Bulk and Interrupt OUT endpoint, it will automatically stop the transfer at the end of the data transfer (received short packet).
Returns
1 if function was successfully done, otherwise 0.

References udd_ep_job_t::b_buf_end, udd_ep_job_t::b_shortpacket, udd_ep_job_t::b_stall_requested, udd_ep_job_t::buf, udd_ep_job_t::buf_cnt, udd_ep_job_t::buf_size, udd_ep_job_t::busy, udd_ep_job_t::call_trans, cpu_irq_restore(), cpu_irq_save(), Is_udd_endpoint_enabled, Is_udd_endpoint_stall_requested, Is_udd_in_pending, udd_enable_endpoint_interrupt, udd_ep_in_sent(), USB_DEVICE_MAX_EP, USB_EP_ADDR_MASK, and USB_EP_DIR_IN.

Referenced by udi_hid_kbd_send_report(), udi_msc_cbw_wait(), udi_msc_csw_send(), udi_msc_data_send(), and udi_msc_trans_block().

bool udd_ep_set_halt ( udd_ep_id_t  ep)

Set the halted state of the endpoint ep.

After calling this function, any transaction on ep will result in a STALL handshake being sent. Any pending transactions will be performed first, however.

Parameters
epThe ID of the endpoint to be halted
Returns
1 if ep is halted, otherwise 0.

References udd_ep_job_t::b_stall_requested, udd_ep_job_t::bank, cpu_irq_restore(), cpu_irq_save(), Is_udd_transmit_ready, udd_enable_endpoint_interrupt, udd_enable_stall_handshake, USB_DEVICE_MAX_EP, USB_EP_ADDR_MASK, and USB_EP_DIR_IN.

Referenced by udc_req_std_ep_set_feature(), udi_msc_cbw_invalid(), udi_msc_csw_invalid(), and udi_msc_csw_process().

bool udd_ep_wait_stall_clear ( udd_ep_id_t  ep,
udd_callback_halt_cleared_t  callback 
)

Registers a callback to call when endpoint halt is cleared.

Parameters
epThe ID of the endpoint to use
callbackNULL or function to call when endpoint halt is cleared
Warning
if the endpoint is not halted then the callback is called immediately.
Returns
1 if the register is accepted, otherwise 0.

References udd_ep_job_t::b_stall_requested, udd_ep_job_t::busy, udd_ep_job_t::call_nohalt, Is_udd_endpoint_enabled, Is_udd_endpoint_stall_requested, USB_DEVICE_MAX_EP, and USB_EP_ADDR_MASK.

Referenced by udi_msc_cbw_invalid(), udi_msc_cbw_wait(), udi_msc_csw_invalid(), and udi_msc_csw_send().

static bool udd_ep_write_fifo ( udd_ep_id_t  ep)
static

Fill transmit data into FIFO.

Parameters
ependpoint number without direction flag
Returns
true if a short packet has been written

References udd_ep_job_t::bank, udd_ep_job_t::buf, udd_ep_job_t::buf_cnt, udd_ep_job_t::buf_size, udd_ep_job_t::size, and udd_endpoint_fifo_write.

Referenced by udd_ep_in_sent().

uint16_t udd_get_frame_number ( void  )

Returns the current start of frame number.

Returns
current start of frame number.

References udd_frame_number.

Referenced by main_sof_action().

uint16_t udd_get_micro_frame_number ( void  )

Returns the current micro start of frame number.

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

Returns the USB address of device.

Returns
USB address

References Is_udd_address_state_enabled, and udd_get_configured_address.

Referenced by udc_req_std_dev_set_configuration().

bool udd_include_vbus_monitoring ( void  )

Authorizes the VBUS event.

Returns
true, if the VBUS monitoring is possible.

Referenced by udc_include_vbus_monitoring().

bool udd_is_high_speed ( void  )

Test whether the USB Device Controller is running at high speed or not.

Returns
true if the Device is running at high speed mode, otherwise false.

Referenced by udc_req_std_dev_get_descriptor(), udc_req_std_dev_set_configuration(), and udc_req_std_dev_set_feature().

static void udd_reset_ep_ctrl ( void  )
static

Reset control endpoint.

Called after a USB line reset or when UDD is enabled

References cpu_irq_restore(), cpu_irq_save(), udd_configure_address, udd_configure_endpoint, udd_enable_address, udd_enable_endpoint, udd_enable_endpoint_interrupt, and USB_EP_TYPE_CONTROL.

Referenced by ISR().

void udd_send_remotewakeup ( void  )

The USB driver sends a resume signal called Upstream Resume.

References udd_b_idle, udd_enable_periph_ck, udd_initiate_remote_wake_up, and udd_sleep_mode().

Referenced by udc_remotewakeup().

void udd_set_address ( uint8_t  address)

Changes the USB address of device.

Parameters
addressNew USB address

References udd_configure_address, udd_disable_address, udd_disable_address_state, udd_enable_address, and udd_enable_address_state.

Referenced by udc_valid_address().

void udd_set_setup_payload ( uint8_t *  payload,
uint16_t  payload_size 
)
static void udd_sleep_mode ( bool  b_idle)
static

Authorize or not the CPU powerdown mode.

Parameters
b_enabletrue to authorize idle mode

References sleepmgr_lock_mode(), sleepmgr_unlock_mode(), udd_b_idle, and UDP_SLEEP_MODE_USB_IDLE.

Referenced by ISR(), udd_attach(), udd_detach(), and udd_send_remotewakeup().

static void udd_vbus_handler ( uint32_t  id,
uint32_t  mask 
)
static

bool udd_b_idle
static

State of USB line.

Referenced by udd_enable(), udd_send_remotewakeup(), and udd_sleep_mode().

uint16_t udd_ctrl_payload_nb_trans
static

Number of data received/sent to/from udd_g_ctrlreq.payload buffer.

Referenced by udd_ctrl_in_sent(), and udd_ctrl_out_received().

uint16_t udd_ctrl_prev_payload_nb_trans
static

Total number of data received/sent during data packet phase with previous payload buffers.

udd_ctrl_ep_state_t udd_ep_control_state
static

State of the endpoint control management.

udd_ep_job_t udd_ep_job[USB_DEVICE_MAX_EP]
static

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