这段时间在自己尝试写了个关于USB MASS storage 的协议传输程序。在调试是中遇到的一些问题在此记录一下。
一. toggle的设定
1.在控制传输中toggle的设定比较固定,Setup 包 中的数据都是用data0 来传输,ACK包用data1. Data包的第一个包用data1 后面 则进行翻转。
在bulk传输中toggle的设定有些复杂。首先对于in 和out两个端口,toggle是分离的,他们各自在数据传输中形成独立翻转。所以一般是设定两个
toggle[1],和toggle[2]的全局变量来记录与设定。
2.在一个qTD中理论上最大传输数据为5X4K个byte(假设地址4K对齐)。而一个包的大小为512bytes,所以一个qTD最多能传20个包。在传送一个qTD中数据包时toggle是由硬件自动翻转的。而我们软件要做的就是设定每个qTD中首个packet的toggle值。在一个QH下如果挂了多个qTD,那么每个qTD的第一个包的toggle都要软件设定。在一个qH传输结束后,我们可以从qH 的写回值中读到组后一个packet的toggle信息。注意这个toggle值是翻转后的,所以它的值可以直接用来设定下一个传输的首个包的toggle。
3.toggle值的清零貌似只有在reset之后才需要,像mass_storage_bbb_reset命令不需要清。这条等我做完实验后再来确定。
二.IOC 的设定
如果在qTD 中IOC置1,那么在这个qTD传输结束后硬件就会产生一个中断。这么做没什么不妥,但是如果一次性传输的数据较大,以至于一个qH下要挂多个qTD那么这样设就会有问题。给传输带来不稳定。正确的做法是在最后一个qTD中置IOC为1,前面的qTD都设0.这样就能保证一个QH中所有的数据传完了才会来中断。
阅读(1326) | 评论(0) | 转发(0) |