mini2440:最简单的嵌入式linux驱动程序模块,mini2440:最简单的嵌入式Linux驱动程序模块 解决找不到mini2440……sample...

原文:http://myswirl.blog.163.com/blog/static/5131864220109143331356/

注意:开发Arm平台的驱动,需要Arm平台的源码树;

注意:ARM平台的linux内核源码需要先编译,否则无法编译驱动;第一种方式:编译进内核,共6步

第1步:建立源码树

解压安装Linux 内核源代码在工作目录/opt/FriendlyARM/mini2440 中执行:

#cd /opt/FriendlyARM/mini2440

#tar xvzf /tmp/linux/linux-2.6.32.2-mini2440-20100106.tar.gz

将创建生成linux-2.6.32.2 目录,里面包含了完整的Linux-2.6.32.2 内核源代码说明:20100106 是我们的发行更新日期标志,请以光盘中实际日期尾缀为准。

第2步:编辑驱动源文件

mini2440_hello_module.c

该文件所在目录:/opt/FriendlyARM/mini2440/linux-2.6.32.2/drivers/char/

*********************************************************************************************

#include

#include

static int __init mini2440_hello_module_init(void)

{

printk("Hello, Mini2440 module is installed !\n");

return 0;

}

static void __exit mini2440_hello_module_cleanup(void)

{

printk("Good-bye, Mini2440 module was removed!\n");

}

module_init(mini2440_hello_module_init);

module_exit(mini2440_hello_module_cleanup);

MODULE_LICENSE("GPL");

*********************************************************************************************

第3步:编辑配置文件linux-2.6.32.2/drivers/char/Kconfig

增加如下字段,如图所示:

2384e0f0691b5d6b06c61d63d1cf5fd4.png

保存退出,这时在

linux-2.6.32.2

目录“/opt/FriendlyARM/mini2440/linux-2.6.32.2"位置运行一下

#cp config_mini2440_t35 .config     ;t35后面有个空格,然后有个“.”开头的config

#make menuconfig

就可以在Device Drivers---> Character devices 菜单中看到刚才所添加的选项了,按下空格键将会选择为,此意为要把该选项编译为模块方式;再按下空格会变为,意为要把该选项编译到内核中,在此我们选择,如图:

afe571d2fc73eba583222c1468856b5e.png 第4步:编辑linux-2.6.32.2/drivers/char/Makefile 通过上一步,我们虽然可以在配置内核的时候进行选择,但实际上此时执行编译内核还是不能把mini2440_hello_module.c 编译进去的,还需要在Makefile 中把内核配置选项和真正的源代码联系起来,打开 linux-2.6.32.2/drivers/char/Makefile,如图添加并保存退出:

6759f05d7b5de2923c9005a7ae066f46.png

第5步:编译驱动模块

这时回到linux-2.6.32.2 源代码根目录位置

/opt/FriendlyARM/mini2440/linux-2.6.32.2

#make modules

就可以生成我们所需要的内核模块文件mini2440_hello_module.ko 了,如图:

62ce0fb77292542d11522a244bfc600c.png

至此,我们已经完成了模块驱动的编译。

第6步:加载驱动模块

将把编译出的mini2440_hello_module.ko下载到板子中,并把它移动到/lib/modules/2.6.29.4-FriendlyARM目录,然后在板子中现在执行

#modprobe mini2440_hello_module

可以看到该模块已经被装载了(注意:使用modprobe 命令加载模块不需要加“ko”尾缀),再执行以下命令,可以看到该模块被卸载

#rmmod mini2440_hello_module

注意:要能够正常卸载模块,必须把模块放入开发板的/lib/modules/2.6.29.4-FriendlyARM 目录

注意:内核有时会升级更新,如果内核版本已经改变,请依照具体的内核版本重新建立一个模块存放目录,在此为/lib/modules/2.6.29.4-FriendlyARM。

第二种方式:动态加载

内核驱动模块的结构hello.c

#include#includestaticinthello_init(void){printk(KERN_ALERT"Hello, World!\n");return0;}staticvoidhello_exit(void){printk(KERN_ALERT"Goodbye, cruel world!\n");}module_init(hello_init);module_exit(hello_exit);

MODULE_LICENSE("Dual BSD/GPL");

源文件hello.c同目录下一个简单的Makefile文件:

KERNELDIR=/opt/FriendlyARM/mini2440/linux-2.6.32.2

PWD:=$(shell pwd)

INSTALLDIR =/lib/modules/2.6.29.4-FriendlyARM

CROSS_COMPILE=arm-linux-

CC=$(CROSS_COMPILE)gcc

obj-m:=hello.o

.PHONY:modules modules_install clean

modules:

$(MAKE)-C$(KERNELDIR)M=$(PWD)modules

modules_install:

cp hello.ko $(INSTALLDIR)

clean:

rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versions

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

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

相关文章

机器学习-tensorflow

为什么80%的码农都做不了架构师?>>> 例子1 先从helloworld开始: tubuntu:~$ python Python 2.7.6 (default, Oct 26 2016, 20:30:19) [GCC 4.8.4] on linux2 Type "help", "copyright", "credits" or "license&qu…

C# 多个异步方法的异常处理

、如果调用两个异步方法,每个都会抛出异常,该如何处理呢 ? 在下面的示例中,第一个 ThrowAfter 方法被调用,2s 后抛出异常(含消息 first)。该方法结束后,另一个 ThrowAfter 方法也被调用,1s 后也抛出异常。…

linux解pdf隐写工具,Linux版PDF解密工具PDFDecryptionTool-Deepin-amd64.deb下载

