一、什么是驱动?
最近了解了什么是驱动。linux内核主要通过设备树和驱动来控制硬件,例如音视频通过v4l2的驱动,usb通过字符驱动等等。简单点的说就是驱动是工作在内核空间,为上层提供必要的函数,上层应用通过调用这些函数就能间接的调用内核来驱动设备。
二、如何编译驱动
编译驱动之前先了解如何编译内核。
- 一般嵌入式都是工作在arm环境下,所以第一步就是安装交叉编译工具链。从官网下载解压后,在/usr/local下建立arm文件夹,将文件放入到该目录下,然后将路径加入到/etc/profile里。就可以了。
- 有了交叉工具链,就可以进行编译了。编译之前,先简单了解一下内核的组织架构、编译最后可以生成zimage和bzimage(压缩过后的链接文件),而这2者又依赖vmlinux。所以编译的目的就是生成该文件。该文件又是由一个个.o 文件链接而成。各个编译文件又是有各自的makefile编译而来的。各个编译文件又是由顶层的makefile进行控制的。所以只要配置最顶层的makefile即可。配置文件我们可以通过menuconfig 进行可视化配置,这点还是比较人性的。
- 有了上面的基础知识,就能够进行编译了。当然,编译不可能一帆风孙,通常需要各种依赖,根据报错即可足矣解决。一般会有以下几个错
(1)缺少库文件,使用sudo安装
(2)由于一般配置文件我们都是将当前系统的配置文件copy过来的,会有些初始化的东西被写入,根据提示清空就好了。 - 编译完成后,就可以进行驱动编译了。有个前提需要清楚,驱动是依赖与内核的,驱动的编译需要和未来安装的设备的内核版本保持一致。为什么呢?因为编译需要在内核大环境下进行。
KVERS = $(shell uname -r)
# Kernel modules
obj-m += hello_world.o
# Specify flags for the module compilation.
# EXTRA_CFLAGS=-g -O0
build: kernel_modules
kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
clean:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
5.编译完成会生成一个.ko文件,将他移植到目标版上,使用inmod就可以将驱动动态的安装到内核中,然后我们就可以在应用层调用驱动了。
总结
以上就是我对驱动一些自己的了解,以后边学边记录。