主机调度器
主机模块内置硬件调度器,可自主对应用程序发出的 USB 事务请求重新排序和管理。每一帧开始时,主机都先执行周期性(同步和中断)事务,然后执行非周期性(控制和批量)事务,以符合 USB 规范对同步和中断传输高优先级的保证。
主机通过请求队列(一个周期性请求队列和一个非周期请求队列)处理 USB 事务。每个请求队列最多可存储 8 个条目。每个条目代表一个应用程序发起但还未得到响应的 USB 事务请求,并存储了执行该 USB 事务所用到的 IN 或 OUT 通道的编号,以及其它相关信息。
USB 事务请求在队列中的写入顺序决定了事务在 USB 接口上的执行顺序。每一帧开始时,主机都先处理周期性请求队列,然后处理非周期性请求队列。如果当前帧结束时,计划在当前帧执行的同步或中断类型的 USB 传输事务请求仍处于挂起状态,则主机将发出未完成周期性传输中断(OTG_FS_GINTSTS 中的 IPXFR 位)。OTG HS 模块负责对周期性和非周期性请求队列的管理。周期性发送 FIFO 和队列状态寄存器(HPTXSTS) 与 非周期性发送 FIFO 和队列状态寄存器 (HNPTXSTS) 都为只读寄存器,应用程序可使用它们来读取各请求队列的状态。其中包括:
●周期性(非周期性)请求队列中当前可用的空闲条目数(最多 8 个)
●周期性(非周期性)Tx-FIFO(OUT 事务)中当前可用的空闲空间
●IN/OUT 令牌、主机通道编号和其它状态信息。
由于每个请求队列最多可存储 8 个 USB 事务请求,因此应用程序可以把主机 USB 事务请求提前发送给调度器;实际的通信最晚会在调度器处理完已挂起的 8 个周期事务和 8 个非周期事务完成之后出现在 USB 总线上。
要向主机调度器(队列)发出事务请求,应用程序必须读取 OTG_FS_HNPTXSTS 寄存器中的 PTXQSAV 位或 OTG_FS_HNPTXSTS 寄存器中的 NPTQXSAV 位,确保周期性(非周期性)请求队列中至少有一个可用空间来存储当前请求。