bootloader: Add support for USB High Speed.

This commit is contained in:
iabdalkader 2022-08-09 21:10:09 +02:00
parent 75fce58aa9
commit e03f42985f
4 changed files with 190 additions and 137 deletions

View File

@ -58,6 +58,14 @@
#define CDC_DATA_FS_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */ #define CDC_DATA_FS_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */
#define CDC_CMD_PACKET_SIZE 8 /* Control Endpoint Packet size */ #define CDC_CMD_PACKET_SIZE 8 /* Control Endpoint Packet size */
#if defined(USE_USB_FS)
#define CDC_DATA_MAX_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE
#elif defined(USE_USB_HS)
#define CDC_DATA_MAX_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE
#else
#error "USB speed is not defined"
#endif
#define USB_CDC_CONFIG_DESC_SIZ 75 #define USB_CDC_CONFIG_DESC_SIZ 75
#define CDC_DATA_HS_IN_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE #define CDC_DATA_HS_IN_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE
#define CDC_DATA_HS_OUT_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE #define CDC_DATA_HS_OUT_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE

View File

@ -193,8 +193,8 @@ __ALIGN_BEGIN uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
CDC_OUT_EP, /* bEndpointAddress */ CDC_OUT_EP, /* bEndpointAddress */
0x02, /* bmAttributes: Bulk */ 0x02, /* bmAttributes: Bulk */
LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */
HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
0x00, /* bInterval: ignore for Bulk transfer */ 0x00, /* bInterval: ignore for Bulk transfer */
/*Endpoint IN Descriptor*/ /*Endpoint IN Descriptor*/
@ -202,8 +202,8 @@ __ALIGN_BEGIN uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
CDC_IN_EP, /* bEndpointAddress */ CDC_IN_EP, /* bEndpointAddress */
0x02, /* bmAttributes: Bulk */ 0x02, /* bmAttributes: Bulk */
LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */
HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
0x00 /* bInterval: ignore for Bulk transfer */ 0x00 /* bInterval: ignore for Bulk transfer */
} ; } ;

View File

