总结:根据Asynchronous Schedule Enable位来判断是否进行非周期性进度表遍历,为0,不用ASYNCLISTADDR寄存器访问非周期性列表,为1,则使用ASYNCLISTADDR寄存器访问非周期性列表。当使用ASYNCLISTADDR寄存器去取下一个queue head时,才使用新改变的Asynchronous Schedule Enable位(改变Asynchronous Schedule Enable位不能立即生效)。当主机控制器完成处理非周期性进度表,主机控制器保存最后访问的queue head的horizontal pointer 到ASYNCLISTADDR寄存器中。当主机控制器遭遇H-bit为1同时Reclamation位为0时,则一个Empty Asynchronous Schedule被检测。每当主机控制器遇到的queue head的H-bit为1时,则清Reclamation位为0。Asynchronous schedule遍历状态机如下所示:
AsyncSchedSleepTime的值为10us。Start Event表示当主机控制器从Periodic Schedule转向Asynchronous Schedule 传输或者从sleeping状态转向Asynchronous Schedule重新开始进行遍历。当Start Event发生,则置Reclamation位。当pre-operation完成,并且pre-condition成立,则置Reclamation位。当主机控制器访问的queue head的H-bit为1,则清Reclamation位。当主机控制器执行periodic schedule,则主机控制器可能清Reclamation位。从这里我们可以看到判定Empty Asynchronous Schedule条件则要求进行遍历的所有的queue head都不满足pre-condition,即在Asynchronous Schedule中的所有的queue head的传输被执行完或者所有的NakCnt域的值为0。

没有评论:
发表评论