简答的字符驱动

lq651659889 2011-09-30 11:41:32
我自己写了个简单的字符驱动,编译什么都没有错,模块加载也成功了,但自动创建的设备节点没有,部分代码如下:
static void my_cdev_setup(struct my_cdev *dev, int index)

{

int err;

dev_t devno = MKDEV(device_major, index);

cdev_init(&dev->cdev,&my_cdev_fops);

dev->cdev.owner = THIS_MODULE;

dev->cdev.ops = &my_cdev_fops;

err = cdev_add(&dev->cdev,devno,1);



if(err)

printk(KERN_NOTICE"Error %d adding LED %d\n", err, index);

}



static int __init my_cdev_init(void)

{

int result;

dev_t devno;

printk(KERN_ALERT"init my char driver\n");

if(device_major)

{

devno = MKDEV(DEVICE_MAJOR, 0);

result = register_chrdev_region(devno,1,"my_cdev_qiong");

}

else

{

result = alloc_chrdev_region(&devno,0,1,"my_cdev_qiong");

device_major = MAJOR(devno);

}



if(result < 0)

return result;



my_cdevp = kmalloc(sizeof(struct my_cdev), GFP_KERNEL);

if(!my_cdevp)

{

result = -ENOMEM;

}



memset(my_cdevp, 0, sizeof(struct my_cdev));



my_cdev_setup(my_cdevp, 0);



my_cdev_class = class_create(THIS_MODULE,"liuqiong");

if(IS_ERR(my_cdev_class))

{

return -1;

}



device_create(my_cdev_class,NULL,devno,"liu" "%d",0);

return result;

}



static void __exit my_cdev_exit(void)

{

cdev_del(&my_cdevp->cdev);



device_destroy(my_cdev_class, MKDEV(device_major, 0));

class_destroy(my_cdev_class);



unregister_chrdev_region(MKDEV(device_major, 0), 1);



kfree(my_cdevp);

}
为什么创建设备节点会没有,如果用命令的话是可以创建成功的,还想问下在卸载模块时老是说模块在被使用,但我只是加载了,什么都没做,求高人解答!!!
...全文
46 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
念茜 2011-09-30
  • 打赏
  • 举报
回复
好像是和别人的节点号冲突了
nevil 2011-09-30
  • 打赏
  • 举报
回复
没有,你试下就知道。少了那个NULL会oops crash

[Quote=引用 6 楼 lq651659889 的回复:]

是不是多了个参数,楼上的
[/Quote]
lq651659889 2011-09-30
  • 打赏
  • 举报
回复
是不是多了个参数,楼上的
nevil 2011-09-30
  • 打赏
  • 举报
回复
应该是这样
device_create(my_cdev_class,NULL, devno, NULL, "liu%d",0); 试下
lq651659889 2011-09-30
  • 打赏
  • 举报
回复
我的是自动创建节点号,在/proc/device中都能看到,只是在/dev下看不到自己创建的节点。
nevil 2011-09-30
  • 打赏
  • 举报
回复
device_create(my_cdev_class,NULL,devno,"liu" "%d",0);
这句话改成
device_create(my_cdev_class,NULL,devno,"liu%d",0); 试下
forch 2011-09-30
  • 打赏
  • 举报
回复
改成自动获取节点吧,省事,不会出错。
给你个参考代码,我自己写的,代码肯定能够没有问题。
static int __init spi_init(void)
{
int result;

dev = MKDEV(spi_major, 0);
/**/
if (spi_major)
{
result = register_chrdev_region(dev, 1, spi_name);
}
else /**/
{
result = alloc_chrdev_region(&dev, 0, 1, spi_name);
spi_major = MAJOR(dev);
}
if (result < 0)
{
return result;
}

cdev_init(&spiCdev, &spi_fops);
spiCdev.owner = THIS_MODULE;
spiCdev.ops = &spi_fops;
if (cdev_add(&spiCdev, dev, 1))
{
printk(KERN_NOTICE "Error adding spi %d", 0);
goto fail;
}


// 创建设备节点 /dev/%s tianyl 2011-09-29
spi_class=class_create(THIS_MODULE, spi_name);
device_create(spi_class,NULL,dev,spi_name);


spi_init_test();
printk("Init spi spi_init_test !\n");
return 0;

fail:
spi_exit();
return result;
}

4,438

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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