📄 udisk.lst
字号:
(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) struct {
(0480) UINT8 mSaveVariable; /* 输入参数: 为0则恢复变量,非0值则备份/保存变量 */
(0481) UINT8 mReserved[3];
(0482) PUINT8 mBuffer; /* 输入参数: 指向子程序库的变量的备份缓冲区,长度不小于80个字节 */
(0483) } SaveVariable; /* CMD_SaveVariable, 备份/保存/恢复子程序库的变量 */
(0484) union {
(0485) struct {
(0486) UINT32 mCBW_Sig;
(0487) UINT32 mCBW_Tag;
(0488) UINT8 mCBW_DataLen; /* 输入: 数据传输长度,有效值是0到255 */
(0489) UINT8 mCBW_DataLen1;
(0490) UINT8 mCBW_DataLen2;
(0491) UINT8 mCBW_DataLen3;
(0492) UINT8 mCBW_Flag; /* 输入: 传输方向等标志 */
(0493) UINT8 mCBW_LUN;
(0494) UINT8 mCBW_CB_Len; /* 输入: 命令块的长度,有效值是1到16 */
(0495) UINT8 mCBW_CB_Buf[6]; /* 输入: 命令块,该缓冲区最多为16个字节 */
(0496) } mCBW; /* BulkOnly协议的命令块, 输入CBW结构 */
(0497) struct {
(0498) UINT32 mCSW_Sig;
(0499) UINT32 mCSW_Tag;
(0500) UINT32 mCSW_Residue; /* 返回: 剩余数据长度 */
(0501) UINT8 mCSW_Status; /* 返回: 命令执行结果状态 */
(0502) UINT8 mReserved;
(0503) } mCSW; /* BulkOnly协议的命令状态块, 输出CSW结构 */
(0504) } BOC; /* CMD_BulkOnlyCmd, 执行基于BulkOnly协议的命令, 如果有数据传输那么数据在DISK_BASE_BUF中 */
(0505) } CMD_PARAM;
(0506)
(0507) typedef CMD_PARAM CMD_PARAM_I;
(0508) typedef CMD_PARAM *P_CMD_PARAM;
(0509)
(0510) /* FILE: CH375HF?.C */
(0511)
(0512) #define EN_DISK_WRITE 1
(0513) #define EN_DISK_FAT12 1
(0514) #define EN_DISK_FAT32 1
(0515) #define EN_BYTE_ACCESS 1
(0516) #define EN_SAVE_VARIABLE 1
(0517) #define EXT_BLK_INTERFACE 1
(0518)
(0519) #define LIB_CFG_DISK_IO 1 /* 默认情况下,磁盘读写的数据的复制方式 */
(0520) #ifndef LIB_CFG_FILE_IO
(0521) #define LIB_CFG_FILE_IO 1 /* 默认情况下,文件读写的数据的复制方式为"内部复制" */
(0522) #endif
(0523) #ifndef LIB_CFG_UPD_SIZE
(0524) #define LIB_CFG_UPD_SIZE 0 /* 默认情况下,在添加数据后文件长度的更新方式为"不更新" */
(0525) #endif
(0526) #ifndef LIB_CFG_NO_DLY
(0527) #define LIB_CFG_NO_DLY 0 /* 默认情况下,在写操作结束后的延时方式为"写后延时" */
(0528) #endif
(0529) #ifndef LIB_CFG_INT_EN
(0530) #define LIB_CFG_INT_EN 0 /* 默认情况下,CH375的INT#引脚连接方式为"查询方式" */
(0531) #endif
(0532)
(0533) #define LIB_CFG_VALUE ( ( LIB_CFG_INT_EN << 7 ) | ( LIB_CFG_NO_DLY << 5 ) | ( LIB_CFG_UPD_SIZE << 4 ) | ( LIB_CFG_FILE_IO << 2 ) | LIB_CFG_DISK_IO ) /* CH375程序库配置值 */
(0534)
(0535) /* 子程序库中提供的变量 */
(0536) extern UINT8V CH375IntStatus; /* CH375操作的中断状态 */
(0537) extern UINT8V CH375DiskStatus; /* 磁盘及文件状态 */
(0538) extern UINT8 CH375LibConfig; /* CH375程序库配置,下行说明 */
(0539) /* 位7: CH375的INT#引脚连接方式: 0查询方式,1中断方式 */
(0540) /* 位5: 在写操作结束后是否延时: 0写后延时,1不延时 */
(0541) /* 位4: 在添加数据后是否自动更新文件长度: 0不更新,1自动更新 */
(0542) /* 位3位2: 针对文件读写的多扇区数据的复制方式: 00外部子程序, 01,10,11内部复制 */
(0543) /* 位1位0: 针对磁盘读写的单扇区数据的复制方式: 总是内部复制 */
(0544)
(0545) /* 如果CH375的INT#引脚连接到单片机的中断输入引脚并且准备使用中断方式,那么LIB_CFG_INT_EN定义为1,否则定义为0由单片机查询INT#引脚 */
(0546) /* 在CH375子程序读写文件数据时,CH375的程序库提供两种优化速度的方式,在LIB_CFG_FILE_IO中定义:
(0547) 方式0:"外部子程序", 只适用于文件读写时的数据复制(只用于CH375FileReadX和CH375FileWriteX两个子程序),
(0548) 是指由子程序xWriteToExtBuf和xReadFromExtBuf进行数据复制,这两个子程序是在应用程序中定义的,由CH375的程序库调用,
(0549) 方式1:"内部复制", 程序内置的常规数据复制方式
(0550) 对于文件数据读写,也就是应用程序调用CH375FileReadX和CH375FileWriteX子程序时:
(0551) 在方式0下,由应用程序在xWriteToExtBuf和xReadFromExtBuf子程序中自行管理缓冲区,设定缓冲区初值等,
(0552) 在方式1下,应用程序每次调用CH375FileReadX和CH375FileWriteX时,CH375的程序库都会从指定缓冲区的起始地址开始读写数据,
(0553) 例如: 某文件长度为1K(占用2个扇区), 如果调用CH375FileReadX时读1K(指定mCmdParam.Read.mSectorCount为2), 那么1K数据全读到指定缓冲区中,
(0554) 如果缓冲区较小只有0.5K, 那么分两次读取, 第一次调用CH375FileReadX时读0.5K, 处理完这0.5K数据后再调用CH375FileReadX读下一个0.5K并处理
(0555) */
(0556) extern UINT8 CH375vDiskFat; /* 逻辑盘的FAT标志:1=FAT12,2=FAT16,3=FAT32 */
(0557) extern UINT8 CH375vSecPerClus; /* 逻辑盘的每簇扇区数 */
(0558) extern UINT32 CH375vStartCluster; /* 当前文件或者目录的起始簇号 */
(0559) extern UINT32 CH375vFileSize; /* 当前文件的长度 */
(0560) extern UINT32 CH375vCurrentOffset; /* 当前文件指针,当前读写位置的字节偏移 */
(0561)
(0562) /* FAT数据区中文件目录信息 */
(0563) typedef struct _FAT_DIR_INFO {
(0564) UINT8 DIR_Name[11]; /* 00H,文件名,共11字节,不足处填空格 */
(0565) UINT8 DIR_Attr; /* 0BH,文件属性,参考前面的说明 */
(0566) UINT8 DIR_NTRes; /* 0CH */
(0567) UINT8 DIR_CrtTimeTenth; /* 0DH,文件创建的时间,以0.1秒单位计数 */
(0568) UINT16 DIR_CrtTime; /* 0EH,文件创建的时间 */
(0569) UINT16 DIR_CrtDate; /* 10H,文件创建的日期 */
(0570) UINT16 DIR_LstAccDate; /* 12H,最近一次存取操作的日期 */
(0571) UINT16 DIR_FstClusHI; /* 14H */
(0572) UINT16 DIR_WrtTime; /* 16H,文件修改时间,参考前面的宏MAKE_FILE_TIME */
(0573) UINT16 DIR_WrtDate; /* 18H,文件修改日期,参考前面的宏MAKE_FILE_DATA */
(0574) UINT16 DIR_FstClusLO; /* 1AH */
(0575) UINT32 DIR_FileSize; /* 1CH,文件长度 */
(0576) } FAT_DIR_INFO; /* 20H */
(0577) typedef FAT_DIR_INFO *P_FAT_DIR_INFO;
(0578)
(0579) extern BOOL1 CH375Version2; /* 芯片版本:0-CH375,1-CH375A */
(0580) extern UINT32 CH375vDataStart; /* 逻辑盘的数据区域的起始LBA */
(0581) extern UINT32 CH375vFdtLba; /* 当前FDT所在的LBA地址 */
(0582) extern UINT16 CH375vFdtOffset; /* 当前FDT在扇区内的偏移地址 */
(0583) extern UINT32 CH375vDiskRoot; /* 对于FAT16盘为根目录占用扇区数,对于FAT32盘为根目录起始簇号 */
(0584)
(0585) extern UINT8 CH375ReadBlock( void ); /* 从磁盘读取多个扇区的数据到外部接口交换区 */
(0586) #ifdef EN_DISK_WRITE
(0587) extern UINT8 CH375WriteBlock( void ); /* 将外部接口交换区的多个扇区的数据块写入磁盘 */
(0588) #endif
(0589)
(0590) /* 子程序库中提供的子程序 */
(0591) /* 下述子程序中, 文件操作子程序CH375File*和磁盘查询子程序CH375DiskQuery都可能会用到磁盘数据缓冲区DISK_BASE_BUF,
(0592) 并且有可能在DISK_BASE_BUF中保存了磁盘信息, 所以必须保证DISK_BASE_BUF不被用于其它用途,
(0593) 如果RAM较少, 要将DISK_BASE_BUF临时用于其它用途, 那么在临时用完后必须调用CH375DirtyBuffer清除磁盘缓冲区 */
(0594) extern UINT8 CH375GetVer( void ); /* 获取当前子程序库的版本号 */
(0595) extern void CH375Reset( void ); /* 复位CH375 */
(0596) extern UINT8 CH375Init( void ); /* 初始化CH375 */
(0597) extern UINT8 CH375DiskConnect( void ); /* 检查磁盘是否连接 */
(0598) extern UINT8 CH375DiskReady( void ); /* 查询磁盘是否准备好 */
(0599) extern void CH375DirtyBuffer( void ); /* 清除磁盘缓冲区 */
(0600) extern UINT8 CH375FileOpen( void ); /* 打开文件或者枚举文件 */
(0601) extern UINT8 CH375FileClose( void ); /* 关闭当前文件 */
(0602) #ifdef EN_DISK_WRITE
(0603) extern UINT8 CH375FileErase( void ); /* 删除文件并关闭 */
(0604) extern UINT8 CH375FileCreate( void ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
(0605) #endif
(0606) extern UINT8 CH375FileModify( void ); /* 查询或者修改当前文件的信息 */
(0607) extern UINT8 CH375FileLocate( void ); /* 移动当前文件指针 */
(0608) extern UINT8 CH375FileReadX( void ); /* 从当前文件读取数据到指定缓冲区 */
(0609) #ifdef EN_DISK_WRITE
(0610) extern UINT8 CH375FileWriteX( void ); /* 向当前文件写入指定缓冲区的数据 */
(0611) #endif
(0612) #ifdef EN_BYTE_ACCESS
(0613) extern UINT8 CH375ByteLocate( void ); /* 以字节为单位移动当前文件指针 */
(0614) extern UINT8 CH375ByteRead( void ); /* 以字节为单位从当前位置读取数据块 */
(0615) #ifdef EN_DISK_WRITE
(0616) extern UINT8 CH375ByteWrite( void ); /* 以字节为单位向当前位置写入数据块 */
(0617) #endif
(0618) #endif
(0619) extern UINT8 CH375DiskSize( void ); /* 查询磁盘容量 */
(0620) extern UINT8 CH375DiskQuery( void ); /* 查询磁盘信息 */
(0621) #ifdef EN_SAVE_VARIABLE
(0622) extern void CH375SaveVariable( void ); /* 备份/保存/恢复子程序库的变量,用于子程序库在多个CH375芯片之间进行切换 */
(0623) #endif
(0624) extern UINT8 CH375BulkOnlyCmd( void ); /* 执行基于BulkOnly协议的命令 */
(0625) extern UINT8 CH375sDiskReady( void ); /* 查询磁盘是否准备好,支持CH375S */
(0626)
(0627) /* 该头文件可以为CH375子程序库分配必要的I/O及内存资源,并产生必要的与硬件有关的目标代码,
(0628) 如果该文件是被工程项目的多个源程序包含作为头文件,那么应该只允许一个头文件分配资源和产生代码,
(0629) 除此之外的头文件应该被事先定义CH375HF_NO_CODE,从而禁止该头文件产生重复的目标代码,例如:
(0630) #define CH375HF_NO_CODE 1
(0631) #include CH375HF?.H
(0632) */
(0633) #ifdef CH375HF_NO_CODE
(0634)
(0635) extern void xWriteCH375Cmd( UINT8 mCmd ); /* 外部定义的被CH375程序库调用的子程序,向CH375写命令,最小周期为4uS,否则之前之后各延时2uS */
(0636) extern void xWriteCH375Data( UINT8 mData ); /* 外部定义的被CH375程序库调用的子程序,向CH375写数据,最小周期为1.5uS,否则之后延时1.5uS */
(0637) extern UINT8 xReadCH375Data( void ); /* 外部定义的被CH375程序库调用的子程序,从CH375读数据,最小周期为1.5uS,否则之前延时1.5uS */
(0638) extern CMD_PARAM_I mCmdParam; /* 命令参数 */
(0639) extern UINT8 DISK_BASE_BUF[512]; /* 外部RAM的磁盘数据缓冲区,缓冲区长度为一个扇区的长度 */
(0640) #ifdef FILE_DATA_BUF_LEN
(0641) extern UINT8 FILE_DATA_BUF[ FILE_DATA_BUF_LEN ]; /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
(0642) extern UINT8 CH375FileRead( void ); /* 从当前文件读取数据 */
(0643) #ifdef EN_DISK_WRITE
(0644) extern UINT8 CH375FileWrite( void ); /* 向当前文件写入数据 */
(0645) #endif
(0646) #endif
(0647) #ifndef NO_DEFAULT_CH375_F_ENUM
(0648) extern UINT8 CH375FileEnumer( void ); /* 枚举文件 */
(0649) #endif
(0650) #ifndef NO_DEFAULT_CH375_F_QUERY
(0651) extern UINT8 CH375FileQuery( void ); /* 查询当前文件的信息 */
(0652) #endif
(0653) extern void xQueryInterrupt( void ); /* 外部定义的被CH375程序库调用的子程序,查询CH375中断并更新中断状态 */
(0654) extern void xDelay100uS( void ); /* 外部定义的被CH375程序库调用的子程序,延时100uS */
(0655) #ifdef EN_DISK_WRITE
(0656) extern void xDelayAfterWrite( void ); /* 外部定义的被CH375程序库调用的子程序,写操作后延时 */
(0657) #endif
(0658) extern void xFileNameEnumer( void ); /* 外部定义的被CH375程序库调用的子程序,文件名枚举回调子程序 */
(0659) extern UINT8 CH375LibInit( void ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
(0660)
(0661) #else
(0662)
(0663) void xWriteCH375Cmd( UINT8 mCmd ); /* 外部定义的被CH375程序库调用的子程序,向CH375写命令,最小周期为4uS,否则之前之后各延时2uS */
(0664) void xWriteCH375Data( UINT8 mData ); /* 外部定义的被CH375程序库调用的子程序,向CH375写数据,最小周期为1.5uS,否则之后延时1.5uS */
(0665) UINT8 xReadCH375Data( void ); /* 外部定义的被CH375程序库调用的子程序,从CH375读数据,最小周期为1.5uS,否则之前延时1.5uS */
(0666)
(0667) CMD_PARAM_I mCmdParam; /* 命令参数 */
(0668)
(0669) UINT8 DISK_BASE_BUF[512]; /* 外部RAM的磁盘数据缓冲区,缓冲区长度为一个扇区的长度,起始地址建议为偶地址 */
(0670) #ifdef FILE_DATA_BUF_LEN
(0671) UINT8 FILE_DATA_BUF[ FILE_DATA_BUF_LEN ]; /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度,起始地址建议为偶地址 */
(0672) UINT8 CH375FileRead( void ) /* 从当前文件读取数据 */
(0673) {
(0674) mCmdParam.ReadX.mDataBuffer = &FILE_DATA_BUF[0]; /* 指向文件数据缓冲区 */
_CH375FileRead:
0061 EA80 LDI R24,0xA0
0062 E092 LDI R25,2
0063 939006A9 STS 0x6A9,R25
0065 938006A8 STS 0x6A8,R24
(0675) return( CH375FileReadX( ) );
0067 940E0E17 CALL _CH375FileReadX
0069 9508 RET
(0676) }
(0677) #ifdef EN_DISK_WRITE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -