我对usb--IN、OUT事务的软件角度理解(gliethttp)
文章来源:http://gliethttp.cublog.cn[转载请声明出处]
当设置地址的setup包发送完之后 usb host主机会继续产生一个IN事务,进而进入这里,将setup包中设置的地址值,配置到usb从设备上--pdiusbd12 对于PDIUSBD12来说,当为OUT事务数据包时,只有包数据接收完毕之后,才会触发PDIUSBD12的中断, 当为IN事务时,一旦host发出IN事务的PID令牌值,PDIUSBD12会立即中断,mcu此时,把需要发送的数据送到USB总线即可.
如果此次操作是OUT事务操作,那么当数据全部传输完毕之后,host主机会再产生一个IN事务操作, 从机必须配合这个IN事务操作发送一个空数据包(实际51测试slave可以不用回发0字节的空数据包;但在at91rm9200下当没有待发的数据时,当出现IN事务时,at91rm9200固件驱动会发送0字节包来响应该IN事务) 如果此次操作是IN事务操作,那么当数据全部传输完毕之后,host主机会再产生一个OUT事务操作, 从机必须配合这个OUT事务操作返回正确ACK(ACK已经由usb控制器硬件自动完成)
所以从这里看,IN事务也好,OUT事务也好,他们都是host主机以逻辑为出发点"乱搞"出来的,[gliethttp] 对于不负责任的从机,可能端点0,1,2之类一旦发生数据中断,它就发数据,它不管当前发的数据是为IN事务服务的,还是为OUT事务服务的, 而对于负责任的从机,它会完全按照host提出来的IN、OUT事务的逻辑,配合IN、OUT事务,发送相应事务下的相应数据.
举一个例子:host下发一个数据,所以需要产生OUT事务,当host发送完成之后,host自己知道已经发完了,[gliethttp] 但host比较bt,他还想让slave做一个确认,让slave报告一个空数据包,他才解恨,slave怎么报告呢,slave不能主动传数据给host, 因为usb主从模式的原因,一切数据的流动都是由host单方面主动提出发送、读取,slave只是被动的响应,就像前面的OUT事务一样 host打算OUT数据时,绝不会事先知会一下slave,有了就发,比较粗鲁,大手大脚,当OUT事务完成之后, host又强迫slave上发一个空数据包给host,完全不顾及slave的感受[gliethttp] 因为slave不能有脾气,如果slave有了脾气,不去理会host的IN事务,host以强硬的姿态让slave上发一个空数据包, slave就是不发,那没办法,slave你是真的不想混了,host会不带商量的把你踢出去--windows提示:"非法usb设备", 所以slave为了能糊口,在windows的一亩三分地混口饭吃,那就只能顺着该死的host的规则来行事了[gliethttp], 所以IN事务也好和OUT事务,以及setup事务,这些都是给这样一个过程起的一个代号,毕竟我们要和其他人交流, 总不能说,"就是那个东西,数据发出去等着回答的那个东西,我觉得它有问题",那交流起来多麻烦,要是有个这个定义之后, 大家就可以这么说,"我对IN事务不理解,我对OUT事务理解了",简洁明了.以上是我对usb--IN、OUT事务的理解.
|