Linux单独编译设备树,迅为IMX6Q开发板-非设备树内核-单独编译内核驱动

内核驱动不仅可以将驱动编译到内核中,还可以动态的编译内核驱动。本文档介绍如何以模块的方式编译内核驱动。

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

9.5.2.1 内核和编译器路径

本节介绍内核路径、编译器路径

如下图所示,作者的 android 源码在“/home/imx6/iTOP-iMX6_android4.4.2”目录下,内核源码在其中的“kernel_imx”目录下。

ede7b1140c510f4b152cb104577eeb8e.png

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

2936f17f672835689dff4c30a53659b8.png

如上图所示,我们可以得到一些信息,在后面编译内核模块的时候,需要设置编译目标平台为 arm,“export ARCH=arm”;编译器的路径为“$(pwd)/../prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-”。

9.5.2.2 Makefile 文件

作者在“/home/imx6”目录下新建一个“imx_driver_modules”目录,将要编译的驱动和 Makefile 文件放到这个目录下。

Makefile 脚本文件:

obj-m += iTOP-iMX6_driver_hello.o

KDIR =/home/imx6/iTOP-iMX6_android4.4.2/kernel_imx

PWD ?= $(shell pwd)

all:

make -C $(KDIR) M=$(PWD) modules ARCH=arm

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

clean:

rm -rf modules.order *.o workqueue.o Module.symvers *.mod.c *.ko

脚本中:

第一行

0de642b4dd1af864b8b4d58481d6f691.gifbj-m += iTOP-iMX6_driver_hello.o 表示编译的源文件为 iTOP-iMX6_driver_hello.c,如果源文件名有变化,则需要修改成对应的。

第二行:KDIR 参数指向对应的内核源码目录。作者的内核源码是在/home/imx6/iTOP-iMX6_android4.4.2/kernel_imx 目录下,用户要根据自己的具体情况来改。

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

第五行:其中 make -C $(KDIR) M=$(PWD) modules,表示将当前目录下的文件编译为模块,并且制定了内核源码的路径;

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

其中 CROSS_COMPILE=$(KDIR)/../prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-,表示设置编译器路径,$(KDIR)为/home/imx6/iTOP-iMX6_android4.4.2/kernel_imx,所以这里完整的路径为“/home/imx6/iTOP-iMX6_android4.4.2/kernel_imx/../prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-”,正好指向作者内核编译器的路径。

9.5.2.3 简单驱动源码

驱动文件名称为:iTOP-iMX6_driver_hello.c,源码如下:

#include

#include

MODULE_LICENSE("Dual BSD/GPL");

MODULE_AUTHOR("iTOPEET_dz");

static int hello_init(void)

{

printk(KERN_EMERG "Hello World enter!\n");

return 0;

}

static void hello_exit(void)

{

printk(KERN_EMERG "Hello world exit!\n");

}

module_init(hello_init);

module_exit(hello_exit);

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

9.5.2.4 模块编译

如下图所示,将源码拷贝到Ubuntu系统下。

a467790ef8eb3fa0c36877d5a460aa6a.png

使用命令“make”,如下图所示,可以看到有“iTOP-iMX6_driver_hello.ko”文件生成。

146d2c0eee3ecdcaf2c583919ea10762.png

使用命令“make clean”,可以删除中间文件,如下图所示。

0b029d5bcdd0284dda6988016ab96cd6.png

9.5.2.5 模块编译常见问题

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

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

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

2.源码和 Makefile 文件在 Windows 下编写,然后拷贝到 Ubuntu 上,由于编辑器不同导致转码错误。

这种错误比较容易解决,Make 编译之后,系统会提示 Makefile 或者驱动文件具体某一行出现问题。使用 vim 编辑器打开查看一下,就能找出一些乱码,使用 vim 编辑器修正一下再编译即可。

9.5.2.6 模块加载和卸载

作者这里使用最小 linux 系统来测试模块的加载和卸载,最小系统在使用手册第十三章有介绍。在编译模块前,内核源码必须要编译通过,作者这里是在最小系统是加载模块,那么内核源码也必须编译为 qt 的内核(最小系统使用的是 qt 的内核),否则是无法加载的。

如下图所示,将 ko 文件拷贝到 u 盘上,启动开发板,将 U 盘插到开发板上(靠近网口的usb 接口),使用命令“mkdir /mnt/udisk”新建文件夹,使用命令“mount /dev/sda1/mnt/udisk/”挂载盘符,使用命令“cp -r /mnt/udisk/iTOP-iMX6_driver_hello.ko ./”将驱动模块拷贝到开发板。

