编译驱动到内核的两种方式

编译驱动模块

有两种方法可以编译自己写的驱动程序。

第一种方法:直接加入内核

1. 将驱动程序放入内核相应的驱动文件夹,例如名字为my_led.c

2. 修改此驱动目录下的
Kconfig文件

加入对该驱动文件的配置选项

config MY_LED

bool “S3C2410 LED Driver”     tristate意思是三态(3种状态,对应Y、N、M三种选择方式),bool是要么真要么假(对应Y和N)。

depens on ARCH_S3C2410   
如果那个依赖的配置项为Y或者M,则本配置项才有意义;如果依赖的哪个配置项本身被设置为N,则本配置项根本没有意义。

help 

LED driver for the samsung s3c2410  帮助信息,告诉我们这个配置项的含义,以及如何去配置他。

参考http://blog.csdn.net/oqqhutu12345678/article/details/71125128

说明:my_LED是配置选项标题

bool表示该选项要么是y
要么是n,不可编译成模块。如需要编译成模块则改为tristate(三态)

3. 修改此驱动目录下的
Makefile文件
,加入对驱动源码的编译:

obj-$(
CONFIG_MY_LED
) += my_led.o

第二种方法:单独编译驱动模块(1)

1. 下载内核源代码,选择和你的驱动相同的平台的配置文件进行编译,

假设路径为/root/linux-2.6.29。或者利用/usr/src下面的源码,这样就只能编译主机平台上的驱动。

2. 将驱动文件放在一目录下,例如/root/dirver/my_led.c

3. 在/root/driver下编写Makefile文件,内容为:

obj-m := my_led.o

如果这个模块包含多个.c文件,则如下编写Makefile :

obj-m := module_name.o

module-objs := file1.o file2.o …

4. 在本目录下执行:

make -C /root/linux-2.6.29 M=$(pwd) modules

第三种方法:单独编译驱动模块(2)

直接编写Makefile文件:

obj-m :=led.o

CURRENT_PATH := $(shell pwd)

ARM_LINUX_KERNEL :=/root/linux-2.6.29

all:

$(MAKE) -C $(ARM_LINUX_KERNEL) M=$(CURRENT_PATH) modules 

clean:

rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions Module.symvers .Makefile.swp modules.order

运行make即可

=========无敌分割线=======================================

驱动加载分为两种模式:静态加载、动态加载。

(1)静态加载需要你:正常步骤应该是先改本文件下的kconfig文件  增加config_XXX
在menuconfig中勾选这条目录
在makefile中增加obj-$(CONFIG_XXX)  += c文件名.o
(2)动态加载需要你编译成动态模块.ko文件,然后再用insmod加载。

编译驱动模块

有两种方法可以编译自己写的驱动程序。

第一种方法:直接加入内核

1. 将驱动程序放入内核相应的驱动文件夹,例如名字为my_led.c

2. 修改此驱动目录下的Kconfig文件,加入对该驱动文件的配置选项:

config MY_LED

bool “S3C2410 LED Driver”    

depens on ARCH_S3C2410

help 

LED driver for the samsung s3c2410

说明:my_LED是配置选项标题

bool表示该选项要么是y要么是n,不可编译成模块。如需要编译成模块则改为tristate(三态)

3. 修改此驱动目录下的Makefile文件,加入对驱动源码的编译:

obj-$(CONFIG_MY_LED) += my_led.o

第二种方法:单独编译驱动模块(1)

1. 下载内核源代码,选择和你的驱动相同的平台的配置文件进行编译,

假设路径为/root/linux-2.6.29。或者利用/usr/src下面的源码,这样就只能编译主机平台上的驱动。

2. 将驱动文件放在一目录下,例如/root/dirver/my_led.c

3. 在/root/driver下编写Makefile文件,内容为:

obj-m := my_led.o

如果这个模块包含多个.c文件,则如下编写Makefile :

obj-m := module_name.o

module-objs := file1.o file2.o …

4. 在本目录下执行:

make -C /root/linux-2.6.29 M=$(pwd) modules

第三种方法:单独编译驱动模块(2)

直接编写Makefile文件:

obj-m :=led.o

CURRENT_PATH := $(shell pwd)

ARM_LINUX_KERNEL :=/root/linux-2.6.29

all:

$(MAKE) -C $(ARM_LINUX_KERNEL) M=$(CURRENT_PATH) modules 

clean:

rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions Module.symvers .Makefile.swp modules.order

运行make即可

=========无敌分割线=======================================

驱动加载分为两种模式:静态加载、动态加载。

(1)静态加载需要你:正常步骤应该是先改本文件下的kconfig文件  增加config_XXX
在menuconfig中勾选这条目录
在makefile中增加obj-$(CONFIG_XXX)  += c文件名.o
(2)动态加载需要你编译成动态模块.ko文件,然后再用insmod加载。

    原文作者:qingkongyeyue
    原文地址: https://blog.csdn.net/qingkongyeyue/article/details/77942112
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