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

📄 ch376inc.h

📁 基于CH376的U盘读写例子
💻 H
📖 第 1 页 / 共 4 页
字号:
	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 {
		UINT8	mBuffer[ MAX_FILE_NAME_LEN ];
	} Default;

	INQUIRY_DATA	DiskMountInq;			/* 返回: INQUIRY命令的返回数据 */
											/* CMD0H_DISK_MOUNT: 初始化磁盘并测试磁盘是否就绪,首次执行时 */

	FAT_DIR_INFO	OpenDirInfo;			/* 返回: 枚举到的文件目录信息 */
											/* CMD0H_FILE_OPEN: 枚举文件和目录(文件夹) */

	FAT_DIR_INFO	EnumDirInfo;			/* 返回: 枚举到的文件目录信息 */
											/* CMD0H_FILE_ENUM_GO: 继续枚举文件和目录(文件夹) */

	struct {
		UINT8	mUpdateFileSz;				/* 输入参数: 是否允许更新文件长度, 0则禁止更新长度 */
	} FileCLose;							/* CMD1H_FILE_CLOSE: 关闭当前已经打开的文件 */

	struct {
		UINT8	mDirInfoIndex;				/* 输入参数: 指定需要读取的目录信息结构在扇区内的索引号, 0FFH则为当前已经打开的文件 */
	} DirInfoRead;							/* CMD1H_DIR_INFO_READ: 读取文件的目录信息 */

	union {
		UINT32	mByteOffset;				/* 输入参数: 偏移字节数,以字节为单位的偏移量(总长度32位,低字节在前) */
		UINT32	mSectorLba;					/* 返回: 当前文件指针对应的绝对线性扇区号,0FFFFFFFFH则已到文件尾(总长度32位,低字节在前) */
	} ByteLocate;							/* CMD4H_BYTE_LOCATE: 以字节为单位移动当前文件指针 */

	struct {
		UINT16	mByteCount;					/* 输入参数: 请求读取的字节数(总长度16位,低字节在前) */
	} ByteRead;								/* CMD2H_BYTE_READ: 以字节为单位从当前位置读取数据块 */

	struct {
		UINT16	mByteCount;					/* 输入参数: 请求写入的字节数(总长度16位,低字节在前) */
	} ByteWrite;							/* CMD2H_BYTE_WRITE: 以字节为单位向当前位置写入数据块 */

	union {
		UINT32	mSectorOffset;				/* 输入参数: 偏移扇区数,以扇区为单位的偏移量(总长度32位,低字节在前) */
		UINT32	mSectorLba;					/* 返回: 当前文件指针对应的绝对线性扇区号,0FFFFFFFFH则已到文件尾(总长度32位,低字节在前) */
	} SectorLocate;							/* CMD4H_SEC_LOCATE: 以扇区为单位移动当前文件指针 */

	struct {
		UINT8	mSectorCount;				/* 输入参数: 请求读取的扇区数 */
											/* 返回: 允许读取的扇区数 */
		UINT8	mReserved1;
		UINT8	mReserved2;
		UINT8	mReserved3;
		UINT32	mStartSector;				/* 返回: 允许读取的扇区块的起始绝对线性扇区号(总长度32位,低字节在前) */
	} SectorRead;							/* CMD1H_SEC_READ: 以扇区为单位从当前位置读取数据块 */

	struct {
		UINT8	mSectorCount;				/* 输入参数: 请求写入的扇区数 */
											/* 返回: 允许写入的扇区数 */
		UINT8	mReserved1;
		UINT8	mReserved2;
		UINT8	mReserved3;
		UINT32	mStartSector;				/* 返回: 允许写入的扇区块的起始绝对线性扇区号(总长度32位,低字节在前) */
	} SectorWrite;							/* CMD1H_SEC_WRITE: 以扇区为单位在当前位置写入数据块 */

	struct {
		UINT32	mDiskSizeSec;				/* 返回: 整个物理磁盘的总扇区数(总长度32位,低字节在前) */
	} DiskCapacity;							/* CMD0H_DISK_CAPACITY: 查询磁盘物理容量 */

	struct {
		UINT32	mTotalSector;				/* 返回: 当前逻辑盘的总扇区数(总长度32位,低字节在前) */
		UINT32	mFreeSector;				/* 返回: 当前逻辑盘的剩余扇区数(总长度32位,低字节在前) */
		UINT8	mDiskFat;					/* 返回: 当前逻辑盘的FAT类型,1-FAT12,2-FAT16,3-FAT32 */
	} DiskQuery;							/* CMD_DiskQuery, 查询磁盘信息 */

	BULK_ONLY_CBW	DiskBocCbw;				/* 输入参数: CBW命令结构 */
											/* CMD0H_DISK_BOC_CMD: 对USB存储器执行BulkOnly传输协议的命令 */

	struct {
		UINT8	mMaxLogicUnit;				/* 返回: USB存储器的最大逻辑单元号 */
	} DiskMaxLun;							/* CMD0H_DISK_MAX_LUN: 控制传输-获取USB存储器最大逻辑单元号 */

	INQUIRY_DATA	DiskInitInq;			/* 返回: INQUIRY命令的返回数据 */
											/* CMD0H_DISK_INIT: 初始化USB存储器 */

	INQUIRY_DATA	DiskInqData;			/* 返回: INQUIRY命令的返回数据 */
											/* CMD0H_DISK_INQUIRY: 查询USB存储器特性 */

	SENSE_DATA		ReqSenseData;			/* 返回: REQUEST SENSE命令的返回数据 */
											/* CMD0H_DISK_R_SENSE: 检查USB存储器错误 */

	struct {
		UINT32	mDiskSizeSec;				/* 返回: 整个物理磁盘的总扇区数(总长度32位,高字节在前) */
	} DiskSize;								/* CMD0H_DISK_SIZE: 获取USB存储器的容量 */

	struct {
		UINT32	mStartSector;				/* 输入参数: LBA扇区地址(总长度32位,低字节在前) */
		UINT8	mSectorCount;				/* 输入参数: 请求读取的扇区数 */
	} DiskRead;								/* CMD5H_DISK_READ: 从USB存储器读数据块(以扇区为单位) */

	struct {
		UINT32	mStartSector;				/* 输入参数: LBA扇区地址(总长度32位,低字节在前) */
		UINT8	mSectorCount;				/* 输入参数: 请求写入的扇区数 */
	} DiskWrite;							/* CMD5H_DISK_WRITE: 向USB存储器写数据块(以扇区为单位) */
} CH376_CMD_DATA, *P_CH376_CMD_DATA;

