Board logo

标题: 驱动入门:一个简单的字符设备驱动 [打印本页]

作者: yuyang911220    时间: 2017-2-20 17:40     标题: 驱动入门:一个简单的字符设备驱动

首先我要向大家推荐一下韦东山老师的视频,他在视频里讲解的非常的好,把代码分析的非常的透彻,而且他会在视频里现场写出每一个程序的代码,而不是从其他的地方拿一个程序过来分析就完事,所以我们可以跟着他一步一步的学习linux程序设计。

我就按照这几天在视频里从韦老师那儿学到的方法,讲一下写简单字符设备的流程,以在书上看到的globalmem这样的一个虚拟设备为例。这个设备的功能是在内核空间里分配4K字节的内存,在驱动中提供如何访问和操作这块内存的函数,以供用户空间的进程通过系统调用来访问这块内存。我们可以把它看成是最大容量为4K的普通文件。我们要能够像打开普通文件一样打开它,读取其中的内容,或向其中写入数据,定位到文件的某个位置处,清空其中的内容,然后关闭打开的文件。我们的应用程序只需要通过系统调用open()read()write()lseek()ioctl()release()。而不用去管它是一个普通文件还是一个字符设备。

第一步、包含进文件中所需的头文件,和宏定义,声明全局变量,并定义一个设备结构体。

#include <linux/module.h>

#include <linux/types.h>

#include <linux/fs.h>

#include <linux/errno.h>

#include <linux/mm.h>

#include <linux/sched.h>

#include <linux/init.h>

#include <linux/cdev.h>

#include <asm/io.h>

#include <asm/system.h>

#include <asm/uaccess.h>

#define GLOBALMEM_SIZE  0x1000  /*全局内存最大4K字节*/

#define MEM_CLEAR 0x1  /*0全局内存*/

#define GLOBALMEM_MAJOR 254    /*预设的globalmem的主设备号*/

static int globalmem_major = GLOBALMEM_MAJOR;

/*globalmem设备结构体*/

struct globalmem_dev                                    

{                                                        

  struct cdev cdev; /*cdev结构体*/                       

  unsigned char mem[GLOBALMEM_SIZE]; /*全局内存*/        

};

第二步、写出驱动框架。

static const struct file_operations globalmem_fops =

{

  .owner = THIS_MODULE,

  .llseek = globalmem_llseek,

  .read = globalmem_read,

  .write = globalmem_write,

  .ioctl = globalmem_ioctl,

  .open = globalmem_open,

  .release = globalmem_release,

};

file_operations结构体里面有很多的函数,但并非要实现其中所有的成员函数。要根据实际的需要向file_operations里添加成员函数,这里实现6个函数。






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0