在我们的系统中,USB主机就是用来对U盘进行读写操作,因此在设计和构架上就完全围绕这个目的而进行。整个系统所涉及到的内容比较多,按照嵌入式系统开发的一般原则,采用层次化的体系结构,将系统按照功能划分为若干层次,每一层完成相应的功能。
根据系统的业务需要,系统总体构架如下:
9 业务应用层
8 文件操作API层
7 文件系统层
6 U盘操作命令接口层
5 UFI命令层
4 USB设备管理层
3 OHCI软件接口层
2 寄存器读写接口层
1 硬件层
这是一个分层的结构,每层完成自己的功能,层与层之间都是通过接口完成,基本上上层应用都只依赖于下一层,对于个别层的功能实现需要依赖其下的2层,这是考虑实现的方便。
下面对每一层的功能进行说明:
1、 硬件
这是系统最底层,直接完成USB协议处理的硬件部分。
2、 寄存器读写接口
AM9200支持标准的OHCI接口,提供了访问OHCI寄存器的指针( pUhp)和数据交换区(HCCA),本层对该指针和数据交换区的访问进行封装,对外屏蔽了寄存器读写的细节。以后如果移植到非OHCI的系统上,则可以保持在接口不变,对该层进行重新编码即可。
3、 OHCI软件接口
根据OHCI标准,数据传输都是通过端点描述符(ED)和传输描述符(TD)这两种数据结构来完成的,在进行传输之前需要对ED和TD进行相应的设置,才可以保证数据传输的正确性,本层对ED和TD的操作进行了封装,提供基于OHCI的数据传输接口。
关于ED和TD的详细介绍请参考OHCI规范《Open Host Controller Interface Specification for USB》。
4、 USB设备管理
根据USB标准,USB设备都需要提供设备描述符、配置描述符、接口描述符和端点描述符等信息,本层代码提供了取得这些描述符的命令。
另外,本层还将这些取得描述符的命令组合起来,完成了USB设备的枚举和检测。
5、 UFI命令
根据《Universal Serial Bus Mass Storage Class Bulk-Only Transport》和《Universal Serial Bus Mass Storage Class UFI Command Specification》规范,完成BulkOnly协议的UFI命令,提供扇区读写命令给上层。
6、 U盘操作命令接口
一方面封装UFI命令层,提供以扇区为单位的磁盘读写命令,譬如diskRead()、diskWrite()等函数,另一方面,调用UFI命令完成U盘枚举和检测,确定逻辑0扇区的编号,为构建文件系统奠定基础。
7、 文件系统
完成文件系统初始化,得到相关的参数,提供目录查找、簇操作等接口给上层。
8、 文件操作库函数
仿照C语言的标准文件库函数,提供一套便于上层业务应用所使用的API函数库,包括文件打开、关闭、读写和定位等。
9、 业务应用
这就是业务逻辑层了,也就是根据接收的计费信息调用相应的文件操作库函数,完成话单保存的功能。
采用这样的层次结构,系统具有良好的可维护性和扩展性,只要CPU支持OHCI标准,则本系统就可以不用修改直接使用,如果CPU不支持OHCI标准,则需要将OHCI层的代码进行修改,保持上层的调用接口不变,就可以完成系统移植了。
如果需要扩展支持更多的USB设备,则保持OHCI层基本不变或适当扩展(目前的OHCI层代码只支持控制和批量传输,不支持同步和中断传输),添加新的驱动以及上层应用就可以了。
在这一篇文章里,我对我们的系统进行总体上的说明,这是为了避免一上来就阐述各种技术细节,导致一叶障目,不见泰山。在本系列文章中,所有的代码都是按照这个构架原则来编写的,记住这个构架,对于理解代码会有很大的帮助。