diff options
Diffstat (limited to 'stm/stmusbh/usbh_hid_core.c')
| -rw-r--r-- | stm/stmusbh/usbh_hid_core.c | 658 |
1 files changed, 0 insertions, 658 deletions
diff --git a/stm/stmusbh/usbh_hid_core.c b/stm/stmusbh/usbh_hid_core.c deleted file mode 100644 index a60038d2b..000000000 --- a/stm/stmusbh/usbh_hid_core.c +++ /dev/null @@ -1,658 +0,0 @@ -/**
- ******************************************************************************
- * @file usbh_hid_core.c
- * @author MCD Application Team
- * @version V2.1.0
- * @date 19-March-2012
- * @brief This file is the HID Layer Handlers for USB Host HID class.
- *
- * @verbatim
- *
- * ===================================================================
- * HID Class Description
- * ===================================================================
- * This module manages the MSC class V1.11 following the "Device Class Definition
- * for Human Interface Devices (HID) Version 1.11 Jun 27, 2001".
- * This driver implements the following aspects of the specification:
- * - The Boot Interface Subclass
- * - The Mouse and Keyboard protocols
- *
- * @endverbatim
- *
- ******************************************************************************
- * @attention
- *
- * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>
- *
- * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************
- */
-
-/* Includes ------------------------------------------------------------------*/
-#include "usbh_hid_core.h"
-#include "usbh_hid_mouse.h"
-#include "usbh_hid_keybd.h"
-
-/** @addtogroup USBH_LIB
-* @{
-*/
-
-/** @addtogroup USBH_CLASS
-* @{
-*/
-
-/** @addtogroup USBH_HID_CLASS
-* @{
-*/
-
-/** @defgroup USBH_HID_CORE
-* @brief This file includes HID Layer Handlers for USB Host HID class.
-* @{
-*/
-
-/** @defgroup USBH_HID_CORE_Private_TypesDefinitions
-* @{
-*/
-/**
-* @}
-*/
-
-
-/** @defgroup USBH_HID_CORE_Private_Defines
-* @{
-*/
-/**
-* @}
-*/
-
-
-/** @defgroup USBH_HID_CORE_Private_Macros
-* @{
-*/
-/**
-* @}
-*/
-
-
-/** @defgroup USBH_HID_CORE_Private_Variables
-* @{
-*/
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
- #if defined ( __ICCARM__ ) /*!< IAR Compiler */
- #pragma data_alignment=4
- #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN HID_Machine_TypeDef HID_Machine __ALIGN_END ;
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
- #if defined ( __ICCARM__ ) /*!< IAR Compiler */
- #pragma data_alignment=4
- #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN HID_Report_TypeDef HID_Report __ALIGN_END ;
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
- #if defined ( __ICCARM__ ) /*!< IAR Compiler */
- #pragma data_alignment=4
- #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN USB_Setup_TypeDef HID_Setup __ALIGN_END ;
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
- #if defined ( __ICCARM__ ) /*!< IAR Compiler */
- #pragma data_alignment=4
- #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN USBH_HIDDesc_TypeDef HID_Desc __ALIGN_END ;
-
-__IO uint8_t start_toggle = 0;
-/**
-* @}
-*/
-
-
-/** @defgroup USBH_HID_CORE_Private_FunctionPrototypes
-* @{
-*/
-
-static USBH_Status USBH_HID_InterfaceInit (USB_OTG_CORE_HANDLE *pdev ,
- void *phost);
-
-static void USBH_ParseHIDDesc (USBH_HIDDesc_TypeDef *desc, uint8_t *buf);
-
-static void USBH_HID_InterfaceDeInit (USB_OTG_CORE_HANDLE *pdev ,
- void *phost);
-
-static USBH_Status USBH_HID_Handle(USB_OTG_CORE_HANDLE *pdev ,
- void *phost);
-
-static USBH_Status USBH_HID_ClassRequest(USB_OTG_CORE_HANDLE *pdev ,
- void *phost);
-
-static USBH_Status USBH_Get_HID_ReportDescriptor (USB_OTG_CORE_HANDLE *pdev,
- USBH_HOST *phost,
- uint16_t length);
-
-static USBH_Status USBH_Get_HID_Descriptor (USB_OTG_CORE_HANDLE *pdev,\
- USBH_HOST *phost,
- uint16_t length);
-
-static USBH_Status USBH_Set_Idle (USB_OTG_CORE_HANDLE *pdev,
- USBH_HOST *phost,
- uint8_t duration,
- uint8_t reportId);
-
-static USBH_Status USBH_Set_Protocol (USB_OTG_CORE_HANDLE *pdev,
- USBH_HOST *phost,
- uint8_t protocol);
-
-
-USBH_Class_cb_TypeDef HID_cb =
-{
- USBH_HID_InterfaceInit,
- USBH_HID_InterfaceDeInit,
- USBH_HID_ClassRequest,
- USBH_HID_Handle
-};
-/**
-* @}
-*/
-
-
-/** @defgroup USBH_HID_CORE_Private_Functions
-* @{
-*/
-
-/**
-* @brief USBH_HID_InterfaceInit
-* The function init the HID class.
-* @param pdev: Selected device
-* @param hdev: Selected device property
-* @retval USBH_Status :Response for USB HID driver intialization
-*/
-static USBH_Status USBH_HID_InterfaceInit ( USB_OTG_CORE_HANDLE *pdev,
- void *phost)
-{
- uint8_t maxEP;
- USBH_HOST *pphost = phost;
-
- uint8_t num =0;
- USBH_Status status = USBH_BUSY ;
- HID_Machine.state = HID_ERROR;
-
- //printf("USBH_HID_InterfaceInit\n");
- if(pphost->device_prop.Itf_Desc[0].bInterfaceSubClass == HID_BOOT_CODE)
- {
- /*Decode Bootclass Protocl: Mouse or Keyboard*/
- if(pphost->device_prop.Itf_Desc[0].bInterfaceProtocol == HID_KEYBRD_BOOT_CODE)
- {
- HID_Machine.cb = &HID_KEYBRD_cb;
- }
- else if(pphost->device_prop.Itf_Desc[0].bInterfaceProtocol == HID_MOUSE_BOOT_CODE)
- {
- HID_Machine.cb = &HID_MOUSE_cb;
- }
- //printf("USBH_HID_InterfaceInit %x %x\n", pphost->device_prop.Itf_Desc[0].bInterfaceSubClass, pphost->device_prop.Itf_Desc[0].bInterfaceProtocol);
-
- HID_Machine.state = HID_IDLE;
- HID_Machine.ctl_state = HID_REQ_IDLE;
- HID_Machine.ep_addr = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;
- HID_Machine.length = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;
- HID_Machine.poll = pphost->device_prop.Ep_Desc[0][0].bInterval ;
-
- if (HID_Machine.poll < HID_MIN_POLL)
- {
- HID_Machine.poll = HID_MIN_POLL;
- }
-
-
- /* Check fo available number of endpoints */
- /* Find the number of EPs in the Interface Descriptor */
- /* Choose the lower number in order not to overrun the buffer allocated */
- maxEP = ( (pphost->device_prop.Itf_Desc[0].bNumEndpoints <= USBH_MAX_NUM_ENDPOINTS) ?
- pphost->device_prop.Itf_Desc[0].bNumEndpoints :
- USBH_MAX_NUM_ENDPOINTS);
-
-
- /* Decode endpoint IN and OUT address from interface descriptor */
- for (num=0; num < maxEP; num++)
- {
- if(pphost->device_prop.Ep_Desc[0][num].bEndpointAddress & 0x80)
- {
- HID_Machine.HIDIntInEp = (pphost->device_prop.Ep_Desc[0][num].bEndpointAddress);
- HID_Machine.hc_num_in =\
- USBH_Alloc_Channel(pdev,
- pphost->device_prop.Ep_Desc[0][num].bEndpointAddress);
-
- /* Open channel for IN endpoint */
- USBH_Open_Channel (pdev,
- HID_Machine.hc_num_in,
- pphost->device_prop.address,
- pphost->device_prop.speed,
- EP_TYPE_INTR,
- HID_Machine.length);
- }
- else
- {
- HID_Machine.HIDIntOutEp = (pphost->device_prop.Ep_Desc[0][num].bEndpointAddress);
- HID_Machine.hc_num_out =\
- USBH_Alloc_Channel(pdev,
- pphost->device_prop.Ep_Desc[0][num].bEndpointAddress);
-
- /* Open channel for OUT endpoint */
- USBH_Open_Channel (pdev,
- HID_Machine.hc_num_out,
- pphost->device_prop.address,
- pphost->device_prop.speed,
- EP_TYPE_INTR,
- HID_Machine.length);
- }
-
- }
-
- start_toggle =0;
- status = USBH_OK;
- }
- else
- {
- pphost->usr_cb->DeviceNotSupported();
- }
-
- return status;
-
-}
-
-
-
-/**
-* @brief USBH_HID_InterfaceDeInit
-* The function DeInit the Host Channels used for the HID class.
-* @param pdev: Selected device
-* @param hdev: Selected device property
-* @retval None
-*/
-void USBH_HID_InterfaceDeInit ( USB_OTG_CORE_HANDLE *pdev,
- void *phost)
-{
- //USBH_HOST *pphost = phost;
-
- if(HID_Machine.hc_num_in != 0x00)
- {
- USB_OTG_HC_Halt(pdev, HID_Machine.hc_num_in);
- USBH_Free_Channel (pdev, HID_Machine.hc_num_in);
- HID_Machine.hc_num_in = 0; /* Reset the Channel as Free */
- }
-
- if(HID_Machine.hc_num_out != 0x00)
- {
- USB_OTG_HC_Halt(pdev, HID_Machine.hc_num_out);
- USBH_Free_Channel (pdev, HID_Machine.hc_num_out);
- HID_Machine.hc_num_out = 0; /* Reset the Channel as Free */
- }
-
- start_toggle = 0;
-}
-
-/**
-* @brief USBH_HID_ClassRequest
-* The function is responsible for handling HID Class requests
-* for HID class.
-* @param pdev: Selected device
-* @param hdev: Selected device property
-* @retval USBH_Status :Response for USB Set Protocol request
-*/
-static USBH_Status USBH_HID_ClassRequest(USB_OTG_CORE_HANDLE *pdev ,
- void *phost)
-{
- USBH_HOST *pphost = phost;
-
- USBH_Status status = USBH_BUSY;
- USBH_Status classReqStatus = USBH_BUSY;
-
-
- /* Switch HID state machine */
- switch (HID_Machine.ctl_state)
- {
- case HID_IDLE:
- case HID_REQ_GET_HID_DESC:
-
- /* Get HID Desc */
- if (USBH_Get_HID_Descriptor (pdev, pphost, USB_HID_DESC_SIZE)== USBH_OK)
- {
-
- USBH_ParseHIDDesc(&HID_Desc, pdev->host.Rx_Buffer);
- HID_Machine.ctl_state = HID_REQ_GET_REPORT_DESC;
- }
-
- break;
- case HID_REQ_GET_REPORT_DESC:
-
-
- /* Get Report Desc */
- if (USBH_Get_HID_ReportDescriptor(pdev , pphost, HID_Desc.wItemLength) == USBH_OK)
- {
- HID_Machine.ctl_state = HID_REQ_SET_IDLE;
- }
-
- break;
-
- case HID_REQ_SET_IDLE:
-
- classReqStatus = USBH_Set_Idle (pdev, pphost, 0, 0);
-
- /* set Idle */
- if (classReqStatus == USBH_OK)
- {
- HID_Machine.ctl_state = HID_REQ_SET_PROTOCOL;
- }
- else if(classReqStatus == USBH_NOT_SUPPORTED)
- {
- HID_Machine.ctl_state = HID_REQ_SET_PROTOCOL;
- }
- break;
-
- case HID_REQ_SET_PROTOCOL:
- /* set protocol */
- if (USBH_Set_Protocol (pdev ,pphost, 0) == USBH_OK)
- {
- HID_Machine.ctl_state = HID_REQ_IDLE;
-
- /* all requests performed*/
- status = USBH_OK;
- }
- break;
-
- default:
- break;
- }
-
- return status;
-}
-
-
-/**
-* @brief USBH_HID_Handle
-* The function is for managing state machine for HID data transfers
-* @param pdev: Selected device
-* @param hdev: Selected device property
-* @retval USBH_Status
-*/
-static USBH_Status USBH_HID_Handle(USB_OTG_CORE_HANDLE *pdev ,
- void *phost)
-{
- USBH_HOST *pphost = phost;
- USBH_Status status = USBH_OK;
-
- switch (HID_Machine.state)
- {
-
- case HID_IDLE:
- HID_Machine.cb->Init();
- HID_Machine.state = HID_SYNC;
-
- case HID_SYNC:
-
- /* Sync with start of Even Frame */
- if(USB_OTG_IsEvenFrame(pdev) == TRUE)
- {
- HID_Machine.state = HID_GET_DATA;
- }
- break;
-
- case HID_GET_DATA:
-
- USBH_InterruptReceiveData(pdev,
- HID_Machine.buff,
- HID_Machine.length,
- HID_Machine.hc_num_in);
- start_toggle = 1;
-
- HID_Machine.state = HID_POLL;
- HID_Machine.timer = HCD_GetCurrentFrame(pdev);
- break;
-
- case HID_POLL:
- if(( HCD_GetCurrentFrame(pdev) - HID_Machine.timer) >= HID_Machine.poll)
- {
- HID_Machine.state = HID_GET_DATA;
- }
- else if(HCD_GetURB_State(pdev , HID_Machine.hc_num_in) == URB_DONE)
- {
- if(start_toggle == 1) /* handle data once */
- {
- start_toggle = 0;
- HID_Machine.cb->Decode(HID_Machine.buff);
- }
- }
- else if(HCD_GetURB_State(pdev, HID_Machine.hc_num_in) == URB_STALL) /* IN Endpoint Stalled */
- {
-
- /* Issue Clear Feature on interrupt IN endpoint */
- if( (USBH_ClrFeature(pdev,
- pphost,
- HID_Machine.ep_addr,
- HID_Machine.hc_num_in)) == USBH_OK)
- {
- /* Change state to issue next IN token */
- HID_Machine.state = HID_GET_DATA;
-
- }
-
- }
- break;
-
- default:
- break;
- }
- return status;
-}
-
-
-/**
-* @brief USBH_Get_HID_ReportDescriptor
-* Issue report Descriptor command to the device. Once the response
-* received, parse the report descriptor and update the status.
-* @param pdev : Selected device
-* @param Length : HID Report Descriptor Length
-* @retval USBH_Status : Response for USB HID Get Report Descriptor Request
-*/
-static USBH_Status USBH_Get_HID_ReportDescriptor (USB_OTG_CORE_HANDLE *pdev,
- USBH_HOST *phost,
- uint16_t length)
-{
-
- USBH_Status status;
-
- status = USBH_GetDescriptor(pdev,
- phost,
- USB_REQ_RECIPIENT_INTERFACE
- | USB_REQ_TYPE_STANDARD,
- USB_DESC_HID_REPORT,
- pdev->host.Rx_Buffer,
- length);
-
- /* HID report descriptor is available in pdev->host.Rx_Buffer.
- In case of USB Boot Mode devices for In report handling ,
- HID report descriptor parsing is not required.
- In case, for supporting Non-Boot Protocol devices and output reports,
- user may parse the report descriptor*/
-
-
- return status;
-}
-
-/**
-* @brief USBH_Get_HID_Descriptor
-* Issue HID Descriptor command to the device. Once the response
-* received, parse the report descriptor and update the status.
-* @param pdev : Selected device
-* @param Length : HID Descriptor Length
-* @retval USBH_Status : Response for USB HID Get Report Descriptor Request
-*/
-static USBH_Status USBH_Get_HID_Descriptor (USB_OTG_CORE_HANDLE *pdev,
- USBH_HOST *phost,
- uint16_t length)
-{
-
- USBH_Status status;
-
- status = USBH_GetDescriptor(pdev,
- phost,
- USB_REQ_RECIPIENT_INTERFACE
- | USB_REQ_TYPE_STANDARD,
- USB_DESC_HID,
- pdev->host.Rx_Buffer,
- length);
-
- return status;
-}
-
-/**
-* @brief USBH_Set_Idle
-* Set Idle State.
-* @param pdev: Selected device
-* @param duration: Duration for HID Idle request
-* @param reportID : Targetted report ID for Set Idle request
-* @retval USBH_Status : Response for USB Set Idle request
-*/
-static USBH_Status USBH_Set_Idle (USB_OTG_CORE_HANDLE *pdev,
- USBH_HOST *phost,
- uint8_t duration,
- uint8_t reportId)
-{
-
- phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE |\
- USB_REQ_TYPE_CLASS;
-
-
- phost->Control.setup.b.bRequest = USB_HID_SET_IDLE;
- phost->Control.setup.b.wValue.w = (duration << 8 ) | reportId;
-
- phost->Control.setup.b.wIndex.w = 0;
- phost->Control.setup.b.wLength.w = 0;
-
- return USBH_CtlReq(pdev, phost, 0 , 0 );
-}
-
-
-/**
-* @brief USBH_Set_Report
-* Issues Set Report
-* @param pdev: Selected device
-* @param reportType : Report type to be sent
-* @param reportID : Targetted report ID for Set Report request
-* @param reportLen : Length of data report to be send
-* @param reportBuff : Report Buffer
-* @retval USBH_Status : Response for USB Set Idle request
-*/
-USBH_Status USBH_Set_Report (USB_OTG_CORE_HANDLE *pdev,
- USBH_HOST *phost,
- uint8_t reportType,
- uint8_t reportId,
- uint8_t reportLen,
- uint8_t* reportBuff)
-{
-
- phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE |\
- USB_REQ_TYPE_CLASS;
-
-
- phost->Control.setup.b.bRequest = USB_HID_SET_REPORT;
- phost->Control.setup.b.wValue.w = (reportType << 8 ) | reportId;
-
- phost->Control.setup.b.wIndex.w = 0;
- phost->Control.setup.b.wLength.w = reportLen;
-
- return USBH_CtlReq(pdev, phost, reportBuff , reportLen );
-}
-
-
-/**
-* @brief USBH_Set_Protocol
-* Set protocol State.
-* @param pdev: Selected device
-* @param protocol : Set Protocol for HID : boot/report protocol
-* @retval USBH_Status : Response for USB Set Protocol request
-*/
-static USBH_Status USBH_Set_Protocol(USB_OTG_CORE_HANDLE *pdev,
- USBH_HOST *phost,
- uint8_t protocol)
-{
-
-
- phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE |\
- USB_REQ_TYPE_CLASS;
-
-
- phost->Control.setup.b.bRequest = USB_HID_SET_PROTOCOL;
-
- if(protocol != 0)
- {
- /* Boot Protocol */
- phost->Control.setup.b.wValue.w = 0;
- }
- else
- {
- /*Report Protocol*/
- phost->Control.setup.b.wValue.w = 1;
- }
-
- phost->Control.setup.b.wIndex.w = 0;
- phost->Control.setup.b.wLength.w = 0;
-
- return USBH_CtlReq(pdev, phost, 0 , 0 );
-
-}
-
-/**
-* @brief USBH_ParseHIDDesc
-* This function Parse the HID descriptor
-* @param buf: Buffer where the source descriptor is available
-* @retval None
-*/
-static void USBH_ParseHIDDesc (USBH_HIDDesc_TypeDef *desc, uint8_t *buf)
-{
-
- desc->bLength = *(uint8_t *) (buf + 0);
- desc->bDescriptorType = *(uint8_t *) (buf + 1);
- desc->bcdHID = LE16 (buf + 2);
- desc->bCountryCode = *(uint8_t *) (buf + 4);
- desc->bNumDescriptors = *(uint8_t *) (buf + 5);
- desc->bReportDescriptorType = *(uint8_t *) (buf + 6);
- desc->wItemLength = LE16 (buf + 7);
-
-}
-/**
-* @}
-*/
-
-/**
-* @}
-*/
-
-/**
-* @}
-*/
-
-
-/**
-* @}
-*/
-
-
-/**
-* @}
-*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
