• Linux /dev 自动创建设备节点


      1. #include <linux/module.h>  
      2. #include <linux/module.h>  
      3. #include <linux/kernel.h>  
      4. #include <linux/init.h>  
      5. #include <linux/fs.h>  
      6. #include <linux/cdev.h>  
      7. #include <linux/device.h>  
      8. #include <asm/uaccess.h>   
      9.   
      10. #define HELLO_MAJOR 250  
      11. #define HELLO_MINOR 0  
      12. #define NUMBER_OF_DEVICES 2  
      13.   
      14. struct class *hello_class;  
      15. static struct cdev cdev;  
      16. dev_t devno;  
      17.   
      18. static ssize_t hello_read(struct file *file, char __user *buf, size_t count,  
      19.                 loff_t *ppos)  
      20. {  
      21.     char *str = "hello world";  
      22.   
      23.     copy_to_user(buf,str,strlen(str));  
      24.     *(buf + strlen(str)) = ' ';  
      25.     return count;  
      26. }  
      27.   
      28. static ssize_t hello_open(struct inode *inode,struct file *file)  
      29. {  
      30.     return 0;   
      31. }  
      32.   
      33. static const struct file_operations hello_fops = {  
      34.         .open = hello_open,  
      35.         .read = hello_read,  
      36.         .owner = THIS_MODULE,  
      37. };  
      38.   
      39. static int __init hello_init(void)  
      40. {  
      41.     int ret;  
      42.     devno = MKDEV(HELLO_MAJOR,HELLO_MINOR);  
      43.   
      44.     if(HELLO_MAJOR){  
      45.         ret = register_chrdev_region(devno,NUMBER_OF_DEVICES,"chrdev");  
      46.     }else{  
      47.         ret = alloc_chrdev_region(&devno, 0, NUMBER_OF_DEVICES, "chrdev");  
      48.     }  
      49.     if(ret < 0){  
      50.         printk("%s register chrdev error ",__func__);  
      51.         return ret;  
      52.     }  
      53.   
      54.     hello_class = class_create(THIS_MODULE,"hello_char_calss");  
      55.     if(IS_ERR(hello_class)){  
      56.         printk("%s create class error ",__func__);  
      57.         return -1;  
      58.     }  
      59.   
      60.     device_create(hello_class, NULL, devno, NULL, "chrdev");  
      61.       
      62.       
      63.     cdev_init(&cdev, &hello_fops);  
      64.     cdev.owner = THIS_MODULE;  
      65.     cdev_add(&cdev, devno, NUMBER_OF_DEVICES);  
      66.   
      67.     return 0;  
      68. }  
      69.   
      70.   
      71. static void __exit hello_exit(void)  
      72. {  
      73.     printk("%s",__func__);  
      74.     cdev_del(&cdev);  
      75.     device_destroy(hello_class,devno);  
      76.     class_destroy(hello_class);  
      77.     unregister_chrdev_region(devno,NUMBER_OF_DEVICES);  
      78.   
      79. }  
      80.   
      81. module_init(hello_init);  
      82. module_exit(hello_exit);  
      83. MODULE_LICENSE("GPL");  
      84. MODULE_AUTHOR("oracleloyal@gmail.com"); 
      85. Makefile 内容
      86.   1 ifeq ($(KERNELRELEASE),)
          2 #KERNEL_DIR:=/home/archermind/zhaoxi/bsw_ww02_2016/kernel/cht
          3 KERNEL_DIR:=/usr/src/linux-headers-3.13.0-32-generic
          4 PWD:=$(shell pwd)
          5 modules:
          6     $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules
          7 modules_install:
          8     $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules_install
          9 clean:
         10     rm -rf  .*.cmd *.ko  *.o modules.order  Module.symvers *mod.c
         11     .PHONY: modules modules_install clean
         12 else
         13     modules-objs := my.o
         14     obj-m := my.o
         15 endif

        编译模块安装之后会在/sys/class/看到hello_char_class 以及目录内的chrdev,同时也会在/dev下看到udev为我们建立的节点chrdev.

        测试程序
        1. #include <stdio.h>  
        2. #include <fcntl.h>  
        3.   
        4. int main(void)  
        5. {  
        6.     int fd;  
        7.     int i;    
        8.     char buf[50];  
        9.   
        10.     fd = open("/dev/chrdev",O_RDWR);  
        11.     if(fd < 0){  
        12.         printf("can't open dev ");  
        13.         return -1;  
        14.     }  
        15.   
        16.     read(fd,buf,11);  
        17.       
        18.     printf("%s",buf);  
        19.   
        20.     return 0;  
        21. 测试程序执行后会输出hello world.,
  • 相关阅读:
    微信公众平台接口测试账号申请
    Windows平台下tomcat+java的web程序持续占cpu问题调试
    mysql存储过程基础
    Mysql权限控制
    MySQL开启federated引擎实现数据库表映射
    JAVA中Set集合--HashSet的使用
    在js中嵌套java代码
    MySql计算两个日期的时间差函数
    关于easyui combobox下拉框实现多选框的实现
    利用excel办公软件快速拼凑sql语句
  • 原文地址:https://www.cnblogs.com/oracleloyal/p/5359376.html
Copyright © 2020-2023  润新知