Linux:以独立方式编译内核设备驱动程序

时间:2015-03-28 15:27:13

标签: linux linux-kernel linux-device-driver

我正在为ARM板编译linux。我需要对内核存储库中存在的现有驱动程序代码进行一些自定义更改,然后重新加载驱动程序。

我期待找到一个" .ko"执行make后,在驱动程序目录中的文件,但不存在这样的文件。显然,uImage /设备树图像编译并不是那样工作的。

我是否需要为独立设备驱动程序编译编写自己的Makefile?

这可能是一个愚蠢的问题,但很抱歉,我对内核/设备驱动程序不熟悉。

编辑: 我按照此处列出的流程进行了操作:http://odroid.com/dokuwiki/doku.php?id=en:c1_building_kernel 在git checkout并安装交叉编译器(arm-linux-gnueabihf-gcc 4.9.2)之后,我发出了基本的make命令

$ make odroidc_defconfig
$ make -j4
$ make -j4 modules
$ make uImage

所有步骤都是成功的。最后几行日志看起来像

KSYM    .tmp_kallsyms1.o
KSYM    .tmp_kallsyms2.o
LD      vmlinux
SORTEX  vmlinux
SYSMAP  System.map
OBJCOPY arch/arm/boot/ccImage
Kernel: arch/arm/boot/ccImage is ready
Image arch/arm/boot/ccImage.lzo is ready
UIMAGE  arch/arm/boot/uImage
Image Name:   Linux-3.10.72
Created:      Sat Mar 28 22:44:45 2015
Image Type:   ARM Linux Kernel Image (lzo compressed)
Data Size:    5459649 Bytes = 5331.69 kB = 5.21 MB
Load Address: 00208000
Entry Point:  00208000
Image arch/arm/boot/uImage is ready

编辑2:驱动程序代码的路径 https://github.com/hardkernel/linux/tree/odroidc-3.10.y/drivers/amlogic/efuse

2 个答案:

答案 0 :(得分:2)

检查您的Makefile

#                             
# Makefile for eFuse.         
#                             

obj-$(CONFIG_EFUSE) += efuse_bch_8.o efuse_version.o efuse_hw.o efuse.o 

我们了解到代码可以构建为可加载模块,也可以永久链接到内核本身。

检查你的指示中提到的分支odroidc-3.10.y-android中的odroidc_defconfig

#
# EFUSE Support
#
CONFIG_EFUSE=y

" y"表示代码将链接到驱动程序。如果它反而说" m"它将被构建为一个模块。

您可以在内核配置中更改它,但如果在需要之前没有任何设置来加载模块,它也可能会导致问题。

可能只是简单地安装新构建的内核,其内部已经链接了代码(即忘记了模块的想法)。

答案 1 :(得分:0)

不确定您是否仍在寻找此问题的答案。

但是查看代码中的Kconfig文件,显示 -

    config EFUSE 
        bool "EFUSE Driver" 

由于所有驱动程序文件都是使用此配置编译的,因此上述配置说明允许CONFIG_EFUSE为' n'或者' y'。所以你只能使用它构建静态模块(内置)。

您需要做的就是将上述说明更改为:

    config EFUSE 
        **tristate** "EFUSE Driver" 

并将Kconfig中的其他配置更改为三态。 这将允许您的驱动程序被编译为模块一旦您选择驱动程序为' M'在你的内核配置中。然后你应该能够看到" .ko"与驱动程序对应的文件。

在将驱动程序构建为模块时,请确保使用EXPORT_SYMBOL(foo),以便在加载模块符号时处理任何依赖关系。