文档章节

Linux 嵌入式驱动开发:hello world

宁宁爸
 宁宁爸
发布于 2015/12/09 14:29
字数 1306
阅读 185
收藏 3

1、代码编写,只有一个文件,内容如下

文件名为:mini2440_hello_module.c

#include <linux/kernel.h>
#include <linux/module.h>

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");

注解:

A、两个头文件是必须的,不要问为什么

B、mini2440_hello_module_init() 驱动加载函数,也是必须的

C、mini2440_hello_module_cleanup()驱动卸载函数,也是必须的

D、module_init(mini2440_hello_module_init) 你想让你的驱动运行起来,就必须有这个

E、module_exit(mini2440_hello_module_cleanup) 和 module_init 的意义刚好相反

B、MODULE_LICENSE("GPL"); 用于声明模块的许可证

2、驱动安装

驱动程序的安装有两种方式,第一种是模块方式,第二种是直接编译进内核

       这里我就讲讲如何修改相应的配置文件,增加内核的配置菜单选项吧。这里涉及到两个文件一个是makefile和kconfig,makefile的作用就是编译,具体的来说就是写好一个程序你就必须写好它的makefile文件。kconfig的作用就是使得写好的驱动能增加到图形配置菜单中,简单来说,就是你想在内核配置菜单中看到你的内核选项,你就必须修改kconfig文件。

      ,下面我们就来讲讲如何修改makefile文件以及kconfig文件吧。假如我们写好了一个驱动程序,然后呢放在了drivers/char目录下,而且文件名为mini2440_hello_module.c。首先,我们先修改同目录下的makefile文件吧,如何修改呢?很多时候一打开一看怎么密密麻麻的呢,其实没关系的,你没看到吗?大部分的格式其实是一摸一样的,这就简单了,我们也依葫芦画瓢吧,我们加这一句: obj-$(CONFIG_MINI2440_HELLO)  += mini2440_hello_module.o

对于这个语句是什么意思,我也不想在这里说的太详细了,最右边那个是我们的驱动文件的文件名,至于右边那个CONFIG是必须的,而那个MINI2440_HELLO呢,是我们等一下在Kconfig文件中要用到的。接着我们修改同目录下的Kconfig文件,找到menu“Character devices”在这下面开始添加吧,添加的内容如下:

config MINI2440_HELLO
	tristate "MINI2440 BOARD HELLO TEST"
	depends on ARCH_S3C2440
	default m if ARCH_S3C2440
	help
	  MINI2440 Board First module test.

在这里我也简单讲解一下上面这几条语句吧,最上面的config是必须的,这是它的格式这样说吧。下面一句呢,是它在内核配置单上显示的文字了,下面的那句是它的依赖,也就是说只有ARCH_S3C2440配置好了,我们才能配置这一驱动。最后的是它的帮助信息,以后你按照它的格式照着写就好了。懂了吧! 

     接着就是照着之前讲的如何编译内核编译一下内核了。输入:make menuconfig,将刚刚的模块选择为M吧,然后编译内核,把内核镜像烧进开发板。最后使用命令make SUBDIR=drivers/char/

modules再编译。得到mini2440_hello_module.ko这个就是我们要的驱动模块了,我们把它加到开发板,加载的方式有很多种,我一般是用串口加进开发板的。在开发板的lib目录下输入rz即可下载了。  

  ok,假如你已经成功下载驱动模块到开发板了,这时候你需要做的是加载驱动模块了,为了形象生动点,我就截图了吧:

注意:在执行make menuconfig,图形化界面中

Device Drivers -->....Character devices -->

下可能不会出现

MINI2440 BOARD HELLO TEST

选项,

需要进行以下动作,则会出现此选项

 #make menuconfig命令进入内核配置界面,进入到“System Type”选项配置菜单,将S3C2440 Machines选项下做如下选择:只选择SMDK2440和SMDK2440 withS3C2440 CPU module两个选项。


Linux操作系统中模块操作相关命令解释
lsmod  查看已经安装好的模块, 也可以查看/proc/modules文件的内容. 实际上,lsmod读命令就是通过查看/proc/modules的内容来显示模块信息的.
modinfo 显示模块信息
modprobe  不需要指定路径,它会到默认路径下寻找模块。模块也存在依赖性问题: 比如你要加载msdos.ko, 需要先加载fat.ko. modprobe查看/lib/module/version/modules.dep得知模块的依赖关系
rmmod 卸载模块,但是内核会认为卸载模块不安全,可以添加命令强制卸载。
depmod 检查系统中模块之间的依赖关系,并把依赖关系信息存于/lib/modules/2.6.18-1.2798/modules.dep中。 一般加载模块后,要命令行下先执行 depmod -a后,在系统加载模块时候会查看modules.dep中模块依赖及路径信息,这样子才可以成功加载需要模块。
insmod 加载模块,需要指定完整的路径和模块名字。


注:本人遇到的问题

模块需要上传到:

/lib/modules/2.6.32.2

下,rmmod命令才会起作用,【2.6.32.2】为linux kernel版本号

如图



© 著作权归作者所有

宁宁爸
粉丝 82
博文 58
码字总数 26478
作品 0
高级程序员
私信 提问
嵌入式Linux学习基础规划篇

嵌入式的学习是需要日积月累的,是通过一点一滴的积累才能成为大神。下面来介绍一下嵌入式linux学习基础规划,目标是达到适应嵌入式应用软件开发、嵌入式系统开发或嵌入式驱动开发的基本素质...

创客学院
2018/04/10
0
0
【广州、深圳、珠海】我想找一份嵌入式linux软件开发工作,但简历写得不好望高手指点,谢谢

大学至今一直对嵌入式linux C/C++ 学习,至今拥有2年的嵌入式系统项目经验,并且有很好的 Linux C/C++ 代码规范能力。专注嵌入式Linux C/C++开发,嵌入式Linux驱动开发,Android底层开发工作...

龙眼鸡
2013/05/18
1K
2
什么是嵌入式开发?嵌入式是什么?初学者必看。

嵌入式技术是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统技术。它最初起源于单片机技术, 是各类数字化...

Midnight
2011/09/20
3K
2
嵌入式工程师有前途吗 嵌入式开发的职业发展方向是什么

嵌入式早在70年代出现到现在,有将近30年的发展历史,能够长久存在并且可持续发展。从工程师起步, 一般有几个发展方向,一个是成为技术方面的核心,领域内的专家;另一个是从项目中锻炼起来...

创客学院
2018/04/08
0
0
嵌入式技术火热程度不减,新手小白入行该如何学?

嵌入式可以说是当下有前途的IT应用领域,小到电子词典、手机,大到航空航天设备都是典型的嵌入式系统,因此,通过嵌入式技术人才的职业发展空间是非常大的。那么想进入嵌入式行业,新手小白学...

纤纤郡主
02/19
15
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
12
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部