1. #include <linux/module.h>
  2. #include <linux/fs.h>
  3. #include <linux/sched.h>
  4. #include <linux/delay.h>
  5. #include <linux/atomic.h>
  6. #include <linux/types.h>
  7. #include <linux/interrupt.h>
  8. #include <linux/kthread.h>
  9. #include <linux/slab.h>
  10. #include <linux/io.h>
  11. #include <linux/gpio.h>
  12. #include <linux/dma-mapping.h>
  13.  
  14. //定义设备名称为test-dev
  15. #define DEV_NAME "test-dev"
  16.  
  17. //定义并初始化一个类
  18. struct class cla = {
  19. .name = "test-cla", //将类的名字设置为test-cla
  20. .owner = THIS_MODULE, //该类的拥有者为这个模块
  21. };
  22.  
  23. int test_open(struct inode *node, struct file *filp)
  24. {
  25. printk("test open\n");
  26. return 0;
  27. }
  28.  
  29. int test_close(struct inode *node, struct file *filp)
  30. {
  31. printk("test close\n");
  32. return 0;
  33. }
  34.  
  35. //填充并初始化file_operations结构体
  36. struct file_operations fops = {
  37. .owner = THIS_MODULE,
  38. .open = test_open,
  39. .release = test_close,
  40. };
  41.  
  42. //定义设备
  43. struct device dev = {
  44. .init_name = DEV_NAME,
  45. .class = &cla, //设备归类cla;
  46. .release = test_release,
  47. };
  48.  
  49. //定义主设备号和次设备号
  50. int major = 0;
  51. int minor = 0;
  52. int test_init(void)
  53. {
  54. int ret;
  55. printk("test init\n");
  56. //将类进行注册
  57. ret = class_register(&cla);
  58. //如果返回值不为0,返回错误值
  59. if(IS_ERR_VALUE(ret))
  60. {
  61. return ret;
  62. }
  63. //注册一个字符设备驱动
  64. ret = register_chrdev(major, DEV_NAME, &fops);
  65. //如果注册不成功返回错误值并撤销类的实现
  66. if(IS_ERR_VALUE(ret))
  67. {
  68. class_unregister(&cla);
  69. return ret;
  70. }
  71. major = ret;
  72. //printk("major = %d\n", major);
  73. //申请主设备号与次设备号
  74. dev.devt = MKDEV(major, minor);
  75. //将设备进行注册
  76. ret = device_register(&dev);
  77. //如果设备注册不成功,撤销类设备注册并解除字符设备驱动的注册
  78. if(IS_ERR_VALUE(ret))
  79. {
  80. class_unregister(&cla);
  81. unregister_chrdev(major, DEV_NAME);
  82. return ret;
  83. }
  84.  
  85. return 0;
  86. }
  87.  
  88. void test_exit(void)
  89. {
  90. printk("test exit\n");
  91. //解除字符设备的注册
  92. unregister_chrdev(major, DEV_NAME);
  93. //解决类设备注册
  94. device_unregister(&dev);
  95. class_unregister(&cla);
  96. }
  97.  
  98. module_init(test_init);
  99. module_exit(test_exit);
  100.  
  101. MODULE_LICENSE("GPL");
  102. MODULE_AUTHOR("yangyx");
  103. MODULE_VERSION("1.1");

linux设备驱动程序--类class的实现的更多相关文章

  1. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

  2. linux设备驱动程序-设备树(1)-dtb转换成device_node

    linux设备驱动程序-设备树(1)-dtb转换成device_node 本设备树解析基于arm平台 从start_kernel开始 linux最底层的初始化部分在HEAD.s中,这是汇编代码,我们暂 ...

  3. linux设备驱动程序-i2c(1):i2c总线的添加与实现

    linux设备驱动程序-i2c(1):i2c总线的添加与实现 (基于4.14内核版本) 在上一章节linux设备驱动程序-i2c(0)-i2c设备驱动源码实现中,我们演示了i2c设备驱动程序的源码实现 ...

  4. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

  5. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

  6. 嵌入式Linux设备驱动程序:发现硬件配置

    嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...

  7. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  8. 【转】linux设备驱动程序中的阻塞机制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...

  9. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

随机推荐

  1. Gazebo與ROS版本說明

    使用哪种ROS / Gazebo版本的组合 介绍 本文档提供了有关将不同版本的ROS与不同版本的Gazebo结合使用的选项的概述.建议在安装Gazebo ROS包装之前阅读它.重要!简单的分析,快速和 ...

  2. DBoW2应用

    图像对应的bag-of-words向量\(v_t\) 假设词典总共有\(W\)个单词,那么每一幅图像能够用一个\(W\)维的向量表示 \((t_1, t_2, t_3, ..., t_W)\)其中 \ ...

  3. Android初级教程反射+AIDL+内容观察者监控黑名单号码代码模板

    对于想要拦截一些莫名的陌生号码,就需要电话拦截功能与删除其电话记录功能.拦截的主要业务逻辑,分别是在一个服务里面进行:1.注册电话监听:2.取消注册电话监听(当然注册于取消是在服务里面建立一个广播接收 ...

  4. Android简易实战教程--第六话《开发一键锁屏应用2·完成》

    转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51885687点击打开链接 上一篇,初步开发了这个应用,功能都有了(见http:// ...

  5. 剑指Offer——网易校招内推笔试题+模拟题知识点总结

    剑指Offer--网易校招内推笔试题+模拟题知识点总结 前言 2016.8.2 19:00网易校招内推笔试开始进行.前天晚上利用大约1小时时间完成了测评(这个必须做,关切到你能否参与面试).上午利用2 ...

  6. xml特殊字符处理 如&

     写了个request2XML的方法,每当数据中有'<'.'&'符号时,封装的XML就无法解析.发现了XML里的CDATA属性,问题迎刃而解!在XML文档中的所有文本都会被解析器解析 ...

  7. Mpg123源代码详解

    Mpg123与libmad一样,支持mpeg1,2,2.5音频解码.目前来看mpg123比libmad支持了网络播放功能.而且libmad基本上开源社区在2005年左右,基本停止更新,mpg123至今 ...

  8. Windows自删除程序和DLL

    Windows自删除程序和DLL 参照文章 http://blog.csdn.net/rxxi/article/details/741557 做了个自删除的程序SelfDelete.代码下载(我的FT ...

  9. java linux 项目经常无故被关闭 进程无故消息

    布了几个项目.居然天天会自动的挂掉.急了.花时间解决了一下.总结方案如下: 1.磁盘满了.这大家都懂,清一下 2.tomcat在关闭的或是重启的时候,常常后台进程没有被关闭.需要用ps aux|gre ...

  10. Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具

    Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具 记得我的第一篇博客就是写Android Studio,但是现在看来还是有些粗糙了,所有重构了一下思路, ...