📄 ch376inc.h
字号:
#define CMD_DISK_R_SENSE CMD0H_DISK_R_SENSE
#define CMD_RD_DISK_SEC CMD0H_RD_DISK_SEC
#define CMD_WR_DISK_SEC CMD0H_WR_DISK_SEC
#define CMD_DISK_MAX_LUN CMD0H_DISK_MAX_LUN
#endif
/* ********************************************************************************************************************* */
/* 并口方式, 状态端口(读命令端口)的位定义 */
#ifndef PARA_STATE_INTB
#define PARA_STATE_INTB 0x80 /* 并口方式状态端口的位7: 中断标志,低有效 */
#define PARA_STATE_BUSY 0x10 /* 并口方式状态端口的位4: 忙标志,高有效 */
#endif
/* ********************************************************************************************************************* */
/* 串口方式, 操作命令前的引导同步码 */
#ifndef SER_CMD_TIMEOUT
#define SER_CMD_TIMEOUT 32 /* 串口命令超时时间, 单位为mS, 同步码之间及同步码与命令码之间的间隔应该尽量短, 超时后的处理方式为丢弃 */
#define SER_SYNC_CODE1 0x57 /* 启动操作的第1个串口同步码 */
#define SER_SYNC_CODE2 0xAB /* 启动操作的第2个串口同步码 */
#endif
/* ********************************************************************************************************************* */
/* 操作状态 */
#ifndef CMD_RET_SUCCESS
#define CMD_RET_SUCCESS 0x51 /* 命令操作成功 */
#define CMD_RET_ABORT 0x5F /* 命令操作失败 */
#endif
/* ********************************************************************************************************************* */
/* USB中断状态 */
#ifndef USB_INT_EP0_SETUP
/* 以下状态代码为特殊事件中断, 如果通过CMD20_CHK_SUSPEND启用USB总线挂起检查, 那么必须处理USB总线挂起和睡眠唤醒的中断状态 */
#define USB_INT_USB_SUSPEND 0x05 /* USB总线挂起事件 */
#define USB_INT_WAKE_UP 0x06 /* 从睡眠中被唤醒事件 */
/* 以下状态代码0XH用于USB设备方式 */
/* 内置固件模式下只需要处理: USB_INT_EP1_OUT, USB_INT_EP1_IN, USB_INT_EP2_OUT, USB_INT_EP2_IN */
/* 位7-位4为0000 */
/* 位3-位2指示当前事务, 00=OUT, 10=IN, 11=SETUP */
/* 位1-位0指示当前端点, 00=端点0, 01=端点1, 10=端点2, 11=USB总线复位 */
#define USB_INT_EP0_SETUP 0x0C /* USB端点0的SETUP */
#define USB_INT_EP0_OUT 0x00 /* USB端点0的OUT */
#define USB_INT_EP0_IN 0x08 /* USB端点0的IN */
#define USB_INT_EP1_OUT 0x01 /* USB端点1的OUT */
#define USB_INT_EP1_IN 0x09 /* USB端点1的IN */
#define USB_INT_EP2_OUT 0x02 /* USB端点2的OUT */
#define USB_INT_EP2_IN 0x0A /* USB端点2的IN */
/* USB_INT_BUS_RESET 0x0000XX11B */ /* USB总线复位 */
#define USB_INT_BUS_RESET1 0x03 /* USB总线复位 */
#define USB_INT_BUS_RESET2 0x07 /* USB总线复位 */
#define USB_INT_BUS_RESET3 0x0B /* USB总线复位 */
#define USB_INT_BUS_RESET4 0x0F /* USB总线复位 */
#endif
/* 以下状态代码2XH-3XH用于USB主机方式的通讯失败代码 */
/* 位7-位6为00 */
/* 位5为1 */
/* 位4指示当前接收的数据包是否同步 */
/* 位3-位0指示导致通讯失败时USB设备的应答: 0010=ACK, 1010=NAK, 1110=STALL, 0011=DATA0, 1011=DATA1, XX00=超时 */
/* USB_INT_RET_ACK 0x001X0010B */ /* 错误:对于IN事务返回ACK */
/* USB_INT_RET_NAK 0x001X1010B */ /* 错误:返回NAK */
/* USB_INT_RET_STALL 0x001X1110B */ /* 错误:返回STALL */
/* USB_INT_RET_DATA0 0x001X0011B */ /* 错误:对于OUT/SETUP事务返回DATA0 */
/* USB_INT_RET_DATA1 0x001X1011B */ /* 错误:对于OUT/SETUP事务返回DATA1 */
/* USB_INT_RET_TOUT 0x001XXX00B */ /* 错误:返回超时 */
/* USB_INT_RET_TOGX 0x0010X011B */ /* 错误:对于IN事务返回数据不同步 */
/* USB_INT_RET_PID 0x001XXXXXB */ /* 错误:未定义 */
/* 以下状态代码1XH用于USB主机方式的操作状态代码 */
#ifndef USB_INT_SUCCESS
#define USB_INT_SUCCESS 0x14 /* USB事务或者传输操作成功 */
#define USB_INT_CONNECT 0x15 /* 检测到USB设备连接事件, 可能是新连接或者断开后重新连接 */
#define USB_INT_DISCONNECT 0x16 /* 检测到USB设备断开事件 */
#define USB_INT_BUF_OVER 0x17 /* USB传输的数据有误或者数据太多缓冲区溢出 */
#define USB_INT_USB_READY 0x18 /* USB设备已经被初始化(已经分配USB地址) */
#define USB_INT_DISK_READ 0x1D /* USB存储器请求数据读出 */
#define USB_INT_DISK_WRITE 0x1E /* USB存储器请求数据写入 */
#define USB_INT_DISK_ERR 0x1F /* USB存储器操作失败 */
#endif
/* 以下状态代码用于主机文件模式下的文件系统错误码 */
#ifndef ERR_DISK_DISCON
#define ERR_DISK_DISCON 0x82 /* 磁盘尚未连接,可能磁盘已经断开 */
#define ERR_LARGE_SECTOR 0x84 /* 磁盘的扇区太大,只支持每扇区512字节 */
#define ERR_TYPE_ERROR 0x92 /* 磁盘分区类型不支持,只支持FAT12/FAT16/BigDOS/FAT32,需要由磁盘管理工具重新分区 */
#define ERR_BPB_ERROR 0xA1 /* 磁盘尚未格式化,或者参数错误,需要由WINDOWS采用默认参数重新格式化 */
#define ERR_DISK_FULL 0xB1 /* 磁盘文件太满,剩余空间太少或者已经没有,需要磁盘整理 */
#define ERR_FDT_OVER 0xB2 /* 目录(文件夹)内文件太多,没有空闲的目录项,FAT12/FAT16根目录下的文件数应该少于512个,需要磁盘整理 */
#define ERR_FILE_CLOSE 0xB4 /* 文件已经关闭,如果需要使用,应该重新打开文件 */
#define ERR_OPEN_DIR 0x41 /* 指定路径的目录(文件夹)被打开 */
#define ERR_MISS_FILE 0x42 /* 指定路径的文件没有找到,可能是文件名称错误 */
#define ERR_FOUND_NAME 0x43 /* 搜索到相匹配的文件名,或者是要求打开目录(文件夹)而实际结果却打开了文件 */
/* 以下文件系统错误码用于文件系统子程序 */
#define ERR_MISS_DIR 0xB3 /* 指定路径的某个子目录(文件夹)没有找到,可能是目录名称错误 */
#define ERR_LONG_BUF_OVER 0x48 /* 长文件缓冲区溢出 */
#define ERR_LONG_NAME_ERR 0x49 /* 短文件名没有对应的长文件名或者长文件名错误 */
#define ERR_NAME_EXIST 0x4A /* 同名的短文件已经存在,建议重新生成另外一个短文件名 */
#endif
/* ********************************************************************************************************************* */
/* 以下状态代码用于主机文件模式下的磁盘及文件状态, VAR_DISK_STATUS */
#ifndef DEF_DISK_UNKNOWN
#define DEF_DISK_UNKNOWN 0x00 /* 尚未初始化,未知状态 */
#define DEF_DISK_DISCONN 0x01 /* 磁盘没有连接或者已经断开 */
#define DEF_DISK_CONNECT 0x02 /* 磁盘已经连接,但是尚未初始化或者无法识别该磁盘 */
#define DEF_DISK_MOUNTED 0x03 /* 磁盘已经初始化成功,但是尚未分析文件系统或者文件系统不支持 */
#define DEF_DISK_READY 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]; /* 00H,文件名,共11字节,不足处填空格 */
UINT8 DIR_Attr; /* 0BH,文件属性,参考后面的说明 */
UINT8 DIR_NTRes; /* 0CH */
UINT8 DIR_CrtTimeTenth; /* 0DH,文件创建的时间,以0.1秒单位计数 */
UINT16 DIR_CrtTime; /* 0EH,文件创建的时间 */
UINT16 DIR_CrtDate; /* 10H,文件创建的日期 */
UINT16 DIR_LstAccDate; /* 12H,最近一次存取操作的日期 */
UINT16 DIR_FstClusHI; /* 14H */
UINT16 DIR_WrtTime; /* 16H,文件修改时间,参考前面的宏MAKE_FILE_TIME */
UINT16 DIR_WrtDate; /* 18H,文件修改日期,参考前面的宏MAKE_FILE_DATE */
UINT16 DIR_FstClusLO; /* 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_DIRECTORY | 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) /* 长文件名最多字符数/字节数 */
#define LONG_NAME_PER_DIR (13*2) /* 长文件名在每个文件目录信息结构中的字符数/字节数 */
#endif
/* ********************************************************************************************************************* */
/* SCSI命令和数据输入输出结构 */
#ifndef SPC_CMD_INQUIRY
/* SCSI命令码 */
#define SPC_CMD_INQUIRY 0x12
#define SPC_CMD_READ_CAPACITY 0x25
#define SPC_CMD_READ10 0x28
#define SPC_CMD_WRITE10 0x2A
#define SPC_CMD_TEST_READY 0x00
#define SPC_CMD_REQUEST_SENSE 0x03
#define SPC_CMD_MODESENSE6 0x1A
#define SPC_CMD_MODESENSE10 0x5A
#define SPC_CMD_START_STOP 0x1B
/* BulkOnly协议的命令块 */
typedef struct _BULK_ONLY_CBW {
UINT32 CBW_Sig;
UINT32 CBW_Tag;
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; /* 01H, 位7为1说明是移动存储 */
UINT8 Versions; /* 02H, 协议版本 */
UINT8 DataFormatAndEtc; /* 03H, 指定返回数据格式 */
UINT8 AdditionalLength; /* 04H, 后续数据的长度 */
UINT8 Reserved1;
UINT8 Reserved2;
UINT8 MiscFlag; /* 07H, 一些控制标志 */
UINT8 VendorIdStr[8]; /* 08H, 厂商信息 */
UINT8 ProductIdStr[16]; /* 10H, 产品信息 */
UINT8 ProductRevStr[4]; /* 20H, 产品版本 */
} INQUIRY_DATA, *P_INQUIRY_DATA; /* 24H */
/* REQUEST SENSE命令的返回数据 */
typedef struct _SENSE_DATA {
UINT8 ErrorCode; /* 00H, 错误代码及有效位 */
UINT8 SegmentNumber;
UINT8 SenseKeyAndEtc; /* 02H, 主键码 */
UINT8 Information0;
UINT8 Information1;
UINT8 Information2;
UINT8 Information3;
UINT8 AdditSenseLen; /* 07H, 后续数据的长度 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -