Datasheet

}
}
6.3.4.2 Assign endpoint number dynamically
void USB_CdcVcomEndpointInit(void)
{
uint8_t i;
for(i = 0; i < USB_DEVICE_CONFIG_CDC_ACM; i++)
{
#if USB_CDC_CIC_INTERRUPT_IN_ENDPOINT_ENABLE
g_CdcVcomCicInterruptInEndpoint[i] = 1 + i*2;
g_CdcVcomDicBulkInEndpoint[i] = 2 + i*2;
g_CdcVcomDicBulkOutEndpoint[i] = 2 + i*2;
#else
g_CdcVcomDicBulkInEndpoint[i] = 1 + i*1;
g_CdcVcomDicBulkOutEndpoint[i] = 1 + i*1;
#endif
}
}
6.3.4.3 Run time initialization for config descriptor
void USB_DescriptorInit(void)
{
uint8_t *p = NULL;
uint8_t i;
/* copy configuration descriptor */
memcpy(g_UsbDeviceConfigurationDescriptor + 0, g_CdcConfigurationDescriptorTemplate,
USB_DESCRIPTOR_LENGTH_CONFIGURE);
/* copy cdc iap, interface, endpoint descriptor */
for(i = 0; i < USB_DEVICE_CONFIG_CDC_ACM ; i++)
{
memcpy(g_UsbDeviceConfigurationDescriptor + USB_DESCRIPTOR_LENGTH_CONFIGURE +
USB_CDC_DESCRIPTOR_INSTANCE_LENGTH * i,
g_CdcDescriptorTemplate,
USB_CDC_DESCRIPTOR_INSTANCE_LENGTH
);
}
/* update interface and endpoint descirptor */
for(i = 0; i < USB_DEVICE_CONFIG_CDC_ACM ; i++)
{
p = g_UsbDeviceConfigurationDescriptor + USB_DESCRIPTOR_LENGTH_CONFIGURE +
USB_CDC_DESCRIPTOR_INSTANCE_LENGTH * i;
/* The first interface number associated with this function */
p[2] = g_CdcVcomCicInterfaceIndex[i];
p += USB_IAD_DESC_SIZE;
/* CIC interface index */
p[2] = g_CdcVcomCicInterfaceIndex[i];
p += USB_DESCRIPTOR_LENGTH_INTERFACE;
p += USB_DESCRIPTOR_LENGTH_CDC_HEADER_FUNC;
p += USB_DESCRIPTOR_LENGTH_CDC_CALL_MANAG;
NXP Semiconductors
Key Steps
USB to Multi VCOM on K32L2 Series MCU, Rev. 0, November 2019
Application Note 22 / 25