我有一个USB设备,我正在使用Ubuntu20.04.3。制造商提供了一个库和一个驱动程序。
我可以安装驱动程序并使设备正常工作,但是每次内核更新时,我都必须将驱动程序重新安装到新的树上。我知道这是dkms的工作,我开始着手完成这个任务,因为这看起来并不太困难,但退一步,我想知道是否有一种更简单/更好的方法让设备工作,因为我认为他们的大部分用户是windows,所以linux方面没有太多的开发时间。无论如何,我想更多地了解linux是如何做到的。
他们提供的驱动程序是一个稍微修改过的Exar驱动程序。查看他们的版本和香草Exar驱动程序之间的差异,基本上他们所做的就是在代码中添加他们的供应商号和产品id号,这样他们的设备就会被识别为与驱动程序兼容,并在设备匹配他们的设备描述符时运行适当的代码块(与他们使用的特定Exar芯片相同)。
基于这个非常有用的页面和互联网上的其他来源,我的理解是每个驱动程序都有一个modules.alias文件,该文件本质上有关于它接受的设备类型的规则。然后,当该设备被插入时,系统从该设备中提取信息,为该设备创建一个mod别名文件。然后,第一个,也是最具体的驱动程序,将设备mod别名与modules.alias文件中的规则相匹配,就是分配给设备的驱动程序。
所以我想我的设备有一个Exar芯片,并且可以使用Exar驱动程序使它工作,如果驱动程序接受它,并承认它本质上是一个Exar芯片。但是,由于制造商放置了自己的自定义设备描述符,所以modprobe不承认该设备与香草Exar驱动程序兼容。
与其复制驱动程序并对其进行如此轻微的修改以使系统像他们所做的那样维护它,是否有一种方法可以告诉系统这个设备确实与普通的Exar驱动程序兼容,或者将Exar设备作为某种子设备隐藏在其中?就调制解调器而言,就像设备描述符的别名一样?
或者有一种方法可以为这个设备编写不同的驱动程序,它利用底层的exar驱动程序并将所有东西传递给它,而不是复制代码?然后我就可以从芯片制造商那里得到更新的好处。
或者我应该继续使用dkms,因为制造商这样做是最好的方法?
我看过如何用udev规则将驱动程序绑定和解除绑定到设备的示例,但是我认为如果驱动程序不匹配,它也不会绑定吗?即使是这样,这会是“最好的”方式吗?
发布于 2022-05-24 21:04:31
正如@ReedGhost在评论中所建议的那样(谢谢!),这正是我想要做的。我找到了内置的xr_serial模块,并将设备供应商和产品id回显到newid文件中。内置驱动程序确认我的设备是兼容的,当我插入它时会加载它。
但是,这并没有解决我的具体用例,因为内置的exar驱动程序是为具有不同产品ids的多个设备编写的。有一个if-然后-else链,它为每个特定的产品id指定要运行的特定代码块。因此,某些功能仍然无法工作,因为当设备运行其他部分时,设备的id会导致它转到代码的其他部分。
现在我意识到,我确实需要将设备的id伪造或替换到所使用的特定芯片的id中,而不是仅仅添加一个新的id以供驱动程序识别。
编辑:实际上,我可能会尝试为使用引擎盖下的制造商提供的驱动程序的设备编写一个不同的驱动程序,因为这似乎是更正确的方法,从而获得更新的好处。这个问题和这个问题对于任何发现这个问题并且有同样问题的人来说似乎是一个很好的起点。同时,我使用dkms更新驱动程序。
https://unix.stackexchange.com/questions/692809
复制相似问题