void usb_init(const usb_profile_t *profile) { usb_driver_init( profile ); usb_msc_init(); usb_dfu_init(); platform_usb_enable(); }
int main(void) { rcc_clock_setup_hse_3v3(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_120MHZ]); rcc_periph_clock_enable(RCC_GPIOB); rcc_periph_clock_enable(RCC_OTGHS); gpio_mode_setup(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO13 | GPIO14 | GPIO15); gpio_set_af(GPIOB, GPIO_AF12, GPIO13 | GPIO14 | GPIO15); msc_dev = usbd_init(&otghs_usb_driver, &dev_descr, &config_descr, usb_strings, 3, usbd_control_buffer, sizeof(usbd_control_buffer)); ramdisk_init(); usb_msc_init(msc_dev, 0x82, 64, 0x01, 64, "VendorID", "ProductID", "0.00", ramdisk_blocks(), ramdisk_read, ramdisk_write); for (;;) { usbd_poll(msc_dev); } }
ErrorCode_t usb_init(void) { uint32_t i; uint32_t uid[4]; /* HARDWARE INIT */ /* Enable AHB clock to the USB block and USB RAM. */ LPC_SYSCON->SYSAHBCLKCTRL |= ((0x1<<14) | (0x1<<27)); /* Pull-down is needed, or internally, VBUS will be floating. This is to address the wrong status in VBUSDebouncing bit in CmdStatus register. */ LPC_IOCON->PIO0_3 &= ~0x1F; LPC_IOCON->PIO0_3 |= (0x01<<0); /* Secondary function VBUS */ LPC_IOCON->PIO0_6 &= ~0x07; LPC_IOCON->PIO0_6 |= (0x01<<0); /* Secondary function SoftConn */ for (i=0; i < strlen(CFG_USB_STRING_MANUFACTURER); i++) USB_StringDescriptor.strManufacturer[i] = CFG_USB_STRING_MANUFACTURER[i]; for (i=0; i < strlen(CFG_USB_STRING_PRODUCT); i++) USB_StringDescriptor.strProduct[i] = CFG_USB_STRING_PRODUCT[i]; /* Use the 128-bit chip ID for USB serial to make sure it's unique */ iapReadUID(uid); /* 1st byte is LSB, 4th byte is MSB */ sprintf((char*)USB_StringDescriptor.strSerial , "%08X%08X%08X%08X", (unsigned int)uid[3], (unsigned int)uid[2], (unsigned int)uid[1], (unsigned int)uid[0]); for (i = USB_STRING_SERIAL_LEN-1; i > 0; i--) { USB_StringDescriptor.strSerial[i] = ((uint8_t*)USB_StringDescriptor.strSerial)[i]; ((uint8_t*)USB_StringDescriptor.strSerial)[i] = 0; } /* ROM DRIVER INIT */ uint32_t membase = (uint32_t) usb_RomDriver_buffer; uint32_t memsize = USB_ROM_SIZE; USBD_API_INIT_PARAM_T usb_param = { .usb_reg_base = LPC_USB_BASE, .max_num_ep = USB_MAX_EP_NUM, .mem_base = membase, .mem_size = memsize, .USB_Configure_Event = USB_Configure_Event, .USB_Reset_Event = USB_Reset_Event }; USB_CORE_DESCS_T DeviceDes = { .device_desc = (uint8_t*) &USB_DeviceDescriptor, .string_desc = (uint8_t*) &USB_StringDescriptor, .full_speed_desc = (uint8_t*) &USB_FsConfigDescriptor, .high_speed_desc = (uint8_t*) &USB_FsConfigDescriptor, .device_qualifier = NULL }; /* Start USB hardware initialisation */ ASSERT_USB_STATUS(USBD_API->hw->Init(&g_hUsb, &DeviceDes, &usb_param)); membase += (memsize - usb_param.mem_size); memsize = usb_param.mem_size; /* Initialise the class driver(s) */ #ifdef CFG_USB_CDC ASSERT_USB_STATUS( usb_cdc_init(g_hUsb, &USB_FsConfigDescriptor.CDC_CCI_Interface, &USB_FsConfigDescriptor.CDC_DCI_Interface, &membase, &memsize) ); #endif #ifdef CFG_USB_HID_KEYBOARD ASSERT_USB_STATUS( usb_hid_init(g_hUsb , &USB_FsConfigDescriptor.HID_KeyboardInterface , HID_KeyboardReportDescriptor, USB_FsConfigDescriptor.HID_KeyboardHID.DescriptorList[0].wDescriptorLength, &membase , &memsize) ); #endif #ifdef CFG_USB_HID_MOUSE ASSERT_USB_STATUS( usb_hid_init(g_hUsb , &USB_FsConfigDescriptor.HID_MouseInterface , HID_MouseReportDescriptor, USB_FsConfigDescriptor.HID_MouseHID.DescriptorList[0].wDescriptorLength, &membase , &memsize) ); #endif #ifdef CFG_USB_HID_GENERIC ASSERT_USB_STATUS( usb_hid_init(g_hUsb , &USB_FsConfigDescriptor.HID_GenericInterface , HID_GenericReportDescriptor, USB_FsConfigDescriptor.HID_GenericHID.DescriptorList[0].wDescriptorLength, &membase , &memsize) ); #endif #ifdef CFG_USB_MSC // there is chance where SD card is not inserted, thus the msc init fails, should continue instead of return if ( usb_msc_init(g_hUsb, &USB_FsConfigDescriptor.MSC_Interface, &membase, &memsize) != LPC_OK) { _PRINTF("MSC class fails to init\n"); } #endif #ifdef CFG_USB_CUSTOM_CLASS ASSERT_USB_STATUS( usb_custom_init(g_hUsb, &USB_FsConfigDescriptor.Custom_Interface) ); #endif /* Enable the USB interrupt */ #if defined CFG_MCU_FAMILY_LPC11UXX NVIC_EnableIRQ(USB_IRQn); #elif defined CFG_MCU_FAMILY_LPC13UXX NVIC_EnableIRQ(USB_IRQ_IRQn); #else #error "No MCU defined" #endif /* Perform USB soft connect */ USBD_API->hw->Connect(g_hUsb, 1); return LPC_OK; } /**************************************************************************/ /*! @brief Redirect the USB IRQ handler to the ROM handler */ /**************************************************************************/ void USB_IRQHandler(void) { USBD_API->hw->ISR(g_hUsb); }