当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]请教!设备驱动加载模块时出现错误如何解决?
帖子发表于 : 2008-06-10 13:53 

注册: 2008-06-10 13:49
帖子: 5
送出感谢: 0 次
接收感谢: 0 次
ubuntu 8.04 内核版本2.6.24-18

makefile文件如下 :

obj-m := char_dev.o
KERNELBUILD :=/lib/modules/2.6.24-18-generic/build
default:
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions

char_dev.c文件如下 :

#ifndef MODULE

#define MODULE

#endif

/*必要的头文件*/

#include <linux/module.h>

#include <linux/kernel.h> /* printk() */

#include <linux/init.h>

#include <asm/timex.h>


/* 字符设备所需*/

#include <linux/fs.h>

#include <linux/slab.h>

#include <asm/system.h>

#include <linux/proc_fs.h>

#include <linux/fcntl.h>

#include <asm/uaccess.h>

#include <asm/segment.h>



#define status 0



/* 设备定义,定义设备的名字为mychardev*/

#define DEVICE_NAME "mychardev"



/* 该设备最大信息长度为80*/

#define BUF_LEN 80



/* 设备否打开?利用它防止当前进程使用同一设备*/

static int open_count = 0;



/* 对设备里面的内容进行初始化 */

char content[BUF_LEN]="Welcome to use this device.\n";



/* 进程读取的信息的指针 */

char *content_Ptr;



/* 当进程试图打开设备文件时调用该函数,参数指出文件的地址以及具体打开方式*/

static int device_open(struct inode *inode, struct file *file)

{

/* 两个进程不得同时对同一设备操作,设备被打开后不得被再次打开*/

if (open_count)
{
/*打开操作失败的返回信息*/

return -EBUSY;
}

/*记录设备被打开的次数,加1*/

open_count++;

/*设备里的指针指向具体的数组,该数组的内容就是该设备里的内容*/

content_Ptr = content;

/*成功打开操作的返回信息*/

return status;

}



/* 当一个进程要关闭这个设备时,该函数被调用,这个调用不允许失败,参数与打开设备的参数相同*/

static int device_release(struct inode *inode, struct file *file)

{
/*记录设备被打开的次数,减1*/

open_count --;


return 0;

}



/* 当一进程要从已打开的设备文件读数据时该函数被调用,file指具体的被打开的设备,buffer是获得填充数据的缓冲区,length是缓冲区中的数据长度 */

static ssize_t device_read(struct file *file, char *buffer,size_t length,loff_t *fops)

{
/* 用于记录写入到缓冲区buffer中的确切字节数*/

int num = 0;
/*指向设备的存放数据的数组*/

char *ptr=content_Ptr;
/*记录设备里的字符的个数,初始化为0*/
int len=0;



/* 如果已位于设备内部信息的尾部,返回0*/

if (*content_Ptr == 0)
{
return 0;
}
len=0;


/*计算设备里字符串的长度*/

while (*(ptr++))

{ len++;}

/*如果要读出的字符串的长度大于设备里字符串的长度,则将真正的读出长度设为设备的字符串的长度*/
if (length<len)

{
len=length;
}
/* 准确地把数据送到缓冲区buffer*/

copy_to_user(buffer,content_Ptr,len);



num=len;


/* 返回读取的实际字节数据 */

return num;

}
/* 当进程向这设备写时调用本函数*/

static ssize_t device_write(struct file *file,const char *buffer, size_t length,loff_t *fops)

{
printk(" write\n");


/* 用于记录写入到设备中的确切字符数*/

int len ;

/*如果用户的参数大于设备里数组的最大长度,则仅写满数组即可,否则写入的长度就是用户传进来的参数*/

if (length>80)

{
len=80;
}

else

{
len=length;
}
/*将用户的数据写入设备*/

copy_from_user(content_Ptr,buffer,len);
/*返回真正写入到设备里的字符的长度*/

return len;

}



/* 模块定义 */



/* 设备的主设备号*/

static int Major;



/* 当进程要对创建的设备进行某些操作时,这个结构存放了要调用的函数的入口

这个结构有系统设备表的指针指向。NULL 表示未实现该功能。*/



struct file_operations Fops = {

read: device_read,

write: device_write,

open: device_open,

release:device_release

};



/* 初始化模块--注册字符设备 */

int init_module()

{

/* 注册字符设备(至少一次) */

Major = register_chrdev(0, DEVICE_NAME, &Fops);



/* 负值意味出错 */

if (Major < 0)
{

printk ("Sorry, registering the character device failed with %d\n", Major);
return Major;

}



printk ("Registeration is a success. The major device number is %d.\n", Major);

printk ("If you want to talk to the device driver, you'll have to\n");

printk ("create a device file. We suggest you use:\n");

printk ("mknod <name> c %d 0\n", Major);



return 0;

}



/* 清除模块 --从 /proc 中注销合适的文件*/

void cleanup_module()

{

int ret;



/* 注销设备 */

ret = unregister_chrdev(Major, DEVICE_NAME); //162

/* 如果出错,报告错误*/

if (ret < 0)
{

printk("Error in module_unregister_chrdev: %d\n", ret);

}


MODULE_LICENSE("GPL"); //169
}


在终端输入 sudo make后 出现如下错误:

make -C /lib/modules/2.6.24-18-generic/build M=/home/sophiazhang/桌面/2 modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-18-generic'
CC [M] /home/sophiazhang/桌面/2/char_dev.o
/home/sophiazhang/桌面/2/char_dev.c: 在函数‘device_write’中:
/home/sophiazhang/桌面/2/char_dev.c:103: 警告: ISO C90 不允许混合使用声明和代码
/home/sophiazhang/桌面/2/char_dev.c: 在函数‘cleanup_module’中:
/home/sophiazhang/桌面/2/char_dev.c:162: 错误: void 值未如预期地被忽略
/home/sophiazhang/桌面/2/char_dev.c:169: 警告: ISO C90 不允许混合使用声明和代码
make[2]: *** [/home/sophiazhang/桌面/2/char_dev.o] 错误 1
make[1]: *** [_module_/home/sophiazhang/桌面/2] 错误 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-18-generic'
make: *** [default] 错误 2

请哪位高手指教下如何解决阿 ??????

103警告已解决,如何解决162,169呢?谢谢!


页首
 用户资料  
 
2 楼 
 文章标题 : [问题]为什么没人理我??????????555555555~
帖子发表于 : 2008-06-10 14:07 

注册: 2008-06-10 13:49
帖子: 5
送出感谢: 0 次
接收感谢: 0 次
为什么没人理我??????????555555555~


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译