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,169警告已解决,如何解决162呢?谢谢!
急,谢谢各位阿
[问题][问题]请教!设备驱动加载模块时出现错误如何解决?
-
- 帖子: 5
- 注册时间: 2008-06-10 13:49
- bones7456
- 帖子: 8495
- 注册时间: 2006-04-12 20:05
- 来自: 杭州
- 联系:
- zongzw
- 帖子: 94
- 注册时间: 2008-03-31 16:12
-
- 帖子: 2
- 注册时间: 2009-03-18 17:30
Re: [问题][问题]请教!设备驱动加载模块时出现错误如何解决?
偶也想知道这个问题是如何解决的了