一  编写Linux驱动程序

1.建立Linux驱动骨架

Linux内核在使用驱动时需要装载与卸载驱动

装载驱动:建立设备文件、分配内存地址空间等;module_init 函数处理驱动初始化

卸载驱动:删除设备文件、释放内存地址空间等;module_exit函数处理退出

包含这两个函数的两个宏的C程序文件也可看做是Linux驱动的骨架

2.注册和注销设备文件

任何一个Linux驱动都需要有一个设备文件,否则应用程序将无法与驱动程序交互。

建立设备文件:在第一步编写的处理Linux初始化工作的函数中完成。misc_register函数

删除设备文件:在第一步编写的处理Linux退出工作的函数中完成。misc_deregister函数

3.指定与驱动相关的信息

驱动程序是自描述的,驱动程序的作者姓名、使用的开源协议、别名、驱动描述等信息。这些信息都需要在驱动源代码中指定。

MODULE_AUTHOR、MODULE_LICENSE、MODULE_ALLS、MODULE_DESCRIPION等宏可以指定与驱动相关的信息

4.指定回调函数

一个驱动程序并不一定要指定所有的回调函数,回调函数会通过相关机制进行注册

5.编写业务逻辑

具体的业务逻辑与驱动的功能有关,业务逻辑可能由多个函数、多个文件甚至是多个Linux驱动模块组成

6.编写Makefile文件

Linux内核源代码的编译规则是通过Makefile文件定义的。因此编写一个新的Linux驱动程序必须有一个Makefile文件

7.编译Linux驱动程序

可以直接编译进内核,也可以作为模块单独编译

8.安装和卸载Linux驱动

若将Linux驱动编译进内核,只要Linux使用该内核,驱动程序就会自动转载

若Linux驱动程序以模块单独存在,需使用insmod或modprode命令装载Linux驱动模块,rmmod命令卸载Linux驱动模块

二  第一个Linux驱动,以word_count为例

(一)基础编写代码

#mkdir -p  /root/drivers/ch06/word_count    建立目录存放Linux驱动程序

#cd /root/drivers/ch06/word_count

#echo '' > word_count.c  建立驱动源代码文件

#echo 'obj-m := word_count.o' > Makefile  编写一个Makefile文件 make命令会吧Linux驱动源代码目录中的word_count.c或 word_count.s文件编译成word_count.o文件

obj-m 表示将Linux驱动作为模块(.ko文件)编译,word_count.o会被连接进word_count.ko文件,然后使用insmod或modprode命令装载word_count.ko

obj-y  表示将Linux驱动编译进Linux内核,word_count.o会被连接进built-in.o 文件,最终会被连接进内核

Linux系统将内存分为了用户空间和内核空间,两者空间的程序不能直接访问,printk函数运行在内核空间,printf函数运行在用户空间,因此属于内核程序的Linux驱动是不能直接访问printf函数的。

#make -C /usr/src/linux-headers-3.0.0-15-generic  M=/root/driver/ch06/word_count    编译Linux驱动源代码

# insmod word_count.ko  装载驱动

# lsmod | grep word_count   查看word_count是否安装成功

# rmmod word_count   卸载Linux驱动

#dmesg | grep word_count | tail -n 2    查看有Linux驱动输出的日志信息

(二)加入有关指定的信息的代码

模块作者:MODULE_AUTHOR("lining");

模块描述:MODULE_DESCRPTION("statistics of word count .");

模块别名:MODULE_ALIAS("word count module.");

开源协议: MODULE_LICENSE("GPL");

#define DEVICE_NAME "wordcount"    //定义设备文件名

//描述与设备文件触发的事件对应的回调函数指针

//owner:设备事件回调幻术应用于哪些驱动模块,THIS_MODULE表示应用于当前驱动模块

static struct file_operations dev_fops={.owner = THIS_MODULE};

//描述设备文件的信息

//minor:次设备号 MISC_DYNAMIC_MINOR,:动态生成次设备号  name :  设备文件名称

//fops : file_operations 结构体变量指针

