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. #define HELLO_MAJOR 250
    10. #define HELLO_MINOR 0
    11. #define NUMBER_OF_DEVICES 2
    12. struct class *hello_class;
    13. static struct cdev cdev;
    14. dev_t devno;
    15. static ssize_t hello_read(struct file *file, char __user *buf, size_t count,
    16. loff_t *ppos)
    17. {
    18. char *str = "hello world";
    19. copy_to_user(buf,str,strlen(str));
    20. *(buf + strlen(str)) = '\n';
    21. return count;
    22. }
    23. static ssize_t hello_open(struct inode *inode,struct file *file)
    24. {
    25. return 0;
    26. }
    27. static const struct file_operations hello_fops = {
    28. .open = hello_open,
    29. .read = hello_read,
    30. .owner = THIS_MODULE,
    31. };
    32. static int __init hello_init(void)
    33. {
    34. int ret;
    35. devno = MKDEV(HELLO_MAJOR,HELLO_MINOR);
    36. if(HELLO_MAJOR){
    37. ret = register_chrdev_region(devno,NUMBER_OF_DEVICES,"chrdev");
    38. }else{
    39. ret = alloc_chrdev_region(&devno, 0, NUMBER_OF_DEVICES, "chrdev");
    40. }
    41. if(ret < 0){
    42. printk("%s register chrdev error\n",__func__);
    43. return ret;
    44. }
    45. hello_class = class_create(THIS_MODULE,"hello_char_calss");
    46. if(IS_ERR(hello_class)){
    47. printk("%s create class error\n",__func__);
    48. return -1;
    49. }
    50. device_create(hello_class, NULL, devno, NULL, "chrdev");
    51. cdev_init(&cdev, &hello_fops);
    52. cdev.owner = THIS_MODULE;
    53. cdev_add(&cdev, devno, NUMBER_OF_DEVICES);
    54. return 0;
    55. }
    56. static void __exit hello_exit(void)
    57. {
    58. printk("%s",__func__);
    59. cdev_del(&cdev);
    60. device_destroy(hello_class,devno);
    61. class_destroy(hello_class);
    62. unregister_chrdev_region(devno,NUMBER_OF_DEVICES);
    63. }
    64. module_init(hello_init);
    65. module_exit(hello_exit);
    66. MODULE_LICENSE("GPL");
    67. MODULE_AUTHOR("oracleloyal@gmail.com");
    68. Makefile 内容
    69. 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. int main(void)
      4. {
      5. int fd;
      6. int i;
      7. char buf[50];
      8. fd = open("/dev/chrdev",O_RDWR);
      9. if(fd < 0){
      10. printf("can't open dev\n");
      11. return -1;
      12. }
      13. read(fd,buf,11);
      14. printf("%s",buf);
      15. return 0;
      16. }
      17. 测试程序执行后会输出hello world.,

Linux /dev 自动创建设备节点的更多相关文章

  1. linux驱动开发(四) 字符设备驱动框架(自动创建设备节点)

    代码如下 #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> # ...

  2. platform型设备在/dev目录下自动创建设备节点的分析【转】

    转自:http://blog.csdn.net/rockrockwu/article/details/7357648 系统启动过程中platform设备.驱动注册完毕,为什么在/dev目录下就自动创建 ...

  3. I.MX6 linux eGalaxTouch 自动获取设备节点

    I.MX6 linux eGalaxTouch 自动获取设备节点 \\\\\\\\\\\\\\-*- 目录 -*-///////////// | 一. 需求: | 二. /proc/bus/input ...

  4. linux下自动创建设备文件节点---class

    在驱动模块初始化函数中实现设备节点的自动创建 我们在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的 ...

  5. Linux 内核驱动自动创建设备节点并挂载设备

    *注:本文来自http://blog.csdn.net/lwj103862095/article/details/17470573 一.首先需要在最开始定义两个数据结构: static struct ...

  6. 使用class 自动创建设备节点

    #include <linux/init.h>// __init __exit #include <linux/module.h> // module_init module_ ...

  7. Linux设备驱动实现自己主动创建设备节点

    #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #inclu ...

  8. linux driver ------ 字符设备驱动 之 “ 创建设备节点流程 ”

    在字符设备驱动开发的入门教程中,最常见的就是用device_create()函数来创建设备节点了,但是在之后阅读内核源码的过程中却很少见device_create()的踪影了,取而代之的是device ...

  9. linux驱动之设备号与创建设备节点

    设备号: 1.自己主动分配 major = register_chrdev(0,"first_drv",&first_sdv_fops);//注冊 注冊设备时给设备号写0, ...

随机推荐

  1. HDU 2845 Beans (DP)

    Beans Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  2. 【转】对于移动APP测试的一个小技巧

    目标:目前越来越多的应用要支持移动设备,html5的推出,方便了页面对移动app的支持,那么我们该如何有效的去测试同时支持app和web的代码?web的测试可以使用浏览器的一些工具来辅助测试,比如ff ...

  3. javascript将浮点数转换成整数的三个方法

    浮点数转换成整数方法有很多,本例为大家介绍常用的三个方法,如果读者想到其他好用方法,也可以交流一下   Summary 暂时我就想到3个方法而已.如果读者想到其他好用方法,也可以交流一下 parseI ...

  4. 搭建Cocos2d-JS开发环境

    使用Cocos2d-JS引擎开发游戏,主要的程序代码是JavaScript语言,因此,凡是能够开发JavaScript语言工具都适用于Cocos2d-JS游戏开发.本书我们推荐WebStorm和Coc ...

  5. cocos2d-x中Node中重要的属性

    Node还有两个非常重要的属性:position和anchorPoint. position(位置)属性是Node对象的实际位置.position属性往往还要配合使用anchorPoint属性,为了将 ...

  6. NSString字符操作

    1.常用创建初始化方法 1.NSString *string0 = @"string"; 2.NSString *string1 = [NSString stringWithFor ...

  7. 时间类型(DataTime)赋空值

    暂时只发现这一个方法 如果直接Datetime time=DBNull.Value;会报null与DataTime没有隐式转换 SqlCommand cmd = SqlCommand(conn); / ...

  8. 20150506—WinForm自动生成按钮&按钮拖动

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. ARM你必须知道的事儿——为啥“PC = PC + 8”?

    为啥是“PC = PC + 8”: “PC = PC + 8”其实这样写容易让人蒙了.“PC = PC + 8”真正含义应该是: 执行处代码地址 = PC - 8: 也就是说,”PC指向的地址“领先“ ...

  10. 8款超酷而实用的CSS3按钮动画

    1.CSS3分享按钮动画特效 这是一款基于CSS3的社会化分享按钮,按钮非常简单,提供了分享到twitter.facebook.youtube等大型社交网站.每一个分享按钮都有个大社交网站的Logo图 ...