[linux驱动][linux驱动]设备驱动模型相关(一)——示例代码

1,以下为示例代码:

[cpp] view plaincopy

  1. #include <linux/device.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/init.h>
  5. #include <linux/string.h>
  6. MODULE_LICENSE("Dual BSD/GPL");
  7. static char *Version = "2.0.1";
  8. static int my_match(struct device *dev, struct device_driver *driver)
  9. {
  10. return !strncmp(dev->kobj.name, driver->name, strlen(driver->name));
  11. }
  12. static void my_bus_release(struct device *dev)
  13. {
  14. printk(KERN_DEBUG "my bus release\n");
  15. }
  16. struct device my_bus = {
  17. .kobj.name   = "my_bus0",
  18. .release  = my_bus_release
  19. };
  20. struct bus_type my_bus_type = {
  21. .name = "my_bus",
  22. .match = my_match,
  23. };
  24. EXPORT_SYMBOL(my_bus);
  25. EXPORT_SYMBOL(my_bus_type); 
  26. static ssize_t show_bus_version(struct bus_type *bus, char *buf)
  27. {
  28. return snprintf(buf, PAGE_SIZE, "%s\n", Version);
  29. }
  30. static BUS_ATTR(version, S_IRUGO, show_bus_version, NULL);
  31. static int __init my_bus_init(void)
  32. {
  33. int ret;
  34. ret = bus_register(&my_bus_type);
  35. if (ret)
  36. return ret;
  37. if (bus_create_file(&my_bus_type, &bus_attr_version))
  38. printk(KERN_NOTICE "Fail to create version attribute!\n");
  39. ret = device_register(&my_bus);
  40. if (ret)
  41. printk(KERN_NOTICE "Fail to register device:my_bus!\n");
  42. return ret;
  43. }
  44. static void my_bus_exit(void)
  45. {
  46. device_unregister(&my_bus);
  47. bus_unregister(&my_bus_type);
  48. }
  49. module_init(my_bus_init);
  50. module_exit(my_bus_exit);

[cpp] view plaincopy

  1. #include <linux/device.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/init.h>
  5. #include <linux/string.h>
  6. MODULE_LICENSE("Dual BSD/GPL");
  7. extern struct device my_bus;
  8. extern struct bus_type my_bus_type;
  9. static void my_dev_release(struct device *dev)
  10. {
  11. }
  12. struct device my_dev = {
  13. .init_name = "my_dev",
  14. .bus = &my_bus_type,
  15. .parent = &my_bus,     
  16. .release = my_dev_release,
  17. };
  18. static ssize_t mydev_show(struct device *dev,struct device_attribute *attr, char *buf)
  19. {
  20. return sprintf(buf, "%s\n", "This is my device!");
  21. }
  22. static DEVICE_ATTR(dev, S_IRUGO, mydev_show, NULL);
  23. static int __init my_device_init(void)
  24. {
  25. int ret = 0;
  26. ///strncpy(my_dev->kobj.name, "my_dev", strlen(my_dev->name));
  27. device_register(&my_dev);
  28. device_create_file(&my_dev, &dev_attr_dev);
  29. return ret;
  30. }
  31. static void my_device_exit(void)
  32. {
  33. device_unregister(&my_dev);
  34. }
  35. module_init(my_device_init);
  36. module_exit(my_device_exit);

[cpp] view plaincopy

    1. #include <linux/device.h>
    2. #include <linux/module.h>
    3. #include <linux/kernel.h>
    4. #include <linux/init.h>
    5. #include <linux/string.h>
    6. MODULE_LICENSE("Dual BSD/GPL");
    7. extern struct bus_type my_bus_type;
    8. static int my_probe(struct device *dev)
    9. {
    10. printk("Driver found device which my driver can handle!\n");
    11. return 0;
    12. }
    13. static int my_remove(struct device *dev)
    14. {
    15. printk("Driver found device unpluged!\n");
    16. return 0;
    17. }
    18. struct device_driver my_driver = {
    19. .name = "my_dev",
    20. .bus = &my_bus_type,
    21. .probe = my_probe,
    22. .remove = my_remove,
    23. };
    24. static ssize_t mydriver_show(struct device_driver *driver, char *buf)
    25. {
    26. return sprintf(buf, "%s\n", "This is my driver!");
    27. }
    28. static DRIVER_ATTR(drv, S_IRUGO, mydriver_show, NULL);
    29. static int __init my_driver_init(void)
    30. {
    31. int ret = 0;
    32. driver_register(&my_driver);
    33. driver_create_file(&my_driver, &driver_attr_drv);
    34. return ret;
    35. }
    36. static void my_driver_exit(void)
    37. {
    38. driver_unregister(&my_driver);
    39. }
    40. module_init(my_driver_init);
    41. module_exit(my_driver_exit);