#endif

/* ********************************************************************************************************************* */
/* 主机文件模式下的文件系统变量的地址 */

#ifndef	VAR_FILE_SIZE

/* 8位/单字节变量 */
#define	VAR_SYS_BASE_INFO	0x20			/* 当前系统的基本信息 */
/*           位6用于指示USB存储设备的子类别SubClass-Code, 位6为0则说明子类别为6, 位6为1则说明子类别是非6的其它值 */
/*           位5用于指示USB设备方式下的USB配置状态和USB主机方式下的USB设备连接状态 */
/*                USB设备方式下, 位5为1则USB配置完成, 位5位0则尚未配置 */
/*                USB主机方式下, 位5为1则USB端口存在USB设备, 位5位0则USB端口没有USB设备 */
/*           位4用于指示USB设备方式下的缓冲区锁定状态, 位4为1则说明USB缓冲区处于锁定状态, 位6为1则说明已经释放 */
/*           其它位, 保留,请勿修改 */
#define	VAR_RETRY_TIMES		0x25			/* USB事务操作的重试次数 */
/*           位7为0则收到NAK时不重试, 位7为1位6为0则收到NAK时无限重试(可以用CMD_ABORT_NAK命令放弃重试), 位7为1位6为1则收到NAK时最多重试3秒 */
/*           位5~位0为超时后的重试次数 */
#define	VAR_FILE_BIT_FLAG	0x26			/* 主机文件模式下的位标志 */
/*           位1和位0, 逻辑盘的FAT文件系统标志, 00-FAT12, 01-FAT16, 10-FAT32, 11-非法 */
/*           位2, 当前缓冲区中的FAT表数据是否被修改标志, 0-未修改, 1-已修改 */
/*           位3, 文件长度需要修改标志, 当前文件被追加数据, 0-未追加无需修改, 1-已追加需要修改 */
/*           其它位, 保留,请勿修改 */
#define	VAR_DISK_STATUS		0x2B			/* 主机文件模式下的磁盘及文件状态 */
#define	VAR_SD_BIT_FLAG		0x30			/* 主机文件模式下SD卡的位标志 */
/*           位0, SD卡版本, 0-只支持SD第一版,1-支持SD第二版 */
/*           位1, 自动识别, 0-SD卡, 1-MMC卡 */
/*           位2, 自动识别, 0-标准容量SD卡, 1-大容量SD卡(HC-SD) */
/*           位4, ACMD41命令超时 */
/*           位5, CMD1命令超时 */
/*           位6, CMD58命令超时 */
/*           其它位, 保留,请勿修改 */
#define	VAR_UDISK_TOGGLE	0x31			/* USB存储设备的BULK-IN/BULK-OUT端点的同步标志 */
/*           位7, Bulk-In端点的同步标志 */
/*           位6, Bulk-In端点的同步标志 */
/*           位5~位0, 必须为0 */
#define	VAR_UDISK_LUN		0x34			/* USB存储设备的逻辑单元号 */
/*           位7~位4, USB存储设备的当前逻辑单元号,CH376初始化USB存储设备后,默认是访问0#逻辑单元 */
/*           位3~位0, USB存储设备的最大逻辑单元号,加1后等于逻辑单元数 */
#define	VAR_SEC_PER_CLUS	0x38			/* 逻辑盘的每簇扇区数 */
#define	VAR_FILE_DIR_INDEX	0x3B			/* 当前文件目录信息在扇区内的索引号 */
#define	VAR_CLUS_SEC_OFS	0x3C			/* 当前文件指针在簇内的扇区偏移,为0xFF则指向文件末尾,簇结束 */