b7b6b801869fe84ed4ec95b4072f9f40.png

然后使用命令“insmod iTOP-iMX6_driver_hello.ko”加载驱动模块,如下图示,打印出“Hello World enter!”,表明模块驱动加载成功。

4b68a480eda456181373c22bbcae3b3a.png

接着使用命令“rmmod iTOP-iMX6_driver_hello”卸载模块,如下图所示,发现提示没有目录“/lib/modules”,我们就按照提示新建目录。

bab4e30749a02948013bc61d25f63edc.png

如下图所示,使用命令“mkdir /lib/modules”新建目录,再次使用命令“rmmodiTOP-iMX6_driver_hello”卸载驱动模块,发现仍然提示没有“3.0.35-g0e09bb1-dirty”这个路径。

18d793445f0e353dddebc8ab133beb19.png

如下图所示,使用命令“mkdir /lib/modules/3.0.35-g0e09bb1-dirty”新建目录,再次用命令“rmmod iTOP-iMX6_driver_hello”卸载驱动模块,发现打印信息“Hello worldexit!”,模块卸载成功。

866d5cf9b17f17311bbd66c45218fd93.png

只要重新烧写系统,这些新建目录只需要建立一次即可。

9abdf7f6021eb6a8691c82fd8093fc4c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux+top+常用参数,linux的top命令参数详细说明

Linux中的top命令是个常用的命令之一,下面由学习啦小编为大家整理了Linux的top命令参数详细说明,希望对大家有帮助!linux的top命令简介top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windo…

linux中常用名词解释,科学网—linux中常见名词解释 - 武海丹的博文