@ -26,7 +26,7 @@ uint8_t UserTxBuffer[APP_TX_DATA_SIZE];/* Received Data over UART (CDC interface
static volatile uint8_t ide_connected = 0; static volatile uint8_t ide_connected = 0;
static volatile uint8_t vcp_connected = 0; static volatile uint8_t vcp_connected = 0;
#define FLASH_BUF_SIZE (64) #define FLASH_BUF_SIZE (CDC_DATA_MAX_PACKET_SIZE)
static volatile uint32_t flash_buf_idx=0; static volatile uint32_t flash_buf_idx=0;
static volatile uint8_t flash_buf[FLASH_BUF_SIZE]; static volatile uint8_t flash_buf[FLASH_BUF_SIZE];
static const uint32_t flash_layout[3] = OMV_FLASH_LAYOUT; static const uint32_t flash_layout[3] = OMV_FLASH_LAYOUT;
@ -103,7 +103,7 @@ static int8_t CDC_Itf_DeInit(void)
* @param Len: Number of data to be sent (in bytes) * @param Len: Number of data to be sent (in bytes)
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
*/ */
static int8_t CDC_Itf_Control (uint8_t cmd, uint8_t* pbuf, uint16_t length) static int8_t CDC_Itf_Control(uint8_t cmd, uint8_t* pbuf, uint16_t length)
{ {
switch (cmd) { switch (cmd) {
case CDC_SEND_ENCAPSULATED_COMMAND: case CDC_SEND_ENCAPSULATED_COMMAND:
@ -327,5 +327,3 @@ uint8_t USBD_IDE_Connected(void)
{ {
return ide_connected; return ide_connected;
} }

View File

@ -16,8 +16,8 @@
* *
* http://www.st.com/software_license_agreement_liberty_v2 * http://www.st.com/software_license_agreement_liberty_v2
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
@ -53,49 +53,116 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
if(hpcd->Instance == USB_OTG_FS) if(hpcd->Instance == USB_OTG_FS)
{ {
/* Configure USB FS GPIOs */ __HAL_RCC_GPIOA_CLK_ENABLE();
__GPIOA_CLK_ENABLE();
/* Configure DM DP Pins */
GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12); GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Configure VBUS Pin */ /* Configure VBUS Pin */
// USB VBUS detect pin is always A9
GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
#if 0 //defined(MICROPY_HW_USB_OTG_ID_PIN) #if defined(USE_USB_OTG_ID)
// Not used
// USB ID pin is always A10
GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
#endif #endif
#if defined(MCU_SERIES_H7) #if defined(MCU_SERIES_H7)
// Keep USB clock running during sleep or else __WFI() will disable the USB // Keep USB clock running during sleep or else __WFI() will disable the USB
__HAL_RCC_USB2_OTG_FS_CLK_SLEEP_ENABLE(); __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_ENABLE();
__HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_DISABLE(); __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_ENABLE();
#endif #endif
/* Enable USB FS Clocks */ /* Enable USB FS Clocks */
__USB_OTG_FS_CLK_ENABLE(); __USB_OTG_FS_CLK_ENABLE();
/* Set USBFS Interrupt priority */ /* Set USBFS Interrupt priority */
HAL_NVIC_SetPriority(OTG_FS_IRQn, 6, 0); HAL_NVIC_SetPriority(OTG_FS_IRQn, 6, 0);
/* Enable USBFS Interrupt */ /* Enable USBFS Interrupt */
HAL_NVIC_EnableIRQ(OTG_FS_IRQn); HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
}
}
#if defined(USE_USB_HS)
else if (hpcd->Instance == USB1_OTG_HS)
{
/* Configure USB FS GPIOs */
__GPIOA_CLK_ENABLE();
__GPIOB_CLK_ENABLE();
__GPIOC_CLK_ENABLE();
__GPIOH_CLK_ENABLE();
__GPIOI_CLK_ENABLE();
/* CLK */
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_HS;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* D0 */
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_HS;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* D1 D2 D3 D4 D5 D6 D7 */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5 |
GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_HS;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* STP */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_HS;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* NXT */
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_HS;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* DIR */
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_HS;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
/* Enable USB HS Clocks */
__HAL_RCC_USB1_OTG_HS_CLK_ENABLE();
__HAL_RCC_USB1_OTG_HS_CLK_SLEEP_ENABLE();
__HAL_RCC_USB1_OTG_HS_ULPI_CLK_ENABLE();
__HAL_RCC_USB1_OTG_HS_ULPI_CLK_SLEEP_ENABLE();
/* Set USBHS Interrupt priority */
HAL_NVIC_SetPriority(OTG_HS_IRQn, 6, 0);
/* Enable USBHS Interrupt */
HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
}
#endif
} }
/** /**
* @brief DeInitializes the PCD MSP. * @brief DeInitializes the PCD MSP.
* @param hpcd: PCD handle * @param hpcd: PCD handle
@ -105,17 +172,17 @@ void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
{ {
if(hpcd->Instance == USB_OTG_FS) if(hpcd->Instance == USB_OTG_FS)
{ {
/* Disable USB FS Clocks */ /* Disable USB FS Clocks */
__USB_OTG_FS_CLK_DISABLE(); __USB_OTG_FS_CLK_DISABLE();
__SYSCFG_CLK_DISABLE(); __SYSCFG_CLK_DISABLE();
} }
#if defined(USE_USB_HS) #if defined(USE_USB_HS)
else if(hpcd->Instance == USB_OTG_HS) else if(hpcd->Instance == USB_OTG_HS)
{ {
/* Disable USB FS Clocks */ /* Disable USB FS Clocks */
__USB_OTG_HS_CLK_DISABLE(); __USB_OTG_HS_CLK_DISABLE();
__SYSCFG_CLK_DISABLE(); __SYSCFG_CLK_DISABLE();
} }
#endif #endif
} }
@ -157,44 +224,35 @@ void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
USBD_LL_DataInStage(hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); USBD_LL_DataInStage(hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff);
} }
/**
* @brief SOF callback.
* @param hpcd: PCD handle
* @retval None
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
{
USBD_LL_SOF(hpcd->pData);
}
*/
/** /**
* @brief Reset callback. * @brief Reset callback.
* @param hpcd: PCD handle * @param hpcd: PCD handle
* @retval None * @retval None
*/ */
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
{ {
USBD_SpeedTypeDef speed = USBD_SPEED_FULL; USBD_SpeedTypeDef speed = USBD_SPEED_FULL;
/* Set USB Current Speed */ /* Set USB Current Speed */
switch(hpcd->Init.speed) switch (hpcd->Init.speed)
{ {
case PCD_SPEED_HIGH: case PCD_SPEED_HIGH:
speed = USBD_SPEED_HIGH; speed = USBD_SPEED_HIGH;
break; break;
case PCD_SPEED_FULL: case PCD_SPEED_FULL:
speed = USBD_SPEED_FULL; speed = USBD_SPEED_FULL;
break; break;
default: default:
speed = USBD_SPEED_FULL; speed = USBD_SPEED_FULL;
break; break;
} }
USBD_LL_SetSpeed(hpcd->pData, speed);
/* Reset Device */ /* Reset Device */
USBD_LL_Reset(hpcd->pData); USBD_LL_Reset(hpcd->pData);
USBD_LL_SetSpeed(hpcd->pData, speed);
} }
/** /**
@ -220,7 +278,7 @@ void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
/** /**
* @brief ISOC Out Incomplete callback. * @brief ISOC Out Incomplete callback.
* @param hpcd: PCD handle * @param hpcd: PCD handle
* @param epnum: Endpoint Number * @param epnum: Endpoint Number
* @retval None * @retval None
*/ */
void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
@ -231,7 +289,7 @@ void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
/** /**
* @brief ISOC In Incomplete callback. * @brief ISOC In Incomplete callback.
* @param hpcd: PCD handle * @param hpcd: PCD handle
* @param epnum: Endpoint Number * @param epnum: Endpoint Number
* @retval None * @retval None
*/ */
void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
@ -267,70 +325,68 @@ void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
LL Driver Interface (USB Device Library --> PCD) LL Driver Interface (USB Device Library --> PCD)
*******************************************************************************/ *******************************************************************************/
/** /**
* @brief Initializes the Low Level portion of the Device driver. * @brief Initializes the Low Level portion of the Device driver.
* @param pdev: Device handle * @param pdev: Device handle
* @retval USBD Status * @retval USBD Status
*/ */
USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev)
{ {
/* Change Systick prioity */ #if defined(USE_USB_FS)
NVIC_SetPriority (SysTick_IRQn, 0);
#ifdef USE_USB_FS
/*Set LL Driver parameters */ /*Set LL Driver parameters */
hpcd.Instance = USB_OTG_FS; hpcd.Instance = USB_OTG_FS;
hpcd.Init.dev_endpoints = 4; hpcd.Init.dev_endpoints = 4;
hpcd.Init.use_dedicated_ep1 = 0; hpcd.Init.use_dedicated_ep1 = 0;
hpcd.Init.ep0_mps = 0x40; hpcd.Init.ep0_mps = 0x40;
hpcd.Init.dma_enable = 0; hpcd.Init.dma_enable = 0;
hpcd.Init.low_power_enable = 0; hpcd.Init.low_power_enable = 0;
hpcd.Init.phy_itface = PCD_PHY_EMBEDDED; hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
hpcd.Init.Sof_enable = 1; hpcd.Init.Sof_enable = 1;
hpcd.Init.speed = PCD_SPEED_FULL; hpcd.Init.speed = PCD_SPEED_FULL;
hpcd.Init.vbus_sensing_enable = 1; hpcd.Init.vbus_sensing_enable = 0;
/* Link The driver to the stack */ /* Link The driver to the stack */
hpcd.pData = pdev; hpcd.pData = pdev;
pdev->pData = &hpcd; pdev->pData = &hpcd;
/*Initialize LL Driver */
/* Initialize LL Driver */
HAL_PCD_Init(&hpcd); HAL_PCD_Init(&hpcd);
HAL_PCDEx_SetRxFiFo(&hpcd, 0x80); HAL_PCDEx_SetRxFiFo(&hpcd, 0x80);
HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x40); HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x40);
HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x80); HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x80);
#elif defined(USE_USB_HS)
#endif
#ifdef USE_USB_HS
/*Set LL Driver parameters */ /*Set LL Driver parameters */
hpcd.Instance = USB_OTG_HS; hpcd.Instance = USB_OTG_HS;
hpcd.Init.dev_endpoints = 6; hpcd.Init.dev_endpoints = 6;
hpcd.Init.use_dedicated_ep1 = 0; hpcd.Init.use_dedicated_ep1 = 0;
hpcd.Init.ep0_mps = 0x40; hpcd.Init.ep0_mps = 0x40;
/* Be aware that enabling USB-DMA mode will result in data being sent only by /* Be aware that enabling DMA mode will result in data being sent only by
multiple of 4 packet sizes. This is due to the fact that USB-DMA does * multiple of 4 packet sizes. This is due to the fact that USB DMA does not
not allow sending data from non word-aligned addresses. * allow sending data from non word-aligned addresses. For this specific
For this specific application, it is advised to not enable this option * application, it is advised to not enable this option unless required. */
unless required. */
hpcd.Init.dma_enable = 0; hpcd.Init.dma_enable = 0;
hpcd.Init.low_power_enable = 0; hpcd.Init.low_power_enable = 0;
hpcd.Init.phy_itface = PCD_PHY_ULPI; hpcd.Init.lpm_enable = 0;
hpcd.Init.Sof_enable = 0;
hpcd.Init.speed = PCD_SPEED_HIGH; hpcd.Init.speed = PCD_SPEED_HIGH;
hpcd.Init.phy_itface = PCD_PHY_ULPI;
hpcd.Init.Sof_enable = 1;
hpcd.Init.use_external_vbus = 0;
hpcd.Init.vbus_sensing_enable = 1; hpcd.Init.vbus_sensing_enable = 1;
hpcd.Init.battery_charging_enable = 0;
/* Link The driver to the stack */ /* Link The driver to the stack */
hpcd.pData = pdev; hpcd.pData = pdev;
pdev->pData = &hpcd; pdev->pData = &hpcd;
/*Initialize LL Driver */ /*Initialize LL Driver */
HAL_PCD_Init(&hpcd); HAL_PCD_Init(&hpcd);
HAL_PCDEx_SetRxFiFo(&hpcd, 0x200); HAL_PCDEx_SetRxFiFo(&hpcd, 0x200);
HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x80); HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x80);
HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x174); HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x174);
#endif
#endif
return USBD_OK; return USBD_OK;
} }
@ -342,18 +398,18 @@ USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev)
USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev) USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev)
{ {
HAL_PCD_DeInit(pdev->pData); HAL_PCD_DeInit(pdev->pData);
return USBD_OK; return USBD_OK;
} }
/** /**
* @brief Starts the Low Level portion of the Device driver. * @brief Starts the Low Level portion of the Device driver.
* @param pdev: Device handle * @param pdev: Device handle
* @retval USBD Status * @retval USBD Status
*/ */
USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev)
{ {
HAL_PCD_Start(pdev->pData); HAL_PCD_Start(pdev->pData);
return USBD_OK; return USBD_OK;
} }
/** /**
@ -364,159 +420,150 @@ USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev)
USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev)
{ {
HAL_PCD_Stop(pdev->pData); HAL_PCD_Stop(pdev->pData);
return USBD_OK; return USBD_OK;
} }
/** /**
* @brief Opens an endpoint of the Low Level Driver. * @brief Opens an endpoint of the Low Level Driver.
* @param pdev: Device handle * @param pdev: Device handle
* @param ep_addr: Endpoint Number * @param ep_addr: Endpoint Number
* @param ep_type: Endpoint Type * @param ep_type: Endpoint Type
* @param ep_mps: Endpoint Max Packet Size * @param ep_mps: Endpoint Max Packet Size
* @retval USBD Status * @retval USBD Status
*/ */
USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps)
uint8_t ep_addr,
uint8_t ep_type,
uint16_t ep_mps)
{ {
HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type); HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type);
return USBD_OK; return USBD_OK;
} }
/** /**
* @brief Closes an endpoint of the Low Level Driver. * @brief Closes an endpoint of the Low Level Driver.
* @param pdev: Device handle * @param pdev: Device handle
* @param ep_addr: Endpoint Number * @param ep_addr: Endpoint Number
* @retval USBD Status * @retval USBD Status
*/ */
USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
{ {
HAL_PCD_EP_Close(pdev->pData, ep_addr); HAL_PCD_EP_Close(pdev->pData, ep_addr);
return USBD_OK; return USBD_OK;
} }
/** /**
* @brief Flushes an endpoint of the Low Level Driver. * @brief Flushes an endpoint of the Low Level Driver.
* @param pdev: Device handle * @param pdev: Device handle
* @param ep_addr: Endpoint Number * @param ep_addr: Endpoint Number
* @retval USBD Status * @retval USBD Status
*/ */
USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
{ {
HAL_PCD_EP_Flush(pdev->pData, ep_addr); HAL_PCD_EP_Flush(pdev->pData, ep_addr);
return USBD_OK; return USBD_OK;
} }
/** /**
* @brief Sets a Stall condition on an endpoint of the Low Level Driver. * @brief Sets a Stall condition on an endpoint of the Low Level Driver.
* @param pdev: Device handle * @param pdev: Device handle
* @param ep_addr: Endpoint Number * @param ep_addr: Endpoint Number
* @retval USBD Status * @retval USBD Status
*/ */
USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
{ {
HAL_PCD_EP_SetStall(pdev->pData, ep_addr); HAL_PCD_EP_SetStall(pdev->pData, ep_addr);
return USBD_OK; return USBD_OK;
} }
/** /**
* @brief Clears a Stall condition on an endpoint of the Low Level Driver. * @brief Clears a Stall condition on an endpoint of the Low Level Driver.
* @param pdev: Device handle * @param pdev: Device handle
* @param ep_addr: Endpoint Number * @param ep_addr: Endpoint Number
* @retval USBD Status * @retval USBD Status
*/ */
USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
{ {
HAL_PCD_EP_ClrStall(pdev->pData, ep_addr); HAL_PCD_EP_ClrStall(pdev->pData, ep_addr);
return USBD_OK; return USBD_OK;
} }
/** /**
* @brief Returns Stall condition. * @brief Returns Stall condition.
* @param pdev: Device handle * @param pdev: Device handle
* @param ep_addr: Endpoint Number * @param ep_addr: Endpoint Number
* @retval Stall (1: yes, 0: No) * @retval Stall (1: yes, 0: No)
*/ */
uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
{ {
PCD_HandleTypeDef *hpcd = pdev->pData; PCD_HandleTypeDef *hpcd = pdev->pData;
if((ep_addr & 0x80) == 0x80) if ((ep_addr & 0x80) == 0x80)
{ {
return hpcd->IN_ep[ep_addr & 0x7F].is_stall; return hpcd->IN_ep[ep_addr & 0x7F].is_stall;
} }
else else
{ {
return hpcd->OUT_ep[ep_addr & 0x7F].is_stall; return hpcd->OUT_ep[ep_addr & 0x7F].is_stall;
} }
} }
/** /**
* @brief Assigns an USB address to the device * @brief Assigns an USB address to the device
* @param pdev: Device handle * @param pdev: Device handle
* @param dev_addr: USB address * @param dev_addr: USB address
* @retval USBD Status * @retval USBD Status
*/ */
USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr) USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr)
{ {
HAL_PCD_SetAddress(pdev->pData, dev_addr); HAL_PCD_SetAddress(pdev->pData, dev_addr);
return USBD_OK; return USBD_OK;
} }
/** /**
* @brief Transmits data over an endpoint * @brief Transmits data over an endpoint
* @param pdev: Device handle * @param pdev: Device handle
* @param ep_addr: Endpoint Number * @param ep_addr: Endpoint Number
* @param pbuf: Pointer to data to be sent * @param pbuf: Pointer to data to be sent
* @param size: Data size * @param size: Data size
* @retval USBD Status * @retval USBD Status
*/ */
USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size)
uint8_t ep_addr,
uint8_t *pbuf,
uint16_t size)
{ {
HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size);
return USBD_OK; return USBD_OK;
} }
/** /**
* @brief Prepares an endpoint for reception * @brief Prepares an endpoint for reception
* @param pdev: Device handle * @param pdev: Device handle
* @param ep_addr: Endpoint Number * @param ep_addr: Endpoint Number
* @param pbuf:pointer to data to be received * @param pbuf:pointer to data to be received
* @param size: data size * @param size: data size
* @retval USBD Status * @retval USBD Status
*/ */
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size)
uint8_t ep_addr,
uint8_t *pbuf,
uint16_t size)
{ {
HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size);
return USBD_OK; return USBD_OK;
} }
/** /**
* @brief Returns the last transfered packet size. * @brief Returns the last transfered packet size.
* @param pdev: Device handle * @param pdev: Device handle
* @param ep_addr: Endpoint Number * @param ep_addr: Endpoint Number
* @retval Recived Data Size * @retval Recived Data Size
*/ */
uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
{ {
return HAL_PCD_EP_GetRxCount(pdev->pData, ep_addr); return HAL_PCD_EP_GetRxCount(pdev->pData, ep_addr);
} }
/** /**
* @brief Delay routine for the USB Device Library * @brief Delay routine for the USB Device Library.
* @param Delay: Delay in ms * @param Delay: Delay in ms
* @retval None * @retval None
*/ */
void USBD_LL_Delay(uint32_t Delay) void USBD_LL_Delay(uint32_t Delay)
{ {
HAL_Delay(Delay); HAL_Delay(Delay);
} }
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/