LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 415|回复: 2

求助:字符设备驱动程序编译出错!

[复制链接]
发表于 2004-5-12 21:55:59 | 显示全部楼层 |阅读模式
请教,字符设备驱动程序编译出了很多问题,求助!
我在一本书找了一个简单的字符设备驱动程序,敲上去之后,一编译,出现了很多的问题。我想请高手指点。尤其是斑竹,帮忙给我解决一下吧!我很着急,且有急用!我的系统是rh 10.0 内核版本是2.4.20-8的。联系方式:guanzhibin@sina.com QQ:37633421 谢谢!
附源程序核出错信息!

#include
#include
#include
#include
#include
#include
#include

/*处理config_modversions*/
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include
#endif

#ifndef KERNEL_VERSION
#define KERNEL_VERSION(a,b,c) ((a,)*65536+(b)*256+(c))
#endif

#if LIUNX_VERSIONCODE > KERNEL_VERSION(2,4,0)
#include /*for copy_to_user */
#endif
/*此头文件都没有在/usr/include/目录下,是在/usr/src/的一个什么目录下*/

#define SUCCESS 0
/*声明设备,这是设备的名子,它将会出现在 /proc/devices */
#define DEVICE_NAME "fifo_dev"
/*定义此设备消息缓冲区的最大长度*/
#define BUF_LEN 100
/*为了防止不同的进程在同一时间使用此设备,定义此静态变量跟踪其状态*/
static int Device_open=0;
/*当提出请求时,设备将读写的内容放在下面的数组中*/
static char *Message[BUF_LEN];
/*在进程读取这个内容的时候,这个指针是指向读取的位置*/
static char *Message_ptr;
/*在这个文件中,主设备号作为全局变量以便于这个设备在注册和释放的时候使用*/
static int Major;

/*open()函数*/
static int device_open(struct inode *inode,struct file *file)
{
static int counter=0;
#ifdef DEBUG
printk("device_open(%p,%p)\n",inode,file);
#endif
printk("Device: %d.%d\n",inode->i_rdev>>8,inode->i_rdev&0xFF);
/*这个设备是一个独占设备,为了避免同时有两个进程使用这一个设备,我们采取措施*/
if (Device_open)
return -EBUSY;
Device_open++;
/*初始化消息*/
sprintf(/var/log/messages,"If I told you once,I told you %d times -%s",counter++,"hello world\n");
Message_ptr=Message;
/*当这个文件被打开的时候,我们必须确认该模块还没有被移走并且增加此模块的用户数*/
MOD_INC_USE_COUNT;
return SUCCESS;
}


/*release()函数*/
#if LINUX_VERSION_CODE>=KERNEL_VERSION(2,4,0)
static int device_release(struct inode * inode,struct file * file)
#else
static void device_release(struct inode * inode,struct file * file)
#endif
{
#ifdef DEBUG
printk("device_release(%p,%p)\n",inode,file);
#endif
/*为下一个使用该设备的进程作准备*/
Device_open--;
/*减少这个模块的使用者数目,否则一旦你打开这个模块后,你永远都不能释放掉它*/
MOD_DEC_USE_COUNT;
#if LINUX_VERSION_CODE>=KERNEL_VERSION(2,4,0)
return 0;
#endif
}


/*read()函数*/
#if LINUX_VERSION_CODE>=KERNEL_VERSION(2,4,0)
static ssize_t device_read(struct file * file,char * buffer,size_t length,loff_t * offset)
#else
static int device_read(struct inode * inode,struct file * file,char * buffer,int length)
#endif
{
/*实际上读出的字节数*/
int bytes_read=0;
/*如果读到缓冲区的末尾,则返回0,类似文件的结束*/
if (*Message_ptr==0)
return 0;
/*将数据放入缓冲区中*/
while (length&&*Message_ptr)
{/*由于缓冲区是在用户空间而不是在内核空间,所以我们使用copy_to_user()函数
将内核空间中的数据拷贝到用户空间*/
copy_to_user(buffer++,*(Message_ptr++),length--);
bytes_read++;
}
#ifdef DEBUG
printk("Read %d bytes,%d left\n",bytes_read,length);
#endif
/*Read函数返回一个真正的读出的字节数*/
return(bytes_read);
}


