硬件层:这是固件中最低的层,它完成向PDIUSBD12的硬件通道.当固件转向其他的CPU 平台,这部分需要修改或增加内容。
PDIUSBD12命令接口:为进一步简化用PDIUSBD12编程,固件定义了一系列命令接口,它们压缩了使用PDIUSBD12的所有功能。
中断服务程序:这部分代码处理由PDIUSBD12产生的中断。它接收从PDIUSBD12内部的FIFO区到CPU存储器的数据,并且建立合适的标志以通知主程序处理。
主程序:主程序检查事件的标志,转移到合适的子程序做进一步的处理。它也包含人机接口代码,例如,发光二极管和键盘扫描。
协议层:协议层处理标准USB设备请求,也处理具体的用户请求诸如DMA和TWAIN。
2) 固件任务
在编写固件程序的过程中,PDIUSBD12 作为接口芯片硬件为我们做了大量的工作,其中包括:
a.检测新的进入事务;翻译从USB 总线上获得的信息;b. 检测事务的目的地址,以决定是否响应;e. 确定事务的类型;d. 从USB 总线上接收数据到FIFO;e. 从FIFO 中发送数据到USB 总线上;f. 计算校验位,检测并报告结果。
但还有相当一部分的工作由固件程序来完成。这部分任务包括:
a.初始化PDIUSBD12并处理PDIUSBD12的中断;b.响应各种请求,至少要响应标准的11种请求;c.选择适当的数据写入PDIUSBD12的FIFO;d.从PDIUSBD12的FIFO中读取数据;
3) PDIUSBD12 的初始化
与一般的接口芯片一样,PDIUSBD12必须先初始化以后再使用,初始化的步骤如下:
a.用Set Address/Enable命令使能芯片功能,地址应设为0;b.用Set Endpoint Enable命令使能芯片上除端点0、1外的所有端点;c.用Set Mode 命令断开连接,延时1-2s;用Set Mode 命令连接;d. 用命令Read Interrupt Register清空中断寄存器;
初始化完后,D12就可以接收USB 总线上的信息了。之后,主机通过端点0、1来读取设备信息,配置设备、设置设备地址,完成设备列举。
4) USB 设备的列举
当有一个USB 设备连接到主机上时,主机的USB总线驱动、根集线器驱动获得设备连接的通知,开始列举设备。在主机一端,列举设备的过程是向设备发出一系列的标准请求。在设备一端,则需要响应主机发出的请求。其顺序如下:
a响应获取设备描述符的请求。务必保证设备描述符的正确发送;b.响应设置地址的请求,设备进入编址态;c.连续三次响应获取设备描述符请求;d.响应获取配置描述符的的请求,务必保证配置描述符的正确发送;e.发送全部的配置描述符,同时发送所有的接口描述符、端点描述符;
如果以上步骤都正确,则主机会提示找到新设备,安装驱动程序。否则,提示找到未知设备,设备不可用。
5) USB 设备固件框架的实现
从上面的讨论发现编写USB设备的固件实质上是处理各种主机提出的请求。其中,标准的11个请求是必须实现的,如果要求设备有其它的功能还必须加入自定义的请求。按照USB 2.0 中的定义,称这些固件程序为USB设备的框架。下面介绍USB设备框架的实现。
3. 主程序的结构
一旦加电,MCU就要初始化所有的端口,存储器,定时器和中断服务子程序。之后,MCU需要重新连接USB。这个程序很重要因为它保证了在MCU未准备好服务D12之前,D12不会动作。
在主循环程序里面,MCU会询问键盘上的任何动作。如果任何一个具体的键被按下,处理键的命令就会执行处理程序,之后返回主程序。这个程序仅是用来调试用。1ms定时是用来启动检查被按下键的子程序。
当询问到达检查Setup包时,它需要先确定setup标志是否建立。如果setup标志已经确立,它将发送设备请求到协议层进行处理。下面的流程图显示了主程序在前台执行的情况。
4. 中断服务程序的实现
PDIUSBD12固件是完全中断驱动的,因此中断服务程序是整个固件编写过程中非常重要的一环。在进入中断服务程序后首先要发用命令Read Interrupt Register(控制字为F4H)读取中断寄存器,根据中断寄存器的内容判断中断源,然后跳转到不同的服务程序中去处理中断。
中断服务程序(ISR)与主程序通信是通过事件标志“EPPFLAG”和数据缓冲区“CONTROL-XFER”。