📄 mass_bulk.h
字号:
#ifndef _MASS_BULK_H
#define _MASS_BULK_H
#ifdef MASS_BULK_GLOBALS
#define MASS_BULK_GLOBALS_EXT
#else
#define MASS_BULK_GLOBALS_EXT extern
#endif
#define MAX_MASS_DEVICES_DEFINE 2
#define MAX_MASS_DEVICES_LUN_DEFINE MAX_MASS_DEVICES_DEFINE+ 3
#define MAX_MASS_LUN 4
#define PERSISTENT_FAILURE (INT8U)0x03
#define PHASE_ERROR (INT8U)0x02
#define COMMAND_FAILED (INT8U)0x01
#define COMMAND_PASSED (INT8U)0x00
#define IN_DATA DirectionPID_IN // 数据输入
#define OUT_DATA DirectionPID_OUT // 数据输出
#define NONE_DATA NoDirection_Just_Hold // 无数据传输
/* 大容量设备描述数据结构 */
typedef struct MASS_STORAGE_CLASS
{
struct _HMEDLUN *LUN_info_ptr[MAX_MASS_LUN]; /* 逻辑单元描述信息结构指针 */
device_instance *dvi_ptr; /* 设备信息描述结构指针*/
INT8U LUN; /* 该设备的逻辑单元数*/
INT8U SubclassCode; /* 子类代码 */
INT8U ProtocolCode; /* 传输协议代码CBI 或BULK*/
INT8U Reserved;
INT8U CBW_Buff[31]; /* 批量传输的命令包缓冲区指针 */
//INT8U RBC_Buff[12]; /* 命令设置缓冲区 */
}MassStorageClass,*PMassStorageClass;
/* 媒介设备句柄 */
typedef struct _HMEDLUN
{
MassStorageClass *MSC; // 大容量设备的描述信息结构
INT8U LUN; // 所在大容量设备的逻辑单元号
INT8U VendorInfo[8]; // 厂商信息
INT8U ProductInfo[16]; // 产品信息
INT8U ProductRev[4]; // 产品版本
INT32U LastLogicalBlookAddress;// 最后逻辑块地址
INT32U BlockLengthInBytes; // 逻辑块长度
}hMedLUN;
/* 命令块包结构(仅单批量使用) */
typedef struct _COMMAND_BLOCK_WRAPPER{
INT8U dCBW_Signature_0;
INT8U dCBW_Signature_1;
INT8U dCBW_Signature_2;
INT8U dCBW_Signature_3;
INT32U dCBW_Tag;
INT8U dCBW_DataXferLen_0;
INT8U dCBW_DataXferLen_1;
INT8U dCBW_DataXferLen_2;
INT8U dCBW_DataXferLen_3;
INT8U bCBW_Flag;
INT8U bCBW_LUN;
INT8U bCBW_CDBLength;
INT8U CBWCB[16];
} COMMAND_BLOCK_WRAPPER, *PCOMMAND_BLOCK_WRAPPER;
/* 命令状态包结构(仅单批量使用) */
typedef struct _COMMAND_STATUS_WRAPPER{
INT8U dCSW_Signature_0; // 0x55
INT8U dCSW_Signature_1; // 0x53
INT8U dCSW_Signature_2; // 0x42
INT8U dCSW_Signature_3; // 0x53
INT32U dCSW_Tag; // 与CBW一致
INT8U dCSW_DataResidue_0;
INT8U dCSW_DataResidue_1;
INT8U dCSW_DataResidue_2;
INT8U dCSW_DataResidue_3;
INT8U bCSW_Status;
} COMMAND_STATUS_WRAPPER, *PCOMMAND_STATUS_WRAPPER;
MASS_BULK_GLOBALS_EXT hMedLUN *Create_Medium(device_instance * dvi_ptr, INT8U LUNIndex);
MASS_BULK_GLOBALS_EXT void Close_Medium(hMedLUN * hMedLUNPtr, INT8U LUNIndex);
MASS_BULK_GLOBALS_EXT INT32U Read_BlockData(hMedLUN * medium_ptr, INT8U * data_ptr, INT32U LBA, INT16U block_num);
MASS_BULK_GLOBALS_EXT INT32U Write_BlockData(hMedLUN * medium_ptr, INT8U * data_ptr, INT32U LBA, INT16U block_num);
#ifdef MASS_BULK_GLOBALS
#define MASS_BULK_GLOBALS_INT
#define CBW_IN_DATA 0x80
#define CBW_OUT_DATA 0x00
MASS_BULK_GLOBALS_INT MassStorageClass MSCDevices[MAX_MASS_DEVICES_DEFINE];
MASS_BULK_GLOBALS_INT hMedLUN MSCDeviceLUNs[MAX_MASS_DEVICES_LUN_DEFINE];
MASS_BULK_GLOBALS_INT INT8U Reset_MassStorage(device_instance * dvi_ptr);
MASS_BULK_GLOBALS_INT INT8U Get_MaxLUN(device_instance * dvi_ptr);
MASS_BULK_GLOBALS_INT INT16U Get_CSWStatus(hMedLUN * Medium_ptr);
MASS_BULK_GLOBALS_INT INT8U Get_ThisInquiryData(hMedLUN * Medium_ptr);
MASS_BULK_GLOBALS_INT INT8U Get_ThisMediumCapacity(hMedLUN * Medium_ptr);
MASS_BULK_GLOBALS_INT hMedLUN *BulkOnlyGet_MassInfo(MassStorageClass * mass_i_ptr);
MASS_BULK_GLOBALS_INT INT8U Get_RequestSense(hMedLUN * Medium_ptr, SENSE_DATA * SenseData_ptr);
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -