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

C {USB复合设备内核模块驱动程序编程}多接口管理和";“无终点”;处理,c,linux,usb,linux-device-driver,C,Linux,Usb,Linux Device Driver,我正在尝试将Pololu的mini-maestro USB伺服控制器驱动程序移植到Linux内核模块中(这是我第一次尝试编写kenel模块)。Pololu的Linux驱动程序实际上使用mono运行时环境,我认为很多都是兼容层,它是用C#编写的(我不知道),因此将其移植到C以编译成内核模块非常重要,因为我希望其他程序使用管道与USB模块通信 所以,这里的交易,我用lsusb-vvv列出 但最后一个接口声明: Interface Descriptor: bInterfaceNumber

我正在尝试将Pololu的mini-maestro USB伺服控制器驱动程序移植到Linux内核模块中(这是我第一次尝试编写kenel模块)。Pololu的Linux驱动程序实际上使用mono运行时环境,我认为很多都是兼容层,它是用C#编写的(我不知道),因此将其移植到C以编译成内核模块非常重要,因为我希望其他程序使用管道与USB模块通信

所以,这里的交易,我用lsusb-vvv列出

但最后一个接口声明:

 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
我不明白的是:

  • 是否存在可用于配置设备模式的未列出的控制端点
  • 我能处理它吗?我怎么做
从复合设备本身:

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

致以最良好的祝愿

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

是否有一个未列出的控制端点可用于 配置设备模式?我能处理它吗?我怎么做

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

从复合设备本身:为其运行内核驱动程序实例 每个接口?如何捕捉接口并确定如何 管理它?如何处理接口关联


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

因此,我在几个网站上进行了搜索,并在上进行了询问,我得到了一些答案,首先感谢@preston提供的线索

  • 我能处理它{未列出的控制端点}吗?我怎么做
是的,我们可以通过第132行中定义的
usb\u control\u msg

int usb_控制_消息(结构usb_设备*dev,未签名的int管道,uu u8请求, __u8 requesttype、uu16值、uu16索引、void*数据、, __u16大小,整数超时)

  • 为每个接口运行内核驱动程序实例
正如@preston所回答的,这是事实

  • 如何捕获接口并确定如何管理它
我们不需要“捕获”接口,接口被发送到内核模块:

static int probe(结构usb_接口*接口,常量结构usb_设备id*id)

  • 如何处理接口关联

正如我被告知不需要以特殊方式处理它们一样,只需在probe函数上识别与驱动程序的接口即可

如何查看我正在处理的接口?(从驾驶员的角度)。据我所知,VendorID(VID)和ProductID(PID)由5个接口共享,或者VID/PID。每个接口都是唯一的?是的,物理设备作为一个整体(复合设备)存在VID/PID,但每个接口都代表一种逻辑设备。从原始角度来看,您可以要求USB设备提供其配置描述符,以获取接口总数。然后,您可以循环并请求每个接口描述符并检查它。如果您正在为某些特定设备创建驱动程序,例如,
usbserial
,则为设备注册的回调将传递一些结构。从那里,您可以查看这些接口以确定您正在与之交谈的接口的数量。您也可以查看libusb,从那里,您可以在不使用内核驱动程序的情况下访问您的设备。取决于你想做什么,这可能足以让你继续前进。我知道libusb可能更容易或更安全,但我真的对Kenel模块编程感兴趣,这就像我第一次