如何构build和部署Linux驱动程序?

我正在使用Ubuntu的,但问题是一般的Linux。

我通过编译我的linux内核来安装一个模块/驱动程序,并安装新的编译内核。 它工作正常。

为了使这个驱动程序在另一台机器上工作而不需要安装新内核,我将.ko文件复制到/lib/modules/<version>/...下的新机器上,然后运行sudo depmod -a 。 然后运行sudo modprobe <drivername> 。 该模块可以加载没有问题。 但是该设备在这个.ko模块中运行不正常。

这两台机器不同于硬件,但它们与内核版本和ubuntu发行版本相同。 通常情况下,复制.ko文件应该适用于相同的Linux版本和相同的内核。

有关驱动程序的更多信息。 这是一个隐藏的笔平板电脑驱动程序。 所有补丁文件:

  • 一个.c文件在drivers/hid/
  • drivers/hid/Makefile添加一行
  • drivers/hid/usbhid/Kconfig添加几行
  • 添加几行到drivers/hid/hid-ids.h
  • 在{0,0}前添加几行到drivers/hid/usbhid/hid-quirks.c的hid_blacklist结构中

就这样。

我甚至试图复制整个drivers/hid/目录包括从第一台机器的所有.ko文件到第二个。 但没有运气。 可以在第二台机器中识别笔写板,我可以用笔做鼠标左键单击事件,但笔不能移动光标。

希望我提供了足够的细节。 我的目标是只将模块安装到相同的linux发行版(内核),无需重新安装内核。 我不知道如何实现,或者如果可能的话。

非常感谢。

PS:

  • 第一台机器的dmesg输出: http : //paste.ubuntu.com/6419301/
  • 第二台机器的dmesg输出: http : //paste.ubuntu.com/6419302/

在第一台机器上,在插入平板电脑前,lsmod不显示模块。 插入后,模块可以自动加载。 我可以看到lsmod显示模块。

在第二台机器中,插入设备不能自动加载模块。 我必须手动执行sudo modprobe <module>

由于我将不得不将模块安装到我公司的许多机器上,所以安装模块更容易,无需重新安装内核。 我试图安装在第一台机器内置的第二台机器的内核.deb包,它在第二台机器上工作正常。 但是我觉得很难将内核重新安装到很多机器上。 谢谢。

看来你建的内核不是1:1的比赛。 另外,通常不需要编译新的内核。

处理树外驱动程序部署的最简单方法是使用DKMS 。

你需要提供的只是一个dkms.conf文件,它指定了软件包名称,版本,驱动程序名称和目标(在/lib/modules/{kernel} )。

在下面的例子中,大括号内的东西需要用真实的东西来替换,例如,如果版本是1.0.0,那么明显的是{version}1.0.0

示例dkms.conf

 PACKAGE_NAME="{mydriver}" PACKAGE_VERSION="{version}" BUILT_MODULE_NAME[0]="{mydriver}" BUILT_MODULE_LOCATION[0]="/{mycompany?}" AUTOINSTALL="yes" 

然后你只需要把源代码安装到/usr/src/{mydriver}-{version} ,然后运行dkms

  dkms add -m {mydriver} -v {version} dkms build -m {mydriver} -v {version} dkms install -m {mydriver} -v {version} 

您应该看看其他人在这方面做了什么,可以应用于测试和发布流程的自动化程度非常高。 Bluecherry的solo6x10 out-of-tree版本提供了一些有用的make目标(披露:我是谁写的那个)。

另外,您一定要构建和分发软件包,您可以使用solo6x10/debian作为模板,并且可以在Debian wiki中阅读有关软件仓库 。

您可以将模块添加到/ etc / modules,以便在启动时加载。