准备:

1、英语-是工具

2、电路原理图-补充“数电”的知识

3、阅读内核代码的能力

linux:vi+ctags+cscope

windows:source insight

驱动开发的步骤

I、编辑

模块的组成:

1、许可证的声明,许可证通常使用GPL协议,如果不声明许可证内核会产生“抱怨”信息,同时内核中的一些遵循GPL协议的功能函数将会无法使用,造成驱动功能受限。

2、加载函数,初始化模块,在使用insmod加载驱动模块时自动调用,该函数必须声明为int init_module(void),insmod调用时会自动加载这个函数。

3、卸载函数,恢复函数,在使用rmmod卸载驱动模块时会自动调用,函数必须声明为void cleanup_module(void),rmmod会自动调用这个函数。

完整示例代码:

hello.c

/**

* 驱动示例程序

* 实现驱动的加载和卸载

*/

//引入相应的头文件,内核和模块的头文件

#include <linux/kernel.h>

#include <linux/module.h>

//声明许可证信息,也可以使用这个来声明许可证

//MODULE_LICENSE("Dual BSD/GPL")

//这表示支持BSD和GPL两种协议

MOUDLE_LICENSE("GPL");

//insmod自动加载的函数,必须如此声明

int init_module(void)

{

//内核中打印信息,需要使用printk函数

printk("Hello world!!!");

return 0;

}

//rmmod自动调用的函数,必须如此声明

void cleanup_module(void)

{

printk("goodbey!!!");

}

保存

II、编译

使用内核的编译文件

1、拷贝代码到内核文件中;

2、修改对应的Kconfig/Makefile文件

3、使用make menuconfig命令选中对应的菜单项,<*>表示编译进内核,<M>表示编译成模块。

4、编译

make zImage

make modules

前者编译内核,后者编译模块,编译完成后生成相应的xxx.ko文件。

外部模块的编译,上面的方法必须要到内核的源文件中修改Kconfig和Makefile,实际操作中比较复杂,通常我们会采用这种编译方法。

使用内核文档查看编译的方法,进入Linux内核目录下的Documentation

使用命令make –C <path-to-kernel> M=`pwd`命令进行编译,该命令的使用依赖于内核源码树,必须针对特定的硬件平台,并且有编译过的内核。

其中make -C /lib/modules/3.2.0-29-generic-pae/build M=`pwd`,使用该命令提示错误,是因为在当前目录中缺少Makefile文件,现在建立Makefile文件输入以下代码:

obj-m += hello.o

保存再次编译

编译通过。

我们还可以通过一个通用的Makefile文件来完成这个步骤

代码如下:

ifeq ($(KERNELRELEASE),)

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

modules:

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

clean:

rm -rvf *.o *.ko *.mod.c module* Module*

.PHONY:modules clean

else

#修改hello.o文件为自己需要的文件即可

obj-m += hello.o

endif

编译生成hello.ko模块

III、测试

1、插入模块

sudo insmod hello.ko

当前的终端并没有显示输出的信息,这是因为终端默认会屏蔽掉所有的内核信息,解决方法有:

1、切入物理终端

2、使用dmesg显示当前的日志信息

3、vi /var/log/messages显示日志信息

2、lsmod列出当前系统动态加载的模块

3、rmmod hello 卸载模块,成功卸载的前提是存在/lib/modules/$(shell uname -r)/build目录

4、modinfo显示模块的信息

modinfo hello.ko显示如下信息:

5、modprobe 模块名-按依赖关系加载所有的模块,使用不多。

Linux设备驱动01的更多相关文章

  1. linux设备驱动第四篇:驱动调试方法

    http://www.cnblogs.com/donghuizaixian/archive/2015/04/02/4387083.html 上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神, ...

  2. linux设备驱动第四篇:从如何定位oops的代码行谈驱动调试方法

    上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试.在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序 ...

  3. (转)Linux设备驱动之HID驱动 源码分析

    //Linux设备驱动之HID驱动 源码分析 http://blog.chinaunix.net/uid-20543183-id-1930836.html HID是Human Interface De ...

  4. 浅谈Android系统移植、Linux设备驱动

    一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...

  5. linux设备驱动概述,王明学learn

    linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...

  6. Linux设备驱动工程师之路——内核链表的使用【转】

    本文转载自:http://blog.csdn.net/forever_key/article/details/6798685 Linux设备驱动工程师之路——内核链表的使用 K-Style 转载请注明 ...

  7. linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-119723.html linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟 xxxxxxxxxx ...

  8. linux设备驱动归纳总结(十二):简单的数码相框【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-116926.html linux设备驱动归纳总结(十二):简单的数码相框 xxxxxxxxxxxxxx ...

  9. linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...

随机推荐

  1. 剑指 offer set 3 旋转数组的最小数字

    总结 1. 没有重复元素的旋转数组可用 logn 时间内求出结果. 解法有两个步骤, 先是求出发生旋转的点(以 array[0] 为支点求得), 然后用正常的二分查找给出结果 2. 有重复元素元素的旋 ...

  2. PS拾色器(前景色背景色)快捷键

    快捷键 I 是拾色器 X 是前后色切换

  3. ubuntu13.04装配oracle11gR2

    http://jingyan.baidu.com/album/bea41d435bc695b4c41be648.html?picindex=2 http://www.360doc.com/conten ...

  4. AliasRegistry接口

    Spring - 4.2.3 // 将一个name注册为一个别名aliasvoid registerAlias(String name, String alias);// 移除一个别名aliasvoi ...

  5. Android(java)学习笔记264:Android下的属性动画高级用法(Property Animation)

    1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画 ...

  6. 【Linux/Ubuntu学习 13】ubuntu上好用的pdf软件okular

    step 1: 安装 sudo apt-get install okular step 2: 注释 按 F6 快捷方式打开注释功能,你会发现太神奇了. step 3: 中文配置 如果安装完成后中文显示 ...

  7. 【Android 界面效果19】Android中shape的使用

    Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结: 先看下面的代码:         <shape>      ...

  8. WebStrom9 体验nodejs

    之前就有体验过 WebStrom8.0.3 版本,确实不错. 最喜欢的是集成了Terminal 很方便的使用NPM,今天装上发现 Terminal 死活打不上字.什么原因! WebStrom9 在wi ...

  9. 100-The 3n + 1 problem

    本文档下载 题目: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_pro ...

  10. java处理高并发高负载类网站的优化方法

    java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF ...