免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dreamice
打印 上一主题 下一主题

Linux驱动开发庖丁解牛之三——揭开字符设备驱动程序的面纱 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2009-04-13 15:18 |只看该作者
原帖由 rico849 于 2009-4-12 17:02 发表


我编译后没有产生,不知道怎么回事,请Dreamice指教啊,初学者,呵呵!

try
cat /proc/devices

论坛徽章:
0
42 [报告]
发表于 2009-05-24 10:10 |只看该作者
这东西不错,支持一下。

论坛徽章:
0
43 [报告]
发表于 2009-05-24 18:45 |只看该作者
dreamice兄一直在不辞辛劳地普及驱动开发方面的知识和技巧,必须得顶一下,

论坛徽章:
0
44 [报告]
发表于 2009-08-14 15:59 |只看该作者
太让人激动了。谢谢

论坛徽章:
0
45 [报告]
发表于 2010-03-19 09:06 |只看该作者
看完了,跟着学点device的东西。!ths!

论坛徽章:
0
46 [报告]
发表于 2010-08-17 16:14 |只看该作者
楼主赶快出PDF啊,我要珍藏~~~

论坛徽章:
0
47 [报告]
发表于 2010-08-19 11:06 |只看该作者
期待关于驱动模型的文章。。。

论坛徽章:
0
48 [报告]
发表于 2010-08-26 16:26 |只看该作者
看到这里不得不佩服楼主,哥们儿,你收我为徒吧!

论坛徽章:
0
49 [报告]
发表于 2010-08-26 16:37 |只看该作者
请问楼主:
你怎么理解驱动与应用程序函数参数变化是什么原因?
比如:write在驱动里是write(struct file ...
vincentdpan 发表于 2008-12-24 19:40



    就是啊!当初改人家的驱动的时候,一直纳闷儿,为什么这两个函数的参数个数不一样???!!!

论坛徽章:
0
50 [报告]
发表于 2010-08-27 14:58 |只看该作者
本帖最后由 zhuqing_739 于 2010-08-30 10:55 编辑

我也贴一个宋老师那本书上的驱动:
----------------------------------------------------------------------------------------

  1. include ...
  2. struct light_dev
  3. {
  4.         struct cdev cdev;
  5.         unsigned char value;
  6. };

  7. struct light_dev *light_devp;
  8. int light_major = LIGHT_MAJOR;

  9. MODULE_AUTHOR("Song Baohua");
  10. MODULE_LICENSE("Dual BSD/GPL");

  11. /*打开和关闭函数*/
  12. int light_open(struct inode *inode, struct file *file)
  13. {
  14.         struct lignt_dev *dev;
  15.         dev = container_of(inode->i_cdev, struct lignt_dev, cdev);
  16.         file->private_data = dev;
  17.         return 0;
  18. }

  19. int light_release(struct inode *inode, struct file *file)
  20. {
  21.         return 0;
  22. }

  23. ssize_t light_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
  24. {
  25.         struct lignt_dev *dev = filp->private_data;

  26.         if (copy_to_user(buf, &(dev->value), 1))
  27.         {
  28.                   return -EFAULT;
  29.         }
  30.         return 1;
  31. }

  32. ssize_t light_write(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
  33. {
  34.         struct lignt_dev *dev = filp->private_data;

  35.         if (copy_to_user(buf, &(dev->value), 1))
  36.         {
  37.                   return -EFAULT;
  38.         }
  39.         return 1;

  40.         if (dev->value == 1)
  41.                 light_on();
  42.         else
  43.                 light_off();

  44.         return 1;
  45. }

  46. int light_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
  47. {
  48.         struct light_dev *dev = filp->private_data;

  49.         switch(cmd)
  50.         {
  51.                 case LIGHT_ON:
  52.                         dev->value = 1;
  53.                         light_on();
  54.                         break;
  55.                
  56.                 case LIGHT_OFF:
  57.                         dev->value = 0;
  58.                         light_off();
  59.                         break;

  60.                 default:
  61.                         return -ENOTTY;
  62.         }

  63.         return 0;
  64. }

  65. struct file_operations light_fops =
  66. {
  67.         .owner = THIS_MODULE,
  68.         .read  = light_read,
  69.         .write = light_write,
  70.         .ioctl = light_ioctl,
  71.         .open  = light_open,
  72.         .release = light_release,
  73. };

  74. struct void light_setup_cdev(struct light_dev *dev, int index)
  75. {
  76.         int err, devno = MKDEV(light_major, index);

  77.         cdev_init(&dev->cdev, &light_fops);
  78.         dev->cdev.owner = THIS_MODULE;
  79.         dev->cdev.ops = &light_fops;
  80.         err = cdev_add(&dev->cdev, devno, 1)
  81.         if (err)
  82.         {
  83.                 printk(KERN_NOTICE "Error %d adding LED%d", err, index);
  84.         }
  85. }

  86. int light_init(void)
  87. {
  88.         int result;
  89.         dev_t dev = MKDEV(light_major, 0);

  90.         if (light_major)
  91.         {
  92.                 result = register_chrdev_region(dev, 1, "LED");
  93.         }
  94.         else
  95.         {
  96.                 result = alloc_chrdev_region(&dev, 0, 1, "LED");
  97.                 light_major = MAJOR(dev);
  98.         }

  99.         if (result < 0)
  100.                 return result;

  101.         light_devp = kmalloc(sizeof(struct light_dev), GPL_KEENEL);

  102.         if (!light_devp)
  103.         {
  104.                 result = -ENOMEM;
  105.                 goto fail_malloc;
  106.         }

  107.         memset(light_devp, 0, sizeof(struct light_dev));
  108.         light_setup_cdev(light_devp, 0);
  109.         light_init();
  110.         return 0;

  111.         fail_malloc: unregister_chrdev_region(dev, light_devp);
  112.         return result;
  113. }

  114. void light_cleanup(void)
  115. {
  116.         cdev_del (&light_devp->cdev);
  117.         kfree(light_devp);
  118.         unregister_chrdev_region(MKDEV(light_major, 0), 1);
  119.        
  120. }

  121. module_init(light_init);
  122. module_exit(light_cleanup);
复制代码
----------------------------------------------------------------------------------------
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP