Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

The fields of the following structure are the parameters needed to configure the USB device controller driver:

Anchor
Listing - USB Device Controller Driver Configuration Structure
Listing - USB Device Controller Driver Configuration Structure

Code Block
languagecpp
linenumberstrue
typedef  const  struct  usb_drv_cfg {
    CPU_ADDR           BaseAddr;                                              (1)
    CPU_ADDR           MemAddr;                                               (2)
    CPU_ADDR           MemSize;                                               (3)
    USBD_DEV_SPD       Spd;                                                   (4)
    USBD_DRV_EP_INFO  *EP_InfoTbl;                                            (5)
} USBD_DRV_CFG;


Panel
bgColor#f0f0f0

(1) Base address of the USB device controller hardware registers.

(2) Base address of the USB device controller dedicated memory.

(3) Size of the USB device controller dedicated memory.

(4) Speed of the USB device controller. Can be set to either USBD_DEV_SPD_LOW, USBD_DEV_SPD_FULL or USBD_DEV_SPD_HIGH.

(5) USB device controller endpoint information table.


Device Configuration

The fields of the following structure are the parameters needed to configure the USB device:

Anchor
Listing - USB Device Configuration Structure
Listing - USB Device Configuration Structure

Code Block
languagecpp
linenumberstrue
typedef  const  struct  usb_dev_cfg {
           CPU_INT16U   VendorID;                                             (1)
           CPU_INT16U   ProductID;                                            (2)
           CPU_INT16U   DeviceBCD;                                            (3)
    const  CPU_CHAR    *ManufacturerStrPtr;                                   (4)
    const  CPU_CHAR    *ProductStrPtr;                                        (5)
    const  CPU_CHAR    *SerialNbrStrPtr;                                      (6)
           CPU_INT16U   LangID;                                               (7)
} USBD_DEV_CFG;


Panel
bgColor#f0f0f0

(1) Vendor ID.

(2) Product ID.

(3) Device release number.

(4) Pointer to manufacturer string.

(5) Pointer to product string.

(6) Pointer to serial number ID.

(7) Language ID.


Driver Endpoint Information Table

The endpoint information table provides the hardware endpoint characteristics to the USB device stack. When an endpoint is opened, the USB device stack’s core iterates through the endpoint information table entries until the endpoint type and direction match the requested endpoint characteristics. The matching entry provides the physical endpoint number and maximum packet size information to the USB device stack. The entries on the endpoint information table are organized as follows:

Anchor
Listing - Endpoint Information Table Entry
Listing - Endpoint Information Table Entry

Code Block
languagecpp
linenumberstrue
typedef  const  struct  usbd_drv_ep_info {
    CPU_INT08U  Attrib;                                                       (1)
    CPU_INT08U  Nbr;                                                          (2)
    CPU_INT16U  MaxPktSize;                                                   (3)
} USBD_DRV_EP_INFO;


Panel
bgColor#f0f0f0

(1) The endpoint Attrib is a combination of the endpoint type USBD_EP_INFO_TYPE and endpoint direction USBD_EP_INFO_DIR attributes. The endpoint type can be defined as: USBD_EP_INFO_TYPE_CTRL, USBD_EP_INFO_TYPE_INTR, USBD_EP_INFO_TYPE_BULK, or USBD_EP_INFO_TYPE_ISOC. The endpoint direction can be defined as either USBD_EP_INFO_DIR_IN or USBD_EP_INFO_DIR_OUT.

(2) The endpoint Nbr is the logical endpoint number used by the USB device controller.

(3) The endpoint MaxPktSize defines the maximum packet size supported by the hardware. The maximum packet size used by the USB device stack is validated to comply with the USB standard guidelines.


An example of an endpoint information table for a high-speed capable device is provided below.

Anchor
Listing - Example of Endpoint Information Table Configuration
Listing - Example of Endpoint Information Table Configuration

Code Block
languagecpp
linenumberstrue
const  USBD_DRV_EP_INFO  USBD_DrvEP_InfoTbl_<controller>[] = {
                                                                              (1)
    {USBD_EP_INFO_TYPE_CTRL                       |USBD_EP_INFO_DIR_OUT, 0u,   64u},
    {USBD_EP_INFO_TYPE_CTRL                       |USBD_EP_INFO_DIR_IN,  0u,   64u},
                                                                              (2)
    {USBD_EP_INFO_TYPE_BULK|USBD_EP_INFO_TYPE_INTR|USBD_EP_INFO_DIR_OUT, 1u, 1024u},
    {USBD_EP_INFO_TYPE_BULK|USBD_EP_INFO_TYPE_INTR|USBD_EP_INFO_DIR_IN,  1u, 1024u},
                                                                              (3)
    {DEF_BIT_NONE                                                     ,  0u,    0u}
};


Panel
bgColor#f0f0f0

(1) An endpoint described only by one type and one direction is a dedicated endpoint. Most of the device controllers will have a dedicated endpoint for control OUT and IN endpoints. That’s why the table USBD_DrvEP_InfoTbl_<controller> is first initialized with two dedicated control endpoints.

(2) An endpoint indicating several types and two possible directions is a configurable endpoint. In this example, the endpoint can be configured as a bulk or interrupt OUT endpoint. An endpoint fully configurable in terms of type and direction would be OR’ed with this format:
USBD_EP_INFO_TYPE_CTRL | USBD_EP_INFO_TYPE_INTRUSBD_EP_INFO_TYPE_BULK | USBD_EP_INFO_TYPE_ISOCUSBD_EP_INFO_DIR_IN | USBD_EP_INFO_DIR_OUT.

(3) The last entry on the endpoint information table must be an empty entry to allow the USB device stack to determine the end of the table.