2022-11-10 22:22:48 +08:00
|
|
|
|
/*
|
|
|
|
|
* Copyright : (C) 2022 Phytium Information Technology, Inc.
|
|
|
|
|
* All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
|
|
|
|
|
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
|
|
|
|
|
* either version 1.0 of the License, or (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
|
|
|
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
* See the Phytium Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* FilePath: fusb_msc.h
|
|
|
|
|
* Date: 2022-02-11 13:33:09
|
|
|
|
|
* LastEditTime: 2022-02-17 17:50:46
|
|
|
|
|
* Description: This files is for definition of USB mass storage function
|
|
|
|
|
*
|
|
|
|
|
* Modify History:
|
|
|
|
|
* Ver Who Date Changes
|
|
|
|
|
* ----- ------ -------- --------------------------------------
|
2023-05-11 10:25:21 +08:00
|
|
|
|
* 1.0 zhugengyu 2022/2/7 init commit
|
2022-11-10 22:22:48 +08:00
|
|
|
|
*/
|
|
|
|
|
|
2023-05-11 10:25:21 +08:00
|
|
|
|
#ifndef FUSB_MSC_H
|
|
|
|
|
#define FUSB_MSC_H
|
|
|
|
|
|
|
|
|
|
/***************************** Include Files *********************************/
|
|
|
|
|
|
|
|
|
|
#include "fusb.h"
|
2022-11-10 22:22:48 +08:00
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
extern "C"
|
|
|
|
|
{
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/************************** Constant Definitions *****************************/
|
|
|
|
|
/* Possible values for quirks field. */
|
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
/* Don't check for LUNs (force assumption that there's only one LUN). */
|
|
|
|
|
FUSB_MSC_QUIRK_NO_LUNS = 1 << 0,
|
|
|
|
|
/* Never do a BULK_ONLY reset, just continue. This means that the device
|
|
|
|
|
cannot recover from phase errors and won't detach automatically for
|
|
|
|
|
unrecoverable errors. Do not use unless you have to. */
|
|
|
|
|
FUSB_MSC_QUIRK_NO_RESET = 1 << 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Possible values for ready field. */
|
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
FUSB_MSC_DETACHED = -1, /* Disk detached or out to lunch. */
|
|
|
|
|
FUSB_MSC_NOT_READY = 0, /* Disk not ready yet -- empty card reader */
|
|
|
|
|
FUSB_MSC_READY = 1, /* Disk ready to communicate. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
FUSB_MSC_SUBCLASS_ATAPI_8020 = 0x2,
|
|
|
|
|
FUSB_MSC_SUBCLASS_ATAPI_8070 = 0x5,
|
|
|
|
|
FUSB_MSC_SUBCLASS_SCSI = 0x6
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Protocols of MSC */
|
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
FUSB_MSC_PROTOCOL_BULK_ONLY = 0x50 /* Usb bulk-only transfer protocol */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
|
{
|
|
|
|
|
FUSB_DIR_DATA_IN = 0x80, /* data from the device to the host */
|
|
|
|
|
FUSB_DIR_DATA_OUT = 0 /* data from the host to the device */
|
|
|
|
|
} FUsbMassStorageDirection;
|
|
|
|
|
|
|
|
|
|
/**************************** Type Definitions *******************************/
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
unsigned int blocksize;
|
|
|
|
|
unsigned int numblocks;
|
|
|
|
|
FUsbEndpoint *bulk_in;
|
|
|
|
|
FUsbEndpoint *bulk_out;
|
|
|
|
|
u8 quirks : 7;
|
|
|
|
|
u8 usbdisk_created : 1;
|
|
|
|
|
s8 ready;
|
|
|
|
|
u8 lun;
|
|
|
|
|
u8 num_luns;
|
|
|
|
|
void *data; /* For use by consumers of libpayload. */
|
|
|
|
|
} FUsbMassStorage;
|
|
|
|
|
|
|
|
|
|
/************************** Variable Definitions *****************************/
|
|
|
|
|
|
|
|
|
|
/***************** Macros (Inline Functions) Definitions *********************/
|
|
|
|
|
#define MSC_INST(dev) ((FUsbMassStorage*)(dev)->data)
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @name: FUsbMscGetCapcityMB
|
|
|
|
|
* @msg: 获取USB大容量存储设备的容量,单位MB
|
|
|
|
|
* @return {fsize_t} 容量,MB
|
|
|
|
|
* @param {FUsbDev} *dev, USB大容量存储设备实例
|
|
|
|
|
*/
|
|
|
|
|
static inline u32 FUsbMscGetCapcityMB(FUsbDev *dev)
|
|
|
|
|
{
|
|
|
|
|
FASSERT(dev);
|
|
|
|
|
return (u32)(MSC_INST(dev)->numblocks > 1000000
|
|
|
|
|
? (MSC_INST(dev)->numblocks / 1024) * MSC_INST(dev)->blocksize / 1024
|
|
|
|
|
: MSC_INST(dev)->numblocks * MSC_INST(dev)->blocksize / 1024 / 1024);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @name: FUsbMscGetBlkSize
|
|
|
|
|
* @msg: 获取USB大容量存储设备的块大小
|
|
|
|
|
* @return {*} 块大小,字节数
|
|
|
|
|
* @param {FUsbDev} *dev, USB大容量存储设备实例
|
|
|
|
|
*/
|
|
|
|
|
static inline u32 FUsbMscGetBlkSize(FUsbDev *dev)
|
|
|
|
|
{
|
|
|
|
|
FASSERT(dev);
|
|
|
|
|
return (u32)MSC_INST(dev)->blocksize;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @name: FUsbMscGetBlkNum
|
|
|
|
|
* @msg: 获取USB大容量存储设备块数目
|
|
|
|
|
* @return {*} 块数目
|
|
|
|
|
* @param {FUsbDev} *dev, USB大容量存储设备实例
|
|
|
|
|
*/
|
|
|
|
|
static inline u32 FUsbMscGetBlkNum(FUsbDev *dev)
|
|
|
|
|
{
|
|
|
|
|
FASSERT(dev);
|
|
|
|
|
return (u32)MSC_INST(dev)->numblocks;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************** Function Prototypes ******************************/
|
|
|
|
|
/* 读写USB大容量存储设备,以512字节为一块 */
|
|
|
|
|
int FUsbMscRwBlk512(FUsbDev *dev, int start, int n, FUsbMassStorageDirection dir, u8 *buf);
|
|
|
|
|
|
|
|
|
|
/* USB大容量存储设备的初始化函数,由应用程序注册到FUSB框架中 */
|
|
|
|
|
void FUsbMassStorageInit(FUsbDev *dev);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* To be implemented by application. It's called by the USB stack
|
|
|
|
|
* when a new USB storage device is found, so the client has the chance
|
|
|
|
|
* to know about it.
|
|
|
|
|
*
|
|
|
|
|
* @param dev descriptor for the USB storage device
|
|
|
|
|
*/
|
|
|
|
|
void __attribute__((weak)) FUsbDiskCreate(FUsbDev *dev);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* To be implemented by application. It's called by the USB stack
|
|
|
|
|
* when it finds out that a USB storage device is removed.
|
|
|
|
|
*
|
|
|
|
|
* @param dev descriptor for the USB storage device
|
|
|
|
|
*/
|
|
|
|
|
void __attribute__((weak)) FUsbDiskRemove(FUsbDev *dev);
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|