/**
******************************************************************************
* @file usbh_usr.c
* @author MCD Application Team
* @version V2.1.0
* @date 19-March-2012
* @brief This file includes the usb host library user callbacks
******************************************************************************
* @attention
*
*
© COPYRIGHT 2012 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 "usbh_usr.h"
#include "bsp_fatfs.h"
#include "ff.h" /* FATFS */
#include "usbh_msc_bot.h"
#include "usbh_msc_core.h"
#include "usbh_msc_scsi.h"
#include
#define usb_printf printf
//#define usb_printf printf(...)
USB_OTG_CORE_HANDLE USB_OTG_Core;
USBH_HOST USB_Host;
uint8_t USBH_USR_ApplicationState = USH_USR_FS_INIT;
/* Points to the DEVICE_PROP structure of current device */
/* The purpose of this register is to speed up the execution */
USBH_Usr_cb_TypeDef USR_cb =
{
USBH_USR_Init,
USBH_USR_DeInit,
USBH_USR_DeviceAttached,
USBH_USR_ResetDevice,
USBH_USR_DeviceDisconnected,
USBH_USR_OverCurrentDetected,
USBH_USR_DeviceSpeedDetected,
USBH_USR_Device_DescAvailable,
USBH_USR_DeviceAddressAssigned,
USBH_USR_Configuration_DescAvailable,
USBH_USR_Manufacturer_String,
USBH_USR_Product_String,
USBH_USR_SerialNum_String,
USBH_USR_EnumerationDone,
USBH_USR_UserInput,
USBH_USR_MSC_Application,
USBH_USR_DeviceNotSupported,
USBH_USR_UnrecoveredError};
/**
* @}
*/
/** @defgroup USBH_USR_Private_Constants
* @{
*/
/*--------------- LCD Messages ---------------*/
const uint8_t MSG_HOST_INIT[] = "> Host Library Initialized\r\n";
const uint8_t MSG_DEV_ATTACHED[] = "> Device Attached \r\n";
const uint8_t MSG_DEV_DISCONNECTED[] = "> Device Disconnected\r\n";
const uint8_t MSG_DEV_ENUMERATED[] = "> Enumeration completed \r\n";
const uint8_t MSG_DEV_HIGHSPEED[] = "> High speed device detected\r\n";
const uint8_t MSG_DEV_FULLSPEED[] = "> Full speed device detected\r\n";
const uint8_t MSG_DEV_LOWSPEED[] = "> Low speed device detected\r\n";
const uint8_t MSG_DEV_ERROR[] = "> Device fault \r\n";
const uint8_t MSG_MSC_CLASS[] = "> Mass storage device connected\r\n";
const uint8_t MSG_HID_CLASS[] = "> HID device connected\r\n";
const uint8_t MSG_DISK_SIZE[] = "> Size of the disk in MBytes: \r\n";
const uint8_t MSG_LUN[] = "> LUN Available in the device:\r\n";
const uint8_t MSG_ROOT_CONT[] = "> Exploring disk flash ...\r\n";
const uint8_t MSG_WR_PROTECT[] = "> The disk is write protected\r\n";
const uint8_t MSG_UNREC_ERROR[] = "> UNRECOVERED ERROR STATE\r\n";
/**
* @}
*/
/** @defgroup USBH_USR_Private_FunctionPrototypes
* @{
*/
/**
* @}
*/
/** @defgroup USBH_USR_Private_Functions
* @{
*/
/**
* @brief USBH_USR_Init
* Displays the message on LCD for host lib initialization
* @param None
* @retval None
*/
void USBH_USR_Init(void)
{
static uint8_t startup = 0;
if (startup == 0)
{
startup = 1;
#ifdef USE_USB_OTG_HS
usb_printf("> USB OTG HS MSC Host\r\n");
#else
usb_printf("> USB OTG FS MSC Host\r\n");
#endif
usb_printf("> USB Host library started.\r\n");
usb_printf(" USB Host Library v2.1.0\r\n");
}
}
/**
* @brief USBH_USR_DeviceAttached
* Displays the message on LCD on device attached
* @param None
* @retval None
*/
void USBH_USR_DeviceAttached(void)
{
usb_printf((char *)MSG_DEV_ATTACHED);
}
/**
* @brief USBH_USR_UnrecoveredError
* @param None
* @retval None
*/
void USBH_USR_UnrecoveredError(void)
{
usb_printf((char *)MSG_UNREC_ERROR);
}
/**
* @brief USBH_DisconnectEvent
* Device disconnect event
* @param None
* @retval Staus
*/
void USBH_USR_DeviceDisconnected(void)
{
usb_printf((char *)MSG_DEV_DISCONNECTED);
}
/**
* @brief USBH_USR_ResetUSBDevice
* @param None
* @retval None
*/
void USBH_USR_ResetDevice(void)
{
/* callback for USB-Reset */
usb_printf("> USBH_USR_ResetDevice \r\n");
}
/**
* @brief USBH_USR_DeviceSpeedDetected
* Displays the message on LCD for device speed
* @param Device speed
* @retval None
*/
void USBH_USR_DeviceSpeedDetected(uint8_t DeviceSpeed)
{
if (DeviceSpeed == HPRT0_PRTSPD_HIGH_SPEED)
{
usb_printf((char *)MSG_DEV_HIGHSPEED);
}
else if (DeviceSpeed == HPRT0_PRTSPD_FULL_SPEED)
{
usb_printf((char *)MSG_DEV_FULLSPEED);
}
else if (DeviceSpeed == HPRT0_PRTSPD_LOW_SPEED)
{
usb_printf((char *)MSG_DEV_LOWSPEED);
}
else
{
usb_printf((char *)MSG_DEV_ERROR);
}
}
/**
* @brief USBH_USR_Device_DescAvailable
* Displays the message on LCD for device descriptor
* @param device descriptor
* @retval None
*/
void USBH_USR_Device_DescAvailable(void *DeviceDesc)
{
USBH_DevDesc_TypeDef *hs;
hs = DeviceDesc;
usb_printf("> VID : %04Xh\r\n", (uint32_t)(*hs).idVendor);
usb_printf("> PID : %04Xh\r\n", (uint32_t)(*hs).idProduct);
}
/**
* @brief USBH_USR_DeviceAddressAssigned
* USB device is successfully assigned the Address
* @param None
* @retval None
*/
void USBH_USR_DeviceAddressAssigned(void)
{
}
/**
* @brief USBH_USR_Conf_Desc
* Displays the message on LCD for configuration descriptor
* @param Configuration descriptor
* @retval None
*/
void USBH_USR_Configuration_DescAvailable(USBH_CfgDesc_TypeDef *cfgDesc,
USBH_InterfaceDesc_TypeDef *itfDesc,
USBH_EpDesc_TypeDef *epDesc)
{
USBH_InterfaceDesc_TypeDef *id;
id = itfDesc;
if ((*id).bInterfaceClass == 0x08)
{
usb_printf((char *)MSG_MSC_CLASS);
}
else if ((*id).bInterfaceClass == 0x03)
{
usb_printf((char *)MSG_HID_CLASS);
}
}
/**
* @brief USBH_USR_Manufacturer_String
* Displays the message on LCD for Manufacturer String
* @param Manufacturer String
* @retval None
*/
void USBH_USR_Manufacturer_String(void *ManufacturerString)
{
usb_printf("> Manufacturer : %sr\r\n", (char *)ManufacturerString);
}
/**
* @brief USBH_USR_Product_String
* Displays the message on LCD for Product String
* @param Product String
* @retval None
*/
void USBH_USR_Product_String(void *ProductString)
{
usb_printf("> Product : %s\r\n", (char *)ProductString);
}
/**
* @brief USBH_USR_SerialNum_String
* Displays the message on LCD for SerialNum_String
* @param SerialNum_String
* @retval None
*/
void USBH_USR_SerialNum_String(void *SerialNumString)
{
usb_printf("> Serial Number : %s\r\n", (char *)SerialNumString);
}
/**
* @brief EnumerationDone
* User response request is displayed to ask application jump to class
* @param None
* @retval None
*/
void USBH_USR_EnumerationDone(void)
{
/* Enumeration complete */
usb_printf((void *)MSG_DEV_ENUMERATED);
}
/**
* @brief USBH_USR_DeviceNotSupported
* Device is not supported
* @param None
* @retval None
*/
void USBH_USR_DeviceNotSupported(void)
{
usb_printf("> Device not supported.\r\n");
}
/**
* @brief USBH_USR_UserInput
* User Action for application state entry
* @param None
* @retval USBH_USR_Status : User response for key button
*/
USBH_USR_Status USBH_USR_UserInput(void)
{
#if 1
/* HOST_ENUMERATION 和 HOST_CLASS_REQUEST
在枚举成功和类请求之间等待用户输入。
此处直接返回OK,无需等待。
*/
return USBH_USR_RESP_OK;
#else
USBH_USR_Status usbh_usr_status;
usbh_usr_status = USBH_USR_NO_RESP;
#if 0
/*Key B3 is in polling mode to detect user action */
if(STM_EVAL_PBGetState(Button_KEY) == RESET)
{
usbh_usr_status = USBH_USR_RESP_OK;
}
#endif
return usbh_usr_status;
#endif
}
/**
* @brief USBH_USR_OverCurrentDetected
* Over Current Detected on VBUS
* @param None
* @retval Staus
*/
void USBH_USR_OverCurrentDetected(void)
{
usb_printf("> Overcurrent detected.\r\n");
}
/**
* @brief USBH_USR_MSC_Application
* Demo application for mass storage
* @param None
* @retval Staus
*/
int USBH_USR_MSC_Application(void)
{
FRESULT res; /* 文件操作结果 */
switch (USBH_USR_ApplicationState)
{
case USH_USR_FS_INIT:
res = f_mount(&FatFs[2], "2:", 1); // 文件系统挂载时会对NAND初始化
if (res == FR_NO_FILESYSTEM) // TF 卡没有文件系统
{
res = f_mkfs("2:", 0, 0); // 格式化
if (res == FR_OK)
{
usb_printf("USB format ok\r\n");
res = f_mount(NULL, "2:", 1); /* 格式化后,先取消挂载 */
res = f_mount(&FatFs[2], "2:", 1); /* 重新挂载 */
}
else
{
usb_printf("USB format fail\r\n");
}
}
if (res != FR_OK)
{
usb_printf("!!!USB mount file system fail (%d)\r\n", res);
return (-1);
}
usb_printf("USB file system mount ok !\r\n");
USBH_USR_ApplicationState = USH_USR_FS_READLIST;
break;
case USH_USR_FS_READLIST:
while (USB_OTG_Core.host.ConnSts == 0)
;
USBH_USR_ApplicationState = USH_USR_FS_WRITEFILE;
break;
case USH_USR_FS_WRITEFILE:
while (USB_OTG_Core.host.ConnSts == 0)
;
USBH_USR_ApplicationState = USH_USR_FS_DRAW;
break;
case USH_USR_FS_DRAW:
break;
default:
break;
}
return (0);
}
/**
* @brief USBH_USR_DeInit
* Deint User state and associated variables
* @param None
* @retval None
*/
void USBH_USR_DeInit(void)
{
USBH_USR_ApplicationState = USH_USR_FS_INIT;
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/