准备:

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. Java图片处理(二)图片加水印

    图片加水印,是通过图片重叠绘制实现的.实现代码如下: public static void press(String pressImg, String pressText, String target ...

  2. C#开源项目

    原文:  http://alance.iteye.com/blog/693987 一.AOP框架        Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了 ...

  3. scala目录

    1. 使用Scala(构建这样一个应用,它会取回一份列表,其中包括用户持有的股票的代码以及股份,并告知他们在当前日期为止的这些投资的总价.这包含了几件事:获取用户输入.读文件.解析数据.写文件.从We ...

  4. PHP|开发必知的良好实践

    过滤.验证.转义 所有这些外部资源都不能完全相信 $_GET $_POST $_REQUEST $_COOKIE $argv php://stdin php://input file_get_cont ...

  5. C++ 设计模式2 (面向对象设计原则)

    1. 变化是复用的天敌! 面向对象设计的最大优势在于 : 抵御变化 2. 重新认识面向对象 理解隔离变化: 从宏观层面来看,面向对象的构建方式更能适应软件的变化, 能将变化所带来的影响减为最小. 各司 ...

  6. Git_Windows 系统下Git安装图解

    Windows 系统下Git安装图解  心得  :很成功~ 简单来说Git是一个免费的.开源的版本控制软件,从功能上讲,跟我们比较熟悉的Subversion(SVN)这类版本控制软件没什么两样.由于工 ...

  7. [Java] SSH框架笔记_框架分析+环境搭建+实例源码下载

    首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...

  8. 【阿里云产品公测】PTS测试 SLB+ECS+RDS组合的DZ论坛负载极限压力,100并发2000页

    作者:阿里云用户woaj01 ​​环境介绍: 1.ECS:1核 1G 5M 杭州 2.RDS:240M  5G  杭州内网 3.SLB:私网实例​ 配置测试环境: 测试脚本: 1.生成参数文件,我的方 ...

  9. iOS - UI - UISegmentedControl

    1.UISegmentedControl NSArray * array = @[@"red",@"green",@"yellow",@&q ...

  10. c# 匿名对象增加动态属性

    在开发过程中碰到了一个需求,需要动态创建对象及其动态属性.在尝试几种方法后,最后完成了需求,记录下过程,给园友参考下 1.动态创建对象一:匿名对象 ",Birthday =DateTime. ...