当前位置: 技术问答>linux和unix
一个很常见的设备驱动程序例子不知道哪里有错,怎么编译,请大家帮忙阿,谢谢!!!
来源: 互联网 发布时间:2015-12-05
本文导语: // MyDev.c 2000年2月7日编写 #ifndef __KERNEL__ # define __KERNEL__ //按内核模块编译 #endif #ifndef MODULE # define MODULE //设备驱动程序模块编译 #endif #define DEVICE_NAM...
// 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 %dn",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 %dn",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
#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 %dn",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 %dn",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