一、驱动编译到内核的主要方式
linux下驱动编译到内核有2种方式:
1)静态编译
2)动态编译
静态编译就是将下载好的驱动源码,整合到kernel内核的源码之中,再通过图形界面来配置相应的选项,配置好选项后保存退出,然后编译,最后编译出来的是一个整合后用于烧录的文件,这里将会把文件命名为uImage。
动态编译就是将下载好的源码编译成.ko文件,最后通过insmod命令去板端加载这个ko文件。
选择静态编译还是选择动态编译看你的需求而定。
一、静态编译
这里只详细讲解如何将相关的模块选项添加到图形界面,在到图形界面(make menuconfig)之前的步骤已省略,在这之前的教程一搜一大堆,这里就不重复了。
1. 关于下载的驱动
1)驱动源码在kernel源码中的存放位置
驱动源码应该放在内核源码中的什么目录下,一般与该驱动的类型相关,比如你下载的是wifi模块的驱动,那一般我们会把wifi模块的驱动源码放到.../linux-3.10.y/drivers/net/wireless
这个路径下;又比如你下载的是字符类型的驱动,那一般会放到.../linux-3.10.y/drivers/char这个路径下;如果你实在不知道应该放在哪里,那就放在.../linux-3.10.y/drivers,只要最后能在图形界面找到就可以了。
2)驱动源码相关文件的修改
驱动源码要修改的文件只有2个:
Kconfig
Kconfig文件用来描述图形界面的相关选项的信息,比如该选项满足哪种类型的选择属性(<>(Y/N/M),【】[Y/N] …),比如该选项相关的描述信息等等,如果没有存在Kconfig则要自己创建,以wifi模块为例,创建完后添加你要加的内容如下(如果已经存在Kconfig则不用修改):
config RTL8821CU
tristate "Realtek 8821C USB WiFi"
depends on USB
---help---
Help message of RTL8821CU
RTL8821CU这个宏是可以任意命名的,而"Realtek 8821C USB WiFi"是这个选项的名称,tristate是指将该选项的选择属性设置为三态,即Y/N/M,depends on是说明依赖关系,如果不知道写什么就保留depends on,后面不需要加什么信息,最后的help就是关于该选择的描述信息,这个可有可无。
Makefile
Kconfig是描述选项,则Makefile是给选项添加链接关系。相同的操做,没有则创建,然后修改如下:
obj-$(CONFIG_RTL8821CU)+=wifi.o
2. 关于内核源码的修改
内核源码要修改的文件和驱动一样只有2个:Kconfig和Makefile,这两个文件在于驱动的上一层目录,比如驱动源码路径为drivers/net/wirless/wifi,则要修改的是drivers/net/wirless这个路径下的Kconfig和Makefile。
Kconfig
在Kconfig的最后一行添加如下代码:
source "drivers/net/wirless/wifi/Kconfig"
Makefile修改如下:
obj-$(CONFIG_RTL8821CU) +=wifi/
修改完以上文件之后,在telminal终端输入make menuconfig再次进入图形界面时,便会看到相应的选项已经出现了(如下图)。选项的位置是和你驱动源码的路径相关的,驱动放在内核源码中的路径越深,则在图形界面中对应的选项路径也会越深。
选择help选项,可以查看描述信息:
二、动态编译
这里依旧以wifi模块为例。下载了相应的驱动源码之后,只需修改Makefile文件,主要的修改如下:
obj-$(CONFIG_RTL8821CU)+=wifi.o//需要编译的文件
ARCH = arm
CROSS_COMPILE = /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-
KSRC := /disk2/SVN/mywork/work/HisiSDK/Hi3531A_SDK_V1.0.5.0/osdrv/opensource/kernel/linux-3.10.y
all: modules
modules:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KSRC) M=$(shell pwd) modules
ARCH是编译的平台,CROSS_COMPILE是编译链所在的路径,在ubuntu上一般通过echo $PATH命令能看到编译链所在的路径,KSRC是内核源码的路径。修改完Makefile之后直接在terminal终端输入make命令,就可以完成编译了,在当前目录下会得到ko文件,而后只需要把ko文件放到板端insmod就完成了。