1. 说明
由于.Net Micro Framework的USB驱动架构中,没有为Mass Storage功能提供原生支持,所以除了要编写Mass Storage主体代码外,还需要在原有的USB驱动中添加部分枚举代码。其实从结构上来说,该部分代码应该添加在PAL层,不过考虑到这层代码为.Net Micro Framework Poring Kit Rtm 3.0标准代码,所以把这部分代码添加到我们自己编写的USB驱动之中去了。
此外,由于Mass Storage功能需要不断地检测和处理USB端口的数据,需要一个进程(或线程)去进行驱动。.Net Micro Framework在应用层仅支持一个进程(单个用户程序),所以必须在应用程序中专开一个线程去进行驱动,考虑到这样实现需要用户做额外的工作,最后摒弃了这一实现。最终的做法是,在Mass Storage驱动中添加了时钟中断处理函数,Mass Storage被初始化后,该时钟中断被激活,以一个用户可设定的间隔去监控和处理USB端口的数据。
在实现Mass Storage功能的代码中,并没有直接去读写相关Flash,而是借助PAL层的SectorCache模块间接访问Flash,这样有两个好处,一是读写有缓存,操作速度较快,二是程序比较通用,代码在不用修改的情况下可以访问不同的Flash、SD卡等存储模块。
本Mass Storage驱动仅实现了一个功能子集,仅支持单个存储模块,不支持从PC机进行格式化(可通过本地提供的接口进行格式化,文件系统目前必须是FAT32)。
2. USB Config
Mass Storage要求的USB Config和我们.Net Micro Framework的标准驱动不同,一是PID和VID不同,由于Mass Storage设备是免驱动安装的,这PID和VID应该没有多大用处,但是由于以前PC上已经安装了该PID和VID的.Net Micro Framework驱动,所以Mass Storage设备插入时,优先去找匹配PID和VID的设备驱动(这样也可以让一些厂家有机会安装自己专门的Mass Storage设备驱动),所以对我们已有该驱动的PC,肯定会有问题,所以我们仅需要调整一下VID的值即可。
其二我们USB接口描述类中,接口类必须为0x08(Mass storage class),子类为0x06(SCSI transparent command set)或0x04(UFI),接口协议为0x50(Bulk-only transport)。
表1 子类表
表2 接口协议
其它描述信息由于非关键,所以可修改,也可以不改。
3. 调用接口
Mass Storage驱动位于/DeviceCode/Drivers目录下, 属于通用驱动,其它设备都可以调用。包括如下三个文件:UsbMassStorage.h、UsbMassStorage.cpp、UsbMassStorage_config.cpp。
3.1 PAL层接口
3.1.1 UsbMassStorage_Start
Mass Storage功能初始化和启动函数。该函数执行时,先关闭原先的USB