/**
******************************************************************************
@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;
}
}