{USB复合设备内核模块驱动程序编程}多接口管理和“无端点”处理

时间:2013-11-24 20:28:19

标签: c linux usb linux-device-driver

我正在尝试将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设备本身:

  • 为每个接口运行内核驱动程序实例?
  • 如何捕获界面并确定如何管理界面?
  • 如何处理接口关联?

最诚挚的问候!

2 个答案:

答案 0 :(得分:1)

以下是您的问题的一些答案:

  

是否有可用于的非列出控制端点   配置设备模式?我可以处理它以及如何做到这一点吗?

控制端点始终为端点0,您只需将设置数据包定向到此端点即可将控制请求传达给设备。由于每个设备只有一个端点,因此您需要查看Polulu如何为指定的控制请求指定接口,通常作为控制传输的wIndex值传入。

  

从Composite设备本身:运行内核驱动程序实例   每个接口?如何捕获界面并确定如何操作   管理它?我该如何处理接口关联?

每个界面都会呈现为一些独特的USB接口。每个人都是独立的,并且会有自己的行为。例如,您可以拥有一个具有3个接口的复合设备:用于大容量存储设备的接口,用于USB音频设备的接口和供应商特定接口。其中每个都会专门为该接口加载自己的驱动程序实例。前两个通常已经内置到现代OS和内核版本中,因为它们是定义的USB类。但供应商特定的设备可能必须为供应商特定的驱动程序进行一些VID / PID匹配。如果您需要与上面显示的特定界面进行对话,这将是您的情况。

答案 1 :(得分:0)

所以,我已经挖掘了几个网站,并在Pololu forum上提问我得到了一些答案,首先要感谢@preston的线索!

  • 我可以处理{未列出的控制端点}以及我该如何处理它?<​​/ li>

是的,我们可以通过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)

  • 如何处理接口关联?

正如我被告知我不需要以特殊方式处理它们,只需在探针功能上识别带有驱动程序的接口