📄 mp3.lst
字号:
(0224) /* 操作状态 */
(0225)
(0226) #define CMD_RET_SUCCESS 0x51 /* 命令操作成功 */
(0227) #define CMD_RET_ABORT 0x5F /* 命令操作失败 */
(0228)
(0229) /* ********************************************************************************************************************* */
(0230) /* USB中断状态 */
(0231)
(0232) /* 以下状态代码为特殊事件中断, 仅CH372A/CH375A支持, 如果通过CMD_CHK_SUSPEND启用USB总线挂起检查, 那么必须处理USB总线挂起和睡眠唤醒的中断状态 */
(0233) #define USB_INT_USB_SUSPEND 0x05 /* USB总线挂起事件 */
(0234) #define USB_INT_WAKE_UP 0x06 /* 从睡眠中被唤醒事件 */
(0235)
(0236) /* 以下状态代码0XH用于USB设备方式 */
(0237) /* 内置固件模式下只需要处理: USB_INT_EP1_IN, USB_INT_EP2_OUT, USB_INT_EP2_IN, 对于CH372A/CH375A还需要处理: USB_INT_EP1_OUT */
(0238) /* 位7-位4为0000 */
(0239) /* 位3-位2指示当前事务, 00=OUT, 10=IN, 11=SETUP */
(0240) /* 位1-位0指示当前端点, 00=端点0, 01=端点1, 10=端点2, 11=USB总线复位 */
(0241) #define USB_INT_EP0_SETUP 0x0C /* USB端点0的SETUP */
(0242) #define USB_INT_EP0_OUT 0x00 /* USB端点0的OUT */
(0243) #define USB_INT_EP0_IN 0x08 /* USB端点0的IN */
(0244) #define USB_INT_EP1_OUT 0x01 /* USB端点1的OUT */
(0245) #define USB_INT_EP1_IN 0x09 /* USB端点1的IN */
(0246) #define USB_INT_EP2_OUT 0x02 /* USB端点2的OUT */
(0247) #define USB_INT_EP2_IN 0x0A /* USB端点2的IN */
(0248) /* USB_INT_BUS_RESET 0x0000XX11B */ /* USB总线复位 */
(0249) #define USB_INT_BUS_RESET1 0x03 /* USB总线复位 */
(0250) #define USB_INT_BUS_RESET2 0x07 /* USB总线复位 */
(0251) #define USB_INT_BUS_RESET3 0x0B /* USB总线复位 */
(0252) #define USB_INT_BUS_RESET4 0x0F /* USB总线复位 */
(0253)
(0254) /* 以下状态代码2XH-3XH用于USB主机方式的通讯失败代码, 仅CH375/CH375A支持 */
(0255) /* 位7-位6为00 */
(0256) /* 位5为1 */
(0257) /* 位4指示当前接收的数据包是否同步 */
(0258) /* 位3-位0指示导致通讯失败时USB设备的应答: 0010=ACK, 1010=NAK, 1110=STALL, 0011=DATA0, 1011=DATA1, XX00=超时 */
(0259) /* USB_INT_RET_ACK 0x001X0010B */ /* 错误:对于IN事务返回ACK */
(0260) /* USB_INT_RET_NAK 0x001X1010B */ /* 错误:返回NAK */
(0261) /* USB_INT_RET_STALL 0x001X1110B */ /* 错误:返回STALL */
(0262) /* USB_INT_RET_DATA0 0x001X0011B */ /* 错误:对于OUT/SETUP事务返回DATA0 */
(0263) /* USB_INT_RET_DATA1 0x001X1011B */ /* 错误:对于OUT/SETUP事务返回DATA1 */
(0264) /* USB_INT_RET_TOUT 0x001XXX00B */ /* 错误:返回超时 */
(0265) /* USB_INT_RET_TOGX 0x0010X011B */ /* 错误:对于IN事务返回数据不同步 */
(0266) /* USB_INT_RET_PID 0x001XXXXXB */ /* 错误:未定义 */
(0267)
(0268) /* 以下状态代码1XH用于USB主机方式的操作状态代码, 仅CH375/CH375A支持 */
(0269)
(0270) #define USB_INT_SUCCESS 0x14 /* USB事务或者传输操作成功 */
(0271) #define USB_INT_CONNECT 0x15 /* 检测到USB设备连接事件 */
(0272) #define USB_INT_DISCONNECT 0x16 /* 检测到USB设备断开事件 */
(0273) #define USB_INT_BUF_OVER 0x17 /* USB控制传输的数据太多, 缓冲区溢出 */
(0274) #define USB_INT_DISK_READ 0x1D /* USB存储器读数据块, 请求数据读出 */
(0275) #define USB_INT_DISK_WRITE 0x1E /* USB存储器写数据块, 请求数据写入 */
(0276) #define USB_INT_DISK_ERR 0x1F /* USB存储器操作失败 */
(0277)
(0278) /* ********************************************************************************************************************* */
(0279) /* 常用USB定义 */
(0280)
(0281) /* USB的包标识PID, 主机方式可能用到 */
(0282) #define DEF_USB_PID_NULL 0x00 /* 保留PID, 未定义 */
(0283) #define DEF_USB_PID_SOF 0x05
(0284) #define DEF_USB_PID_SETUP 0x0D
(0285) #define DEF_USB_PID_IN 0x09
(0286) #define DEF_USB_PID_OUT 0x01
(0287) #define DEF_USB_PID_ACK 0x02
(0288) #define DEF_USB_PID_NAK 0x0A
(0289) #define DEF_USB_PID_STALL 0x0E
(0290) #define DEF_USB_PID_DATA0 0x03
(0291) #define DEF_USB_PID_DATA1 0x0B
(0292) #define DEF_USB_PID_PRE 0x0C
(0293)
(0294) /* USB请求类型, 外置固件模式可能用到 */
(0295) #define DEF_USB_REQ_READ 0x80 /* 控制读操作 */
(0296) #define DEF_USB_REQ_WRITE 0x00 /* 控制写操作 */
(0297) #define DEF_USB_REQ_TYPE 0x60 /* 控制请求类型 */
(0298) #define DEF_USB_REQ_STAND 0x00 /* 标准请求 */
(0299) #define DEF_USB_REQ_CLASS 0x20 /* 设备类请求 */
(0300) #define DEF_USB_REQ_VENDOR 0x40 /* 厂商请求 */
(0301) #define DEF_USB_REQ_RESERVE 0x60 /* 保留请求 */
(0302)
(0303) /* USB标准设备请求, RequestType的位6位5=00(Standard), 外置固件模式可能用到 */
(0304) #define DEF_USB_CLR_FEATURE 0x01
(0305) #define DEF_USB_SET_FEATURE 0x03
(0306) #define DEF_USB_GET_STATUS 0x00
(0307) #define DEF_USB_SET_ADDRESS 0x05
(0308) #define DEF_USB_GET_DESCR 0x06
(0309) #define DEF_USB_SET_DESCR 0x07
(0310) #define DEF_USB_GET_CONFIG 0x08
(0311) #define DEF_USB_SET_CONFIG 0x09
(0312) #define DEF_USB_GET_INTERF 0x0A
(0313) #define DEF_USB_SET_INTERF 0x0B
(0314) #define DEF_USB_SYNC_FRAME 0x0C
(0315)
(0316) /* ********************************************************************************************************************* */
(0317)
(0318) /* FILE: CH375HF.H */
(0319)
(0320) typedef unsigned char BOOL1;
(0321)
(0322) #ifndef UINT8
(0323) typedef unsigned char UINT8;
(0324) #endif
(0325) #ifndef UINT16
(0326) typedef unsigned short UINT16;
(0327) #endif
(0328) #ifndef UINT32
(0329) typedef unsigned long UINT32;
(0330) #endif
(0331) #ifndef PUINT8
(0332) typedef unsigned char *PUINT8;
(0333) #endif
(0334) #ifndef PUINT16
(0335) typedef unsigned short *PUINT16;
(0336) #endif
(0337) #ifndef PUINT32
(0338) typedef unsigned long *PUINT32;
(0339) #endif
(0340) #ifndef UINT8V
(0341) typedef unsigned char volatile UINT8V;
(0342) #endif
(0343)
(0344) /* 错误码 */
(0345) #define ERR_SUCCESS 0x00 /* 操作成功 */
(0346) #define ERR_CH375_ERROR 0x81 /* CH375硬件错误,可能需要复位CH375 */
(0347) #define ERR_DISK_DISCON 0x82 /* 磁盘尚未连接,可能磁盘已经断开 */
(0348) #define ERR_STATUS_ERR 0x83 /* 磁盘状态错误,可能正在连接或者断开磁盘 */
(0349) #define ERR_MBR_ERROR 0x91 /* 磁盘的主引导记录无效,可能磁盘尚未分区或者尚未格式化 */
(0350) #define ERR_TYPE_ERROR 0x92 /* 磁盘分区类型不支持,只支持FAT12/FAT16/BigDOS/FAT32,需要由磁盘管理工具重新分区 */
(0351) #define ERR_BPB_ERROR 0xA1 /* 磁盘尚未格式化,或者参数错误,需要由WINDOWS采用默认参数重新格式化 */
(0352) #define ERR_TOO_LARGE 0xA2 /* 磁盘非正常格式化并且容量大于4GB,或者容量大于250GB,需要由WINDOWS采用默认参数重新格式化 */
(0353) #define ERR_FAT_ERROR 0xA3 /* 磁盘的文件系统不支持,只支持FAT12/FAT16/FAT32,需要由WINDOWS采用默认参数重新格式化 */
(0354) #define ERR_DISK_FULL 0xB1 /* 磁盘文件太满,剩余空间太少或者已经没有,需要磁盘整理 */
(0355) #define ERR_FDT_OVER 0xB2 /* 目录内文件太多,没有空闲的目录项,FAT12/FAT16根目录下的文件数应该少于500个,需要磁盘整理 */
(0356) #define ERR_MISS_DIR 0xB3 /* 指定路径的某个子目录没有找到,可能是目录名称错误 */
(0357) #define ERR_FILE_CLOSE 0xB4 /* 文件已经关闭,如果需要使用,应该重新打开文件 */
(0358) #define ERR_OPEN_DIR 0x41 /* 指定路径的目录被打开 */
(0359) #define ERR_MISS_FILE 0x42 /* 指定路径的文件没有找到,可能是文件名称错误 */
(0360) #define ERR_FOUND_NAME 0x43 /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中,如果需要使用,应该打开该文件 */
(0361) /* 代码2XH-3XH用于USB主机方式的通讯失败代码,由CH375返回 */
(0362) /* 代码1XH用于USB主机方式的操作状态代码,由CH375返回 */
(0363) #define ERR_USB_CONNECT 0x15 /* 检测到USB设备连接事件,磁盘已经连接 */
(0364) #define ERR_USB_DISCON 0x16 /* 检测到USB设备断开事件,磁盘已经断开 */
(0365) #define ERR_USB_DISK_ERR 0x1F /* USB存储器操作失败,在初始化时可能是USB存储器不支持,在读写操作中可能是磁盘损坏或者已经断开 */
(0366)
(0367) /* 磁盘及文件状态 */
(0368) #define DISK_UNKNOWN 0x00 /* 尚未初始化,未知状态 */
(0369) #define DISK_DISCONNECT 0x01 /* 磁盘没有连接或者已经断开 */
(0370) #define DISK_CONNECT 0x02 /* 磁盘已经连接,但是尚未初始化或者无法识别该磁盘 */
(0371) #define DISK_MOUNTED 0x03 /* 磁盘已经初始化成功,但是尚未分析文件系统或者文件系统不支持 */
(0372) #define DISK_READY 0x10 /* 已经分析磁盘的文件系统并且能够支持 */
(0373) #define DISK_OPEN_ROOT 0x12 /* 已经打开根目录,扇区模式,只能以扇区为单位读写目录的内容,使用后必须关闭,注意FAT12/FAT16根目录是固定长度 */
(0374) #define DISK_OPEN_DIR 0x13 /* 已经打开子目录,扇区模式,只能以扇区为单位读写目录的内容 */
(0375) #define DISK_OPEN_FILE 0x14 /* 已经打开文件,扇区模式,可以以扇区为单位进行数据读写 */
(0376) #define DISK_OPEN_FILE_B 0x15 /* 已经打开文件,字节模式,可以以字节为单位进行数据读写 */
(0377)
(0378) /* FAT类型标志 */
(0379) #define DISK_FS_UNKNOWN 0 /* 未知的文件系统 */
(0380) #define DISK_FAT12 1 /* FAT12文件系统 */
(0381) #define DISK_FAT16 2 /* FAT16文件系统 */
(0382) #define DISK_FAT32 3 /* FAT32文件系统 */
(0383)
(0384) /* 文件属性 */
(0385) #define ATTR_READ_ONLY 0x01 /* 文件为只读属性 */
(0386) #define ATTR_HIDDEN 0x02 /* 文件为隐含属性 */
(0387) #define ATTR_SYSTEM 0x04 /* 文件为系统属性 */
(0388) #define ATTR_VOLUME_ID 0x08 /* 卷标 */
(0389) #define ATTR_DIRECTORY 0x10 /* 子目录 */
(0390) #define ATTR_ARCHIVE 0x20 /* 文件为存档属性 */
(0391) #define ATTR_LONG_NAME ( ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID )
(0392) /* 文件属性 UINT8 */
(0393) /* bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 */
(0394) /* 只 隐 系 卷 目 存 未定义 */
(0395) /* 读 藏 统 标 录 档 */
(0396) /* 文件时间 UINT16 */
(0397) /* Time = (Hour<<11) + (Minute<<5) + (Second>>1) */
(0398) #define MAKE_FILE_TIME( h, m, s ) ( (h<<11) + (m<<5) + (s>>1) ) /* 生成指定时分秒的文件时间数据 */
(0399) /* 文件日期 UINT16 */
(0400) /* Date = ((Year-1980)<<9) + (Month<<5) + Day */
(0401) #define MAKE_FILE_DATE( y, m, d ) ( ((y-1980)<<9) + (m<<5) + d ) /* 生成指定年月日的文件日期数据 */
(0402)
(0403) /* 文件名 */
(0404) #define PATH_WILDCARD_CHAR 0x2A /* 路径名的通配符 '*' */
(0405) #define PATH_SEPAR_CHAR1 0x5C /* 路径名的分隔符 '\' */
(0406) #define PATH_SEPAR_CHAR2 0x2F /* 路径名的分隔符 '/' */
(0407) #ifndef MAX_PATH_LEN
(0408) #define MAX_PATH_LEN 30 /* 最大路径长度,含所有斜杠分隔符和小数点间隔符以及路径结束符00H */
(0409) #endif
(0410) #ifndef MAX_BYTE_IO
(0411) #define MAX_BYTE_IO ( MAX_PATH_LEN - 1 ) /* 以字节为单位单次读写文件时的最大长度,超过该长度可以分多次读写 */
(0412) #endif
(0413)
(0414) /* 外部命令参数 */
(0415) typedef union _CMD_PARAM {
(0416) struct {
(0417) UINT8 mBuffer[ MAX_PATH_LEN ];
(0418) } Other;
(0419) struct {
(0420) UINT32 mDiskSizeSec; /* 返回: 整个物理磁盘的总扇区数 */
(0421) UINT32 mTotalSector; /* 返回: 当前逻辑盘的总扇区数 */
(0422) UINT32 mFreeSector; /* 返回: 当前逻辑盘的剩余扇区数 */
(0423) UINT8 mDiskFat; /* 返回: 当前逻辑盘的FAT类型 */
(0424) } Query; /* CMD_DiskQuery, 查询磁盘信息 */
(0425) struct {
(0426) UINT8 mPathName[ MAX_PATH_LEN ]; /* 输入参数: 路径: [盘符,冒号,斜杠,目录名或者文件名及扩展名...,结束符00H], 其中盘符和冒号可以省略, 例如"C:\DIR1.EXT\DIR2\FILENAME.EXT",00H */
(0427) } Open; /* CMD_FileOpen, 打开文件 */
(0428) struct {
(0429) UINT8 mPathName[ MAX_PATH_LEN ]; /* 输入参数: 路径: [盘符,冒号,斜杠,目录名或者文件名及扩展名(含通配符*)...,枚举序号], 其中盘符和冒号可以省略, 例如"C:\DIR1.EXT\DIR2\FILE*",00H */
(0430) } Enumer; /* CMD_FileEnumer, 枚举文件,返回文件名 */
(0431) struct {
(0432) UINT8 mUpdateLen; /* 输入参数: 是否允许更新长度: 0禁止,1允许 */
(0433) } Close; /* CMD_FileClose, 关闭当前文件 */
(0434) struct {
(0435) UINT8 mPathName[ MAX_PATH_LEN ]; /* 输入参数: 路径: [盘符,冒号,斜杠,目录名或者文件名及扩展名...,结束符00H], 其中盘符和冒号可以省略, 例如"C:\DIR1.EXT\DIR2\FILENAME.EXT",00H */
(0436) } Create; /* CMD_FileCreate, 新建文件并打开,如果文件已经存在则先删除后再新建 */
(0437) struct {
(0438) UINT8 mPathName[ MAX_PATH_LEN ]; /* 输入参数: 路径: [盘符,冒号,斜杠,目录名或者文件名及扩展名...,结束符00H], 其中盘符和冒号可以省略, 例如"C:\DIR1.EXT\DIR2\FILENAME.EXT",00H */
(0439) } Erase; /* CMD_FileErase, 删除文件并关闭 */
(0440) struct {
(0441) UINT32 mFileSize; /* 输入参数: 新的文件长度,为0FFFFFFFFH则不修改, 返回: 原长度 */
(0442) UINT16 mFileDate; /* 输入参数: 新的文件日期,为0FFFFH则不修改, 返回: 原日期 */
(0443) UINT16 mFileTime; /* 输入参数: 新的文件时间,为0FFFFH则不修改, 返回: 原时间 */
(0444) UINT8 mFileAttr; /* 输入参数: 新的文件属性,为0FFH则不修改, 返回: 原属性 */
(0445) } Modify; /* CMD_FileQuery, 查询当前文件的信息; CMD_FileModify, 查询或者修改当前文件的信息 */
(0446) struct {
(0447) UINT32 mSectorOffset; /* 输入参数: 扇区偏移,0则移动到文件头,0FFFFFFFFH则移动到文件尾, 返回: 当前文件指针对应的绝对线性扇区号, 0FFFFFFFFH则已到文件尾 */
(0448) } Locate; /* CMD_FileLocate, 移动当前文件指针 */
(0449) struct {
(0450) UINT8 mSectorCount; /* 输入参数: 读取扇区数, 返回: 实际读取扇区数 */
(0451) } Read; /* CMD_FileRead, 从当前文件读取数据 */
(0452) struct {
(0453) UINT8 mSectorCount; /* 输入参数: 写入扇区数, 返回: 实际写入扇区数 */
(0454) } Write; /* CMD_FileWrite, 向当前文件写入数据 */
(0455) struct {
(0456) UINT8 mSectorCount; /* 输入参数: 读取扇区数, 返回: 实际读取扇区数 */
(0457) UINT8 mReserved[7];
(0458) PUINT8 mDataBuffer; /* 输入参数: 缓冲区起始地址, 返回: 缓冲区当前地址 */
(0459) } ReadX; /* CMD_FileReadX, 从当前文件读取数据到指定缓冲区 */
(0460) struct {
(0461) UINT8 mSectorCount; /* 输入参数: 写入扇区数, 返回: 实际写入扇区数 */
(0462) UINT8 mReserved[7];
(0463) PUINT8 mDataBuffer; /* 输入参数: 缓冲区起始地址, 返回: 缓冲区当前地址 */
(0464) } WriteX; /* CMD_FileWriteX, 向当前文件写入指定缓冲区的数据 */
(0465) struct {
(0466) UINT32 mDiskSizeSec; /* 返回: 整个物理磁盘的总扇区数 */
(0467) } DiskSize; /* CMD_DiskSize, 查询磁盘容量 */
(0468) struct {
(0469) UINT32 mByteOffset; /* 输入参数: 以字节为单位的偏移量, 以字节为单位的文件指针, 返回: 当前文件指针对应的绝对线性扇区号, 0FFFFFFFFH则已到文件尾 */
(0470) } ByteLocate; /* CMD_ByteLocate, 以字节为单位移动当前文件指针 */
(0471) struct {
(0472) UINT8 mByteCount; /* 输入参数: 准备读取的字节数,不得大于MAX_BYTE_IO, 返回: 实际读出的字节数 */
(0473) UINT8 mByteBuffer[ MAX_BYTE_IO ]; /* 返回: 读出的数据块 */
(0474) } ByteRead; /* CMD_ByteRead, 以字节为单位从当前文件读取数据块 */
(0475) struct {
(0476) UINT8 mByteCount; /* 输入参数: 准备写入的字节数,不得大于MAX_BYTE_IO, 返回: 实际写入的字节数 */
(0477) UINT8 mByteBuffer[ MAX_BYTE_IO ]; /* 输入参数: 准备写入的数据块 */
(0478) } ByteWrite; /* CMD_ByteWrite, 以字节为单位向当前文件写入数据块 */
(0479) union {
(0480) struct {
(0481) UINT32 mCBW_Sig;
(0482) UINT32 mCBW_Tag;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -