Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1254033
  • 博文数量: 479
  • 博客积分: 12240
  • 博客等级: 上将
  • 技术积分: 4999
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-24 17:12
文章分类

全部博文(479)

文章存档

2014年(1)

2013年(1)

2012年(1)

2011年(95)

2010年(177)

2009年(167)

2008年(16)

2007年(21)

分类: LINUX

2011-01-16 21:21:50

misc主设备号是10,MISC_MAJOR,初始化和注册在drivers/char/misc.c中进行,实际上是通过register_chrdev完成的,可见misc实际上也是一个cdev字符设备。

  1. static int __init misc_init(void)
  2. {
  3.         int err;

  4. #ifdef CONFIG_PROC_FS
  5.         proc_create("misc", 0, NULL, &misc_proc_fops);
  6. #endif
  7.         misc_class = class_create(THIS_MODULE, "misc");
  8.         err = PTR_ERR(misc_class);
  9.         if (IS_ERR(misc_class))
  10.                 goto fail_remove;

  11.         err = -EIO;
  12.         if (register_chrdev(MISC_MAJOR,"misc",&misc_fops))
  13.                 goto fail_printk;
  14.         misc_class->devnode = misc_devnode;
  15.         return 0;

  16. fail_printk:
  17.         printk("unable to get major %d for misc devices\n", MISC_MAJOR);
  18.         class_destroy(misc_class);
  19. fail_remove:
  20.         remove_proc_entry("misc", NULL);
  21.         return err;
  22. }
  23. subsys_initcall(misc_init);


miscdevice,混杂设备,由device结构派生而来。


使用misc子系统注册的字符驱动。
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/fs.h>
  4. #include <linux/miscdevice.h>

  5. #define DEVICE_NAME     "charmisc"

  6. static int char_misc_open(struct inode *inode, struct file *file )
  7. {
  8.     try_module_get(THIS_MODULE);
  9.     printk(KERN_INFO DEVICE_NAME "opened!\n");

  10.     return 0;
  11. }

  12. static int char_misc_release(struct inode *inode, struct file *file )
  13. {
  14.     printk(KERN_INFO DEVICE_NAME "closed!\n");

  15.     module_put(THIS_MODULE);
  16.     return 0;
  17. }


  18. static ssize_t char_misc_read(struct file *file, char *buf,size_t count, loff_t *f_pos)
  19. {
  20.     printk(KERN_INFO DEVICE_NAME "read method!\n");

  21.     return count;
  22. }

  23. static ssize_t char_misc_write(struct file *file, const char *buf, size_t count, loff_t *f_pos)
  24. {
  25.     printk(KERN_INFO DEVICE_NAME "write method!\n");

  26.     return count;
  27. }

  28. static int char_misc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  29. {
  30.     printk(KERN_INFO DEVICE_NAME "ioctl method!\n");

  31.     return 0;
  32. }

  33. struct file_operations char_misc_fops = {
  34.     .owner        = THIS_MODULE,
  35.     .read        = char_misc_read,
  36.     .write        = char_misc_write,
  37.     .open        = char_misc_open,
  38.     .release    = char_misc_release,
  39.     .ioctl        = char_misc_ioctl
  40. };

  41. /* misc结构体 */
  42. static struct miscdevice char_misc = {
  43.     .minor     = MISC_DYNAMIC_MINOR,
  44.     .name    = DEVICE_NAME,
  45.     .fops    = &char_misc_fops,
  46. };

  47. static int __init char_misc_init(void)
  48. {
  49.     int ret;

  50.     ret = misc_register(&char_misc); //注册misc设备
  51.     if (ret < 0) {
  52.         printk(KERN_ERR "misc_register error!\n");
  53.         return -1;
  54.     }

  55.     return 0;
  56. }

  57. static void __exit char_misc_exit(void)
  58. {
  59.      misc_deregister(&char_misc); //卸载misc设备
  60. }

  61. module_init(char_misc_init);
  62. module_exit(char_misc_exit);

  63. MODULE_LICENSE("GPL");
  64. MODULE_AUTHOR("Chenxibing,hibrian.chen@gmail.com");

使用方法:

#insmod char_misc.ko
#ls /dev/charmisc -l
crw------- 1 root root 10, 53 2011-01-16 21:19 /dev/charmisc
主设备号是misc的主设备号10,53是新注册设备的次设备号。

在/sys/class/misc/目录下创建了charmisc目录:
#ls /sys/class/misc/charmisc/
dev  power  subsystem  uevent

#rmmod char_misc
/dev/charmisc设备消失
/sys/class/misc/charmisc/目录消失




















阅读(961) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~