本文写了一个demo程序,来验证usb gadget和usb host通信时,收发数据包的情况。如何分包,buffer大小等。
usb gadget,通过读写epX文件。usb host使用libusb异步通信。
usb gadget发送数据,host接收数据
如果device发送的数据包大小,大于host libusb rx transfer的buffer大小
a. 如果rx buffer不是512的整数倍,则host收包报错。
如 tx 65536, rx 4000。报错:usb rx failed: status 6, 3584 bytes
b. 如果rx buffer是512的整数倍,那么host收到切割后的包,需要自己重组。
tx长度不是512的整数倍,如 tx 4000 bytes, rx 64k
那么接收正常,发一个包,能收一个包。能区分边界。
如果tx长度是512的整数倍,rx也是512的整数倍,比如tx 512, rx 64k
那么,收的时候,一次能收到多个包。
not a single msg, len 65536 hlen 460 cmd len 52
如果rx不是512的整数倍,那么接收将失败,比如tx 512,rx 513
usb rx failed: status 6, 512 bytes
这种情况下,如果tx总是固定的大小,那么不管是不是512的整数倍,一次都能收一个包。
总结:
usb底层传输最大大小是512,usb收消息的时候,通过不满512的结尾来确定消息结束,重组成一个大的msg。
接收buffer根据是不是512的整数倍,有特殊处理。
如果接收的buffer不是512的整数倍,且小于msg的大小,则接收报错。否则能接收一个完整的消息,且不会一次接收多个消息。
如果接收的buffer是512的整数倍,那么,如果buffer小于msg的长度,也会切割先收buffer。
usb gadget 通过ep文件收数据。
总结:
尽可能按一个消息接收,如果接收不下,则会切割。和libusb接收有一个不同,就是总是会切割。
而libusb,如果rx buffer不是512的整数倍,且小于msg大小,那么就不会切割,会报错。