diff options
Diffstat (limited to 'thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/usb_prop.c')
-rw-r--r-- | thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/usb_prop.c | 581 |
1 files changed, 581 insertions, 0 deletions
diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/usb_prop.c b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/usb_prop.c new file mode 100644 index 0000000..446fa84 --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/usb_prop.c @@ -0,0 +1,581 @@ +/** + ****************************************************************************** + * @file usb_prop.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief All processings related to Custom HID Demo + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT 2013 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 "hw_config.h" +#include "usb_lib.h" +#include "usb_conf.h" +#include "usb_prop.h" +#include "usb_desc.h" +#include "usb_pwr.h" +#include "usb_bot.h" +#include "memory.h" +#include "mass_mal.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint32_t ProtocolValue; +__IO uint8_t EXTI_Enable; +__IO uint8_t Request = 0; +uint8_t Report_Buf[2]; +/* -------------------------------------------------------------------------- */ +/* Structures initializations */ +/* -------------------------------------------------------------------------- */ + +DEVICE Device_Table = + { + EP_NUM, + 1 + }; + +DEVICE_PROP Device_Property = + { + CustomHID_init, + CustomHID_Reset, + CustomHID_Status_In, + CustomHID_Status_Out, + CustomHID_Data_Setup, + CustomHID_NoData_Setup, + CustomHID_Get_Interface_Setting, + CustomHID_GetDeviceDescriptor, + CustomHID_GetConfigDescriptor, + CustomHID_GetStringDescriptor, + 0, + 0x40 /*MAX PACKET SIZE*/ + }; +USER_STANDARD_REQUESTS User_Standard_Requests = + { + CustomHID_GetConfiguration, + CustomHID_SetConfiguration, + CustomHID_GetInterface, + CustomHID_SetInterface, + CustomHID_GetStatus, + CustomHID_ClearFeature, + CustomHID_SetEndPointFeature, + CustomHID_SetDeviceFeature, + CustomHID_SetDeviceAddress + }; + +ONE_DESCRIPTOR Device_Descriptor = + { + (uint8_t*)Composite_DeviceDescriptor, + Composite_SIZ_DEVICE_DESC + }; + +ONE_DESCRIPTOR Config_Descriptor = + { + (uint8_t*)Composite_ConfigDescriptor, + Composite_SIZ_CONFIG_DESC + }; + +ONE_DESCRIPTOR CustomHID_Report_Descriptor = + { + (uint8_t *)CustomHID_ReportDescriptor, + CUSTOMHID_SIZ_REPORT_DESC + }; + +ONE_DESCRIPTOR CustomHID_Hid_Descriptor = + { + (uint8_t*)Composite_ConfigDescriptor + CUSTOMHID_OFF_HID_DESC, + CUSTOMHID_SIZ_HID_DESC + }; + +ONE_DESCRIPTOR String_Descriptor[4] = + { + {(uint8_t*)Composite_StringLangID, Composite_SIZ_STRING_LANGID}, + {(uint8_t*)Composite_StringVendor, Composite_SIZ_STRING_VENDOR}, + {(uint8_t*)Composite_StringProduct, Composite_SIZ_STRING_PRODUCT}, + {(uint8_t*)Composite_StringSerial, Composite_SIZ_STRING_SERIAL} + }; + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Extern function prototypes ------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/*CustomHID_SetReport_Feature function prototypes*/ +uint8_t *CustomHID_SetReport_Feature(uint16_t Length); + +extern unsigned char Bot_State; +extern Bulk_Only_CBW CBW; +uint32_t Max_Lun = 0; + + +/******************************************************************************* +* Function Name : Get_Max_Lun +* Description : Handle the Get Max Lun request. +* Input : uint16_t Length. +* Output : None. +* Return : None. +*******************************************************************************/ +uint8_t *Get_Max_Lun(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = LUN_DATA_LENGTH; + return 0; + } + else + { + return((uint8_t*)(&Max_Lun)); + } +} +/******************************************************************************* +* Function Name : CustomHID_init. +* Description : Custom HID init routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_init(void) +{ + /* Update the serial number string descriptor with the data from the unique + ID*/ + Get_SerialNum(); + + pInformation->Current_Configuration = 0; + /* Connect the device */ + PowerOn(); + + /* Perform basic device initialization operations */ + USB_SIL_Init(); + + bDeviceState = UNCONNECTED; +} + +/******************************************************************************* +* Function Name : CustomHID_Reset. +* Description : Custom HID reset routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_Reset(void) +{ + /* Set Composite_DEVICE as not configured */ + pInformation->Current_Configuration = 0; + pInformation->Current_Interface = 0;/*the default Interface*/ + + /* Current Feature initialization */ + pInformation->Current_Feature = Composite_ConfigDescriptor[7]; + + SetBTABLE(BTABLE_ADDRESS); + + /* Initialize Endpoint 0 */ + SetEPType(ENDP0, EP_CONTROL); + SetEPTxStatus(ENDP0, EP_TX_STALL); + SetEPRxAddr(ENDP0, ENDP0_RXADDR); + SetEPTxAddr(ENDP0, ENDP0_TXADDR); + Clear_Status_Out(ENDP0); + SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); + SetEPRxValid(ENDP0); + + /* Initialize Endpoint 1 */ + SetEPType(ENDP1, EP_INTERRUPT); + SetEPTxAddr(ENDP1, ENDP1_TXADDR); + SetEPRxAddr(ENDP1, ENDP1_RXADDR); + SetEPTxCount(ENDP1, 2); + SetEPRxCount(ENDP1, 2); + SetEPRxStatus(ENDP1, EP_RX_VALID); + SetEPTxStatus(ENDP1, EP_TX_NAK); + /* Initialize Endpoint 2 IN */ + SetEPType(ENDP2, EP_BULK); + SetEPTxCount(ENDP1, 64); + SetEPTxAddr(ENDP2, ENDP1_TXADDR); + SetEPTxStatus(ENDP2, EP_TX_NAK); + + + /* Initialize Endpoint 2 OUT */ + SetEPType(ENDP2, EP_BULK); + SetEPRxAddr(ENDP2, ENDP2_RXADDR); + SetEPRxCount(ENDP2, 64); + SetEPRxStatus(ENDP2, EP_RX_VALID); + + /* Set this device to response on default address */ + SetDeviceAddress(0); + CBW.dSignature = BOT_CBW_SIGNATURE; + Bot_State = BOT_IDLE; + bDeviceState = ATTACHED; +} +/******************************************************************************* +* Function Name : CustomHID_SetConfiguration. +* Description : Update the device state to configured and command the ADC +* conversion. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_SetConfiguration(void) +{ + if (pInformation->Current_Configuration != 0) + { + /* Device configured */ + bDeviceState = CONFIGURED; + + /* Start ADC Software Conversion */ +#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)|| defined(STM32F37X) + ADC_SoftwareStartConv(ADC1); +#elif defined (STM32F30X) + ADC_StartConversion(ADC1); +#else + ADC_SoftwareStartConvCmd(ADC1, ENABLE); +#endif /* STM32L1XX_XD */ + ClearDTOG_TX(ENDP2); + ClearDTOG_RX(ENDP2); + Bot_State = BOT_IDLE; /* set the Bot state machine to the IDLE state */ + } +} +/******************************************************************************* +* Function Name : CustomHID_SetConfiguration. +* Description : Update the device state to addressed. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_SetDeviceAddress (void) +{ + bDeviceState = ADDRESSED; +} +/******************************************************************************* +* Function Name : CustomHID_Status_In. +* Description : Joystick status IN routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_Status_In(void) +{ + BitAction Led_State; + + if (Report_Buf[1] == 0) + { + Led_State = Bit_RESET; + } + else + { + Led_State = Bit_SET; + } + + switch (Report_Buf[0]) + { + /*Change LED's status according to the host report*/ + + case 1: /* Led 1 */ + if (Led_State != Bit_RESET) + { + STM_EVAL_LEDOn(LED1); + } + else + { + STM_EVAL_LEDOff(LED1); + } + break; + case 2: /* Led 2 */ + if (Led_State != Bit_RESET) + { + STM_EVAL_LEDOn(LED2); + } + else + { + STM_EVAL_LEDOff(LED2); + } + break; + case 3:/* Led 3 */ + if (Led_State != Bit_RESET) + { + STM_EVAL_LEDOn(LED3); + } + else + { + STM_EVAL_LEDOff(LED3); + } + break; + case 4:/* Led 4 */ + if (Led_State != Bit_RESET) + { + STM_EVAL_LEDOn(LED4); + } + else + { + STM_EVAL_LEDOff(LED4); + } + break; + default: + STM_EVAL_LEDOff(LED1); + STM_EVAL_LEDOff(LED2); + STM_EVAL_LEDOff(LED3); + STM_EVAL_LEDOff(LED4); + break; + } +} + +/******************************************************************************* +* Function Name : CustomHID_Status_Out +* Description : Joystick status OUT routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_Status_Out (void) +{ +} + +/******************************************************************************* +* Function Name : CustomHID_Data_Setup +* Description : Handle the data class specific requests. +* Input : Request Nb. +* Output : None. +* Return : USB_UNSUPPORT or USB_SUCCESS. +*******************************************************************************/ +RESULT CustomHID_Data_Setup(uint8_t RequestNo) +{ + uint8_t *(*CopyRoutine)(uint16_t); + + if (pInformation->USBwIndex != 0) + return USB_UNSUPPORT; + + CopyRoutine = NULL; + + if ((RequestNo == GET_DESCRIPTOR) + && (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + ) + { + + if (pInformation->USBwValue1 == REPORT_DESCRIPTOR) + { + CopyRoutine = CustomHID_GetReportDescriptor; + } + else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE) + { + CopyRoutine = CustomHID_GetHIDDescriptor; + } + + } /* End of GET_DESCRIPTOR */ + + /*** GET_PROTOCOL, GET_REPORT, SET_REPORT ***/ + else if ( (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) ) + { + switch( RequestNo ) + { + case GET_PROTOCOL: + CopyRoutine = CustomHID_GetProtocolValue; + break; + case SET_REPORT: + CopyRoutine = CustomHID_SetReport_Feature; + Request = SET_REPORT; + break; + default: + break; + } + } + + if (CopyRoutine == NULL) + { + return USB_UNSUPPORT; + } + + pInformation->Ctrl_Info.CopyData = CopyRoutine; + pInformation->Ctrl_Info.Usb_wOffset = 0; + (*CopyRoutine)(0); + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : CustomHID_SetReport_Feature +* Description : Set Feature request handling +* Input : Length. +* Output : None. +* Return : Buffer +*******************************************************************************/ +uint8_t *CustomHID_SetReport_Feature(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = 2; + return NULL; + } + else + { + return Report_Buf; + } +} +/******************************************************************************* +* Function Name : CustomHID_NoData_Setup +* Description : handle the no data class specific requests +* Input : Request Nb. +* Output : None. +* Return : USB_UNSUPPORT or USB_SUCCESS. +*******************************************************************************/ +RESULT CustomHID_NoData_Setup(uint8_t RequestNo) +{ + if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) + && (RequestNo == SET_PROTOCOL)) + { + return CustomHID_SetProtocol(); + } + + else + { + return USB_UNSUPPORT; + } +} + +/******************************************************************************* +* Function Name : CustomHID_GetDeviceDescriptor. +* Description : Gets the device descriptor. +* Input : Length +* Output : None. +* Return : The address of the device descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetDeviceDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Device_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_GetConfigDescriptor. +* Description : Gets the configuration descriptor. +* Input : Length +* Output : None. +* Return : The address of the configuration descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetConfigDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Config_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_GetStringDescriptor +* Description : Gets the string descriptors according to the needed index +* Input : Length +* Output : None. +* Return : The address of the string descriptors. +*******************************************************************************/ +uint8_t *CustomHID_GetStringDescriptor(uint16_t Length) +{ + uint8_t wValue0 = pInformation->USBwValue0; + if (wValue0 > 4) + { + return NULL; + } + else + { + return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]); + } +} + +/******************************************************************************* +* Function Name : CustomHID_GetReportDescriptor. +* Description : Gets the HID report descriptor. +* Input : Length +* Output : None. +* Return : The address of the configuration descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetReportDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &CustomHID_Report_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_GetHIDDescriptor. +* Description : Gets the HID descriptor. +* Input : Length +* Output : None. +* Return : The address of the configuration descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetHIDDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &CustomHID_Hid_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_Get_Interface_Setting. +* Description : tests the interface and the alternate setting according to the +* supported one. +* Input : - Interface : interface number. +* - AlternateSetting : Alternate Setting number. +* Output : None. +* Return : USB_SUCCESS or USB_UNSUPPORT. +*******************************************************************************/ +RESULT CustomHID_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting) +{ + if (AlternateSetting > 0) + { + return USB_UNSUPPORT; + } + else if (Interface > 0) + { + return USB_UNSUPPORT; + } + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : CustomHID_SetProtocol +* Description : Joystick Set Protocol request routine. +* Input : None. +* Output : None. +* Return : USB SUCCESS. +*******************************************************************************/ +RESULT CustomHID_SetProtocol(void) +{ + uint8_t wValue0 = pInformation->USBwValue0; + ProtocolValue = wValue0; + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : CustomHID_GetProtocolValue +* Description : get the protocol value +* Input : Length. +* Output : None. +* Return : address of the protocol value. +*******************************************************************************/ +uint8_t *CustomHID_GetProtocolValue(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = 1; + return NULL; + } + else + { + return (uint8_t *)(&ProtocolValue); + } +} + +void CustomHID_ClearFeature (void) +{ + if (CBW.dSignature != BOT_CBW_SIGNATURE) + Bot_Abort(BOTH_DIR); +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |