u盘读写控制源程序 - ch376芯片

发布时间 : 星期三 文章u盘读写控制源程序 - ch376芯片更新完毕开始阅读

#define ERR_NAME_EXIST 0x4A /* 同名的短文件已经存在,建议重新生成另外一个短文件名 */ #endif /*

********************************************************************************************************************* */

/* 以下状态代码用于主机文件模式下的磁盘及文件状态, VAR_DISK_STATUS */ #ifndef DEF_DISK_UNKNOWN #define DEF_DISK_UNKNOWN #define DEF_DISK_DISCONN #define DEF_DISK_CONNECT 识别该磁盘 */

#define DEF_DISK_MOUNTED 系统或者文件系统不支持 */ #define DEF_DISK_READY */

0x00 0x01 0x02 0x03 0x10

/* 尚未初始化,未知状态 */

/* 磁盘没有连接或者已经断开 */

/* 磁盘已经连接,但是尚未初始化或者无法/* 磁盘已经初始化成功,但是尚未分析文件/* 已经分析磁盘的文件系统并且能够支持

#define DEF_DISK_OPEN_ROOT 0x12 /* 已经打开根目录,使用后必须关闭,注意FAT12/FAT16根目录是固定长度 */ #define DEF_DISK_OPEN_DIR 0x13 /* 已经打开子目录(文件夹) */ #define DEF_DISK_OPEN_FILE 0x14 /* 已经打开文件 */ #endif /*

********************************************************************************************************************* */ /* 文件系统常用定义 */

#ifndef DEF_SECTOR_SIZE #define DEF_SECTOR_SIZE 512 /* U盘或者SD卡默认的物理扇区的大小 */ #endif

#ifndef DEF_WILDCARD_CHAR

#define DEF_WILDCARD_CHAR 0x2A /* 路径名的通配符 '*' */ #define DEF_SEPAR_CHAR1 0x5C /* 路径名的分隔符 '\\' */ #define DEF_SEPAR_CHAR2 0x2F /* 路径名的分隔符 '/' */ #define DEF_FILE_YEAR 2004 /* 默认文件日期: 2004年 */ #define DEF_FILE_MONTH 1 /* 默认文件日期: 1月 */ #define DEF_FILE_DATE 1 /* 默认文件日期: 1日 */ #endif

#ifndef ATTR_DIRECTORY

/* FAT数据区中文件目录信息 */ typedef struct _FAT_DIR_INFO { UINT8 DIR_Name[11]; */

UINT8 DIR_Attr; UINT8 DIR_NTRes; UINT8 DIR_CrtTimeTenth; UINT16 DIR_CrtTime; UINT16 DIR_CrtDate; UINT16 DIR_LstAccDate; UINT16 DIR_FstClusHI; UINT16 DIR_WrtTime; MAKE_FILE_TIME */ UINT16 DIR_WrtDate; MAKE_FILE_DATE */ UINT16 DIR_FstClusLO;

/* 00H,文件名,共11字节,不足处填空格

/* 0BH,文件属性,参考后面的说明 */ /* 0CH */

/* 0DH,文件创建的时间,以0.1秒单位计数 */ /* 0EH,文件创建的时间 */ /* 10H,文件创建的日期 */ /* 12H,最近一次存取操作的日期 */ /* 14H */

/* 16H,文件修改时间,参考前面的宏/* 18H,文件修改日期,参考前面的宏

/* 1AH */

UINT32 DIR_FileSize; /* 1CH,文件长度 */ } FAT_DIR_INFO, *P_FAT_DIR_INFO; /* 20H */

/* 文件属性 */

#define ATTR_READ_ONLY 0x01 /* 文件为只读属性 */ #define ATTR_HIDDEN 0x02 /* 文件为隐含属性 */ #define ATTR_SYSTEM 0x04 /* 文件为系统属性 */ #define ATTR_VOLUME_ID 0x08 /* 卷标 */ #define ATTR_DIRECTORY 0x10 /* 子目录(文件夹) */ #define ATTR_ARCHIVE 0x20 /* 文件为存档属性 */ #define ATTR_LONG_NAME ( ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID ) /* 长文件名属性 */ #define ATTR_LONG_NAME_MASK ( ATTR_LONG_NAME ATTR_ARCHIVE )

/* 文件属性 UINT8 */

/* bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 */

/* 只 隐 系 卷 目 存 未定义 */ /* 读 藏 统 标 录 档 */ /* 文件时间 UINT16 */

