接着编写扇区读写程序。对于存储设备来说,文件管理几乎都是“块操作”方式,即使只修改存储设备中一比特的数据,也必须将包含该比特的整个扇区读出,找到相应位置进行修改,再把修改好的扇区数据写回原位置。对于大多数USB接口芯片,读写扇区的阶段要求我们熟悉SCSI或UFO协议指令,利用特定指令来完成操作。而CH375内嵌了支持此方面指令的固件,当读扇区时,发CMD_DISK_READ,与CMD_DISK_RD_GO配合使用,则可在USB存储设备中任意读取1至255个扇区的数据;只需将CMD_DISK_WRITE与CMD_DISK_WR_GO指令结合使用,则可在U盘中任意写入1至255个扇区数据。
进行文件读写前,必须完成以下工作:
根据DOS文件管理系统格式,声明必要的结构体,用于增强程序的跨平台可操作性及可读性。需要定义的结构体为DPT(DOS分区表)、MBR(主引导记录)、BPB16(BIOS参数块,仅适合于FAT12及FAT16)、BPB32(仅适合于FAT32)、FDT(文件目录表)、LFDT(长文件名FDT)等。除DPT、MBR外,其它结构体的内容在FAT硬件白皮书中均有专门表格详细说明。
声明并初始化必要的全局变量。首先必须读取首个物理扇区,即MBR扇区,取得DBR的相对起始地址,然后读取DBR的内容。有些U盘没有MBR,首个物理扇区就是DBR区,因此必须进行判断:若扇区首字节为0xeb或0xe9,则为DBR区,否则为MBR区。其次设置重要变量,并计算DOS各分区的起始LBA值。需要处理的变量按先后顺序如下:每扇区字节数、每簇扇区数、FAT表起始地址、单FAT表扇区数、根目录区扇区数(FAT32为0)、数据区起始地址、数据区总簇数、FAT类型及根目录的起始地址等。FAT类型按如下标准进行判定,如果数据区总簇数少于4085,则为FAT12类型;否则,若少于65525,则为FAT16;大于或等于65535为FAT32。