1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/include/usb/usbus/msc.h

136 lines
4.3 KiB
C

/*
* Copyright (C) 2019-2021 Mesotic SAS
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License v2.1. See the file LICENSE in the top level directory for
* more details.
*
*
*/
/**
* @ingroup usbus_msc
*
* @{
*
* @file
* @brief USBUS Mass Storage Class functions definitions
*
* @author Dylan Laduranty <dylan.laduranty@mesotic.com>
*/
#ifndef USB_USBUS_MSC_H
#define USB_USBUS_MSC_H
#include <stdint.h>
#include "usb/usbus.h"
#include "usb/usbus/msc/scsi.h"
#include "mtd_default.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief USBUS MSC bulk data endpoint size.
*/
#if defined(MODULE_PERIPH_USBDEV_HS_UTMI) || defined(MODULE_PERIPH_USBDEV_HS_ULPI)
#define USBUS_MSC_EP_DATA_SIZE 512
#else
#define USBUS_MSC_EP_DATA_SIZE 64
#endif
/**
* @brief Number of IN EPs required for the MSC interface
*/
#define USBUS_MSC_EP_IN_REQUIRED_NUMOF 1
/**
* @brief Number of Out EPs required for the MSC interface
*/
#define USBUS_MSC_EP_OUT_REQUIRED_NUMOF 1
/**
* @brief USBUS MSC internal state machine enum
*/
typedef enum {
WAITING, /**< Initial state, wait for USB setup */
WAIT_FOR_TRANSFER, /**< Wait for a single packet transfer before sending CSW */
DATA_TRANSFER_IN, /**< Ongoing transfer on USB MSC IN endpoint */
DATA_TRANSFER_OUT, /**< Ongoing transfer on USB MSC OUT endpoint */
GEN_CSW /**< Generate CSW response to host w/ the current transfer status */
} usbus_msc_state_t;
/**
* @brief USBUS MSC Logical Unit descriptor
*/
typedef struct usbus_msc_lun {
mtd_dev_t *mtd; /**< Pointer to the current mtd device used */
uint32_t block_nb; /**< Reported USB block number */
uint32_t block_size; /**< Reported USB block size */
} usbus_msc_lun_t;
/**
* @brief USBUS MSC device interface context
*/
typedef struct usbus_msc_device {
usbus_handler_t handler_ctrl; /**< Control interface handler */
usbus_interface_t iface; /**< MSC interface */
usbus_endpoint_t *ep_in; /**< Data endpoint in */
usbus_endpoint_t *ep_out; /**< Data endpoint out */
uint8_t *out_buf; /**< Pointer to internal out endpoint buffer */
uint8_t *in_buf; /**< Pointer to internal in endpoint buffer */
usbus_descr_gen_t msc_descr; /**< MSC descriptor generator */
usbus_t *usbus; /**< Pointer to the USBUS context */
cbw_info_t cmd; /**< Command Block Wrapper information */
event_t rx_event; /**< Transmit ready event */
usbus_msc_state_t state; /**< Internal state machine for msc */
uint8_t *buffer; /**< Pointer to the current data transfer buffer */
uint32_t buffer_size; /**< Size of the internal buffer used for data transfer */
uint32_t block; /**< First block to transfer data from/to */
uint16_t block_nb; /**< Number of block to transfer for READ and
WRITE operations */
uint16_t block_offset; /**< Internal offset for endpoint size chunk transfer */
usbus_msc_lun_t *lun_dev; /**< Array holding exported logical unit descriptor */
} usbus_msc_device_t;
/**
* @brief MSC initialization function
*
* @param usbus USBUS thread to use
* @param handler MSC device struct
*/
int usbus_msc_init(usbus_t *usbus, usbus_msc_device_t *handler);
/**
* @brief Register a MTD device as a MSC LUN (Logical Unit Number)
*
* @param[in] usbus USBUS context
* @param[in] dev pointer to the MTD device to export
*
* @return 0 on success
* -ENOMEM, if the selected MTD device doesn't have enough memory
* -EAGAIN, if no more MTD devices can be exported
* -EBUSY, if the MTD device is already exported
*/
int usbus_msc_add_lun(usbus_t *usbus, mtd_dev_t *dev);
/**
* @brief Unregister a MTD device as a MSC LUN
*
* @param[in] usbus USBUS context
* @param[in] dev pointer to the MTD device to export
*
* @return 0 on success
* -ENODEV, if no matching MTD device was found
*/
int usbus_msc_remove_lun(usbus_t *usbus, mtd_dev_t *dev);
#ifdef __cplusplus
}
#endif
#endif /* USB_USBUS_MSC_H */
/** @} */