/** ****************************************************************************** @file usb_prop.c @author MCD Application Team @version V4.0.0 @date 21-January-2013 @brief All processing related to Virtual Com Port Demo ****************************************************************************** @attention

© COPYRIGHT 2013 STMicroelectronics

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 "usb_lib.h" #include "usb_conf.h" #include "usb_prop.h" #include "usb_desc.h" #include "usb_pwr.h" #include "hw_config.h" // Private variables uint32_t MUTE_DATA = 0; // Structures initializations DEVICE Device_Table = { EP_NUM, 1 }; DEVICE_PROP Device_Property = { Speaker_Init, Speaker_Reset, Speaker_Status_In, Speaker_Status_Out, Speaker_Data_Setup, Speaker_NoData_Setup, Speaker_Get_Interface_Setting, Speaker_GetDeviceDescriptor, Speaker_GetConfigDescriptor, Speaker_GetStringDescriptor, 0, 0x40 /*MAX PACKET SIZE*/ }; USER_STANDARD_REQUESTS User_Standard_Requests = { Speaker_GetConfiguration, Speaker_SetConfiguration, Speaker_GetInterface, Speaker_SetInterface, Speaker_GetStatus, Speaker_ClearFeature, Speaker_SetEndPointFeature, Speaker_SetDeviceFeature, Speaker_SetDeviceAddress }; ONE_DESCRIPTOR Device_Descriptor = { (uint8_t *)Speaker_DeviceDescriptor, SPEAKER_DEVICE_DESC_SIZE }; ONE_DESCRIPTOR Config_Descriptor = { (uint8_t *)Speaker_ConfigDescriptor, SPEAKER_CONFIG_DESC_SIZE }; ONE_DESCRIPTOR String_Descriptor[4] = { {(uint8_t *)Speaker_StringLangID, SPEAKER_SIZ_STRING_LANGID}, {(uint8_t *)Speaker_StringVendor, SPEAKER_SIZ_STRING_VENDOR}, {(uint8_t *)Speaker_StringProduct, SPEAKER_SIZ_STRING_PRODUCT}, {(uint8_t *)Speaker_StringSerial, SPEAKER_SIZ_STRING_SERIAL}, }; // Public variables extern uint16_t In_Data_Offset; extern uint16_t Out_Data_Offset; // Private functions /******************************************************************************* Function Name : Speaker_Init. Description : Speaker init routine. Input : None. Output : None. Return : None. *******************************************************************************/ void Speaker_Init() { // Update the serial number string descriptor with the data from the unique ID Get_SerialNum(); // Initialize the current configuration pInformation->Current_Configuration = 0; // Connect the device PowerOn(); // Perform basic device initialization operations USB_SIL_Init(); bDeviceState = UNCONNECTED; } /******************************************************************************* Function Name : Speaker_Reset. Description : Speaker reset routine. Input : None. Output : None. Return : None. *******************************************************************************/ void Speaker_Reset() { // Set Speaker device as not configured state pInformation->Current_Configuration = 0; // Current Feature initialization pInformation->Current_Feature = Speaker_ConfigDescriptor[7]; // *BTABLE = BTABLE_ADDRESS & 0xFFF8; *BTABLE = BTABLE_ADDRESS; // BTABLE_ADDRESS = 0 // Initialize Endpoint 0 SetEPType(ENDP0,EP_CONTROL); SetEPTxStatus(ENDP0,EP_TX_NAK); SetEPRxAddr(ENDP0,ENDP0_RXADDR); SetEPRxCount(ENDP0,Device_Property.MaxPacketSize); SetEPTxAddr(ENDP0,ENDP0_TXADDR); Clear_Status_Out(ENDP0); SetEPRxValid(ENDP0); // Initialize Endpoint 1 SetEPType(ENDP1,EP_ISOCHRONOUS); SetEPDblBuffAddr(ENDP1,ENDP1_BUF0Addr,ENDP1_BUF1Addr); SetEPDblBuffCount(ENDP1,EP_DBUF_OUT,0x40); ClearDTOG_RX(ENDP1); ClearDTOG_TX(ENDP1); ToggleDTOG_TX(ENDP1); SetEPRxStatus(ENDP1,EP_RX_VALID); SetEPTxStatus(ENDP1,EP_TX_DIS); SetEPRxValid(ENDP0); // Set this device to response on default address SetDeviceAddress(0); bDeviceState = ATTACHED; In_Data_Offset = 0; Out_Data_Offset = 0; } /******************************************************************************* Function Name : Speaker_SetConfiguration. Description : Update the device state to configured. Input : None. Output : None. Return : None. *******************************************************************************/ void Speaker_SetConfiguration(void) { if (Device_Info.Current_Configuration) bDeviceState = CONFIGURED; } /******************************************************************************* Function Name : Speaker_SetConfiguration. Description : Update the device state to addressed. Input : None. Output : None. Return : None. *******************************************************************************/ void Speaker_SetDeviceAddress (void) { bDeviceState = ADDRESSED; } /******************************************************************************* Function Name : Speaker_Status_In. Description : Speaker Status In routine. Input : None. Output : None. Return : None. *******************************************************************************/ void Speaker_Status_In(void) { } /******************************************************************************* Function Name : Speaker_Status_Out. Description : Speaker Status Out routine. Input : None. Output : None. Return : None. *******************************************************************************/ void Speaker_Status_Out (void) { } /******************************************************************************* Function Name : Speaker_Data_Setup Description : Handle the data class specific requests. Input : None. Output : None. Return : USB_UNSUPPORT or USB_SUCCESS. *******************************************************************************/ RESULT Speaker_Data_Setup(uint8_t RequestNo) { uint8_t *(*CopyRoutine)(uint16_t); CopyRoutine = NULL; if ((RequestNo == GET_CUR) || (RequestNo == SET_CUR)) { CopyRoutine = Mute_Command; } else { return USB_UNSUPPORT; } pInformation->Ctrl_Info.CopyData = CopyRoutine; pInformation->Ctrl_Info.Usb_wOffset = 0; (*CopyRoutine)(0); return USB_SUCCESS; } /******************************************************************************* Function Name : Speaker_NoData_Setup Description : Handle the no data class specific requests. Input : None. Output : None. Return : USB_UNSUPPORT or USB_SUCCESS. *******************************************************************************/ RESULT Speaker_NoData_Setup(uint8_t RequestNo) { return USB_UNSUPPORT; } /******************************************************************************* Function Name : Speaker_GetDeviceDescriptor. Description : Get the device descriptor. Input : Length : uint16_t. Output : None. Return : The address of the device descriptor. *******************************************************************************/ uint8_t *Speaker_GetDeviceDescriptor(uint16_t Length) { return Standard_GetDescriptorData(Length,&Device_Descriptor); } /******************************************************************************* Function Name : Speaker_GetConfigDescriptor. Description : Get the configuration descriptor. Input : Length : uint16_t. Output : None. Return : The address of the configuration descriptor. *******************************************************************************/ uint8_t *Speaker_GetConfigDescriptor(uint16_t Length) { return Standard_GetDescriptorData(Length,&Config_Descriptor); } /******************************************************************************* Function Name : Speaker_GetStringDescriptor. Description : Get the string descriptors according to the needed index. Input : Length : uint16_t. Output : None. Return : The address of the string descriptors. *******************************************************************************/ uint8_t *Speaker_GetStringDescriptor(uint16_t Length) { uint8_t wValue0 = pInformation->USBwValue0; if (wValue0 > 4) { return NULL; } else { return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]); } } /******************************************************************************* Function Name : Speaker_Get_Interface_Setting. Description : test the interface and the alternate setting according to the supported one. Input1 : uint8_t: Interface : interface number. Input2 : uint8_t: AlternateSetting : Alternate Setting number. Output : None. Return : The address of the string descriptors. *******************************************************************************/ RESULT Speaker_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting) { if (AlternateSetting > 1) { return USB_UNSUPPORT; } else if (Interface > 1) { return USB_UNSUPPORT; } return USB_SUCCESS; } /******************************************************************************* Function Name : Mute_Command Description : Handle the GET MUTE and SET MUTE command. Input : Length : uint16_t. Output : None. Return : The address of the string descriptors. *******************************************************************************/ uint8_t *Mute_Command(uint16_t Length) { if (Length) { return ((uint8_t *)(&MUTE_DATA)); } else { pInformation->Ctrl_Info.Usb_wLength = pInformation->USBwLengths.w; return NULL; } }