前言:
本文章目标平台是PC Linux,不包含其他平台。
执行下面的步骤之前,请先编译kernel通过。
linux KO编译
将驱动程序源码集成到Linux内核中:
- 将驱动源码文件放到drivers/net/wireless并命名
自己简单创建的几个没有任何关联的源文件:
并命名为:driver_test
任意贴一个源程序代码:dricer.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#define HUANGRUI 1
#define huangrui 2
MODULE_LICENSE("GPL v2");
int huangrui_function(void)
{
int i=1,j=2;
if (i==2)
{
return 0;
}
else if(j ==3)
{
return 1;
}
else
{
return 2;
}
}
其中MODULE_LICENSE(“GPL v2”);是必须要的
- 在drivers/net/wireless/Makefile中添加相应源码目录:
- 在drivers/net/wireless/Kconfig中添加相应Kconfig目录
- 在driver_test中创建Kconfig和Makefile
Konfig:
config DRIVER_TEST
tristate "driver_test_bool"
depends on USB
select USB_USBNET
select USB_NET_CDCETHER
default m
help
driver testing
Kconfig的字符解释
- menuconfig:表示菜单(本身属于一个菜单中的项目,但是他又有子菜单项目)config表示菜单中的一个配置项(本身并没有子菜单下的项目)。一个menuconfig后面跟着的所有config项就是这个menuconfig的子菜单。这就是Kconfig中表示的目录关系。
- source:内核源码目录树中每一个Kconfig都会用source引入其所有子目录下的Kconfig,从而保证了所有的Kconfig项目都被包含进menuconfig中。这个也说明了:如果你自己在linux内核中添加了一个文件夹,一定要在这个文件夹下创建一个Kconfig文件,然后在这个文件夹的上一层目录的Kconfig中source引入这个文件夹下的Kconfig文件。
- tristate:意思是三态(3种状态,对应Y、N、M三种选择方式),意思就是这个配置项可以被三种选择。
- bool:是要么真要么假(对应Y和N)。意思是这个配置项只能被2种选择。
- depends:意思是本配置项依赖于另一个配置项。如果那个依赖的配置项为Y或者M,则本配置项才有意义;如果依赖的哪个配置项本身被设置为N,则本配置项根本没有意义。depends项会导致make menuconfig的时候找不到一些配置项。所以在menuconfig中如果找不到一个选项,但是这个选项在Kconfig中却是有的,则可能的原因就是这个配置项依赖的一个配置项是不成立的。depends依赖的配置项可以是多个,还可以有逻辑运算。这种时候只要依赖项目运算式子的结果为真则依赖就成立。
- select:表示depends on的值有效时,下面的select也会成立,将相应的内容选上。
- default:表示depends on的值有效时,下面的default也会成立,将相应的选项选上,有三种选项,分别对应y,n,m。
- help:帮助信息,解释这个配置项的含义,以及如何去配置他。
Makefile
MODULE_NAME := driver_all
$(MODULE_NAME)-y := \
driver.o \
led.o \
key.o
obj-$(CONFIG_DRIVER_TEST) += $(MODULE_NAME).o
- 使用make menuconfig命令选择宏定义
使用"/DRIVER_TEST"查找目录:
接下来:
接下来Device Drivers —>Network device support —>driver_test_bool
如下图:
配置好后保存,检查根目录的.config文件是否生效。 - 使用make命令进行全编译。
- 如果没有报错,会生成相应的ko文件
注
这不是正式的驱动移植,驱动移植的具体细节还要具体debug