/* 32位/4字节变量 */
#define	VAR_DISK_ROOT		0x44			/* 对于FAT16盘为根目录占用扇区数,对于FAT32盘为根目录起始簇号(总长度32位,低字节在前) */
#define	VAR_DSK_TOTAL_CLUS	0x48			/* 逻辑盘的总簇数(总长度32位,低字节在前) */
#define	VAR_DSK_START_LBA	0x4C			/* 逻辑盘的起始绝对扇区号LBA(总长度32位,低字节在前) */
#define	VAR_DSK_DAT_START	0x50			/* 逻辑盘的数据区域的起始LBA(总长度32位,低字节在前) */
#define	VAR_LBA_BUFFER		0x54			/* 当前磁盘数据缓冲区的数据对应的LBA(总长度32位,低字节在前) */
#define	VAR_LBA_CURRENT		0x58			/* 当前读写的磁盘起始LBA地址(总长度32位,低字节在前) */
#define	VAR_FAT_DIR_LBA		0x5C			/* 当前文件目录信息所在的扇区LBA地址(总长度32位,低字节在前) */
#define	VAR_START_CLUSTER	0x60			/* 当前文件或者目录(文件夹)的起始簇号(总长度32位,低字节在前) */
#define	VAR_CURRENT_CLUST	0x64			/* 当前文件的当前簇号(总长度32位,低字节在前) */
#define	VAR_FILE_SIZE		0x68			/* 当前文件的长度(总长度32位,低字节在前) */
#define	VAR_CURRENT_OFFSET	0x6C			/* 当前文件指针,当前读写位置的字节偏移(总长度32位,低字节在前) */

#endif

/* ********************************************************************************************************************* */
/* 常用USB定义 */

/* USB的包标识PID, 主机方式可能用到 */
#ifndef	DEF_USB_PID_SETUP
#define	DEF_USB_PID_NULL	0x00			/* 保留PID, 未定义 */
#define	DEF_USB_PID_SOF		0x05
#define	DEF_USB_PID_SETUP	0x0D
#define	DEF_USB_PID_IN		0x09
#define	DEF_USB_PID_OUT		0x01
#define	DEF_USB_PID_ACK		0x02
#define	DEF_USB_PID_NAK		0x0A
#define	DEF_USB_PID_STALL	0x0E
#define	DEF_USB_PID_DATA0	0x03
#define	DEF_USB_PID_DATA1	0x0B
#define	DEF_USB_PID_PRE		0x0C
#endif

/* USB请求类型, 外置固件模式可能用到 */
#ifndef	DEF_USB_REQ_TYPE
#define	DEF_USB_REQ_READ	0x80			/* 控制读操作 */
#define	DEF_USB_REQ_WRITE	0x00			/* 控制写操作 */
#define	DEF_USB_REQ_TYPE	0x60			/* 控制请求类型 */
#define	DEF_USB_REQ_STAND	0x00			/* 标准请求 */
#define	DEF_USB_REQ_CLASS	0x20			/* 设备类请求 */
#define	DEF_USB_REQ_VENDOR	0x40			/* 厂商请求 */
#define	DEF_USB_REQ_RESERVE	0x60			/* 保留请求 */
#endif

/* USB标准设备请求, RequestType的位6位5=00(Standard), 外置固件模式可能用到 */
#ifndef	DEF_USB_GET_DESCR
#define	DEF_USB_CLR_FEATURE	0x01
#define	DEF_USB_SET_FEATURE	0x03
#define	DEF_USB_GET_STATUS	0x00
#define	DEF_USB_SET_ADDRESS	0x05
#define	DEF_USB_GET_DESCR	0x06
#define	DEF_USB_SET_DESCR	0x07
#define	DEF_USB_GET_CONFIG	0x08
#define	DEF_USB_SET_CONFIG	0x09
#define	DEF_USB_GET_INTERF	0x0A
#define	DEF_USB_SET_INTERF	0x0B
#define	DEF_USB_SYNC_FRAME	0x0C
#endif

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

#ifdef __cplusplus
}
#endif

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -