/**
  ******************************************************************************
  * @file    usbd_msc.h
  * @author  MCD Application Team
  * @brief   Header for the usbd_msc.c file
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under Ultimate Liberty license
  * SLA0044, the "License"; You may not use this file except in compliance with
  * the License. You may obtain a copy of the License at:
  *                      www.st.com/SLA0044
  *
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USBD_MSC_H
#define __USBD_MSC_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include  "usbd_msc_bot.h"
#include  "usbd_msc_scsi.h"
#include  "usbd_ioreq.h"

/** @addtogroup USBD_MSC_BOT
  * @{
  */

/** @defgroup USBD_MSC
  * @brief This file is the Header file for usbd_msc.c
  * @{
  */


/** @defgroup USBD_BOT_Exported_Defines
  * @{
  */
#define MSC_BOT_STR_DESC             "STM32 MSC DEVICE"

/* MSC Class Config */
#ifndef MSC_MEDIA_PACKET
#define MSC_MEDIA_PACKET             512U
#endif /* MSC_MEDIA_PACKET */

#define MSC_MAX_FS_PACKET            0x40U
#define MSC_MAX_HS_PACKET            0x200U

#define BOT_GET_MAX_LUN              0xFE
#define BOT_RESET                    0xFF
#define USB_MSC_CONFIG_DESC_SIZ      32

/**
  * @}
  */

/** @defgroup USB_CORE_Exported_Types
  * @{
  */
typedef struct _USBD_STORAGE
{
  int8_t (*Init)(uint8_t lun);
  int8_t (*GetCapacity)(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
  int8_t (*IsReady)(uint8_t lun);
  int8_t (*IsWriteProtected)(uint8_t lun);
  int8_t (*Read)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
  int8_t (*Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
  int8_t (*GetMaxLun)(void);
  int8_t *pInquiry;

} USBD_StorageTypeDef;

typedef struct
{
  uint32_t max_lun;
  uint32_t interface;
  uint8_t bot_state;
  uint8_t bot_status;
  uint32_t bot_data_length;
  uint8_t bot_data[MSC_MEDIA_PACKET];
  USBD_MSC_BOT_CBWTypeDef cbw;
  USBD_MSC_BOT_CSWTypeDef csw;

  USBD_SCSI_SenseTypeDef scsi_sense[SENSE_LIST_DEEPTH];
  uint8_t scsi_sense_head;
  uint8_t scsi_sense_tail;
  uint8_t scsi_medium_state;

  uint16_t scsi_blk_size;
  uint32_t scsi_blk_nbr;

  uint32_t scsi_blk_addr;
  uint32_t scsi_blk_len;
} USBD_MSC_BOT_HandleTypeDef;

/* Structure for MSC process */
extern USBD_ClassTypeDef USBD_MSC;

extern uint8_t MSC_IN_EP;
extern uint8_t MSC_OUT_EP;
extern uint8_t MSC_ITF_NBR;
extern uint8_t MSC_BOT_STR_DESC_IDX;

uint8_t USBD_MSC_RegisterStorage(USBD_HandleTypeDef *pdev,
                                 USBD_StorageTypeDef *fops);

void USBD_Update_MSC_DESC(uint8_t *desc, uint8_t itf_no, uint8_t in_ep, uint8_t out_ep, uint8_t str_idx);

/**
  * @}
  */

/**
  * @}
  */

#ifdef __cplusplus
}
#endif

#endif /* __USBD_MSC_H */
/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
