linux驱动基础知识(1)--总线理解

Linux设备驱动归纳总结,觉得这里写的很好

http://blog.chinaunix.net/uid-25014876-id-59420.html

1. 总线、设备和驱动

linux驱动基础知识(1)--总线理解

                      总线、设备和驱动


linux驱动基础知识(1)--总线理解

2 bus.c

  1. #include <linux/module.h>  
  2. #include <linux/init.h>   
  3. #include <linux/device.h>  
  4. #include <linux/kernel.h>  
  5. #include "bus.h"  
  6.   
  7. int usb_bus_match(struct device *dev, struct device_driver *drv){ /*使用container_of找出总线自己定义的结构体*/  
  8.     struct usb_device *usb_dev = container_of(dev, struct usb_device, dev);  
  9.     struct usb_driver *usb_drv = container_of(drv, struct usb_driver, drv);  
  10.   
  11.      /*配对函数判断驱动和设备的生产厂商编号和设备编号是否一致*/  
  12.      if((usb_dev->VendorID == usb_drv->VendorID) &&(usb_dev->DeviceID == usb_drv->DeviceID)){  
  13.         printk("match success\n");  
  14.         return 1;  
  15.     }else{  
  16.         printk("match failed\n");  
  17.         return 0;  
  18.     }  
  19. }   
  20.   
  21. struct bus_type usb_bus = {  
  22.                            .name = "my_usb"//定义总线的名字为usb,注册成功后将在/sys/bus目录下看  
  23.                .match =usb_bus_match,               
  24. };  
  25.   
  26.   
  27. int usb_device_register(struct usb_device *usb_dev){  
  28.     usb_dev->dev.bus = &usb_bus; //设备device的总线为usb_bus  
  29.     return device_register(&usb_dev->dev); //注册此device  
  30. }  
  31.   
  32. void usb_device_unregister(struct usb_device *usb_dev)  
  33. {  
  34.     device_unregister(&usb_dev->dev);  
  35. }  
  36. EXPORT_SYMBOL(usb_device_register);  
  37. EXPORT_SYMBOL(usb_device_unregister);  
  38.   
  39. /*总线提供的驱动注册函数*/  
  40.   
  41. int usb_driver_register(struct usb_driver *usb_drv){  
  42.     usb_drv->drv.bus = &usb_bus; //设置driver的总线为usb_bus  
  43.     return driver_register(&usb_drv->drv); //注册此driver  
  44. }  
  45.   
  46. void usb_driver_unregister(struct usb_driver *usb_drv){  
  47.     driver_unregister(&usb_drv->drv);  
  48. }  
  49.   
  50. EXPORT_SYMBOL(usb_driver_register);  
  51. EXPORT_SYMBOL(usb_driver_unregister);   
  52.   
  53.   
  54. static int __init usb_bus_init(void){  
  55.     int ret;  
  56.     ret = bus_register(&usb_bus);//总线注册,必须检测返回值  
  57.     if(ret){  
  58.         printk("bus create failed!\n");  
  59.         return ret;  
  60.     }  
  61.     printk("usb bus init\n");  
  62.     return ret;  
  63.   
  64. }  
  65.   
  66. static void __exit usb_bus_exit(void){  
  67.     bus_unregister(&usb_bus);  
  68.     printk("usb bus bye!\n");  
  69. }  
  70.   
  71. module_init(usb_bus_init);  
  72. module_exit(usb_bus_exit);  
  73. MODULE_LICENSE("GPL");  
3 device.c
  1. #include <linux/module.h>  
  2. #include <linux/init.h>   
  3. #include <linux/device.h>  
  4. #include <linux/kernel.h>  
  5. #include "bus.h"  
  6.   
  7. extern struct bus_type usb_bus;  
  8.   
  9. void usb_dev_release(struct device *dev){  
  10.     printk("usb_dev_release\n");  
  11. }  
  12.   
  13. struct usb_device mouse_dev = {  
  14.         .VendorID = 0x1122,  
  15.         .DeviceID = 0x3344,  
  16.         .dev = {  
  17.             .init_name = "usb_mouse",  
  18.             .release = usb_dev_release,  
  19.             },  
  20. };   
  21.   
  22. static int __init usb_device_init(void){  
  23.     int ret;  
  24.   
  25.     /*设备注册,注册成功后在/sys/device目录下创建目录usb_device*/  
  26.     ret = usb_device_register(&mouse_dev);   
  27.     if(ret){  
  28.         printk("device register failed!\n");  
  29.         return ret;  
  30.     }  
  31.     printk("usb device init\n");  
  32.     return ret;  
  33.   
  34. }  
  35.   
  36. static void __exit usb_device_exit(void){  
  37.     usb_device_unregister(&mouse_dev);   
  38.     printk("usb device bye!\n");  
  39. }  
  40.   
  41. module_init(usb_device_init);  
  42. module_exit(usb_device_exit);  
  43. MODULE_LICENSE("GPL");  

driver.c

  1. #include <linux/module.h>  
  2. #include <linux/init.h>   
  3. #include <linux/device.h>  
  4. #include <linux/kernel.h>  
  5. #include "bus.h"  
  6.   
  7. int usb_driver_probe(struct device *dev){  
  8.     printk("usb_driver_probe\n");  
  9.     return 0;  
  10. }   
  11.   
  12. int usb_driver_remove(struct device *dev){  
  13.     printk("usb_driver_remove\n");  
  14.     return 0;  
  15. }   
  16.   
  17. struct usb_driver mouse_drv = {  
  18.         .VendorID = 0x1122,  
  19.         .DeviceID = 0x3344,  
  20.         .drv = {  
  21.             .name = "usb_mouse"//在/sys/中的驱动目录名字  
  22.             .probe =  usb_driver_probe,  
  23.             .remove = usb_driver_remove,  
  24.             },  
  25. };   
  26.   
  27.   
  28.   
  29. static int __init usb_driver_init(void){  
  30.   
  31.     int ret;  
  32.        /*驱动注册,注册成功后在/sys/bus/usb/driver目录下创建目录usb_driver*/  
  33.     ret = usb_driver_register(&mouse_drv);   
  34.     if(ret){  
  35.         printk("driver register failed!\n");  
  36.         return ret;  
  37.     }     
  38.     printk("usb driver init\n");  
  39.     return ret;  
  40. }  
  41.   
  42.   
  43. static void __exit usb_driver_exit(void){  
  44.     usb_driver_unregister(&mouse_drv);   
  45.     printk("usb driver bye!\n");  
  46. }  
  47. module_init(usb_driver_init);  
  48. module_exit(usb_driver_exit);  
  49. MODULE_LICENSE("GPL");   


Makefile

  1. ifeq ($(KERNELRELEASE),)          
  2. KERNELDIR ?= /usr/src/linux-headers-3.19.0-39-generic  
  3. PWD :=$(shell pwd)        
  4. modules:    
  5.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules    
  6. modules_install:    
  7.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install    
  8. clear:    
  9.     rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions  modules.order  Module.symvers  
  10. .PHONY: modules modules_install clean    
  11. else    
  12.     obj-m:= bus.o device.o driver.o  
  13. endif