/*write()函数*/
#if LINUX_VERSION_CODE>=KERNEL_VERSION(2,4,0)
static ssize_t device_write(struct file * file,const char * buffer,size_t length,loff_t * offset)
#else
static int device_write(struct inode *inode,struct file *file,const char *buffer,int length)
#endif
{
static int i;
#ifdef DEBUG
printk("device_write(%p,%s,%d)",file,buffer,length);
#endif
i=0;
/*写入的缓冲区的长度大于消息缓冲区的长度,则不予读写*/
if (length>100)
return 0;
while( length)
{
copy_to_user(*(Message++),buffer++,length--);
i++;
}
Message_ptr=Message;
/*返回写入的字节数*/
return (i);
}
/*设备驱动程序提供给文件系统的接口*/
struct file_operations Fifo_fops={
read:device_read,
write:device_write,
open:device_open,
release:device_release,
};


/*模块初始化和注册*/
int init_module()
{/*试图注册该设备*/
Major=module_register_chrdev(0,DEVICE_NAME,&Fifo_fops);
/*失败的时候返回负值*/
if (Major<0)
{printk("%s device failed with %d\n","sorry,registering the character",Major);
return Major;
}
printk("%s The major device number is %d\n","Registeration is a success.",Major);
printk("If you want to talk to the device driver ,\n");
printk("you'll have to create a device file.\n");
printk("we suggest you use:\n");
printk("mknod c %d \n",Major);
printk("you can try different minor numbers %s","and see what happens.\n");
return 0;
}


/*卸载模块*/
void cleanup_module()
{
int ret;
/*取消注册的设备*/
ret=module_unregister_chrdev(Major,DEVICE_NAME);
/*如果出错的话,则显示出错信息*/
if (ret<0)
printk("Error in unregister_chrdev: %d\n",ret);
}


出错信息!
char_dr.c:39: warning: `struct file' declared inside parameter list
char_dr.c:39: warning: its scope is only this definition or declaration, which is probably not what you want
char_dr.c:39: warning: `struct inode' declared inside parameter list
char_dr.c: In function `device_open':
char_dr.c:47: warning: implicit declaration of function `printk'
char_dr.c:47: dereferencing pointer to incomplete type
char_dr.c:47: dereferencing pointer to incomplete type
char_dr.c:53: warning: implicit declaration of function `sprintf'
char_dr.c:53: parse error before '/' token
char_dr.c:54: warning: assignment from incompatible pointer type
char_dr.c:56: warning: implicit declaration of function `atomic_inc'
char_dr.c:56: union has no member named `usecount'
char_dr.c:41: warning: unused variable `counter'
char_dr.c: At top level:
char_dr.c:62: warning: `struct file' declared inside parameter list
char_dr.c:62: warning: `struct inode' declared inside parameter list
char_dr.c: In function `device_release':
char_dr.c:74: warning: implicit declaration of function `atomic_dec'
char_dr.c:74: union has no member named `usecount'
char_dr.c: At top level:
char_dr.c:83: warning: `struct file' declared inside parameter list
char_dr.c: In function `device_read':
char_dr.c:98: warning: implicit declaration of function `copy_to_user'
char_dr.c: At top level:
char_dr.c:112: warning: `struct file' declared inside parameter list
char_dr.c: In function `device_write':
char_dr.c:129: wrong type argument to increment
char_dr.c:132: warning: assignment from incompatible pointer type
char_dr.c: At top level:
char_dr.c:138: variable `Fifo_fops' has initializer but incomplete type
char_dr.c:139: unknown field `read' specified in initializer
char_dr.c:139: warning: excess elements in struct initializer
char_dr.c:139: warning: (near initialization for `Fifo_fops')
char_dr.c:140: unknown field `write' specified in initializer
char_dr.c:140: warning: excess elements in struct initializer
char_dr.c:140: warning: (near initialization for `Fifo_fops')
char_dr.c:141: unknown field `open' specified in initializer
char_dr.c:141: warning: excess elements in struct initializer
char_dr.c:141: warning: (near initialization for `Fifo_fops')
char_dr.c:142: unknown field `release' specified in initializer
char_dr.c:142: warning: excess elements in struct initializer
char_dr.c:142: warning: (near initialization for `Fifo_fops')
char_dr.c: In function `init_module':
char_dr.c:148: warning: implicit declaration of function `module_register_chrdev'
char_dr.c: In function `cleanup_module':
char_dr.c:169: warning: implicit declaration of function `module_unregister_chrdev'
char_dr.c: At top level:
char_dr.c:138: storage size of `Fifo_fops' isn't known
 楼主| 发表于 2004-5-13 20:46:26 | 显示全部楼层

求助,怎么没有人回复啊?

大家快帮帮忙么!我的这个驱动程序听简单的!
发表于 2004-5-13 21:26:47 | 显示全部楼层
没有缩进,看得累!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表