免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4073 | 回复: 5
打印 上一主题 下一主题

关于字符驱动struct cdev的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-23 11:17 |只看该作者 |倒序浏览
在看ldd3的时候里面讲内核用struct cdev结构来表示字符设备
在使用中碰到点疑惑
我这有2个驱动的例子
第一个 键盘驱动
result = register_chrdev(KEYBOARD_MAJOR, "Key7279", &Key7279_fops);
这个里面就是这么注册的,没有用到struct cdev 这个结构体

第二个 IO驱动
cdev_init(&myled_dev.cdev, &myled_fops);
myled_dev.cdev.owner = THIS_MODULE;
ret=alloc_chrdev_region(&led_dev,0,1,"myled");
这个里面就用到了struct cdev 这个结构体

我的问题是键盘是属于块设备吗?
还是用register_chrdev 这个注册时不需要用struct cdev 这个结构体
而用alloc_chrdev_region 这个注册就要用到struct cdev 这个结构体
或者是其它的什么原因 敬请高人解答

论坛徽章:
0
2 [报告]
发表于 2010-03-23 11:24 |只看该作者
int register_chrdev(unsigned int major, const char *name,
const struct file_operations *fops)
{
struct char_device_struct *cd;
struct cdev *cdev;
char *s;
int err = -ENOMEM;

cd = __register_chrdev_region(major, 0, 256, name);
if (IS_ERR(cd))
return PTR_ERR(cd);

cdev = cdev_alloc();
if (!cdev)
goto out2;

cdev->owner = fops->owner;
cdev->ops = fops;
kobject_set_name(&cdev->kobj, "%s", name);
for (s = strchr(kobject_name(&cdev->kobj),'/'); s; s = strchr(s, '/'))
*s = '!';

err = cdev_add(cdev, MKDEV(cd->major, 0), 256);
if (err)
goto out;

cd->cdev = cdev;

return major ? 0 : cd->major;
out:
kobject_put(&cdev->kobj);
out2:
kfree(__unregister_chrdev_region(cd->major, 0, 256));
return err;
}

论坛徽章:
0
3 [报告]
发表于 2010-03-23 15:03 |只看该作者
我也是刚学的,好像是这样的:
第一个是静态注册,第二个是动态注册

论坛徽章:
0
4 [报告]
发表于 2010-03-23 15:44 |只看该作者
回复 1# yel617


    键盘不是块设备,

    两种不同的注册字符设备的方法,自己百度吧,没法google了

论坛徽章:
1
NBA常规赛纪念章
日期:2015-05-04 22:32:03
5 [报告]
发表于 2010-03-23 17:19 |只看该作者
回复 4# liying_gg


    没有谷歌中国,不是还有谷歌HK嘛

论坛徽章:
0
6 [报告]
发表于 2010-03-24 10:20 |只看该作者
呵呵
这个问题我已经找到答案了
2楼就是
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP