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
#include
#include
#define DEVICE_NAME MyDev
#define OPENSPK 1
#define CLOSESPK 2
char buf[128];
int main(){
int f=open(DEVICE_NAME,O_RDRW);
if (f==-1) return 1;
printf("\nHit enter key to read device...");
read(f,buf,128); printf(buf);
printf("\nHit enter key to write device ...");
write(f,"test",4);
printf("\nHit enter key to open PC's speaker...");
ioctl(f,OPENSPK);
printf("\nHit enter key to close PC's speaker...");
ioctl(f,CLOSESPK);
close(f);
}
实例讲解Linux设备驱动程序的设计
内容版权声明:除非注明,否则皆为本站原创文章。