void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) { struct pios_usb_dev * usb_dev = (struct pios_usb_dev *) pios_usb_id; bool valid = PIOS_USB_validate(usb_dev); PIOS_Assert(valid); #define FORCE_DISABLE_USB_IRQ 1 #if FORCE_DISABLE_USB_IRQ /* Make sure we disable the USB interrupt since it may be left on by bootloader */ NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure = usb_dev->cfg->irq.init; NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; NVIC_Init(&NVIC_InitStructure); #endif /* Configure USB D-/D+ (DM/DP) pins */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_OTG1_FS); GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_OTG1_FS); /* Configure VBUS sense pin */ GPIO_Init(usb_dev->cfg->vsense.gpio, (GPIO_InitTypeDef*)&usb_dev->cfg->vsense.init); /* Enable USB OTG Clock */ RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE); }
/** * This function returns the connection status of the USB HID interface * \return 1: interface available * \return 0: interface not available * \note Applications shouldn't call this function directly, instead please use \ref PIOS_COM layer functions */ bool PIOS_USB_CheckAvailable(uint32_t id) { struct pios_usb_dev * usb_dev = (struct pios_usb_dev *) pios_usb_com_id; if (PIOS_USB_validate(usb_dev) != 0) return false; return PIOS_USB_CableConnected(id) && transfer_possible; }
bool PIOS_USB_CableConnected(uint8_t id) { struct pios_usb_dev * usb_dev = (struct pios_usb_dev *) pios_usb_com_id; if (PIOS_USB_validate(usb_dev) != 0) return false; return sof_seen_since_reset; }
void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev) { struct pios_usb_dev * usb_dev = (struct pios_usb_dev *) pios_usb_id; bool valid = PIOS_USB_validate(usb_dev); PIOS_Assert(valid); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); NVIC_Init((NVIC_InitTypeDef*)&usb_dev->cfg->irq.init); }
/** * This function returns the connection status of the USB interface * \return true: interface available * \return false: interface not available */ bool PIOS_USB_CheckAvailable(uintptr_t id) { struct pios_usb_dev * usb_dev = (struct pios_usb_dev *) pios_usb_id; if (!PIOS_USB_validate(usb_dev)) return false; if (usb_dev->cfg->vsense.gpio != NULL) return GPIO_ReadInputDataBit(usb_dev->cfg->vsense.gpio, usb_dev->cfg->vsense.init.GPIO_Pin) == Bit_SET; return transfer_possible == 1; }
bool PIOS_USB_CableConnected(uintptr_t id) { struct pios_usb_dev * usb_dev = (struct pios_usb_dev *) pios_usb_com_id; if (PIOS_USB_validate(usb_dev) != 0) return false; if (usb_dev->cfg->vsense.gpio != NULL) return GPIO_ReadInputDataBit(usb_dev->cfg->vsense.gpio, usb_dev->cfg->vsense.init.GPIO_Pin) == Bit_SET; return sof_seen_since_reset; }