ILD

functionfs usb gadget communicate with usb host tx/rx size
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2024-8-24 站点:Inside Linux Development

本文写了一个demo程序,来验证usb gadget和usb host通信时,收发数据包的情况。如何分包,buffer大小等。

usb gadget,通过读写epX文件。usb host使用libusb异步通信。

device -> host

usb gadget发送数据,host接收数据

1 rx buffer < tx msg length

如果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收到切割后的包,需要自己重组。


2 rx buffer > tx msg length

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


3 rx buffer = tx msg length

这种情况下,如果tx总是固定的大小,那么不管是不是512的整数倍,一次都能收一个包。


总结:

usb底层传输最大大小是512,usb收消息的时候,通过不满512的结尾来确定消息结束,重组成一个大的msg。

接收buffer根据是不是512的整数倍,有特殊处理。


如果接收的buffer不是512的整数倍,且小于msg的大小,则接收报错。否则能接收一个完整的消息,且不会一次接收多个消息。


如果接收的buffer是512的整数倍,那么,如果buffer小于msg的长度,也会切割先收buffer。


host->device

usb gadget 通过ep文件收数据。


总结:

尽可能按一个消息接收,如果接收不下,则会切割。和libusb接收有一个不同,就是总是会切割。

而libusb,如果rx buffer不是512的整数倍,且小于msg大小,那么就不会切割,会报错。



Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.