aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Mass_Storage/src/usb_prop.c
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Mass_Storage/src/usb_prop.c')
-rw-r--r--thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Mass_Storage/src/usb_prop.c411
1 files changed, 411 insertions, 0 deletions
diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Mass_Storage/src/usb_prop.c b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Mass_Storage/src/usb_prop.c
new file mode 100644
index 0000000..22eed99
--- /dev/null
+++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Mass_Storage/src/usb_prop.c
@@ -0,0 +1,411 @@
+/**
+ ******************************************************************************
+ * @file usb_prop.c
+ * @author MCD Application Team
+ * @version V4.0.0
+ * @date 21-January-2013
+ * @brief All processing related to Mass Storage Demo
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; 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_desc.h"
+#include "usb_pwr.h"
+#include "usb_bot.h"
+#include "memory.h"
+#include "mass_mal.h"
+#include "usb_prop.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+#if defined (USE_STM3210E_EVAL)
+uint32_t Max_Lun = 1;
+#else
+uint32_t Max_Lun = 0;
+#endif
+
+DEVICE Device_Table =
+ {
+ EP_NUM,
+ 1
+ };
+
+DEVICE_PROP Device_Property =
+ {
+ MASS_init,
+ MASS_Reset,
+ MASS_Status_In,
+ MASS_Status_Out,
+ MASS_Data_Setup,
+ MASS_NoData_Setup,
+ MASS_Get_Interface_Setting,
+ MASS_GetDeviceDescriptor,
+ MASS_GetConfigDescriptor,
+ MASS_GetStringDescriptor,
+ 0,
+ 0x40 /*MAX PACKET SIZE*/
+ };
+
+USER_STANDARD_REQUESTS User_Standard_Requests =
+ {
+ Mass_Storage_GetConfiguration,
+ Mass_Storage_SetConfiguration,
+ Mass_Storage_GetInterface,
+ Mass_Storage_SetInterface,
+ Mass_Storage_GetStatus,
+ Mass_Storage_ClearFeature,
+ Mass_Storage_SetEndPointFeature,
+ Mass_Storage_SetDeviceFeature,
+ Mass_Storage_SetDeviceAddress
+ };
+
+ONE_DESCRIPTOR Device_Descriptor =
+ {
+ (uint8_t*)MASS_DeviceDescriptor,
+ MASS_SIZ_DEVICE_DESC
+ };
+
+ONE_DESCRIPTOR Config_Descriptor =
+ {
+ (uint8_t*)MASS_ConfigDescriptor,
+ MASS_SIZ_CONFIG_DESC
+ };
+
+ONE_DESCRIPTOR String_Descriptor[5] =
+ {
+ {(uint8_t*)MASS_StringLangID, MASS_SIZ_STRING_LANGID},
+ {(uint8_t*)MASS_StringVendor, MASS_SIZ_STRING_VENDOR},
+ {(uint8_t*)MASS_StringProduct, MASS_SIZ_STRING_PRODUCT},
+ {(uint8_t*)MASS_StringSerial, MASS_SIZ_STRING_SERIAL},
+ {(uint8_t*)MASS_StringInterface, MASS_SIZ_STRING_INTERFACE},
+ };
+
+/* Extern variables ----------------------------------------------------------*/
+extern unsigned char Bot_State;
+extern Bulk_Only_CBW CBW;
+
+/* Private function prototypes -----------------------------------------------*/
+/* Extern function prototypes ------------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+/*******************************************************************************
+* Function Name : MASS_init
+* Description : Mass Storage init routine.
+* Input : None.
+* Output : None.
+* Return : None.
+*******************************************************************************/
+void MASS_init()
+{
+ /* 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 : MASS_Reset
+* Description : Mass Storage reset routine.
+* Input : None.
+* Output : None.
+* Return : None.
+*******************************************************************************/
+void MASS_Reset()
+{
+ /* Set the device as not configured */
+ Device_Info.Current_Configuration = 0;
+
+ /* Current Feature initialization */
+ pInformation->Current_Feature = MASS_ConfigDescriptor[7];
+
+ SetBTABLE(BTABLE_ADDRESS);
+
+ /* 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_BULK);
+ SetEPTxAddr(ENDP1, ENDP1_TXADDR);
+ SetEPTxStatus(ENDP1, EP_TX_NAK);
+ SetEPRxStatus(ENDP1, EP_RX_DIS);
+
+ /* Initialize Endpoint 2 */
+ SetEPType(ENDP2, EP_BULK);
+ SetEPRxAddr(ENDP2, ENDP2_RXADDR);
+ SetEPRxCount(ENDP2, Device_Property.MaxPacketSize);
+ SetEPRxStatus(ENDP2, EP_RX_VALID);
+ SetEPTxStatus(ENDP2, EP_TX_DIS);
+
+
+ SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
+ SetEPRxValid(ENDP0);
+
+ /* Set the device to response on default address */
+ SetDeviceAddress(0);
+
+ bDeviceState = ATTACHED;
+
+ CBW.dSignature = BOT_CBW_SIGNATURE;
+ Bot_State = BOT_IDLE;
+
+ USB_NotConfigured_LED();
+}
+
+/*******************************************************************************
+* Function Name : Mass_Storage_SetConfiguration
+* Description : Handle the SetConfiguration request.
+* Input : None.
+* Output : None.
+* Return : None.
+*******************************************************************************/
+void Mass_Storage_SetConfiguration(void)
+{
+ if (pInformation->Current_Configuration != 0)
+ {
+ /* Device configured */
+ bDeviceState = CONFIGURED;
+
+ ClearDTOG_TX(ENDP1);
+ ClearDTOG_RX(ENDP2);
+
+ Bot_State = BOT_IDLE; /* set the Bot state machine to the IDLE state */
+ }
+}
+
+/*******************************************************************************
+* Function Name : Mass_Storage_ClearFeature
+* Description : Handle the ClearFeature request.
+* Input : None.
+* Output : None.
+* Return : None.
+*******************************************************************************/
+void Mass_Storage_ClearFeature(void)
+{
+ /* when the host send a CBW with invalid signature or invalid length the two
+ Endpoints (IN & OUT) shall stall until receiving a Mass Storage Reset */
+ if (CBW.dSignature != BOT_CBW_SIGNATURE)
+ Bot_Abort(BOTH_DIR);
+}
+
+/*******************************************************************************
+* Function Name : Mass_Storage_SetConfiguration.
+* Description : Update the device state to addressed.
+* Input : None.
+* Output : None.
+* Return : None.
+*******************************************************************************/
+void Mass_Storage_SetDeviceAddress (void)
+{
+ bDeviceState = ADDRESSED;
+}
+/*******************************************************************************
+* Function Name : MASS_Status_In
+* Description : Mass Storage Status IN routine.
+* Input : None.
+* Output : None.
+* Return : None.
+*******************************************************************************/
+void MASS_Status_In(void)
+{
+ return;
+}
+
+/*******************************************************************************
+* Function Name : MASS_Status_Out
+* Description : Mass Storage Status OUT routine.
+* Input : None.
+* Output : None.
+* Return : None.
+*******************************************************************************/
+void MASS_Status_Out(void)
+{
+ return;
+}
+
+/*******************************************************************************
+* Function Name : MASS_Data_Setup.
+* Description : Handle the data class specific requests..
+* Input : RequestNo.
+* Output : None.
+* Return : RESULT.
+*******************************************************************************/
+RESULT MASS_Data_Setup(uint8_t RequestNo)
+{
+ uint8_t *(*CopyRoutine)(uint16_t);
+
+ CopyRoutine = NULL;
+ if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
+ && (RequestNo == GET_MAX_LUN) && (pInformation->USBwValue == 0)
+ && (pInformation->USBwIndex == 0) && (pInformation->USBwLength == 0x01))
+ {
+ CopyRoutine = Get_Max_Lun;
+ }
+ else
+ {
+ return USB_UNSUPPORT;
+ }
+
+ if (CopyRoutine == NULL)
+ {
+ return USB_UNSUPPORT;
+ }
+
+ pInformation->Ctrl_Info.CopyData = CopyRoutine;
+ pInformation->Ctrl_Info.Usb_wOffset = 0;
+ (*CopyRoutine)(0);
+
+ return USB_SUCCESS;
+
+}
+
+/*******************************************************************************
+* Function Name : MASS_NoData_Setup.
+* Description : Handle the no data class specific requests.
+* Input : RequestNo.
+* Output : None.
+* Return : RESULT.
+*******************************************************************************/
+RESULT MASS_NoData_Setup(uint8_t RequestNo)
+{
+ if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
+ && (RequestNo == MASS_STORAGE_RESET) && (pInformation->USBwValue == 0)
+ && (pInformation->USBwIndex == 0) && (pInformation->USBwLength == 0x00))
+ {
+ /* Initialize Endpoint 1 */
+ ClearDTOG_TX(ENDP1);
+
+ /* Initialize Endpoint 2 */
+ ClearDTOG_RX(ENDP2);
+
+ /*initialize the CBW signature to enable the clear feature*/
+ CBW.dSignature = BOT_CBW_SIGNATURE;
+ Bot_State = BOT_IDLE;
+
+ return USB_SUCCESS;
+ }
+ return USB_UNSUPPORT;
+}
+
+/*******************************************************************************
+* Function Name : MASS_Get_Interface_Setting
+* Description : Test the interface and the alternate setting according to the
+* supported one.
+* Input : uint8_t Interface, uint8_t AlternateSetting.
+* Output : None.
+* Return : RESULT.
+*******************************************************************************/
+RESULT MASS_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting)
+{
+ if (AlternateSetting > 0)
+ {
+ return USB_UNSUPPORT;/* in this application we don't have AlternateSetting*/
+ }
+ else if (Interface > 0)
+ {
+ return USB_UNSUPPORT;/*in this application we have only 1 interfaces*/
+ }
+ return USB_SUCCESS;
+}
+
+/*******************************************************************************
+* Function Name : MASS_GetDeviceDescriptor
+* Description : Get the device descriptor.
+* Input : uint16_t Length.
+* Output : None.
+* Return : None.
+*******************************************************************************/
+uint8_t *MASS_GetDeviceDescriptor(uint16_t Length)
+{
+ return Standard_GetDescriptorData(Length, &Device_Descriptor );
+}
+
+/*******************************************************************************
+* Function Name : MASS_GetConfigDescriptor
+* Description : Get the configuration descriptor.
+* Input : uint16_t Length.
+* Output : None.
+* Return : None.
+*******************************************************************************/
+uint8_t *MASS_GetConfigDescriptor(uint16_t Length)
+{
+ return Standard_GetDescriptorData(Length, &Config_Descriptor );
+}
+
+/*******************************************************************************
+* Function Name : MASS_GetStringDescriptor
+* Description : Get the string descriptors according to the needed index.
+* Input : uint16_t Length.
+* Output : None.
+* Return : None.
+*******************************************************************************/
+uint8_t *MASS_GetStringDescriptor(uint16_t Length)
+{
+ uint8_t wValue0 = pInformation->USBwValue0;
+
+ if (wValue0 > 5)
+ {
+ return NULL;
+ }
+ else
+ {
+ return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]);
+ }
+}
+
+/*******************************************************************************
+* 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));
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/