首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SET_INTERFACE激活备用设置时,FunctionFS会停止终结点。知道为什么吗?

使用SET_INTERFACE激活备用设置时,FunctionFS会停止终结点。知道为什么吗?
EN

Stack Overflow用户
提问于 2019-11-18 12:07:09
回答 1查看 215关注 0票数 1

我正在尝试使用FunctionFS和FS驱动程序创建一个小工具。我的小工具由两个函数组成,配置如下:

代码语言:javascript
复制
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中的备用设置)和代码(当我打开端点时,使用一个函数而不是两个),但没有任何东西改变结果。我还查看了内核源代码,以找出错误所在,但没有找到可能导致停顿的明显位置。

有没有人遇到过类似的问题,或者知道我是怎么搞清楚发生了什么事的?我真的很感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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文件中选择的模块。

我测试了这个解决方案,它工作得很好。修改内核以添加函数也不是太难。互联网上有很多关于这方面的指南。

祝你好运:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58907857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档