Shell:是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。(当用户发出指令,其实先将这些指令发送给…

linux学习手册,Linux命令学习手册-ps

ps [选项]功能察看运行进程。举例显示所有进程$ps aux输入之后&#xff0c;输出如下&#xff1a;USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 3056 876 ? Ss 09:16 0:01 /sbin/initroot 2 0.0 0.0 0 0 ? S< 09:16 0:00 [kthreadd]root 2289 0.…

linux c 封装redis,封装hiredis——C++与redis对接(一)(string的SET与GET操作)

redis&#xff0c;总想着像Mysql一样&#xff0c;在C/C中进行对接。于是查询了一些资料&#xff0c;最后找到了hiredis。然而直接用它的话&#xff0c;难免有点不方便。于是&#xff0c;对其进行封装。hiredis直接去git上克隆&#xff0c;地址&#xff1a;https://github.com/r…

win8关闭uefi+linux,UEFI启动是什么?Win8关闭UEFI引导方式的方法

UEFI启动是什么?不少新电脑都给用户直接预装了Win8系统&#xff0c;后来使用又非常不习惯&#xff0c;因此想改成Win7系统&#xff0c;但是在换系统之前&#xff0c;需要在BIOS下关闭UEFI引导方式&#xff0c;可能很多朋友都不懂该如何关闭UEFI启动项。针对这个问题&#xff0…

C语言求x和y的乘积,计算方程式,求x,C语言中怎么计算x,y的值?

导航&#xff1a;网站首页 >计算方程式,求x,C语言中怎么计算x,y的值&#xff1f;计算方程式,求x,C语言中怎么计算x,y的值&#xff1f;匿名网友:(x-1)0吧&#xff0c;写题也这么不仔细呀。哈哈m/xn/(x-1)因为mn≠0&#xff0c;所以m≠0;n≠0&#xff1b;所以方程两边取倒数得…

c语言的单行注释范围,c语言中的注释,multi-line comment

在C/C语言中&#xff0c;在对源文件做预处理的时候&#xff0c;有两条基本原则&#xff1a;1、凡是以//开头的为单行注释2、凡是以\结尾的代表此行尚未结束于是预处理器在处理的时候会先按第二条规则&#xff0c;看每行的末尾的那个字符是不是”\”,是的话&#xff0c;就下一行…

c语言自动拷贝u盘文件,写了一个偷偷拷贝老师U盘所有文件的程序……蛋疼……………...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼直接双击运行&#xff0c;程序会每一秒检查一下是否有移动盘插入&#xff0c;如果有&#xff0c;就在C盘下新建一个文件夹copy&#xff0c;并把移动盘内所有的文件拷贝到C:\copy下。拷贝完成后自动退出。我想也没哪个老师会蛋疼的去…

android listview自动加载更多,如何实现 Android ListView『上拉加载更多』?

ListView上拉加载更多的UI需求(1)向上滑动 ListView&#xff0c;当最后一个条目滚入屏幕时开始加载更多条目&#xff0c;在列表底部增加一个 footerView&#xff1a;一个 infinite progressBar&#xff0c;一个 textView 显示 “Loading...”&#xff1b;(2)根据数据加载的结果…

android webview 字体 系统字体大小,Android 系统字体大小动态改变,导致webview中显示不兼容的问题解决...

唠叨几句&#xff1a;在移动端再开发的过程中&#xff0c;很容易使用到webview,它也是用来混合开发的中间桥梁&#xff0c;因此解决webview使用过程中出现的问题是非常有必要的&#xff1b;问题现象与发现&#xff1a;现象&#xff1a;日前&#xff0c;在是使用webview加载html…

android安全性发展,Android未来发展 安全是重点

自2008年首部Android手机问世以来&#xff0c;谷歌智能手机方面的发展也开始高歌勇进&#xff0c;经过近8年的发展&#xff0c;Android已经成为市场上最大的移动互联网操作系统&#xff0c;市场占有率位居第一&#xff0c;虽然其竞争对手iOS步步紧逼&#xff0c;但是由于Androi…

android 字符串调用方法名,AndroidJNI.CallStringMethod 调用字符串方法

AndroidJNI.CallStringMethod 调用字符串方法static function CallStringMethod (obj : IntPtr, methodID : IntPtr, args : jvalue[]) : stringDescription描述Calls an instance (nonstatic) Java method defined by methodID, optionally passing an array of arguments (ar…

android 服务器返回302,Android WebView 内处理302重定向不跳转的解决

最近项目中Webview加载第三方的具有302的重定向&#xff0c;但是却发现却没有重新跳转。最后发现问题如下&#xff1a;public boolean shouldOverrideUrlLoading(WebView view, String url) {super.shouldOverrideUrlLoading(view, url);.................return true&#xff…

c语言输入一个数求因数,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#includemain(){int n,q,p,m,k1,sum0,s[99999]{2},t[99999];//n是输入的数;q和p分别代表两个数组的工作下标scanf("%d",&n); //k是用来取小于n数的数组工作下标for(int i3;i<n;i2) //去所有小于n的数&…

android手机rom简单制作教程,【图片】ROM助手:任意安卓机型的ROM制作教程【a298t吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼很多机友都在求精简系统&#xff0c;求ROOT等等....但不会怎么办&#xff1f;我来告诉大家一个完美无缺的办法&#xff01;授人以鱼不如授人以渔......蘑菇ROM助手&#xff1b;点击系统精简&#xff0c;导入刷机包。之后我们可以看…

android 邮件分享链接,Android应用从通过电子邮件发送的链接打开

我们的用户不时收到电子邮件.更改密码当他们点击链接时,我想将它们发送到我们的网站,但我们的Android应用程序被打开.链接例如是https://www.ourdomain.com/change-password/{random-string}.我们的应用程序中已经启用了深层链接,但配置方式如下&#xff1a;android:host"…

android excel布局,Android实现仿excel数据表格效果

在没给大家分享代码之前&#xff0c;先给大家展示下效果图&#xff1a;1.activity/*** 采购需求* Created by Administrator on 2016/10/13.*/public class PurchaseRequireActivity extends BaseActivity implements PurchaseRequireView {Bind(R.id.appTitle)TextView appTit…

android 页面整体滑动,ScrollView 实现页面整体滑动

页眉整体垂直方向滑动&#xff0c;xml文件较为简单&#xff0c;只需要在需要滑动的布局文件中包裹一层ScrollView就可以实现。示例&#xff1a;xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schemas.android.com/tools"android:…

首款搭载鸿蒙os的设备,华为发布会配件汇总,首款搭载 鸿蒙OS 的设备来了

2020 年 10 月 30 日&#xff0c;华为召开 Mate40 系列发布会&#xff0c;正式发布 Mate40 系列手机。除了手机&#xff0c;本次发布会还发布了华为 Watch GT2 Pro 手表、华为 Sound 音箱等配件。以下是详细情况&#xff1a;华为智选智能摄像头 Pro该设备是首款搭载 HarmonyOS …

html 纵向选项卡,竖直选项卡式面板的实现_html/css_WEB-ITnose

前面的话&#xff1a;我是html的初学者&#xff0c;懂得一些html的基本知识。最近开始学css&#xff0c;不会JavaScript。了解到adobe dw cs5的插入->spry有选项卡式面板的设计&#xff0c;对这个很感兴趣。但是发现默认的是tab水平排列在上面的。然而多数网站都是tab竖直排…