high bandwidth isoc

来源:互联网 发布:守望先锋 数据查询 编辑:程序博客网 时间:2024/05/22 17:09


*************** specification *************** 


MUSBMHDRC Product Specification and Programming Guide contains information about the standard M-USB mechanics.


MUSBMHDRC Datasheet contains a block schema, signal descriptions and information about capabilities.


TMS320DM335 Reference Guide implements MUSBMHDRC and contains details about standard registers.




. ULPI and TLL
The USBTLL module is a high-speed USB UTMI low-pin interface (ULPI) transceiverless link logic (TLL)
adapter. 


. UTMI全称为 USB2.0 Transceiver Macrocell Interface,此协议是针对USB2.0的信号特点进行定义的,分为8位或16位数据接口。




. (tms处理器usb控制器)只有端点1-4(注意总共只有0-4的端点)有动态fifo大小的特性,端点0有固定的fifo大小和起始地址(0)


. 对于isoc in,如果dma是使能的,可以设置AUTOREQ寄存器以在接收到数据之后,自动产生in token


. EOP end of packet


. [isoc in transfer]设置HOST_RXCSR寄存器中的REQPKT位,将导致host发送一个in token给target。当端点接收到这个packet时,产生一个interrupt,REQPKT位会在interrupt routine被clear。












*************** musb *************** 
. TXMAXP,这个寄存器的bit10-bit0代表Maximum Payload/transaction,bit11-bit12是Maximum Payload/transaction的multiple。这个multiple需要加上1,然后
乘max payload/transaction。这个multiple称为在一个macroframe中的最大transaction数量。这个max payload/transaction的最大值是1024.


. AUTOSET, AUTOCLEAR不能使用在high bandwidth isoc传输中。


. The transmission of packets as a number of sections introduces a further type of error – the transmission of Incomplete packets.


. 对于isoc传输,doubled buffering是要使用的。


. TxPktRdy,这个表示要发送的数据包已经放置在fifo中,等待发送出去;
RxPktRdy,表示fifo中已经有数据包了,程序可以去这个数据包了。


. 在musb的代码中,RXCSR寄存器是一个16bits的,对应在musb的specification中的RXCSRL, RXCSRH两个8bits的寄存器。


. 设置rxcsr register的FlushFIFObit,只是清除fifo中的next packet(只清除一个packet)。


. DMAReqMode(RXCSRH寄存器中的一个bit):
The CPU sets this bit to select DMA Request Mode 1 and clears it to select DMA Request Mode 0.


















*************** code part *************** 
. musb_id_pin_work在这个函数中根据端点配置表(cfg table)初始化所有端点。
对于根据fifo_cfg初始化musb中musb_hw_ep类型的数组endpoints实际执行的过程:
musb_id_pin_work -> ep_config_from_table_for_host -> fifo_setup_for_host


. musb_core_init这个函数中:
1. 根据fifo cfg table配置musb结构中的所有硬件端点(这些端点在musb的musb_hw_ep类型的endpoints数组中),例如硬件端点的接收/发送 max packet size。
2. 设置musb中musb_hw_ep类型的数组endpoints中的所有元素的fifo地址。


注意:
musb_core_init和musb_id_pin_work所做的事情有些是一样的,比如根据fifo cfg table配置musb中musb_hw_ep类型的数组endpoints。


. 在接收到一个urb,在中断routine中处理这个urb的过程中,在musb_advance_schedule函数中,调用give back函数执行urb的complete函数,在give back函数中
会把当前的urb从它所在的musb_qh中的host endpoint中的urb list链表中删除。在give back函数之后,判断musb_qh中的host endpoint中的urb list是否为空,如果
是空的,并且是输入端点的情况,将当前musb_qh中的musb_hw_ep类型的成员hw_ep中的rx_reinit成员设置为1. 再将这个ep中musb_qh类型的in_qh成员设置为null。
并且之后不会再调用下面的musb_start_urb。
如果这个链表不是空的,执行musb_start_urb,在执行这个函数的过程中,会调用musb_rx_reinit函数重新初始化endpoint(musb hw endpoint)。然后设置RXCSR 
register的MUSB_RXCSR_H_REQPKT位请求数据包。


根据上面,在接收到一个urb在interrupt routine中处理这个urb时,在调用完这个urb的complete函数之后,会判断musb中的host endpoint中的urb list链表是否为
空,如果是空的,将musb_qh中的musb_hw_ep类型的成员hw_ep中的rx_reinit设置为1,标志着这个musb_hw_ep硬件端点需要重新初始化。




. hb_mults
musb_urb_enqueue
qh->hb_mult = 1 + ((qh->maxpacket >> 11) & 0x03); // high bandwidth multiplier.
在maxpacket bit11,bit12中编码了high bandwidth multiplier - 1,所以上面需要加1.


. fifo_setup_for_host, 这个是有效的。









































0 0
原创粉丝点击