我正在尝试将Pololu的mini maestro USB伺服控制器驱动程序移植到Linux内核模块中(这是我第一次尝试编写一个kenel模块)。 Pololu的Linux驱动程序实际上使用单声道运行时环境,我认为很多是增容层,它是用C#编写的(我不知道),所以将它移植到C将其编译成内核模块这很重要因为我希望其他程序使用管道与USB模块通信。
所以,这是交易,我使用lsusb -vvv列出Device Characteristics
但是最后一个界面说明了:
Interface Descriptor:
bInterfaceNumber 4
bNumEndpoints 0
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 4
bInterfaceProtocol 1
iInterface 2 Pololu Mini Maestro 18-Channel USB Servo Controller
我无法弄清楚的是:
来自Composite设备本身:
最诚挚的问候!
答案 0 :(得分:1)
以下是您的问题的一些答案:
是否有可用于的非列出控制端点 配置设备模式?我可以处理它以及如何做到这一点吗?
控制端点始终为端点0,您只需将设置数据包定向到此端点即可将控制请求传达给设备。由于每个设备只有一个端点,因此您需要查看Polulu如何为指定的控制请求指定接口,通常作为控制传输的wIndex值传入。
从Composite设备本身:运行内核驱动程序实例 每个接口?如何捕获界面并确定如何操作 管理它?我该如何处理接口关联?
每个界面都会呈现为一些独特的USB接口。每个人都是独立的,并且会有自己的行为。例如,您可以拥有一个具有3个接口的复合设备:用于大容量存储设备的接口,用于USB音频设备的接口和供应商特定接口。其中每个都会专门为该接口加载自己的驱动程序实例。前两个通常已经内置到现代OS和内核版本中,因为它们是定义的USB类。但供应商特定的设备可能必须为供应商特定的驱动程序进行一些VID / PID匹配。如果您需要与上面显示的特定界面进行对话,这将是您的情况。
答案 1 :(得分:0)
所以,我已经挖掘了几个网站,并在Pololu forum上提问我得到了一些答案,首先要感谢@preston的线索!
是的,我们可以通过function
第132行中定义的usb_control_msg
/drivers/usb/core/message.c来定义
int usb_control_msg(struct usb_device * dev,unsigned int pipe,__ u8 request, __u8 requesttype,__ u16 value,__ u16 index,void * data, __u16 size,int timeout)
作为@preston回复,它是
我们不需要'捕获'接口,接口被发送到探测内核模块:
static int probe(struct usb_interface *interface, const struct usb_device_id *id)
正如我被告知我不需要以特殊方式处理它们,只需在探针功能上识别带有驱动程序的接口