PDF解密工具PDFDecryptionTool的deb安装包提供下载了,可用在Deepin 20.2等Linux发行版中。该工具用于解除PDF文件的所有者权限的密码,解除编辑、复制等限制。另外,PDFDecryptionToolWin.py为Windows版本,针对Windows优化了下UI&am…

Mysql中explain命令查看语句执行概况

Mysql中可以使用explain命令查看查询语句的执行方式,使用方法举例:explain 查询语句 例如:explain select * from user_info 几个重要的字段说明: table:此次查询操作是关联哪张数据表 type:连接查询操作类…

Android之java.lang.UnsatisfiedLinkError(Failed to register native method ***callMethod1())解决办法

1、问题 Failed to register native method com.example.chenyu.test.JniClient.callMethod1() java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/com.example.chenyu.test-2/lib/arm/libFirstJni.so" 如下图 2、解决办法 原因:…

代码段编辑器SnippetEditor 2.1

1.选择程序版本 2.可以创建文件夹 3.新建片段 4.给片段取名 5.双击进行编辑 6.点击保存 7.直接使用 转载于:https://www.cnblogs.com/shiworkyue/p/3844993.html

HUAWEI nova 青春版闪速快充,让追剧不再断电

笔者是一个对追剧到极致要求的人,每每有好看的影剧出来,都迫不及待想要一次看个够本。但是事与愿违,手机总是很不争气,虽然电池续航能力不算太差,但是对于我们这种追剧重症患者来说是完全不够的,每次出门还…

飞信linux下载文件,OpenFetion(飞信for Linux)

这是OpenFetion(飞信for Linux),openfetion是使用GTK 编写的基于libofetion的用户界面。软件功能程序简洁轻快,界面美观,支持libofetion当前提供的所有功能。软件优势它是目前GNU/Linux平台上最优秀的飞信客户端程序,也是基于libo…

免费开源Blazor在线Ico转换工具

1. 功能效果演示 仓库地址:IcoTool[1]在线演示地址:https://tool.dotnet9.com/ico[2]演示下文件上传、转换结果:通过该工具及代码,能了解到:使用Blazor怎么上传文件到服务器(Blazor Server)。怎么从服务器下载文件。如…

【02】CC - 有意义的命名

为什么80%的码农都做不了架构师?>>> 1、提防使用不同之处较小的名称 XYZControllerForEfficientHandlingOfStrings 与 XYZControllerForEfficientStorageOfStrings 在IDE下,都有自动补全,这种细微的差别,容易补全错&a…

linux7 语言包,Centos 7中文语言包的安装及中文支持

1、修改配置文件etc/locale.confLANG"zh_CN.UTF-8"2、查看更改后的系统语言变量[root5c46832b5c01 ~]# localelocale: Cannot set LC_CTYPE to default locale: No such file or directorylocale: Cannot set LC_MESSAGES to default locale: No such file or direct…

如何在构建docker镜像时执行SonarQube扫描.NET Core应用

前言SonarQube是一款静态代码质量分析工具,它常用于检测代码中的Bug、漏洞和代码异味,并且能够集成在IDE、Jenkins、Git等服务中,方便随时查看代码质量分析报告。一般情况下,我们在Jenkins管道中配置SonarQube,在编译过…

Win10系列:VC++ Direct3D模板介绍1

Visual Studio为开发Direct3D应用程序提供了便捷的模版,读者可以不必手动去新建Direct3D中所使用到的基础资源,而只需专注于图形的绘制。本小节主要为读者介绍这个模版中用于绘制图形的主要函数及其功能,为了能让读者更为清楚地了解如何使用此…

linux+arch系统下载,Linux

大小: 695MB更新时间:2021-02-04适用电脑:系统盘大于20G超过1GMHz的处理器最佳64位处理器Arch Linux是一份独立开发的、为i686优化的Linux发行,它面向高级Linux用户。它使用自行开发的包管理器pacman来为最新的应用软件提供 更新升…

Android---AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(…

C# 实例解释面向对象编程中的里氏替换原则

在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特C马丁(Robert Cecil Martin)提出的许多原则的子集,在他2000年的论文《设计原则与设计模式》中首次提出…

Android之JNI ERROR (app bug): accessed stale global reference 0xb39533f2 (index 19708 in a table of s

1、问题 2、原因 我在jni里面是这样写的 (*env)->CallVoidMethod(env, obj, method3, "chenyu"); 3、解决办法 把这个 (*env)->CallVoidMethod(env, obj, method3, "chenyu"); 改为这个 (*env)->CallVoidMethod(env, obj, method3, (*env)-&g…

工业互联网的最后一公里

最后一公里,出自中国共产党十八大以来的新名词之一,指政策始终“走在路上”,服务始终“停在嘴上”,实惠没有真正“落在身上”的“末梢堵塞”问题。要让人民群众真正得实惠,就要切实解决好“最后一公里”问题。1、移动互…

介绍这个库:C# Blazor中显示Markdown文件

1 讲目的 前几天上线了一个在线Icon转换工具[1],为了让大家使用放心,改了点代码,在转换下载Icon图标后立即删除临时文件,并在工具下面贴上了工具的开发步骤和代码,大家看这样改是否合适,见Issue 1[2]。这篇…

Linux 信号量 生产者消费者小例题

菜鸟偶遇信号量,擦出火花(只有不熟才会有火花)。于是上网搜资料和看《Unix环境高级编程》实现了几个小例题,高手请勿喷!这几位写得非常好啊: 题目来源: http://www.it165.net/os/html/201312/70…