现在的位置: 首页 > 综合 > 正文

misc杂项设备驱动

2013年06月22日 ⁄ 综合 ⁄ 共 5399字 ⁄ 字号 评论关闭

Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。

它有自己的设备结构体:

 struct miscdevice  {
     int minor;
     const char *name;
     const struct file_operations *fops;
     struct list_head list;
     struct device *parent;
     struct device *this_device;
     const char *nodename;
     mode_t mode;
 };
它在头文件linux/miscdevice.h里面有定义,

其中minor是misc设备的副设备号,misc设备主要依赖minor去区分,如果设置为MISC_DYNAMIC_MINOR则表示系统自动分配未使用的minor

nodename是在/dev下面创建的设备驱动节点,

fops是驱动主体处理函数入口指针

 

主要使用到的函数有:

int misc_register(struct miscdevice * misc);
int misc_deregister(struct miscdevice *misc);

misc01.c文件

  1. #include <linux/init.h>  
  2. #include <linux/module.h>  
  3. #include <linux/fs.h>  
  4. #include <linux/miscdevice.h>  
  5. /////////////////////////////////////////////////  
  6. MODULE_LICENSE("Dual BSD/GPL");  
  7. int open_state = 0;  
  8. /////////////////////////////////////////////////  
  9. int misc01_open(struct inode *inode, struct file *filp)  
  10. {  
  11.     if (open_state == 0)  
  12.     {  
  13.         open_state = 1;  
  14.         printk("misc01 open!\n");  
  15.         return 0;  
  16.     }  
  17.     printk("misc01 has been open!\n");  
  18.     return -1;  
  19. }  
  20.   
  21. int misc01_release(struct inode *inode, struct file *filp)  
  22. {  
  23.     if (open_state == 1)  
  24.     {  
  25.         open_state = 0;  
  26.         printk("misc01 release!\n");  
  27.         return 0;  
  28.     }  
  29.     printk("misc01 has not been open yet!\n");  
  30.     return -1;  
  31. }  
  32.   
  33. ssize_t misc01_read(struct file *filp, char *buf,  
  34.         size_t count, loff_t fpos)  
  35. {  
  36.     printk("misc01 read!\n");  
  37.     return 0;  
  38. }  
  39.   
  40. ssize_t misc01_write(struct file *filp, char *buf,  
  41.         size_t count, loff_t fpos)  
  42. {  
  43.     printk("misc01 write!\n");  
  44.     return 0;  
  45. }  
  46.   
  47. int misc01_ioctl(struct inode *inode, struct file *filp,  
  48.         unsigned int cmd, unsigned long arg)  
  49. {  
  50.     printk("ioctl is called!\n");  
  51.     printk("cmd:%d arg:%d\n", cmd, arg);  
  52.     return 0;  
  53. }  
  54. /////////////////////////////////////////////////  
  55. struct file_operations fops =   
  56. {  
  57.     .owner      =   THIS_MODULE,  
  58.     .open       =   misc01_open,  
  59.     .release    =   misc01_release,  
  60.     .write      =   misc01_write,  
  61.     .read       =   misc01_read,  
  62.     .ioctl      =   misc01_ioctl  
  63. };  
  64.   
  65. struct miscdevice dev =   
  66. {  
  67.     .minor  =   MISC_DYNAMIC_MINOR,  
  68.     .fops    =   &fops,  
  69.     .name   =   "misc01",  
  70.     .nodename = "misc01_node"  
  71. };  
  72.   
  73. int setup_misc01(void)  
  74. {  
  75.       
  76.     return misc_register(&dev);  
  77. }  
  78. /////////////////////////////////////////////////  
  79. static int __init misc01_init(void)  
  80. {  
  81.     printk("misc01 init!\n");  
  82.     return setup_misc01();  
  83. }  
  84.   
  85. static void __exit misc01_exit(void)  
  86. {  
  87.     printk("misc01 exit!\n");  
  88.     misc_deregister(&dev);  
  89. }  
  90.   
  91. /////////////////////////////////////////////////  
  92. module_init(misc01_init);  
  93. module_exit(misc01_exit);  


Makefile文件

  1. #Makefile  
  2. obj-m   :=  misc01.o  
  3. PWD     :=  $(shell pwd)  
  4. K_DIR   :=  /lib/modules/$(shell uname -r)/build  
  5.   
  6. all:  
  7.     $(MAKE) -C $(K_DIR) M=$(PWD) modules  
  8. clean:  
  9.     $(MAKE) -C $(K_DIR) M=$(PWD) clean  
  10. test:misc01_test.o  
  11.     gcc -o $@ {1}lt;  


misc01_test.c文件

  1. #include <stdio.h>  
  2. #include <sys/stat.h>  
  3. #include <sys/ioctl.h>  
  4. #include <fcntl.h>  
  5. #include <errno.h>  
  6. /////////////////////////////////////////////////  
  7. int main(int argc, char **argv)  
  8. {  
  9.     int fd;  
  10.     fd = open("/dev/misc01_node", O_RDONLY);  
  11.     if (fd < 0)  
  12.     {  
  13.         printf("open /dev/misc01_node failed!\n");  
  14.         printf("%s\n", strerror(errno));  
  15.         return -1;  
  16.     }  
  17.       
  18.     printf("open /dev/misc01_node ok!\n");  
  19.     if (ioctl(fd, 6) != 0)  
  20.     {  
  21.         printf("ioctl failed!\n");  
  22.         printf("%s\n", strerror(errno));  
  23.     }  
  24.     else  
  25.         printf("ioctl ok!\n");  
  26.     close(fd);  
  27.     return 0;  

抱歉!评论已关闭.