为了执行控制转移,可以使用框架函数send_request(),send_request()函数将分配一个传递给TD处理器的URB结构。URB应该包含有关设置状态的信息,并且借助参数传递给send_request()。URB需要的信息包括:
* 请求类型:表明USB请求类型的字节,该字节包含表示传输方向、传输类型以及传输接受方的位。
* 请求:11种标准USB请求中的一种,这些请求包括:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Feature、Set_Interface、Synch_Frame。
* 值:特殊请求字段。
* 索引:特殊请求字段。
* 长度:相关数据缓冲器的大小
载入用于URB的设置信息之后,便可将其它设备信息装入URB,如地址、速度、终点数以及传输方向,还有表示传输类型的字节和“回调”函数指示器。利用回调函数可以在框架内进行某些并行操作,也可在硬件处理USB操作的同时执行其它任务。TD需要USB传输类型信息,这样框架就可以安排正确的传输类型时序。此外,与批量或中断传输相反,框架一次只允许进行一个控制传输操作。
装入所有URB信息之后,URB便被提交给TD处理器。TD处理器是框架的组成部分,它与硬件直接通信,处理有关传输的低级详细资料。TD完成任务后,TD处理器将程序控制权由原始调用指定的“回调”函数转给send_request()函数。
图2显示了调用带回调函数的send_request()。这里我们使用控制传输以获得某键盘的国家代码,在get_country_code()函数中可看到send_request()的调用,注意send_request()调用中的最后一个参数是回调函数。在TD处理器确定硬件完成处理后执行该函数,此时回调函数将获得返回的数据缓冲器,将其与HID描述器结构相匹配,并存取与国家代码对应的字节,然后URB被释放。
EZ-Host框架值得注意的最后一个特点是设备驱动程序的使用。在执行过程中,设备驱动程序将执行三个功能,即停止、启动和运行。启动某设备驱动程序便是运行它的run()函数,该函数对某些数值进行初始化,并分配一个用于数据传输的重复出现的URB。对于鼠标或键盘,该URB将每隔10毫秒发生一次。数据传输完成后,TD处理器将控制转交给interrupt_in_complete()函数,通过检查URB可得知数据是来自键盘还是来自鼠标,该回调函数负责将键盘或鼠标数据发送至应用层。
当某驱动程序停止时,其重复出现的URB将从TD列表中除去并释放出空间,然后传送一个消息至应用层,去掉相关设备。如果停止的驱动程序相关设备是集线器,则与该集线器相连的所有设备也要去除,且驱动程序同时停止。当然,如果去除的设备中还有集线器,则与该集线器相连的设备将以同样方式去除。
在驱动程序运行期间,系统可执行各种任务。对于集线器设备驱动程序,要检查集线器的端口,以了解是否有设备插入和去除。这里键盘和鼠标驱动程序运行函数不起任何作用。