/** * @brief Initializes the Low Level portion of the Device driver. * @param pdev: Device handle * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) { /* Init USB_IP */ /* Link The driver to the stack */ hpcd_USB_FS.pData = pdev; pdev->pData = &hpcd_USB_FS; hpcd_USB_FS.Instance = USB; hpcd_USB_FS.Init.dev_endpoints = 8; hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; hpcd_USB_FS.Init.ep0_mps = DEP0CTL_MPS_8; hpcd_USB_FS.Init.low_power_enable = DISABLE; hpcd_USB_FS.Init.lpm_enable = DISABLE; hpcd_USB_FS.Init.battery_charging_enable = DISABLE; if (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK) { Error_Handler(); } HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0xC0); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x01 , PCD_SNG_BUF, 0x110); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x82 , PCD_SNG_BUF, 0x100); return USBD_OK; }
void stm32_usbc_init(void) { LTRACE_ENTRY; usbc.pma_highwater = 0x40; // Set LL Driver parameters usbc.handle.Instance = USB; usbc.handle.Init.dev_endpoints = 4; usbc.handle.Init.ep0_mps = 0x40; usbc.handle.Init.phy_itface = PCD_PHY_EMBEDDED; usbc.handle.Init.speed = PCD_SPEED_FULL; usbc.handle.Init.low_power_enable = 0; usbc.handle.Init.lpm_enable = 0; usbc.handle.Init.battery_charging_enable = 0; // Initialize LL Driver HAL_PCD_Init(&usbc.handle); HAL_PCDEx_PMAConfig(&usbc.handle, 0x00, PCD_SNG_BUF, stm32_usbc_pma_alloc(0x40)); HAL_PCDEx_PMAConfig(&usbc.handle, 0x80, PCD_SNG_BUF, stm32_usbc_pma_alloc(0x40)); }
USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) { /* Init USB_IP */ /* Link The driver to the stack */ hpcd_USB_FS.pData = pdev; pdev->pData = &hpcd_USB_FS; hpcd_USB_FS.Instance = USB; hpcd_USB_FS.Init.dev_endpoints = 5; hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; hpcd_USB_FS.Init.ep0_mps = DEP0CTL_MPS_64; hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED; hpcd_USB_FS.Init.low_power_enable = DISABLE; hpcd_USB_FS.Init.lpm_enable = DISABLE; HAL_PCD_Init(&hpcd_USB_FS); /* * PMA layout * 0x00 - 0x17 (24 bytes) metadata? * 0x18 - 0x57 (64 bytes) EP0 OUT * 0x58 - 0x97 (64 bytes) EP0 IN * 0x98 - 0xD7 (64 bytes) EP1 IN * 0xD8 - 0x157 (128 bytes) EP1 OUT (buffer 1) * 0x158 - 0x1D7 (128 bytes) EP1 OUT (buffer 2) */ HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 24); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0x98); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x02 , PCD_DBL_BUF, 0x00D80158); return USBD_OK; }
/** * @brief Initializes the Low Level portion of the Device driver. * @param pdev: Device handle * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) { /* Init USB_IP */ /* Link The driver to the stack */ hpcd_USB_OTG_FS.pData = pdev; pdev->pData = &hpcd_USB_OTG_FS; #ifdef STM32F4 hpcd_USB_OTG_FS.Instance = USB_OTG_FS; hpcd_USB_OTG_FS.Init.dev_endpoints = 4; hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL; // MUST KEEP THIS FULL - buffer sizes only big enough for this, not high hpcd_USB_OTG_FS.Init.dma_enable = DISABLE; // NO DMA - we are assuming USBD_CtlSendData/USBD_LL_Transmit don't keep the pointer they are passed hpcd_USB_OTG_FS.Init.ep0_mps = DEP0CTL_MPS_8; hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED; hpcd_USB_OTG_FS.Init.Sof_enable = ENABLE; hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE; hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE; hpcd_USB_OTG_FS.Init.vbus_sensing_enable = ENABLE; hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE; HAL_PCD_Init(&hpcd_USB_OTG_FS); // USB memory is 1.25kB - lots of room for big FIFO sizes HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x40); HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x20); // EP0 IN HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x40); // HID IN HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 0x20); // CDC CMD HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 3, 0x40); // CDC IN #endif #ifdef STM32F1 hpcd_USB_OTG_FS.Instance = USB; hpcd_USB_OTG_FS.Init.dev_endpoints = 8; hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL; hpcd_USB_OTG_FS.Init.ep0_mps = DEP0CTL_MPS_8; hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE; hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE; hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE; hpcd_USB_OTG_FS.Init.battery_charging_enable = DISABLE; HAL_PCD_Init(&hpcd_USB_OTG_FS); // USB memory is 512 bytes according to datasheet, so we should have loads // of space available? /*HAL_PCDEx_PMAConfig(pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); HAL_PCDEx_PMAConfig(pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); HAL_PCDEx_PMAConfig(pdev->pData , 0x81 , PCD_SNG_BUF, 0xC0); // HID IN HAL_PCDEx_PMAConfig(pdev->pData , 0x01 , PCD_SNG_BUF, 0x110); // unused? HAL_PCDEx_PMAConfig(pdev->pData , 0x82 , PCD_SNG_BUF, 0x100); // CDC CMD HAL_PCDEx_PMAConfig(pdev->pData , 0x83 , PCD_SNG_BUF, 0x180); // CDC IN HAL_PCDEx_PMAConfig(pdev->pData , 0x03 , PCD_SNG_BUF, 0x1C0); // CDC OUT*/ // above doesn't work HAL_PCDEx_PMAConfig(pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); HAL_PCDEx_PMAConfig(pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); HAL_PCDEx_PMAConfig(pdev->pData , 0x81 , PCD_SNG_BUF, 0xC0); // CDC IN HAL_PCDEx_PMAConfig(pdev->pData , 0x01 , PCD_SNG_BUF, 0x110); // CDC OUT HAL_PCDEx_PMAConfig(pdev->pData , 0x82 , PCD_SNG_BUF, 0x100); // CDC CMD #endif return USBD_OK; }
static void USBD_CDC_PMAConfig(PCD_HandleTypeDef *hpcd, uint32_t *pma_address) { unsigned index; /* allocate PMA memory for all endpoints associated with CDC */ for (index = 0; index < NUM_OF_CDC_UARTS; index++) { HAL_PCDEx_PMAConfig(hpcd, parameters[index].data_in_ep, PCD_SNG_BUF, *pma_address); *pma_address += CDC_DATA_IN_MAX_PACKET_SIZE; HAL_PCDEx_PMAConfig(hpcd, parameters[index].data_out_ep, PCD_SNG_BUF, *pma_address); *pma_address += CDC_DATA_OUT_MAX_PACKET_SIZE; HAL_PCDEx_PMAConfig(hpcd, parameters[index].command_ep, PCD_SNG_BUF, *pma_address); *pma_address += CDC_CMD_PACKET_SIZE; } }
/** * @brief Initializes the Low Level portion of the Device driver. * @param pdev: Device handle * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) { /* Set LL Driver parameters */ hpcd.Instance = USB; hpcd.Init.dev_endpoints = 8; hpcd.Init.ep0_mps = 0x40; hpcd.Init.phy_itface = PCD_PHY_EMBEDDED; hpcd.Init.speed = PCD_SPEED_FULL; /* Link The driver to the stack */ hpcd.pData = pdev; pdev->pData = &hpcd; /* Initialize LL Driver */ HAL_PCD_Init(&hpcd); HAL_PCDEx_PMAConfig(&hpcd , 0x00 , PCD_SNG_BUF, 0x18); HAL_PCDEx_PMAConfig(&hpcd , 0x80 , PCD_SNG_BUF, 0x58); return USBD_OK; }
/** * @brief Initializes the Low Level portion of the Device driver. * @param pdev: Device handle * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) { /* Init USB_IP */ /* Link The driver to the stack */ hpcd_USB_FS.pData = pdev; pdev->pData = &hpcd_USB_FS; hpcd_USB_FS.Instance = USB; hpcd_USB_FS.Init.dev_endpoints = 5; hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; hpcd_USB_FS.Init.ep0_mps = DEP0CTL_MPS_8; hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED; hpcd_USB_FS.Init.low_power_enable = DISABLE; hpcd_USB_FS.Init.battery_charging_enable = DISABLE; HAL_PCD_Init(&hpcd_USB_FS); HAL_PCDEx_PMAConfig(pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); HAL_PCDEx_PMAConfig(pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); HAL_PCDEx_PMAConfig(pdev->pData , 0x81 , PCD_SNG_BUF, 0x100); return USBD_OK; }
/** * @brief Initializes the Low Level portion of the Device driver. * @param pdev: Device handle * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) { /* Set LL Driver parameters */ hpcd.Instance = USB; hpcd.Init.dev_endpoints = 8; hpcd.Init.ep0_mps = PCD_EP0MPS_64; hpcd.Init.phy_itface = PCD_PHY_EMBEDDED; hpcd.Init.speed = PCD_SPEED_FULL; /* Link The driver to the stack */ hpcd.pData = pdev; pdev->pData = &hpcd; /* Initialize LL Driver */ HAL_PCD_Init(pdev->pData); HAL_PCDEx_PMAConfig(pdev->pData , 0x00 , PCD_SNG_BUF, 0x40); HAL_PCDEx_PMAConfig(pdev->pData , 0x80 , PCD_SNG_BUF, 0x80); HAL_PCDEx_PMAConfig(pdev->pData , CDC_IN_EP , PCD_SNG_BUF, 0xC0); HAL_PCDEx_PMAConfig(pdev->pData , CDC_OUT_EP , PCD_SNG_BUF, 0x110); HAL_PCDEx_PMAConfig(pdev->pData , CDC_CMD_EP , PCD_SNG_BUF, 0x100); return USBD_OK; }
/** * @brief Initializes the Low Level portion of the Device driver. * @param pdev: Device handle * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) { /* Set LL Driver parameters */ hpcd.Instance = USB; hpcd.Init.dev_endpoints = 8; hpcd.Init.ep0_mps = PCD_EP0MPS_64; hpcd.Init.phy_itface = PCD_PHY_EMBEDDED; hpcd.Init.speed = PCD_SPEED_FULL; hpcd.Init.low_power_enable = 0; /* Link The driver to the stack */ hpcd.pData = pdev; pdev->pData = &hpcd; /* Initialize LL Driver */ HAL_PCD_Init((PCD_HandleTypeDef*)pdev->pData); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x10); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x50); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0x90); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x01 , PCD_SNG_BUF, 0xD0); return USBD_OK; }
int usb_dc_ep_configure(const struct usb_dc_ep_cfg_data * const ep_cfg) { u8_t ep = ep_cfg->ep_addr; struct usb_dc_stm32_ep_state *ep_state = usb_dc_stm32_get_ep_state(ep); LOG_DBG("ep 0x%02x, ep_mps %u, ep_type %u", ep_cfg->ep_addr, ep_cfg->ep_mps, ep_cfg->ep_type); if (!ep_state) { return -EINVAL; } #ifdef USB if (DT_USB_RAM_SIZE <= (usb_dc_stm32_state.pma_offset + ep_cfg->ep_mps)) { return -EINVAL; } HAL_PCDEx_PMAConfig(&usb_dc_stm32_state.pcd, ep, PCD_SNG_BUF, usb_dc_stm32_state.pma_offset); usb_dc_stm32_state.pma_offset += ep_cfg->ep_mps; #endif ep_state->ep_mps = ep_cfg->ep_mps; switch (ep_cfg->ep_type) { case USB_DC_EP_CONTROL: ep_state->ep_type = EP_TYPE_CTRL; break; case USB_DC_EP_ISOCHRONOUS: ep_state->ep_type = EP_TYPE_ISOC; break; case USB_DC_EP_BULK: ep_state->ep_type = EP_TYPE_BULK; break; case USB_DC_EP_INTERRUPT: ep_state->ep_type = EP_TYPE_INTR; break; default: return -EINVAL; } return 0; }
status_t usbc_setup_endpoint(ep_t ep, ep_dir_t dir, uint width, ep_type_t type) { LTRACEF("ep %u dir %u width %u\n", ep, dir, width); DEBUG_ASSERT(ep <= NUM_EP); // PCD_EP_TYPE* and USB_* have the same values. Let's make sure that // doesn't change. DEBUG_ASSERT(PCD_EP_TYPE_CTRL == USB_CTRL); DEBUG_ASSERT(PCD_EP_TYPE_ISOC == USB_ISOC); DEBUG_ASSERT(PCD_EP_TYPE_BULK == USB_BULK); DEBUG_ASSERT(PCD_EP_TYPE_INTR == USB_INTR); uint8_t ep_addr = ep | ((dir == USB_IN) ? 0x80 : 0); HAL_PCDEx_PMAConfig(&usbc.handle, ep_addr, PCD_SNG_BUF, stm32_usbc_pma_alloc(width)); HAL_StatusTypeDef ret = HAL_PCD_EP_Open(&usbc.handle, ep_addr, width, type); return (ret == HAL_OK) ? NO_ERROR : ERR_GENERIC; }