记录相关数据结构之前,先上一张图,这样就基本一目了然了
USB XHCI HOST有三种RING
分别为COMMAND, EVENT 与TRANSFER
这里所说的是TRANSFER RING
一个RING可能由一个或者多个SEGMENT构成
每一个SEGMENT则有多个TRB构成
多个SEGMENT的链接是由LINK TRB来实现的,LINK就像一个单链表,最后一个LINK TRB指向第一个SEGMENT,由此,形成了一个环,RING
TRANSFER TRB有以下几种类型:
针对USB CONTROL TRANSFER的SETUP, DATA, STATUS TRBs
针对BULK, INTERRUPT, ISO TRANSFER的NORMAL TRB
针对ISO TRANSFER的ISOCH TRB (ISO TD由一个ISOCH TRB与0个或多个NORMAL TRB构成)
SW将需要硬件完成的USB传输,通过TRB的形式,将信息提交给硬件,放入RING当中,放入的位置为当前ENQUEUE PTR的位置,每放一个,ENQUEUE PTR向前跨一步,遇到LINK TRB,则跳转到LINK TRB指向的位置
而硬件则按DEQUEUE PTR指向的位置,取出TRB到CACHE当中,执行该TRB,同样,每执行一个,则ADVANCE 该 DEQUEUE PTR,遇LINK TRB,跳转。
TD表示一个USB TRANSFER(不同于USB TRANSACTION)
在TRB当中,有一个CH BIT,如果一处TD由多个TRB构成,则软件需要将除最后一个TRB的所有CH BIT置位。