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

时间:2013-11-15 03:01:21

标签: c linux ubuntu linux-kernel kernel

我使用的是ubuntu,但问题是Linux的问题。

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

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

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

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

  • drivers/hid/
  • 中的一个.c文件
  • 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:

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

在第二个模块中,插入设备无法自动加载模块。我必须手动执行sudo modprobe <module>

由于我必须将模块安装到我公司的许多机器上,因此在不重新安装内核的情况下安装模块会更容易。我尝试将内置在第一台机器中的内核.deb软件包安装到第二台机器上,它在第二台机器上工作正常。但我觉得将内核重新安装到许多机器上感觉不错。感谢。

2 个答案:

答案 0 :(得分:1)

您构建的内核似乎不是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树外版本提供了一些有用的make目标(披露:我是编写该目标的人)。

此外,您绝对想要构建和分发软件包,您可以使用solo6x10/debian作为模板,并且可以read about repositories in the Debian wiki

答案 1 :(得分:-3)

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