zoukankan      html  css  js  c++  java
  • [linux驱动][linux驱动]设备驱动模型相关(一)——示例代码

    1,以下为示例代码:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.   
    13. static void my_bus_release(struct device *dev)  
    14. {  
    15.         printk(KERN_DEBUG "my bus release ");  
    16. }  
    17. struct device my_bus = {  
    18.         .kobj.name   = "my_bus0",  
    19.         .release  = my_bus_release  
    20. };  
    21. struct bus_type my_bus_type = {  
    22.         .name = "my_bus",   
    23.         .match = my_match,   
    24. };  
    25. EXPORT_SYMBOL(my_bus);        
    26. EXPORT_SYMBOL(my_bus_type);   
    27. static ssize_t show_bus_version(struct bus_type *bus, char *buf)  
    28. {  
    29.         return snprintf(buf, PAGE_SIZE, "%s ", Version);  
    30. }  
    31. static BUS_ATTR(version, S_IRUGO, show_bus_version, NULL);  
    32.   
    33. static int __init my_bus_init(void)  
    34. {  
    35.         int ret;  
    36.         ret = bus_register(&my_bus_type);  
    37.         if (ret)  
    38.                 return ret;  
    39.         if (bus_create_file(&my_bus_type, &bus_attr_version))  
    40.                 printk(KERN_NOTICE "Fail to create version attribute! ");  
    41.         ret = device_register(&my_bus);  
    42.         if (ret)  
    43.                 printk(KERN_NOTICE "Fail to register device:my_bus! ");  
    44.   
    45.         return ret;  
    46. }  
    47. static void my_bus_exit(void)  
    48. {  
    49.         device_unregister(&my_bus);  
    50.         bus_unregister(&my_bus_type);  
    51. }  
    52.   
    53. module_init(my_bus_init);  
    54. module_exit(my_bus_exit);  
    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.   
    7. MODULE_LICENSE("Dual BSD/GPL");  
    8.   
    9. extern struct device my_bus;  
    10. extern struct bus_type my_bus_type;  
    11. static void my_dev_release(struct device *dev)  
    12. {  
    13.   
    14. }  
    15.   
    16. struct device my_dev = {  
    17.         .init_name = "my_dev",  
    18.         .bus = &my_bus_type,     
    19.         .parent = &my_bus,       
    20.         .release = my_dev_release,  
    21. };  
    22.   
    23. static ssize_t mydev_show(struct device *dev,struct device_attribute *attr, char *buf)  
    24. {  
    25.         return sprintf(buf, "%s ", "This is my device!");  
    26. }  
    27.   
    28. static DEVICE_ATTR(dev, S_IRUGO, mydev_show, NULL);  
    29.   
    30. static int __init my_device_init(void)  
    31. {  
    32.         int ret = 0;  
    33.         ///strncpy(my_dev->kobj.name, "my_dev", strlen(my_dev->name));  
    34.         device_register(&my_dev);  
    35.         device_create_file(&my_dev, &dev_attr_dev);  
    36.         return ret;  
    37. }  
    38. static void my_device_exit(void)  
    39. {  
    40.         device_unregister(&my_dev);  
    41. }  
    42. module_init(my_device_init);  
    43. module_exit(my_device_exit);  



    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
      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.   
      7. MODULE_LICENSE("Dual BSD/GPL");  
      8. extern struct bus_type my_bus_type;  
      9. static int my_probe(struct device *dev)  
      10. {  
      11.     printk("Driver found device which my driver can handle! ");  
      12.     return 0;  
      13. }  
      14. static int my_remove(struct device *dev)  
      15. {  
      16.     printk("Driver found device unpluged! ");  
      17.     return 0;  
      18. }  
      19. struct device_driver my_driver = {  
      20.         .name = "my_dev",  
      21.         .bus = &my_bus_type,  
      22.         .probe = my_probe,  
      23.         .remove = my_remove,  
      24. };  
      25. static ssize_t mydriver_show(struct device_driver *driver, char *buf)  
      26. {  
      27.         return sprintf(buf, "%s ", "This is my driver!");  
      28. }  
      29. static DRIVER_ATTR(drv, S_IRUGO, mydriver_show, NULL);  
      30. static int __init my_driver_init(void)  
      31. {  
      32.         int ret = 0;  
      33.         driver_register(&my_driver);  
      34.         driver_create_file(&my_driver, &driver_attr_drv);  
      35.         return ret;  
      36. }  
      37. static void my_driver_exit(void)  
      38. {  
      39.         driver_unregister(&my_driver);  
      40. }  
      41. module_init(my_driver_init);  
      42. module_exit(my_driver_exit);  
  • 相关阅读:
    javascript性能
    图片及js的预加载
    url参数解析
    javascript预编译
    13、MVC 设计思想
    12、JDBC 流程
    线程-2、sleep() 、join()、yield()有什么区别
    线程-1、创建线程的方式及实现
    集合-7、HashMap实现原理及源码分析
    集合-6、HashSet 和 HashMap 区别
  • 原文地址:https://www.cnblogs.com/zhiliao112/p/4237205.html
Copyright © 2011-2022 走看看