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. 【MongoDB】MongoDB服务器搭建(Unix/Linux)

    1.安装MongboDB安装包(开源免费的哟) 在Mac 下 brew install mongoDB 就可以啦 安装要等一会儿,大概200M 2. cd到MongboDB文件夹 - 如果是用home ...

  2. VMware系统运维(十四)部署虚拟化桌面 Horzion View Manager 5.2 配置许可

    1.通过网页访问https://conntionserver.testad.local/admin,打开如下图所示页面:输入用户名密码 2.进来以后配置View 许可,点击"编辑许可证&qu ...

  3. jQuery的deferred对象详解(二)

    Deferred对象是由$.Deferred构造的,$.Deferred被实现为简单的工厂模式. $.Deferred的实现 创建三个$.Callbacks对象,分别表示成功done,失败fail,处 ...

  4. 京东2017 C++一面

    一面直接跪,日 1. 重写和重载的区别                            答的一般 2. C++内存分配方式                           不会 3. TCP ...

  5. 用Drawing画图如何不会消失

    方法一:将事件放在form_Load中,在窗体中画图   1: protected void MainForm_Load(object sender,EventArgs e) 2: { 3: Init ...

  6. Ubuntu 15.04 配置VPN的方法详解

    源 起 不久前因为要更新AndroidSDK 和查找相关资料, 但有些方式不能墙了, 所以为了节约时间成本, 购买了为期一个月的VPN,  对方发来邮件, 提供了二十几个服务器地址, 以及一套自动生成 ...

  7. 更改Activity亮度

    有些需求需进入到页面后更改Activity的亮度,退出页面后恢复到之前的亮度.通过更改WindowManager.LayoutParams的screenBrightness可以达到这个效果.scree ...

  8. CSS之表格操作

    表格的colspan和rowspan属性参考:http://erpoperator.blog.163.com/blog/static/17899637220123993031921/ colspan是 ...

  9. Excel VBA 快捷键 代码

    一. 在ThisWorkbook中 Private Sub Workbook_Open() '%对应alt键 宏不能加() Application.OnKey "%q", &quo ...

  10. hive安装配置错误

    1.Access denied for user 'hive'@'localhost' (using password: YES) 解决办法: 执行 hive --service metastore ...