/* Time = (Hour<<11) + (Minute<<5) + (Second>>1) */ #define MAKE_FILE_TIME( h, m, s ) ( (h<<11) + (m<<5) + (s>>1) ) /* 生成指定时分秒的文件时间数据 */

/* 文件日期 UINT16 */

/* Date = ((Year-1980)<<9) + (Month<<5) + Day */ #define MAKE_FILE_DATE( y, m, d ) ( ((y-1980)<<9) + (m<<5) + d ) /* 生成指定年月日的文件日期数据 */

#define LONE_NAME_MAX_CHAR (255*2) /* 长文件名最多字符数/字节数 */

|

ATTR_DIRECTORY

|

#define LONG_NAME_PER_DIR (13*2) /* 长文件名在每个文件目录信息结构中的字符数/字节数 */

#endif /*

********************************************************************************************************************* */ /* SCSI命令和数据输入输出结构 */

#ifndef SPC_CMD_INQUIRY

/* SCSI命令码 */

#define SPC_CMD_INQUIRY #define SPC_CMD_READ_CAPACITY #define SPC_CMD_READ10 #define SPC_CMD_WRITE10 #define SPC_CMD_TEST_READY #define SPC_CMD_REQUEST_SENSE #define SPC_CMD_MODESENSE6 #define SPC_CMD_MODESENSE10 #define SPC_CMD_START_STOP

/* BulkOnly协议的命令块 */ typedef struct _BULK_ONLY_CBW { UINT32 CBW_Sig; UINT32 CBW_Tag;

0x12

0x25 0x28 0x2A 0x00 0x03 0x1A 0x5A 0x1B

UINT8 CBW_DataLen0; /* 08H,输入: 数据传输长度,对于输入数据其有效值是0到48,对于输出数据其有效值为0到33 */ UINT8 CBW_DataLen1; UINT16 CBW_DataLen2; UINT8 CBW_Flag; /* 0CH,输入: 传输方向等标志,位7为1则输入数据,位为0则输出数据或者没有数据 */ UINT8 CBW_LUN; UINT8 CBW_CB_Len; /* 0EH,输入: 命令块的长度,有效值是1到16 */ UINT8 CBW_CB_Buf[16]; /* 0FH,输入: 命令块,该缓冲区最多为16个字节 */

} BULK_ONLY_CBW, *P_BULK_ONLY_CBW; /* BulkOnly协议的命令块, 输入CBW结构 */

/* INQUIRY命令的返回数据 */ typedef struct _INQUIRY_DATA { UINT8 DeviceType; /* 00H, 设备类型 */

UINT8 RemovableMedia; UINT8 Versions; UINT8 DataFormatAndEtc; UINT8 AdditionalLength; UINT8 Reserved1; UINT8 Reserved2; UINT8 MiscFlag; UINT8 VendorIdStr[8]; UINT8 ProductIdStr[16]; UINT8 ProductRevStr[4]; } INQUIRY_DATA, *P_INQUIRY_DATA;

/* 01H, 位7为1说明是移动存储 */ /* 02H, 协议版本 */

/* 03H, 指定返回数据格式 */ /* 04H, 后续数据的长度 */

/* 07H, 一些控制标志 */ /* 08H, 厂商信息 */ /* 10H, 产品信息 */ /* 20H, 产品版本 */ /* 24H */

/* REQUEST SENSE命令的返回数据 */ typedef struct _SENSE_DATA {

UINT8 UINT8

ErrorCode; SegmentNumber;

/* 00H, 错误代码及有效位 */

UINT8 SenseKeyAndEtc; /* 02H, 主键码 */ UINT8 Information0; UINT8 Information1; UINT8 Information2; UINT8 Information3; UINT8 AdditSenseLen; /* 07H, 后续数据的长度 */ UINT8 CmdSpecInfo[4]; UINT8 AdditSenseCode; /* 0CH, 附加键码 */ UINT8 AddSenCodeQual; /* 0DH, 详细的附加键码 */ UINT8 FieldReplaUnit; UINT8 SenseKeySpec[3]; } SENSE_DATA, *P_SENSE_DATA; /* 12H */

#endif /*

********************************************************************************************************************* */ /* 主机文件模式下的数据输入和输出结构 */

#ifndef MAX_FILE_NAME_LEN

#define MAX_FILE_NAME_LEN (13+1) /* 文件名最大长度,最大长度是1个根目录符+8个主文件名+1个小数点+3个类型名+结束符=14 */

/* 命令的输入数据和输出数据 */ typedef union _CH376_CMD_DATA { struct {

联系合同范文客服:xxxxx#qq.com(#替换为@)