Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3466
  • 博文数量: 2
  • 博客积分: 55
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-13 17:53
文章分类
文章存档

2012年(2)

我的朋友
最近访客

分类: LINUX

2012-04-15 22:26:39

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0

点击(此处)折叠或打开

  1. //字符设备的结构体
  2. struct xxx_dev_t
  3. {
  4.     struct cdev cdev;
  5.     ...........
  6. }xxx_dev;

  7. //字符设备模块的加载和卸载函数
  8. static int __init xxx_init(void)
  9. {
  10.     .......
  11.     /*初始化cdev*/
  12.     cdev_init(&xxx_dev.cdev,&xxx_fops);
  13.     xxx_dev.owner=THIS_MODULE;
  14.     /*获取字符设备号*/
  15.     if(xxx_major)
  16.     {
  17.     /*为一个字符驱动获取一个或多个设备编号*/
  18.     register_chrdev_region(xxx_dev_no,1,DEV_NAME);
  19.     }
  20.     else {
  21.     alloc_chrdev_region(&xxx_dev_no,0,1,DEV_NAME);
  22.     }
  23.     ret=cdev_add(&xxx_dev.cdev,xxx_dev_no,1);
  24.     ........
  25. }

  26. //设备驱动模块的卸载函数
  27. static void __exit xxx_exit(void)
  28. {
  29.     unregister_chrdev_region(xxx_dev_no,1);//注释占用设备号
  30.     cdev_del(&xxx_dev.cdev);
  31.     ............
  32. }
  33. //字符设备驱动的file_operations结构体中的成员函数
  34. /*读设备*/
  35. ssize_t xxx_read(struct file *filp,char __usr *buf,size_t count,loff_t *f_pos)
  36. {
  37.     ............
  38.     copy_to_user(buf,...,...);
  39.     .............
  40. }
  41. /*写设备*/
  42. ssize_t xxx_write(struct file *filp,const char __usr *buf,size_f count,loff_t *f_pos)
  43. {
  44.     ..............
  45.     copy_from_user(....,buf,....);
  46.     ..............
  47. }
  48. /*ioctl函数*/
  49. int xxx_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)
  50. {
  51.     .............
  52.     switch(cmd)
  53.     {
  54.     case xxx_cmd1:
  55.     ..........;break;
  56.     case xxx_cmd2:
  57.     ...........;break;
  58.     ..............
  59.     default: /*不能支持的命令*/
  60.     return -ENOTTY;
  61.     }
  62.     return0;
  63. }

  64. //内核空间和用户空间交互,经常用到的两个函数
  65. unsigned long copy_from_user(void *to,const void __user *from,unsigned long count);
  66. unsigned long copy_to_usr(void __user *to,const void *from,unsigned long count);
  67. /*上述函数均返回不能被复制的字节数,如果完全复制成功,则返回值为0。*/

阅读(231) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~