驱动源码怎么编译-如何将驱动程序编译为模块

本文主要介绍“如何以模块的形式编译驱动程序”的相关知识。 小编将通过实际案例为您展示操作流程。 操作方法简单、快捷、实用。 希望这篇《如何以模块的形式编译驱动程序》一文能够帮助您解决问题。

要以模块的形式编译驱动程序,需要以下部分:

1 内核已经编译成功;

2 找到内核的arm编译器;

3 编译简单的驱动程序;

4 编译一个简单的Makefile,Makefile需要指向内核源码目录(编译成功的内核源码目录);

与文档一起的是“Makefile”、c 文件和 ko 文件驱动源码怎么编译,您可以使用它们进行测试。

要动态编译内核,首先需要编译内核源代码。 内核编译请参考《用户指南》第五章。

1. 内核和编译器路径

本节介绍内核路径、编译器路径。 Qt和Ubuntu的内核源代码都在android源代码包中,因此必须先将android源代码解压到Ubuntu14.04中。

如右图,作者的android源码在“/home/iMX6Q/iTOP-iMX6_android6.0.1”目录下,内核源码在“kernel_imx”目录下。

进入“kernel_imx”目录,查看“build_android_kernel.sh”中的脚本文件,如右图。

如上图所示,我们可以得到一些信息。 编译内核模块时,我们需要设置编译目标平台为arm,“exportARCH=arm”;

编译器的路径是“$(pwd)/../prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-”。理论上来说,这个编译器应该是使用,但在实践中

当以模块的形式编译内核驱动时,使用这个编译器很难编译! !

您应该使用编译器“../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编译器” ,没有提供更多解释,也没有提示方法,但是作者测试了几个内核驱动,都可以正常insmoded和rmmoded。

2.Makefile及测试驱动源码及编译

作者在“/home/imx6”目录下新建了“imx_driver_modules”目录,并将编译好的驱动和Makefile放在该目录下。

2.1 生成文件

Makefile脚本文件:

obj-m+=iTOP_IMX6_treedriver_hello.o

KDIR=/home/iMX6Q/iTOP-iMX6_android6.0.1/kernel_imx

PWD?=$(shellpwd)

全部:

make -C $(KDIR)M=$(PWD)modulesmodulesARCH=arm

CROSS_COMPILE=$(KDIR)/../prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-

干净的:

rm-rfmodules.order*.oworkqueue.oModule.symvers*.mod.c*.ko

在脚本中:

第一排

bj-m+=iTOP_IMX6_treedriver_hello.o 表示编译后的源文件为iTOP_IMX6_treedriver_hello.c,如果源文件名称发生变化,需要改为对应的。

第二行:KDIR参数指向对应的内核源代码目录。 笔者的内核源码在/home/iMX6Q/iTOP-iMX6_android6.0.1/kernel_imxx目录下,用户根据自己的具体情况进行更改。

第三行:PWD?=$(shellpwd)表示将当前目录的路径参数赋予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,源码如下:

#包括

#包括

MODULE_LICENSE("双BSD/GPL");

MODULE_AUTHOR(“iTOPEET_dz”);

静态inthello_init(无效)

printk(KERN_EMERG "Hello Worldenter!n");

返回0;

静态无效hello_exit(无效)

printk(KERN_EMERG "Helloworld 退出!n");

module_init(hello_init);

module_exit(hello_exit);

驱动源码只有基本的进入和退出功能。 复制“HelloWorldenter!” 和“Helloworldexit!” 分别在装载和卸载时。

2.3 编译

将源代码和Makefile复制到Ubuntu14系统中。

使用命令“make”驱动源码怎么编译,如右图,可以看到生成了“iTOP_IMX6_treedriver_hello.ko”文件。

使用命令“makeclean”,可以删除中间文件。

3、模块编译常见问题

菜鸟在以模块的形式编译驱动的过程中,可能会遇到以下问题。

1、内核源码未编译或内核源码路径设置不正确。

如果内核源码没有编译,模块会提示缺少库等错误; 如果路径设置不正确,会提示找不到内核。

2.源代码和Makefile是在Windows下编译的,然后复制到Ubuntu上,因为编辑器不同导致转码错误。

这些错误相对容易解决。 Make编译完成后,系统会提示Makefile或驱动文件中的特定行有问题。 使用vim编辑器打开检查发现有一些乱码,使用vim编辑器修正并编译。

4. 模块加载和卸载

笔者这里使用一个最小的linux系统来测试模块的加载和卸载。 用户指南第13章介绍了最小系统。 在编译模块之前,必须编译内核源代码。 笔者这里加载的是最小系统中的模块,所以内核源码也必须编译到qt内核中(最小系统使用的是qt内核),否则很难加载。

如右图,将驱动模块复制到开发板(笔者采用的是nfs共享目录方式,对于nfs可以参考群共享中的nfs相关文档,设备树和非设备Ubuntu通用。也可以使用TF卡或U盘)。

然后使用命令“insmodiTOP_IMX6_treedriver_hello.ko”加载驱动模块,如右图,复制出“HelloWorldenter!”,说明模块驱动加载成功。

然后使用命令“rmmodiTOP_IMX6_treedriver_hello”卸载模块,如右图,发现没有4.1.15目录,这里我们新建一个“/lib/modules/4.1.15”。

如右图,使用命令“mkdir/lib/modules/4.1.15”新建目录,再次使用命令“rmmodiTOP_IMX6_treedriver_helloello”卸载驱动模块。

复制消息“Helloworldexit!” 找到,模块卸载成功。

只要再次烧录系统,这个新目录就只需要建一次。

关于“如何以模块的形式编译驱动程序”的介绍就到此结束,感谢您的阅读。 如果您想了解更多行业相关知识,可以关注易速云行业资讯频道。 小编每天都会为您更新不同的知识点。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 驱动源码怎么编译-如何将驱动程序编译为模块 https://www.wkzy.net/game/183702.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务