static struct miscdevice misc={.minor = MISC_DYNAMIC_MINOR, .name=DEVICE_NAME,.fops = &dev_fops};

//初始化Linux驱动

static  int word_count_init(void)

{ int ret;

ret = misc_register(&misc);

printk("word_count_init_success\n");

return ret;

}

// 卸载Linux驱动

static void word_count_exit(void)

{  misc_deregister(&misc);

printk("word_inti_exit_success\n");

}

由于内核空间的程序不能直接访问用户空间中的数据,因此,需要在word_count_read(从设备文件读数据)和word_count_write(向设备文件写数据) 函数中分别使用copy_to_user和copy_from_user函数将数据从内核空间复制到用户空间或从用户空间复制到内核空间

(三)装载与卸载驱动

检查word_count驱动工作是否完全正常

#dmesg | tail -n 1

#modinfo word_count.ko

检测Linux驱动模块的依赖关系

#depmod /root/drivers/ch06/word_count/word_count.ko

调用命令装载Linux驱动

#modprode word_count

注:insmod 和 modprode 命令都是加载驱动,后者可以检查驱动模块的依赖性

三 多种方法测试Linux驱动

(一)使用Ubuntu Linux 测试Linux驱动

需要编写专门用于测试的程序,例如test_word_count.c

#gcc test_word_count.c -o test_word_count

#test_word_count

#test_word_count "I love you."

输出结果: String:I love you.

word byte display:0,0,0,3

word count:3

(二)在android模拟器上通过原生C程序测试Linux驱动

#cd ~/kernel/goldfish

#make menuconfig

     

按照如图所示进行设置,之后重新编译Linux内核,成功编译内核后,android模拟器可以使用性生成的zImage内核文件动态装载Linux驱动模块。

两个条件满足可以直接运行普通的Linux程序:android模拟器、开发板或手机需要有root权限;可执行文件需要使用交叉编译器来编译test_word_count.c文件,建立Android.mk设置编译参数,并使用make命令进行编译

#mm   编译.c文件,在相应目录下

#adb push  ./emulator/test_word_count  /data/local    上传到Android模拟器

执行下面命令测试驱动

#chmod 777 /data/local/test_word_count   设置可执行权限

#/data/local/test_word_count

#/data/local/test_word_count  'a bb ccc ddd eee'

输出结果:5,表示测试成功

(三)使用Android NDK测试

(四)使用开发板测试

(五)将驱动编译进Linux内核进行测试

四 在eclipse中开发Linux驱动程序

第一步:建立C工程

第二步:建立C源代码文件链接     New>Source Folder   Folder name 输入 src,导入word_count.c文件

第三步:设置include路径   单击菜单项properties,C/C++General > Paths and Symbols ,选中Include的GNU C项,Add添加两个路径:/root/kernel/goldfish/include和/root/kernel/goldfish/arch/arm/include

第四步:编译Linux驱动

测试Linux驱动

第一步:导入test_word_count.c文件

第二步:设置include路径

第三步:建立Target      Make Target > Create ,在Target name 文本框中输入word_count_eclipse_test,点击OK

第四步:Build工程    Make Target > Build,选中第三步中建立的文件,然后点击Build

第五步:运行测试程序   Run As > Local C/C++  Application

