准备:

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. careercup-高等难度 18.9

    18.9 随机生成一些数字并传入某个方法.编写一个程序,每当收到新字符数字时,找出并记录中位数. 类似:设计一个数据结构,包括两个函数,插入数据和获得中位数 解法: 一种解法是使用两个优先级堆:一个大 ...

  2. tar备份工具

    一.tar命令的基本格式 在UNIX.Linux系统中,有许多命令可以用于备份数据,其中最常见的命令是tar命令..tar是UNIX和Linux系统中的打包工具,可以将多个文件或目录打包(也称为归档) ...

  3. jquery ui 改写cloes事件

    htmlAjax:{//模板ajax请求参数设置项            url:"template/task/task_create.html",            data ...

  4. 关于调试程序接收通过adb发送带有参数的广播问题

    一句话,如果你检查完格式没有错:关于通过adb启动Activity.activity.service以及发送broadcast的命令 am broadcast -a myAction --es cit ...

  5. myecplise 打开报错 Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project 'myf'. Java.lang.NullPointerException

    Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project 'myf'.Java.l ...

  6. 跨平台轻量级redis、ssdb代理服务器(C++ 11编写)

    dbproxy 是我业余采用C++11编写的跨平台代理服务器(并使用lua和自己的网络库),以扩展系统负载,同时使用多个后端数据库,后端数据库支持redis和ssdb. 需要由用户自己编写lua脚本控 ...

  7. 3. Android框架和工具之 xUtils(DbUtils )

    1. xUtils简介 xUtils 包含了很多实用的android工具.xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓 ...

  8. 【Android Studio使用教程 7】AndroidStudio问题汇总

    FindBugs:Compiler output path for module can not be null. check your module/project settings问题原因 And ...

  9. js 每秒刷新系统时间,可停止

    <title>无标题页</title> <script language="javascript" type="text/javascrip ...

  10. 关于JPA方法名创建自动查询

    JPA 的根据解析方法名称自动对接口进行实现的方法能节省大量的资源,以下对于解析规则进行列举哈 商品实体类 package com.dionren.zhaoxie.entity.trade; impo ...