Microchip® Advanced Software Framework

usbc_otg.h File Reference

USBC OTG Driver header file.

Copyright (c) 2012-2018 Microchip Technology Inc. and its subsidiaries.

#include "compiler.h"
#include "preprocessor.h"
#include "conf_board.h"
#include "board.h"
#include "ioport.h"
#include "gpio.h"
#include "eic.h"

Macros

#define Is_otg_clock_frozen()   USBC_TST_BITS(USBCON,FRZCLK)
 
#define Is_otg_clock_usable()   USBC_TST_BITS(USBSTA,CLKUSABLE)
 Check USB interface clock usable. More...
 
#define Is_otg_suspend()   USBC_TST_BITS(USBSTA,SUSPEND)
 Check transceiver state. More...
 
#define Is_otg_transceiver_off()   (Is_otg_suspend())
 
#define Is_otg_transceiver_on()   (!Is_otg_suspend())
 
#define otg_freeze_clock()   USBC_SET_BITS(USBCON,FRZCLK)
 
#define otg_get_fsm_drd_state()   USBC_RD_BITFIELD(USBFSM,DRDSTATE)
 Get the dual-role device state of the internal USB finite state machine. More...
 
#define otg_register_desc_tab(addr)   (Wr_bitfield(USBC->USBC_UDESC, USBC_UDESC_UDESCA_Msk, addr))
 
#define otg_unfreeze_clock()   USBC_CLR_BITS(USBCON,FRZCLK)
 
#define USBC_CLR_BITS(reg, bit)   (Clr_bits(USBC->TPASTE2(USBC_,reg), TPASTE4(USBC_,reg,_,bit)))
 
#define USBC_RD_BITFIELD(reg, bit)
 
#define USBC_RD_BITS(reg, bit)   (Rd_bits(USBC->TPASTE2(USBC_,reg), TPASTE4(USBC_,reg,_,bit)))
 
#define USBC_REG_CLR(reg, bit)   (USBC->TPASTE3(USBC_,reg,CLR) = TPASTE5(USBC_,reg,CLR_,bit,C))
 
#define USBC_REG_SET(reg, bit)   (USBC->TPASTE3(USBC_,reg,SET) = TPASTE5(USBC_,reg,SET_,bit,S))
 
#define USBC_SET_BITS(reg, bit)   (Set_bits(USBC->TPASTE2(USBC_,reg), TPASTE4(USBC_,reg,_,bit)))
 
#define USBC_TST_BITS(reg, bit)   (Tst_bits(USBC->TPASTE2(USBC_,reg), TPASTE4(USBC_,reg,_,bit)))
 
#define USBC_WR_BITFIELD(reg, bit, value)
 
USBC IP properties

These macros give access to IP properties

#define otg_get_ip_name()   (((uint64_t)USBC->USBC_UNAME1<<32)|(uint64_t)USBC->USBC_UNAME2)
 Get IP name part 1 or 2. More...
 
#define otg_data_memory_barrier()   do { barrier(); } while (0)
 
#define otg_get_ip_version()   USBC_RD_BITFIELD(UVERS,VERSION)
 Get IP version. More...
 
#define otg_get_max_nbr_endpoints()   USBC_RD_BITFIELD(UFEATURES, EPTNBRMAX)
 Get maximal number of pipes/endpoints. More...
 
#define otg_get_max_nbr_pipes()   USBC_RD_BITFIELD(UFEATURES, EPTNBRMAX)
 
USBC OTG ID pin management

The ID pin come from the USB OTG connector (A and B receptable) and allows to select the USB mode host or device.

The ID pin can be managed through GPIO or EIC pin. This feature is optional, and it is enabled if USB_ID_PIN or USB_ID_EIC is defined in board.h and CONF_BOARD_USB_ID_DETECT defined in conf_board.h.

#define OTG_ID_DETECT   (defined(CONF_BOARD_USB_ID_DETECT))
 
#define OTG_ID_IO   (defined(USB_ID_PIN) && OTG_ID_DETECT)
 
#define OTG_ID_EIC   (defined(USB_ID_EIC) && OTG_ID_DETECT)
 
#define pad_id_init()   eic_pad_init(USB_ID_EIC_LINE, otg_id_handler, USB_ID_EIC_IRQn, USB_ID_EIC, UHD_USB_INT_LEVEL);
 
#define pad_id_interrupt_disable()   eic_line_disable_interrupt(EIC, USB_ID_EIC_LINE)
 
#define pad_ack_id_interrupt()
 
#define Is_pad_id_device()   ioport_get_pin_level(USB_ID_EIC)
 
USBC Vbus management

The VBus line can be monitored through a GPIO pin and a basic resitor voltage divider.

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

#define OTG_VBUS_DETECT   (defined(CONF_BOARD_USB_VBUS_DETECT))
 
#define OTG_VBUS_IO   (defined(USB_VBUS_PIN) && OTG_VBUS_DETECT)
 
#define OTG_VBUS_EIC   (defined(USB_VBUS_EIC) && OTG_VBUS_DETECT)
 
