首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux驱动编撰(字符设备编写框架)

2013-01-28 
linux驱动编写(字符设备编写框架)【 声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:feixiaoxing @163.

linux驱动编写(字符设备编写框架)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】


    上次我们编写了一个简单的字符设备,但是涉及的内容比较少,只有open和read两个函数。今天,我们打算在此基础上扩充一下内容。基本的思路是这样的:(1)编写字符设备下需要处理的各个函数,包括open、release、read、write、ioctl、lseek函数;(2)编写一个用户侧的程序来验证我们编写的驱动函数是否正确。当然,我们编写的代码部分参考了宋宝华先生的《linux设备驱动开发详解》一书,在此说明一下。
    在开始今天的内容之前,其实有一些题外话可以和大家分享一下。自从工作以来,我个人一直都有一个观点。那就怎么样利用简单的代码来说明开发中的问题,或者是解释软件中的原理,这是一个很高的学问。有些道理看上去云里雾里说不清楚,其实都可以通过编写代码来验证的。os可以、cpu可以、cache可以、编译器可以、网络协议也可以,很多很多的内容完全可以通过几行代码就可以表达得非常清楚,但是事实上我们并没有这么做。我想原因无非是这么几条,一来授业者对相关知识的学习也是停留在概念上而已,二来我们的学习过于死板和教条、太关注知识、不求实践,三就是学习者自身缺少思考的能力、缺少自我反省的能力、对很多东西不求甚解。对于简单的linux设备,我们完全可以通过这几行代码说清楚问题,免得大家还要苦苦追寻,百思而不得入门。
    好了,说了这么多,我们看看现在的驱动代码是怎么修改的把。
#include <stdio.h>#include <fcntl.h>#include <unistd.h>#define MEM_CLEAR 0x01#define CHAR_DEV_NAME "/dev/chr_dev"int main(){        int ret;        int fd;        int index;        char buf[32];/* open device */        fd = open(CHAR_DEV_NAME, O_RDWR | O_NONBLOCK);        if(fd < 0)        {                printf("open failed!\n");                return -1;        }/* set buffer data, which will be stored into device */        for(index = 0; index < 32; index ++)        {                buf[index] = index;        }/* write data */        write(fd, buf, 32);        memset(buf, 0, 32);/* read data */        lseek(fd, 0, SEEK_SET);        read(fd, buf, 32);        for(index = 0; index < 32; index ++)        {                printf("data[%d] = %d\n", index, buf[index]);        }/* reset all data to zero, read it and check whether it is ok */ioctl(fd, MEM_CLEAR, NULL);lseek(fd, 0, SEEK_SET);        read(fd, buf, 32);        for(index = 0; index < 32; index ++)        {                printf("data[%d] = %d\n", index, buf[index]);        }        close(fd);        return 0;}
    细心的朋友可能发现了,我们在用户侧代码中使用了很多的处理函数,基本上从open、release、read、write、lseek、ioctl全部包括了。测试代码处理的流程也非常简单,首先打开设备,接着写数据,后面就是读取数据,最后利用ioctl清除数据,程序返回。因为代码中包含了注释的内容,在此我们就不过多赘述了。大家慢慢看代码,应该都会了解和明白的。

    希望以上的这段内容对大家有所帮助。



热点排行