时间: 2024-10-05 05:08:29

[linux驱动][linux驱动]设备驱动模型相关(一)——示例代码的相关文章

【转】深入浅出:Linux设备驱动之字符设备驱动

深入浅出:Linux设备驱动之字符设备驱动 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称

Linux SPI总线和设备驱动架构之三:SPI控制器驱动

通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能:1.    申请必要的硬件资源,例如中断,DMA通道,DMA内存缓冲区等等:2.    配置SPI控制器的工作模式和参数,使之可以和相应的设备进行正确的数据交换工作: 3.    向通用接口层提供接口,使得上层的协议驱动可以通过通用接口层访问控制器驱动: 4.    配合通用接口层,完成数据消息队列的排

Linux设备驱动开发 - 平台设备驱动

Linux2.6的内核中引入了一种新的设备驱动模型-平台(platform)设备驱动,平台设备驱动分为平台设备(platform_device)和平台驱动(platform_driver),平台设备的引入使得Linux设备驱动更加便于移植. 一.平台设备平台设备结构体: 1 struct platform_device { 2 const char * name; /* 设备名 */ 3 int id; 4 struct device dev; /* 设备结构体 */ 5 u32 num_res

Linux 设备驱动开发 —— platform设备驱动应用实例解析

前面我们已经学习了platform设备的理论知识Linux 设备驱动开发 -- platform 设备驱动 ,下面将通过一个实例来深入我们的学习. 一.platform 驱动的工作过程 platform模型驱动编程,platform 驱动只是在字符设备驱动外套一层platform_driver 的外壳. 在一般情况下,2.6内核中已经初始化并挂载了一条platform总线在sysfs文件系统中.那么我们编写platform模型驱动时,需要完成两个工作: a -- 实现platform驱动 架构就

Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化

我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返回.而异步方式则正好相反,数据传输的发起者无需等待传输的结束,数据传输期间还可以做其它事情,用代码来解释就是,调用传输的函数后,函数会立刻返回而不用等待数据传输完成,我们只需设置一个回调函数,传输完成后,该回调函数会被调用以通知发起者数据传送已经完成.同步方式简单易用,很适合处理那些少量数据的单次传

字符设备驱动、平台设备驱动、设备驱动模型、sysfs的关系

Linux驱动开发的童鞋们来膜拜吧:-)  学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关联的分析.对于开发者而言,能够熟悉某一点并分享出来已很难得,但对于专注传授技术和经验给

[kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关

《驱动学习 - 字符设备驱动》

1.1字符设备驱动基础 字符设备驱动:设备对数据的处理是按照字节流的形式进行的. 在linux中,“一切皆文件”(除了网络设备),这表示设备最终都会体现为一个文件.设备文件通常位于/dev目录下. 内核通常用主设备号区别一类设备,次设备号用于区分同一类设备的不同个人或不同分区. 手动创建设备文件 mknod /dev/vser0 c 256 0 mknod是make node的缩写.用于创建一个节点(设备文件也叫设备节点).在linux系统中,一个节点代表一个文件. 原文地址:https://w

java目录相关操作 示例代码

package org.rui.io; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; /** * 目录列表器 测试 * * @author lenovo * */ //Args:"C:/Users/lenovo/Pictures/screen/*\.jpg" public class DirList { public

linux设备驱动之字符设备驱动模型(2)

在上一篇中我们已经了解了字符设备驱动的原理,也了解了应用层调用内核函数的机制,但是我们每次操作设备,都必须首先通过mknod命令创建一个设备文件名,比如说我们要打开u盘,硬盘等这些设备,难道我们还要自己创建,就如同刘老师常说的一句话,这也太山寨了吧,所以我们今天我们来点比较专业的,让函数帮我们自动创建: 在Linux 下,设备和驱动通常都需要挂接在一种总线上,总线有PCI.USB.I2C.SPI 等等,总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,一总线来管理设备和驱动函