一个字符设备驱动,但是在/dev下没有相应的设备

hfyinsdu 2011-06-23 09:00:09
1. insmod virtual_disk.ko,加载模块;

2. cat proc/devices
Character devices:
1 mem
200 VirtualDisk
204 s3c2410_serial

3. lsmod
VirtualDisk 3756 0 - Live 0xbf000000

3. 但是,在/dev下没有VirtualDisk设备。
请问具体什么原因呢??

程序代码:
int VirtualDisk_init(void)
{
int result;
dev_t devno = MKDEV(VirtualDisk_major, 0); /*构建设备号*/

/* 申请设备号*/
if (VirtualDisk_major) /* 如果不为0,则静态申请*/
result = register_chrdev_region(devno, 1, "VirtualDisk");
else /* 动态申请设备号 */
{
result = alloc_chrdev_region(&devno, 0, 1, "VirtualDisk");
VirtualDisk_major = MAJOR(devno);/* 从申请设备号中得到主设备号 */
}
if (result < 0)
return result;

/* 动态申请设备结构体的内存*/
Virtualdisk_devp = kmalloc(sizeof(struct VirtualDisk), GFP_KERNEL);
if (!Virtualdisk_devp) /*申请失败*/
{
result = - ENOMEM;
goto fail_kmalloc;
}
memset(Virtualdisk_devp, 0, sizeof(struct VirtualDisk));/*将内存清零*/
/*初始化并且添加cdev结构体*/
VirtualDisk_setup_cdev(Virtualdisk_devp, 0);
printk(KERN_ALERT "Virtualdisk Success\n");
return 0;

fail_kmalloc:
unregister_chrdev_region(devno, 1);
return result;
}

/*模块卸载函数*/
void VirtualDisk_exit(void)
{
cdev_del(&Virtualdisk_devp->cdev); /*注销cdev*/
kfree(Virtualdisk_devp); /*释放设备结构体内存*/
unregister_chrdev_region(MKDEV(VirtualDisk_major, 0), 1); /*释放设备号*/
}

MODULE_AUTHOR("Zheng Qiang");
MODULE_LICENSE("Dual BSD/GPL");

module_param(VirtualDisk_major, int, S_IRUGO);

module_init(VirtualDisk_init);
module_exit(VirtualDisk_exit);
...全文
1946 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑暗中的影子 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hfyinsdu 的回复:]

终于搞定了,按照zheng23yi的想法,在驱动里面自动创建设备。
1. 添加头文件 #include <linux/device.h>
2. 修改函数int VirtualDisk_init(void),添加“自动创建设备”,代码如下:

struct class *virtual_disk_class; /*by yinhf.*/

/*设备驱动模块加载函数*/
int Vi……
[/Quote]
LZ你好,我按照你的方法,在驱动初始化函数中添加
second_class = class_create(THIS_MODULE, "second");
if(IS_ERR(second_class)){
printk("Err: failed in creating virtual_disk_class.\n");
return -1;
}
device_create(second_class, NULL, devno, 0, "second");
printk (KERN_INFO "Registered character driver VirtualDisk.\n");

但是在/dev目录下还是没有设备文件,如果按照2.4内核的devfs方法来创建设备驱动文件,一样也是无法实现
devfs_mk_cdev(devno, S_IFCHR|S_IRUGO|S_IWUSR| S_IRGRP, "second");

我的设备初始化代码如下,请教下哪出问题了
static int __init second_init(void)
{
int ret,err;
dev_t devno = MKDEV(second_major,0);

if(second_major)
ret = register_chrdev_region(devno,1,"second");
else{
ret = alloc_chrdev_region(&devno,0,1,"second");
second_major = MAJOR(devno);
}

if(ret < 0)
return ret;

second_devp = kmalloc(sizeof(struct second_dev),GFP_KERNEL);
if(!second_devp){
ret = -ENOMEM;
unregister_chrdev_region(devno,1);
}

memset(second_devp,0,sizeof(struct second_dev));

cdev_init(&second_devp->cdev,&second_fops);
second_devp->cdev.owner = THIS_MODULE;
second_devp->cdev.ops = &second_fops;

err = cdev_add(&second_devp->cdev,devno,1);
if(err)
printk(KERN_NOTICE"Error %d adding LED%d\n",err,0);

second_class = class_create(THIS_MODULE, "second");
if(IS_ERR(second_class)){
printk("Err: failed in creating virtual_disk_class.\n");
return -1;
}

device_create(second_class, NULL, devno, 0, "second");
printk (KERN_INFO "Registered character driver VirtualDisk.\n");
// devfs_mk_cdev(devno, S_IFCHR|S_IRUGO|S_IWUSR| S_IRGRP, "second");

return 0;
}
zxzxy1988 2011-10-26
  • 打赏
  • 举报
回复
学习啦~~嘿嘿,谢谢
hfyinsdu 2011-06-23
  • 打赏
  • 举报
回复
终于搞定了,按照zheng23yi的想法,在驱动里面自动创建设备。
1. 添加头文件 #include <linux/device.h>
2. 修改函数int VirtualDisk_init(void),添加“自动创建设备”,代码如下:

struct class *virtual_disk_class; /*by yinhf.*/