#define pad_vbus_init(level)   eic_pad_init(USB_VBUS_EIC_LINE, uhd_vbus_handler, USB_VBUS_EIC_IRQn, USB_VBUS_EIC, level);
 
#define pad_vbus_interrupt_disable()   eic_line_disable_interrupt(EIC, USB_VBUS_EIC_LINE)
 
#define pad_ack_vbus_interrupt()
 
#define Is_pad_vbus_high()   ioport_get_pin_level(USB_VBUS_EIC)
 
#define uhd_vbus_is_on()   USBC_REG_SET(USBSTA,VBUSRQ)
 Notify USBC that the VBUS on the usb line is powered. More...
 
#define uhd_vbus_is_off()   USBC_REG_CLR(USBSTA,VBUSRQ)
 Notify USBC that the VBUS on the usb line is not powered. More...
 
USBC OTG main management

These macros allows to enable/disable pad and USBC hardware

#define otg_enable()   USBC_SET_BITS(USBCON,USBE)
 
#define otg_disable()   USBC_CLR_BITS(USBCON,USBE)
 
USBC mode management

The USBC mode device or host must be selected manualy by user

#define otg_enable_device_mode()   USBC_SET_BITS(USBCON,UIMOD)
 
#define Is_otg_device_mode_enabled()   USBC_TST_BITS(USBCON,UIMOD)
 
#define otg_enable_host_mode()   USBC_CLR_BITS(USBCON,UIMOD)
 
#define Is_otg_host_mode_enabled()   (!Is_otg_device_mode_enabled())
 

Functions

void otg_dual_disable (void)
 Uninitialize the dual role This function is implemented in usbc_host.c file. More...
 
bool otg_dual_enable (void)
 Initialize the dual role This function is implemented in usbc_host.c file. More...
 
USB IO PADs management
static __always_inline void eic_line_change_config (uint8_t line, bool b_high)
 
static __always_inline void eic_pad_init (uint8_t line, eic_callback_t callback, uint8_t irq_line, ioport_pin_t pin, uint8_t irq_level)
 
static __always_inline void io_pad_init (ioport_pin_t pin, ioport_mode_t mode, gpio_pin_callback_t callback, uint8_t irq_level)
 
USBC Power Manager wake-up feature
static __always_inline void usbc_async_wake_up_enable (void)
 Enable one or several asynchronous wake-up source. More...
 
static __always_inline void usbc_async_wake_up_disable (void)
 Disable one or several asynchronous wake-up source. More...
 

#define USBC_CLR_BITS (   reg,
  bit 
)    (Clr_bits(USBC->TPASTE2(USBC_,reg), TPASTE4(USBC_,reg,_,bit)))
#define USBC_RD_BITFIELD (   reg,
  bit 
)
Value:
(Rd_bitfield(USBC->TPASTE2(USBC_,reg),\
TPASTE5(USBC_,reg,_,bit,_Msk)))
#define Rd_bitfield(value, mask)
Reads the bit-field of a value specified by a given bit-mask.
Definition: compiler.h:539
#define TPASTE5(a, b, c, d, e)
Definition: tpaste.h:62
#define USBC_RD_BITS (   reg,
  bit 
)    (Rd_bits(USBC->TPASTE2(USBC_,reg), TPASTE4(USBC_,reg,_,bit)))
#define USBC_REG_CLR (   reg,
  bit 
)    (USBC->TPASTE3(USBC_,reg,CLR) = TPASTE5(USBC_,reg,CLR_,bit,C))
#define USBC_REG_SET (   reg,
  bit 
)    (USBC->TPASTE3(USBC_,reg,SET) = TPASTE5(USBC_,reg,SET_,bit,S))
#define USBC_SET_BITS (   reg,
  bit 
)    (Set_bits(USBC->TPASTE2(USBC_,reg), TPASTE4(USBC_,reg,_,bit)))
#define USBC_TST_BITS (   reg,
  bit 
)    (Tst_bits(USBC->TPASTE2(USBC_,reg), TPASTE4(USBC_,reg,_,bit)))
#define USBC_WR_BITFIELD (   reg,
  bit,
  value 
)
Value:
(Wr_bitfield(USBC->TPASTE2(USBC_,reg),\
TPASTE5(USBC_,reg,_,bit,_Msk),value))
#define TPASTE5(a, b, c, d, e)
Definition: tpaste.h:62
#define Wr_bitfield(lvalue, mask, bitfield)
Writes the bit-field of a C lvalue specified by a given bit-mask.
Definition: compiler.h:549

static __always_inline void usbc_async_wake_up_disable ( void  )
static

Disable one or several asynchronous wake-up source.

Parameters
awen_maskMask of asynchronous wake-up sources (use one of the defines PM_AWEN_xxxx in the part-specific header file)

Referenced by otg_dual_disable().

static __always_inline void usbc_async_wake_up_enable ( void  )
static

Enable one or several asynchronous wake-up source.

Parameters
awen_maskMask of asynchronous wake-up sources (use one of the defines PM_AWEN_xxxx in the part-specific header file)

Referenced by otg_dual_enable(), and udd_enable().