我正在尝试使用FunctionFS和FS驱动程序创建一个小工具。我的小工具由两个函数组成,配置如下:
Function 1:
Interface 0:
Endpoint BULK OUT 0x01
Endpoint BULK IN 0x81
Function 2:
Interface 0 Alternate setting 0:
No Endpoint
Interface 0 Alternate setting 1:
Endpoint BULK OUT 0x02
Endpoint BULK IN 0x82这个小工具可以在IMX8板上运行。操作系统是内核为4.14.98的Debian。
一切正常,直到我在另一台计算机上使用libusb的libusb_set_interface_alt_setting激活了函数2中的备用设置1。libusb未显示错误,但交换的USB数据包显示已从主板返回STALL。内核日志中也没有关于停顿的调试信息。这个问题不是由于libusb造成的,因为如果我将小工具连接到另一个不依赖libusb进行通信的板上,我也会遇到同样的问题(并且停止)。
我尝试更改USB描述符(端点地址,函数1中的备用设置)和代码(当我打开端点时,使用一个函数而不是两个),但没有任何东西改变结果。我还查看了内核源代码,以找出错误所在,但没有找到可能导致停顿的明显位置。
有没有人遇到过类似的问题,或者知道我是怎么搞清楚发生了什么事的?我真的很感谢你的帮助。
发布于 2019-11-26 10:30:02
我想明白了,所以我把答案放在这里,以防其他人遇到这个问题。
FunctionFS (f_fs.c)不完全支持备用设置。该实现具有更改为另一个替代设置的代码(ffs_func_set_alt(...))但是它需要另外一个函数来识别当前正在使用的替代设置(ffs_func_get_alt(...)),该函数由复合(composite.c)使用。当设备接收到SET_INTERFACE时,函数composite_setup(...)C检查是否实现了get_alt函数。如果不是,并且要激活的备用设置不为零,则返回错误。
如果您想使用具有替代设置的FunctionFS,唯一的方法是使用FunctionFS作为基础来创建您自己的小工具函数,并编写缺少的ffs_func_get_alt。有关如何编写它的灵感,请看一下f_uvc函数。完成后,将新模块复制到内核,并修改Makefiles、Kconfig和modules.order以在编译过程中添加该模块。这将为您提供一个可以在内核.config文件中选择的模块。
我测试了这个解决方案,它工作得很好。修改内核以添加函数也不是太难。互联网上有很多关于这方面的指南。
祝你好运:)
https://stackoverflow.com/questions/58907857
复制相似问题