...
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 |
---|
language | cpp |
---|
linenumbers | true |
---|
|
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 |
---|
|
(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 |
---|
language | cpp |
---|
linenumbers | true |
---|
|
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 |
---|
|
(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 |
---|
language | cpp |
---|
linenumbers | true |
---|
|
typedef const struct usbd_drv_ep_info {
CPU_INT08U Attrib; (1)
CPU_INT08U Nbr; (2)
CPU_INT16U MaxPktSize; (3)
} USBD_DRV_EP_INFO; |
Panel |
---|
|
(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 |
---|
language | cpp |
---|
linenumbers | true |
---|
|
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 |
---|
|
(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_INTR | USBD_EP_INFO_TYPE_BULK | USBD_EP_INFO_TYPE_ISOC | USBD_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. |