迅为-iMX6开发板-设备树驱动-以module的方式编译驱动

内核驱动不只能够将驱动编译到内核中,还能够动态的编译内核驱动。本文档介绍如何以linux

模块的方式编译内核驱动。android

以 module 的方式编译驱动,须要如下几个部分:shell

1 内核成功编译过;vim

2 找到内核的 arm 编译器;编辑器

3 编译简单驱动;ide

4 编译简单的 Makefile 文件,Makefile 文件中须要指向内核源码目录(成功编译过的内函数

核源码目录);测试

和文档在一块儿的有“Makefile”、c 文件和 ko 文件,你们能够用来测试。ui

要动态的编译内核,首先须要将内核源码编译经过,内核的编译请参考使用手册第五章。idea

1 内核和编译器路径

本节介绍内核路径、编译器路径。不管是 Qt 和 Ubuntu 的内核源码,都是在 android 源

码包中,因此必须先解压 android 源码到 Ubuntu14.04 中。

以下图所示,做者的 android 源码在“/home/iMX6Q/iTOP-iMX6_android6.0.1”目录

下,内核源码在其中的“kernel_imx”目录下。

进入“kernel_imx”目录,查看“build_android_kernel.sh”中的脚本文件,以下图所

示。

如上图所示,咱们能够获得一些信息,在后面编译内核模块的时候,须要设置编译目标平

台为 arm,“export ARCH=arm”;

编译器的路径为“$(pwd)/../prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-

4.9/bin/arm-linux-androideabi-”。理论上,应该使用这个编译器,可是实际上以

modules 的方式编译内核驱动的时候,使用这个编译器,是没法编译的!!

应该使用“../prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-”这个编译器

才行,以下图所示。

编译器路径为内核源码目录对应的../prebuilts/gcc/linux-x86/arm/arm-eabi-

4.8/bin/arm-eabi-”,这是做者测试出来的,做者没有太多时间深刻研究编译脚本,可是这

个编译器是能够的。前面红色部分介绍的编译器,会提示报错,对于这个报错,飞思卡尔官方

给出的是简单的回复“你使用了 android 的编译器”,没有提供更多的解释,也没有提示方

法,不过做者测试了几个内核驱动,都是能够正常 insmod 和 rmmod 的。

2 Makefile 和测试驱动源码以及编译

做者在“/home/imx6”目录下新建一个“imx_driver_modules”目录,将要编译的驱

动和 Makefile 文件放到这个目录下。

2.1 Makefile

Makefile 脚本文件:

脚本中:

第一行:obj-m += iTOP_IMX6_treedriver_hello.o 表示编译的源文件为

iTOP_IMX6_treedriver_hello.c,若是源文件名有变化,则须要修改为对应的。

第二行:KDIR 参数指向对应的内核源码目录。做者的内核源码是在

/home/iMX6Q/iTOP-iMX6_android6.0.1/kernel_imxx 目录下,用户要根据本身的具体状况

来修改。

第三行:PWD ?= $(shell pwd)表示将当前目录的路径赋值给 PWD 变量,也就是

/home/imx6_tree_driver/iTOP_IMX6_treedriver_hello。做者将会把 Makefile 文件和驱动

源码放到这个目录下编译。

第五行:其中 make -C $(KDIR) M=$(PWD) modules,表示将当前目录下的文件编译

为模块,而且制定了内核源码的路径;

其中 ARCH=arm 表示设置目标 CPU 类别为 arm,也就是编译的依赖内核和驱动模块目

标 CPU 为 ARM;

其中 CROSS_COMPILE=$(KDIR)/../prebuilts/gcc/linux-x86/arm/arm-eabi-

4.8/bin/arm-eabi- ,这里的路径,指向内核编译器的路径。

2.2 简单驱动源码

驱动文件名称为:iTOP_IMX6_treedriver_hello.c,源码以下:

驱动源码只有基本的入口和出口函数。加载和卸载的时候分别打印“Hello World

enter!”和“Hello world exit!”。

2.3 编译

将源码和 Makefile 文件拷贝到 Ubuntu14 系统下。

使用命令“make”,以下图所示,能够看到有“iTOP_IMX6_treedriver_hello.ko”文件

生成。

使用命令“make clean”,能够删除中间文件。

3 模块编译常见问题

在以模块的方式编译驱动的过程当中,新手可能会如下问题。

1.内核源码没有编译或者内核源码路径设置不正确。

若是内核源码没有编译,那么模块将会提示缺乏库之类的错误;若是路径设置不正确,会

提示找不到内核。

2.源码和 Makefile 文件在 Windows 下编写,而后拷贝到 Ubuntu 上,因为编辑器不一样

致使转码错误。

这种错误比较容易解决,Make 编译以后,系统会提示 Makefile 或者驱动文件具体某一

行出现问题。使用 vim 编辑器打开查看一下,就能找出一些乱码,使用 vim 编辑器修正一下

再编译便可。

4 模块加载和卸载

做者这里使用最小 linux 系统来测试模块的加载和卸载,最小系统在使用手册第十三章有

介绍。在编译模块前,内核源码必需要编译经过,做者这里是在最小系统是加载模块,那么内

核源码也必须编译为 qt 的内核(最小系统使用的是 qt 的内核),不然是没法加载的。

以下图所示,将驱动模块拷贝到开发板(做者采用的是 nfs 共享目录的方式,关于 nfs 大

家能够参考群共享中 nfs 相关的文档,设备树和非设备的 Ubuntu 都通用。也能够用 tf 卡或

者 U 盘)。

而后使用命令“insmod iTOP_IMX6_treedriver_hello.ko”加载驱动模块,以下图示,

打印出“Hello World enter!”,代表模块驱动加载成功。

接着使用命令“rmmod iTOP_IMX6_treedriver_hello”卸载模块,以下图所示,发现提

示没有目录 4.1.15,这里咱们新建“/lib/modules/4.1.15”。

以下图所示,使用命令“mkdir /lib/modules/4.1.15”新建目录,再次使用命令

“rmmod iTOP_IMX6_treedriver_helloello”卸载驱动模块。

发现打印信息“Hello world exit!”,模块卸载成功。

只要从新烧写系统,这些新建目录只须要创建一次便可。

相关文章
相关标签/搜索