⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch376inc.h

📁 基于CH376的U盘读写例子
💻 H
📖 第 1 页 / 共 4 页
字号:
#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 + -