From 6482cf2a698d1108510680f95ac0373ac21b92ce Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 30 Jul 2017 16:10:36 +0200 Subject: USB HID host code import --- usbh_conf.c | 434 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 434 insertions(+) create mode 100644 usbh_conf.c (limited to 'usbh_conf.c') diff --git a/usbh_conf.c b/usbh_conf.c new file mode 100644 index 0000000..851c4ff --- /dev/null +++ b/usbh_conf.c @@ -0,0 +1,434 @@ +/** + ****************************************************************************** + * @file USB_Host/HID_Standalone/Src/usbh_conf.c + * @author MCD Application Team + * @version V1.1.0 + * @date 17-February-2017 + * @brief USB Host configuration file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" +#include "usbh_core.h" + +HCD_HandleTypeDef hhcd; + +/******************************************************************************* + HCD BSP Routines +*******************************************************************************/ +/** + * @brief Initializes the HCD MSP. + * @param hhcd: HCD handle + * @retval None + */ +void HAL_HCD_MspInit(HCD_HandleTypeDef* hhcd) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* Configure USB FS GPIOs */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + + GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12); + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* Configure POWER_SWITCH IO pin */ + __HAL_RCC_GPIOB_CLK_ENABLE(); + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* Enable USB FS Clocks */ + __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + + /* Set USBFS Interrupt priority */ + HAL_NVIC_SetPriority(OTG_FS_IRQn, 6, 0); + + /* Enable USBFS Interrupt */ + HAL_NVIC_EnableIRQ(OTG_FS_IRQn); +} + +/** + * @brief DeInitializes the HCD MSP. + * @param hhcd: HCD handle + * @retval None + */ +void HAL_HCD_MspDeInit(HCD_HandleTypeDef* hhcd) +{ + /* Disable USB FS Clocks */ + __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); +} + +/******************************************************************************* + LL Driver Callbacks (HCD -> USB Host Library) +*******************************************************************************/ + +/** + * @brief SOF callback. + * @param hhcd: HCD handle + * @retval None + */ +void HAL_HCD_SOF_Callback(HCD_HandleTypeDef* hhcd) +{ + USBH_LL_IncTimer(hhcd->pData); +} + +/** + * @brief Connect callback. + * @param hhcd: HCD handle + * @retval None + */ +void HAL_HCD_Connect_Callback(HCD_HandleTypeDef* hhcd) +{ + USBH_LL_Connect(hhcd->pData); +} + +/** + * @brief Disconnect callback. + * @param hhcd: HCD handle + * @retval None + */ +void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef* hhcd) +{ + USBH_LL_Disconnect(hhcd->pData); +} + +/** + * @brief Notify URB state change callback. + * @param hhcd: HCD handle + * @param chnum: Channel number + * @param urb_state: URB State + * @retval None + */ +void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef* hhcd, uint8_t chnum, + HCD_URBStateTypeDef urb_state) +{ + /* To be used with OS to sync URB state with the global state machine */ +} + +/******************************************************************************* + LL Driver Interface (USB Host Library --> HCD) +*******************************************************************************/ +/** + * @brief USBH_LL_Init + * Initialize the Low Level portion of the Host driver. + * @param phost: Host handle + * @retval USBH Status + */ +USBH_StatusTypeDef USBH_LL_Init(USBH_HandleTypeDef* phost) +{ + /* Set the LL Driver parameters */ + hhcd.Instance = USB_OTG_FS; + hhcd.Init.Host_channels = 11; + hhcd.Init.dma_enable = 0; + hhcd.Init.low_power_enable = 0; + hhcd.Init.phy_itface = HCD_PHY_EMBEDDED; + hhcd.Init.Sof_enable = 0; + hhcd.Init.speed = HCD_SPEED_FULL; + hhcd.Init.vbus_sensing_enable = 0; + hhcd.Init.lpm_enable = 0; + + /* Link the driver to the stack */ + hhcd.pData = phost; + phost->pData = &hhcd; + + /* Initialize the LL Driver */ + HAL_HCD_Init(&hhcd); + + USBH_LL_SetTimer(phost, HAL_HCD_GetCurrentFrame(&hhcd)); + + return USBH_OK; +} + +/** + * @brief De-Initializes the Low Level portion of the Host driver. + * @param phost: Host handle + * @retval USBH Status + */ +USBH_StatusTypeDef USBH_LL_DeInit(USBH_HandleTypeDef* phost) +{ + HAL_HCD_DeInit(phost->pData); + return USBH_OK; +} + +/** + * @brief Starts the Low Level portion of the Host driver. + * @param phost: Host handle + * @retval USBH Status + */ +USBH_StatusTypeDef USBH_LL_Start(USBH_HandleTypeDef* phost) +{ + HAL_HCD_Start(phost->pData); + return USBH_OK; +} + +/** + * @brief Stops the Low Level portion of the Host driver. + * @param phost: Host handle + * @retval USBH Status + */ +USBH_StatusTypeDef USBH_LL_Stop(USBH_HandleTypeDef* phost) +{ + HAL_HCD_Stop(phost->pData); + return USBH_OK; +} + +/** + * @brief Returns the USB Host Speed from the Low Level Driver. + * @param phost: Host handle + * @retval USBH Speeds + */ +USBH_SpeedTypeDef USBH_LL_GetSpeed(USBH_HandleTypeDef* phost) +{ + USBH_SpeedTypeDef speed = USBH_SPEED_FULL; + + switch (HAL_HCD_GetCurrentSpeed(phost->pData)) { + case 0: + speed = USBH_SPEED_HIGH; + break; + + case 1: + speed = USBH_SPEED_FULL; + break; + + case 2: + speed = USBH_SPEED_LOW; + break; + + default: + speed = USBH_SPEED_FULL; + break; + } + return speed; +} + +/** + * @brief Resets the Host Port of the Low Level Driver. + * @param phost: Host handle + * @retval USBH Status + */ +USBH_StatusTypeDef USBH_LL_ResetPort(USBH_HandleTypeDef* phost) +{ + HAL_HCD_ResetPort(phost->pData); + return USBH_OK; +} + +/** + * @brief Returns the last transferred packet size. + * @param phost: Host handle + * @param pipe: Pipe index + * @retval Packet Size + */ +uint32_t USBH_LL_GetLastXferSize(USBH_HandleTypeDef* phost, uint8_t pipe) +{ + return HAL_HCD_HC_GetXferCount(phost->pData, pipe); +} + +/** + * @brief Opens a pipe of the Low Level Driver. + * @param phost: Host handle + * @param pipe: Pipe index + * @param epnum: Endpoint Number + * @param dev_address: Device USB address + * @param speed: Device Speed + * @param ep_type: Endpoint Type + * @param mps: Endpoint Max Packet Size + * @retval USBH Status + */ +USBH_StatusTypeDef USBH_LL_OpenPipe(USBH_HandleTypeDef* phost, uint8_t pipe, + uint8_t epnum, uint8_t dev_address, + uint8_t speed, uint8_t ep_type, + uint16_t mps) +{ + HAL_HCD_HC_Init(phost->pData, pipe, epnum, dev_address, speed, ep_type, mps); + return USBH_OK; +} + +/** + * @brief Closes a pipe of the Low Level Driver. + * @param phost: Host handle + * @param pipe: Pipe index + * @retval USBH Status + */ +USBH_StatusTypeDef USBH_LL_ClosePipe(USBH_HandleTypeDef* phost, uint8_t pipe) +{ + HAL_HCD_HC_Halt(phost->pData, pipe); + return USBH_OK; +} + +/** + * @brief Submits a new URB to the low level driver. + * @param phost: Host handle + * @param pipe: Pipe index + * This parameter can be a value from 1 to 15 + * @param direction: Channel number + * This parameter can be one of these values: + * 0: Output + * 1: Input + * @param ep_type: Endpoint Type + * This parameter can be one of these values: + * @arg EP_TYPE_CTRL: Control type + * @arg EP_TYPE_ISOC: Isochronous type + * @arg EP_TYPE_BULK: Bulk type + * @arg EP_TYPE_INTR: Interrupt type + * @param token: Endpoint Type + * This parameter can be one of these values: + * @arg 0: PID_SETUP + * @arg 1: PID_DATA + * @param pbuff: pointer to URB data + * @param length: length of URB data + * @param do_ping: activate do ping protocol (for high speed only) + * This parameter can be one of these values: + * 0: do ping inactive + * 1: do ping active + * @retval USBH Status + */ +USBH_StatusTypeDef USBH_LL_SubmitURB(USBH_HandleTypeDef* phost, uint8_t pipe, + uint8_t direction, uint8_t ep_type, + uint8_t token, uint8_t* pbuff, + uint16_t length, uint8_t do_ping) +{ + HAL_HCD_HC_SubmitRequest(phost->pData, pipe, direction, ep_type, token, pbuff, + length, do_ping); + return USBH_OK; +} + +/** + * @brief Gets a URB state from the low level driver. + * @param phost: Host handle + * @param pipe: Pipe index + * This parameter can be a value from 1 to 15 + * @retval URB state + * This parameter can be one of these values: + * @arg URB_IDLE + * @arg URB_DONE + * @arg URB_NOTREADY + * @arg URB_NYET + * @arg URB_ERROR + * @arg URB_STALL + */ +USBH_URBStateTypeDef USBH_LL_GetURBState(USBH_HandleTypeDef* phost, + uint8_t pipe) +{ + return (USBH_URBStateTypeDef)HAL_HCD_HC_GetURBState(phost->pData, pipe); +} + +/** + * @brief Drives VBUS. + * @param phost: Host handle + * @param state: VBUS state + * This parameter can be one of these values: + * 0: VBUS Active + * 1: VBUS Inactive + * @retval USBH Status + */ +USBH_StatusTypeDef USBH_LL_DriverVBUS(USBH_HandleTypeDef* phost, + uint8_t state) +{ + if (state == 0) { + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); + } else { + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); + } + HAL_Delay(200); + return USBH_OK; +} + +/** + * @brief Sets toggle for a pipe. + * @param phost: Host handle + * @param pipe: Pipe index + * @param toggle: toggle (0/1) + * @retval USBH Status + */ +USBH_StatusTypeDef USBH_LL_SetToggle(USBH_HandleTypeDef* phost, uint8_t pipe, + uint8_t toggle) +{ + if (hhcd.hc[pipe].ep_is_in) { + hhcd.hc[pipe].toggle_in = toggle; + } else { + hhcd.hc[pipe].toggle_out = toggle; + } + return USBH_OK; +} + +/** + * @brief Returns the current toggle of a pipe. + * @param phost: Host handle + * @param pipe: Pipe index + * @retval toggle (0/1) + */ +uint8_t USBH_LL_GetToggle(USBH_HandleTypeDef* phost, uint8_t pipe) +{ + uint8_t toggle = 0; + + if (hhcd.hc[pipe].ep_is_in) { + toggle = hhcd.hc[pipe].toggle_in; + } else { + toggle = hhcd.hc[pipe].toggle_out; + } + return toggle; +} + +/** + * @brief Delay routine for the USB Host Library + * @param Delay: Delay in ms + * @retval None + */ +void USBH_Delay(uint32_t Delay) +{ +#if (USBH_USE_OS == 1) + osDelay(Delay); +#else + HAL_Delay(Delay); +#endif +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ -- cgit