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

C 如何构建和部署Linux驱动程序?,c,linux,ubuntu,linux-kernel,kernel,C,Linux,Ubuntu,Linux Kernel,Kernel,我使用的是ubuntu,但问题是linux的通用性 我通过编译linux内核安装了一个模块/驱动程序,并安装了新编译的内核。它很好用 为了使该驱动程序在另一台机器上工作而不安装新内核,我将.ko文件复制到/lib/modules/…下的新机器上,然后运行sudo depmod-a。然后运行sudo modprobe。可以毫无问题地加载模块。但是,该设备与此.ko模块一起工作不正常 这两台机器与硬件不同,但它们与内核版本和ubuntu发行版相同。通常,复制.ko文件应该适用于相同的linux版本和

我使用的是ubuntu,但问题是linux的通用性

我通过编译linux内核安装了一个模块/驱动程序,并安装了新编译的内核。它很好用

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

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

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

  • drivers/hid/
  • drivers/hid/Makefile
  • 在驱动程序/hid/usbhid/Kconfig中添加几行
  • 在驱动程序/hid/hid ID.h中添加几行
  • 在{0,0}之前的
    驱动程序/hid/usbhid/hid quirks.c
    的hid_黑名单结构中添加几行
就这些

我甚至试图将整个
驱动程序/hid/
目录包括所有
.ko
文件从第一台机器复制到第二台机器。但是没有运气。在第二台机器上可以识别手写板,我可以用手写板做鼠标左键点击事件,但手写板无法移动光标

希望我提供了足够的细节。我的目标是只将模块安装到相同的linux版本(内核),而不重新安装内核。我不知道如何实现这一目标,也不知道这是否可能

非常感谢

附言:

  • 工作的第一台机器中的dmesg输出:
  • 第二台机器中的dmesg输出:
在第一台机器中,在插入平板电脑之前,lsmod不显示模块。插入后,模块可以自动加载。我可以看到lsmod显示模块

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


由于我将不得不在公司的许多机器上安装该模块,因此无需重新安装内核就可以更轻松地安装该模块。我试着将第一台机器上构建的kernel.deb包安装到第二台机器上,它在第二台机器上运行良好。但是我觉得在很多机器上重新安装内核并不好。谢谢。

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

您构建的内核似乎不是1:1匹配。此外,通常不需要编译新内核

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

您需要提供的只是一个
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的树外版本提供了一些有用的
make
目标(披露:是我写的)


另外,您肯定想要构建和分发软件包,您可以使用
solo6x10/debian
作为模板,而且您可以。

在加载相关模块之前,您是否在第二台机器上加载了模块
usbcore
usbhid
。如上所述,我将整个
驱动程序/hid
从第一台机器复制到第二台机器<默认情况下加载代码>usbhid。但我没有在这两台机器中找到
usbcore
模块。我是内核方面的新手。我不确定什么是
usbcore
模块<代码>wusbcore?那是我唯一能找到的。谢谢。
lsmod
告诉你加载模块前后这两台机器的情况是什么?你好,我检查了lsmod的输出。第一台机器中加载的唯一新模块是设备模块。在第二台机器中,我需要如上所述使用
sudo modprobe
手动加载它。没有区别。试试另一台机器好吗?尝试在有问题的机器上重新编译?