Linux设备驱动程序举例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux设备驱动程序设计实例2007-03-03 23:09

Linux系统中,设备驱动程序是操作系统内核的重要组成部分,在与硬件设备之间

建立了标准的抽象接口。通过这个接口,用户可以像处理普通文件一样,对硬件设

备进行打开(open)、关闭(close)、读写(read/write)等操作。通过分析和设计设

备驱动程序,可以深入理解Linux系统和进行系统开发。本文通过一个简单的例子

来说明设备驱动程序的设计。

1、程序清单

//MyDev.c 2000年2月7日编写

#ifndef __KERNEL__

#define __KERNEL__//按内核模块编译

#endif

#ifndef MODULE

#define MODULE//设备驱动程序模块编译

#endif

#define DEVICE_NAME "MyDev"

#define OPENSPK 1

#define CLOSESPK 2

//必要的头文件

#include //同kernel.h,最基本的内核模块头文件

#include //同module.h,最基本的内核模块头文件

#include //这里包含了进行正确性检查的宏

#include //文件系统所必需的头文件

#include //这里包含了内核空间与用户空间进行数据交换时的函数宏

#include //I/O访问

int my_major=0; //主设备号

static int Device_Open=0;

static char Message[]="This is from device driver";

char *Message_Ptr;

int my_open(struct inode *inode, struct file *file)

{//每当应用程序用open打开设备时,此函数被调用

printk ("\ndevice_open(%p,%p)\n", inode, file);

if (Device_Open)

return -EBUSY;//同时只能由一个应用程序打开

Device_Open++;

MOD_INC_USE_COUNT;//设备打开期间禁止卸载

return 0;

}

static void my_release(struct inode *inode, struct file *file)

{//每当应用程序用close关闭设备时,此函数被调用

printk ("\ndevice_release(%p,%p)\n", inode, file);

Device_Open --;

MOD_DEC_USE_COUNT;//引用计数减1

}

ssize_t my_read (struct file *f,char *buf,int size,loff_t off)

{//每当应用程序用read访问设备时,此函数被调用

int bytes_read=0;

#ifdef DEBUG

printk("\nmy_read is called. User buffer is %p,size is %d\n",buf,size);

#endif

if (verify_area(VERIFY_WRITE,buf,size)==-EFAULT)

return -EFAULT;

Message_Ptr=Message;

while(size && *Message_Ptr)

{

if(put_user(*(Message_Ptr++),buf++))//写数据到用户空间

return -EINVAL;

size --;

bytes_read++;

}

return bytes_read;

}

ssize_t my_write (struct file *f,const char *buf, int size,loff_t off)

{//每当应用程序用write访问设备时,此函数被调用

int i;

unsigned char uc;

#ifdef DEBUG

printk("\nmy_write is called. User buffer is %p,size is %d\n",buf,size);

#endif

if (verify_area(VERIFY_WRITE,buf,size)==-EFAULT)

return -EFAULT;

printk("\nData below is from user program:\n");

for (i=0;i

if(!get_user(uc,buf++)) //从用户空间读数据

printk("%02x ",uc);

return size;

}

int my_ioctl(struct inode *inod,struct file *f,unsigned int arg1,

unsigned int arg2)

{//每当应用程序用ioctl访问设备时,此函数被调用

#ifdef DEBUG

printk("\nmy_ioctl is called. Parameter is %p,size is %d\n",arg1);

#endif

相关文档
最新文档