第六章 第一个Linux驱动程序: 统计单词个数

  本章作为实战第一章,首先要做的就是了解linux驱动到底是个什么东西,首先了解linux驱动的工作方式,linux系统将每一个驱动都映射成一个文件,保存在/dev中,再使用c语言函数ioctl向驱动的设备文件发送打印命令。

一、编写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)

    // 卸载Linux驱动

    static void word_count_exit(void)

    由于内核空间的程序不能直接访问用户空间中的数据,因此,需要在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驱动

    需要编写专门用于测试的程序

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

  (三)使用Android NDK测试

  (四)使用开发板测试

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

四、在eclipse中开发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驱动

  (二)在 Eclipse 中测试 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

http://www.cnblogs.com/JOKERLAU/

时间: 2024-12-21 04:44:07

第六章 第一个Linux驱动程序: 统计单词个数的相关文章

第6章: 第一个Linux驱动程序统计单词个数

6章: 第一个Linux驱动程序统计单词个数 编写Linux驱动的程序的步骤: 第1步:建立 Linux 驱动骨架(装载和卸载 Linux 驱动) 第2步:注册和注销设备文件 第3步:指定与驱动相关的信息 第4步:指定回调函数 第5步:编写业务逻辑 第6步:编写 Makefile 文件 第7步:编译 Linux 驱动程序 第8步:安装和卸载 Linux 驱动 Linux驱动测试的方法多种多样: 1.使用Ubuntu Linux测试Linux驱动 2.在Android模拟器上通过原(Native)

第一个Linux驱动程序统计单词个数

Linux驱动的工作和访问方式是Linux的亮点之一,Linux系统将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中,这种设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易,当然也比访问LinuxAPI更容易. 编写Linux驱动的程序的步骤: 第1步:建立 Linux 驱动骨架(装载和卸载 Linux 驱动) 第2步:注册和注销设备文件 第3步:指定与驱动相关的信息 第4步:指定回调函数 第5步:编写业务逻辑 第6步:编写 Makefile

Android深度探索(卷1)HAL与驱动开发 第六章 第一个Linux驱动程序:统计单词个数

Android深度探索(卷1)HAL与驱动开发 第六章 第一个Linux驱动程序:统计单词个数 统计单词个数的功能是封装在Linux驱动中的. Linux驱动的工作和访问方式是Linux亮点之一,同时受到了业界大防范好评.Linux系统将每一个驱动都映射成一个文件.这些文件称为设备文件或者驱动文件,都保存在 /dev 目录中.这种设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易.当然,也比访问Linux API 更容易.由于大多数Linux驱动都有与其对应的设备文件,因此与Li

第六章第一个Linux驱动程序:统计单词个数

第六章介绍如何在多种平台,使用多种方法测试Linux驱动. 本章主讲统计单词个数的算法的实现技术:Linux驱动.统计单词个数的功能是封装在Linux驱动中的.驱动不一定是直接和硬件打交道的,还可以喝普通的library一样提供其他程序的调用来实现特定功能的. 第一节Linux驱动到底是个什么东西 Linux驱动和普通的Linux API没有本质上的区别,只是使用Linux驱动的方式和使用Linux API的方法不同. Linux系统将每一个驱动都映射成一个文件,这些文件称为设备文件或驱动文件,

第六章 第一个Linux驱动程序:统计单词个数

在本章将进入了最令人激动的时刻,为了是读者在刚开始学习Linux驱动开发时充满期待,没有只提供Helloworld程序. 首先介绍Linux驱动到底是个什么东西,它和我们以前接触过的windows类型差不多,但是操作和工作方式有很大的区别,Linux系统将每一个驱动都映射成一个文件.这些文件成为设备文件或这驱动文件,都保存在/dev目录中. 接下来给出编写Linux驱动程序的步骤:第一步:建立Linux驱动骨架,Linux驱动程序中需要提供两个函数来分别处理驱动初始化和退出的工作.这两个函数分别

Android深度探索(卷1)HAL与驱动开发 第六章 第一个Linux驱动程序:统计单词个数 读书笔记

本章是一个具体的例子,来详细的介绍开发和测试Linux驱动程序的完整过程.尤其是测试Linux驱动.在这个统计单词个数的实例中,重点是该算法的实现技术:即Linux驱动,而不是如何统计的. 6.1Linux驱到底是什么 Linux驱动的工作方式和访问方式是Linux的特点之一.Linux系统将每一个驱动都映射成一个文件,这些文件被称为驱动文件或设备文件,保存在dev目录中.由于大多数Linux驱动都有与其对应的设备文件,因此与Linux驱动交换数据就变成了与设备文件交换数据.事实上,编写Linu

第六章 第一个Linux驱动程序:统计单词个数 心得笔记

一.Linux系统将每个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中.这使得与Linux驱动进行交互就向与普通文件进行交互一样容易.大多数Linux驱动都有与其对应的设备文件,因此与Linux驱动交换数据变成与驱动设备交换数据. 二.编写Linux驱动程序 1.建立Linux驱动骨架           Linux内核在使用驱动时需要装载与卸载驱动        装载驱动:建立设备文件.分配内存地址空间等:module_init 函数处理驱动初始化        

六、第一个Linux驱动程序:统计单词个数 ——学习笔记

第6章 第一个Linux驱动程序:统计单词个数 ——学习笔记 一.首先了解一下: 打印机驱动写入数据:对于打印机驱动来说,需要接收这些被写入的数据,并将它们通过PC的并口.USB等端口发送给打印机.要实现这一过程就需要Linux驱动可以响应应用程序传递过来的数据.这就是Linux驱动的事件,虽然在C语言里没有事件的概念,但却有与事件类似的概念,这就是回调(callback)函数.因此,编写Linux驱动最重要的一步就是编写回调函数,否则与设备文件交互的数据将无法得到处理.图6-1是应用软件.设备

第六章 第一个linux个程序:统计单词个数

从本章就开始实战,实例是统计一片文章或者一段文字中的单词个数.还介绍了用不同的方法去测试linux驱动,这些方法主要使用平台来区分. 一.linux:linux跟普通的linux API没什么区别,只是使用方式不同而已.Linux系统每一个驱动都映射成一个文件,这些被映射的文件被称为设备文件或映射文件,并且都保存在./dev目录下. Linux驱动的工作方式:Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统.在Linux环境下设计驱动程序