/*设备驱动模块加载函数*/
int VirtualDisk_init(void)
{
int result;
dev_t devno = MKDEV(VirtualDisk_major, 0); /*构建设备号*/

/* 申请设备号*/
if (VirtualDisk_major) /* 如果不为0,则静态申请*/
result = register_chrdev_region(devno, 1, "VirtualDisk");
else /* 动态申请设备号 */
{
result = alloc_chrdev_region(&devno, 0, 1, "VirtualDisk");
VirtualDisk_major = MAJOR(devno);/* 从申请设备号中得到主设备号 */
}
if (result < 0)
return result;

/* 动态申请设备结构体的内存*/
Virtualdisk_devp = kmalloc(sizeof(struct VirtualDisk), GFP_KERNEL);
if (!Virtualdisk_devp) /*申请失败*/
{
result = - ENOMEM;
goto fail_kmalloc;
}
memset(Virtualdisk_devp, 0, sizeof(struct VirtualDisk));/*将内存清零*/
/*初始化并且添加cdev结构体*/
VirtualDisk_setup_cdev(Virtualdisk_devp, 0);
// devfs_mk_cdev(devno, S_IFCHR|S_IRUGO|S_IWUSR, "VirtualDisk"); /*yinhf*/
printk(KERN_ALERT "Virtualdisk Success\n");

/* create virtual_disk_class under /sysfs by yinhf.*/
virtual_disk_class = class_create(THIS_MODULE, "VirtualDisk");
if(IS_ERR(virtual_disk_class))
{
printk("Err: failed in creating virtual_disk_class.\n");
return -1;
}
/* register your own device in sysfs, and this will cause udev to create corresponding device node */
device_create( virtual_disk_class, NULL, devno, 0, "VirtualDisk");
printk (KERN_INFO "Registered character driver VirtualDisk.\n");
/*end create virtual_disk_class by yinhf.*/

return 0;

fail_kmalloc:
unregister_chrdev_region(devno, 1);
return result;
}



具体原理可以参考下面网址,可能由于版本的原因,device_create的用法不太一样,注意一下啊。
http://blog.csdn.net/engerled/archive/2011/02/24/6205722.aspx
http://www.embedu.org/Column/Column120.htm
hfyinsdu 2011-06-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zheng23yi 的回复:]

引用楼主 hfyinsdu 的回复:
1. insmod virtual_disk.ko,加载模块;

2. cat proc/devices
Character devices:
1 mem
200 VirtualDisk
204 s3c2410_serial

3. lsmod
VirtualDisk 3756 0 - Live 0xbf000000

3. 但是,在……
[/Quote]
恩,哈哈,马上啊,刚刚在看怎么实现你的想法呢,现在终于搞定了,谢谢你,非常感谢。
zheng23yi 2011-06-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 hfyinsdu 的回复:]
1. insmod virtual_disk.ko,加载模块;

2. cat proc/devices
Character devices:
1 mem
200 VirtualDisk
204 s3c2410_serial

3. lsmod
VirtualDisk 3756 0 - Live 0xbf000000

3. 但是,在/dev下没有VirtualDisk设……
[/Quote]

给分呀,楼主。
yuanjie_123 2011-06-23
  • 打赏
  • 举报
回复
学习中....
zheng23yi 2011-06-23
  • 打赏
  • 举报
回复
你还可以在驱动里面自动创建,免去手动创建的麻烦。
hfyinsdu 2011-06-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zheng23yi 的回复:]

在 VirtualDisk_init里面添加
#ifdef CONFIG_DEVFS_FS //支持devfs文件系统,在内核里面配置
devfs_mk_cdev(设备号, S_IFCHR|S_IRUGO|S_IWUSR, 设备名称);
#endif
或者用mknod手动创建设备文件。
[/Quote]
很感谢你啊 ^_^
我使用 mknod VirtualDisk c 200 0,创建了这个设备,
ls -l dev/V*
crw-rw-rw- 1 root root 200, 0 Aug 25 07:17 dev/VirtualDisk
但是,当我用下面的程序访问这个设备时,依然不能打开这个设备;
并且,我决定加载这个设备驱动后,VirtualDisk应该自动出现在/dev目录下。
此外,我用的是linux-2.6.30.4,里面没有CONFIG_DEVFS_FS的定义啊,我查了一下,说linux-2.6之后用的是sysfs管理设备,并且我在制作文件系统时,用的是udev,应该也是sysfs。

#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

void main()
{
int fileno;/*用于文件表述符*/
int number;
char data[]="one two three four five six";/*写入VirtualDisk的数据*/
char str[1024];/*用户空间缓冲*/
int len;

fileno = open("/dev/VirtualDisk",O_RDWR);/*以读写方式打开设备文件*/

if (fileno == -1)/*打开文件失败*/
{
printf("open VirtualDisk device errr!\n");
return 0;
}

write(fileno,data,strlen(data));/*将数据写入设备*/
close(fileno);/*关闭设备文件*/

fileno=open("/dev/VirtualDisk",O_RDWR);/*以读写方式打开设备文件*/
len=read(fileno,str,1024);/*读出设备中的数据*/
str[len]='\0';
printf("%s\n",str);/*显示设备的数据*/
close(fileno);/*关闭设备文件*/

fileno=open("/dev/VirtualDisk",O_RDWR);/*以读写方式打开设备文件*/
lseek(fileno,4,SEEK_SET);/*将文件指针后移4字节,当前位置的字符为t*/
len=read(fileno,str,1024);/*读出设备中的数据*/
str[len]='\0';
printf("%s\n",str);/*显示设备的数据*/
close(fileno);/*关闭设备文件*/

return 0;
}
zheng23yi 2011-06-23
  • 打赏
  • 举报
回复
在 VirtualDisk_init里面添加
#ifdef CONFIG_DEVFS_FS //支持devfs文件系统,在内核里面配置
devfs_mk_cdev(设备号, S_IFCHR|S_IRUGO|S_IWUSR, 设备名称);
#endif
或者用mknod手动创建设备文件。
zheng23yi 2011-06-23
  • 打赏
  • 举报
回复
这个我正想说,linux里面有两种设备文件系统,devfs和sysfs。你使用的是后者,新版本的内核已经停止对devfs的支持,如果想用的话可以自己添加。你用的是第二种设备文件系统。

21,619

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