详细讲解Linux驱动程序的更多相关文章

  1. 详细讲解Linux下安装python3(Python3.5.4)

    https://jingyan.baidu.com/article/6b97984dd6dbb01ca2b0bf0a.html

  2. 详细讲解Hadoop源码阅读工程(以hadoop-2.6.0-src.tar.gz和hadoop-2.6.0-cdh5.4.5-src.tar.gz为代表)

    首先,说的是,本人到现在为止,已经玩过.                   对于,这样的软件,博友,可以去看我博客的相关博文.在此,不一一赘述! Eclipse *版本 Eclipse *下载 Jd ...

  3. Linux驱动程序开发 - 设备控制接口

    (2008-08-08 15:02:19) 转载▼ 标签: it linux kernel driver 分类: Linux 序言设备驱动程序的一个基本功能就是管理和控制设备,同时为用户应用程序提供管 ...

  4. python编写shell脚本详细讲解

    python编写shell脚本详细讲解 那,python可以做shell脚本吗? 首先介绍一个函数: os.system(command) 这个函数可以调用shell运行命令行command并且返回它 ...

  5. Siki_Unity_2-1_API常用方法和类详细讲解(上)

    Unity 2-1 API常用方法和类详细讲解(上) 任务1&2:课程前言.学习方法 && 开发环境.查API文档 API: Application Programming I ...

  6. 【ARM-Linux开发】【CUDA开发】NVIDIA TEGRA X1:LINUX驱动程序包多媒体用户指南

    NVIDIA TEGRA X1:LINUX驱动程序包多媒体用户指南 转载请注明作者和出处:http://blog.csdn.net/u011475210 嵌入式平台:NVIDIA Jetson TX1 ...

  7. Nginx基础详细讲解

    Nginx基础详细讲解 链接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ 提取码:migq 复制这段内容后打开百度网盘手机App,操作更方便哦 1. ...

  8. head标签详细讲解

    head标签详细讲解 head位于html网页的头部,后前的标签,并以开始以结束的一html标签. Head标签位置如图: head标签示意图 head包含标签 meta,title,link,bas ...

  9. Linux驱动程序学习【转】

    本文转载自: 一直在学习驱动,对于下面这篇文章,本人觉得简洁明了,基本符合我们学习驱动的进度与过程,现转发到自己的博客,希望能与更多的朋友分享. 了解Linux驱动程序技巧学习的方法很重要,学习lin ...

随机推荐

  1. VB发送后台按键和组合键

    http://files.cnblogs.com/files/liuzhaoyzz/VB%E5%8F%91%E9%80%81%E5%90%8E%E5%8F%B0%E7%BB%84%E5%90%88%E ...

  2. 2015项目timeline

    1. app签到  http://h5.a.rongyi.com/html/app/sign/index.html (pc无效果.app端 20160105) 2.圣诞活动--砍价 http://h5 ...

  3. js创建标签的方法--依赖于jquery

    /** * 创建标签,传入一个对象,返回一个完整的标签 * @param {Object.attribute} tag 标签 * @param {Object.attribute} attribute ...

  4. JAVA04类与对象之课后问题解决

    1.验证ClassAndObjectTest.java(使用自定义类) public class ClassAndObjectTest { public static void main(String ...

  5. Discuz论坛安全加固浅析

    [51CTO专稿]Discuz! 论坛以其功能完善.效率高效.负载能力,深受被大多数的网站喜爱和青睐.无独有隅,笔者所维护的论坛就是用discuz! 来构建的,从接手时候的7.2到现在x2.0,经历了 ...

  6. C++ 指向成员函数指针问题

    成员函数指针与常规指针不同,一个指向成员变量的指针并不指向一个内存位置.通常最清晰的做法是将指向数据成员的指针看作为一个偏移量. class ru_m { public: typedef int (r ...

  7. SharePoint 根据时间筛选

    最近在整SP列表 老大要求用列表规范周报格式. 提出要在一个视图内查看上周一至周日的内容 翻了下资料想到了以下几种方法 1.在视图页面添加时间筛选器webpart,用参数传入列表筛选 2.在列表添加按 ...

  8. 缺少wlanapi.dll文件问题修复

    我在下载百度云盘的时候碰到了一个问题,缺少wlanapi.dll文件.下面贴出解决办法 第一步 http://d.apktop.cn/p/soft_134.html   下载wlanapi.dll 第 ...

  9. AutoCAD2006启动慢解决方案

    一. 1.打开控制面板.2.选择Internet选项.3.在Internet属性对话框里,点高级标签.4.清除“检查发行商的证书吊销”选项.5.单击应用,然后单击OK.6.重新启动,运行应用程序. 二 ...

  10. VS2013 破解

    密钥 : BWG7X-J98B3-W34RT-33B3R-JVYW9