#ifndef _BUS_H #define _BUS_H struct usb_device{ char name[20]; unsigned long CompanyID,ProductID; unsigned long addr; int irqno; struct device dev; }; struct usb_driver{ char name[20]; unsigned long CompanyID,ProductID; struct device_driver drv; }; int usb_device_register(struct usb_device *device); void usb_device_unregister(struct usb_device *device); int usb_driver_register(struct usb_driver *driver); void usb_driver_unregister(struct usb_driver *driver); #endif bus.c: #include <linux/module.h> #include <linux/init.h> #include <linux/device.h> #include <linux/interrupt.h> #include "bus.h" struct work_struct my_work; struct usb_device *led; int usb_match(struct device *dev,struct device_driver *drv) { struct usb_device *udev; struct usb_driver *udrv; udev=container_of(dev,struct usb_device,dev); udrv=container_of(drv,struct usb_driver,drv); if((udev->CompanyID==udrv->CompanyID)&&(udev->ProductID==udrv->ProductID)) { printk("<bus> match sucess/n"); return 1; } printk("<bus> match failed/n"); return 0; } void release_led(struct device *led_device) { printk("has the led release/n"); return; } void work_handled(struct work_struct *work) { led=(struct usb_device*)kmalloc(sizeof(struct usb_device),GFP_KERNEL); if(NULL==led) { printk("the kernel has no space/n"); return; } memset(led,0,sizeof(struct usb_device)); led->CompanyID=1234; led->ProductID=5678; strcpy(led->name,"led"); strcpy(led->dev.bus_id,"ledvice"); led->dev.release=release_led; usb_device_register(led); printk("has the plughot sucess/n"); } irqreturn_t handler(int irq,void *dev_id) { printk("has the [%d]interrupt/n",irq); schedule_work(&my_work); return IRQ_HANDLED; } struct bus_type usb_bus={ .name="usb", .match=usb_match, }; int init_bus(void) { INIT_WORK(&my_work,work_handled); request_irq(IRQ_EINT1,handler,IRQF_TRIGGER_FALLING,"usb bus hot-plug",NULL); bus_register(&usb_bus); return 0; } void exit_bus(void) { usb_device_unregister(led); free_irq(IRQ_EINT1,NULL); bus_unregister(&usb_bus); } int usb_device_register(struct usb_device *udev) { udev->dev.bus=&usb_bus; device_register(&udev->dev); return 0; } void usb_device_unregister(struct usb_device *udev) { device_unregister(&udev->dev); } int usb_driver_register(struct usb_driver *udrv) { udrv->drv.bus=&usb_bus; driver_register(&udrv->drv); return 0; } void usb_driver_unregister(struct usb_driver *udrv) { driver_unregister(&udrv->drv); } module_init(init_bus); module_exit(exit_bus); MODULE_LICENSE("GPL"); //EXPORT_SYMBOL(usb_bus); EXPORT_SYMBOL(usb_device_register); EXPORT_SYMBOL(usb_device_unregister); EXPORT_SYMBOL(usb_driver_register); EXPORT_SYMBOL(usb_driver_unregister); driver.c #include <linux/module.h> #include <linux/init.h> #include <linux/device.h> #include "bus.h" //extern struct bus_type usb_bus; int mouse_probe(struct device *dev) { printk("the mouse driver has probed/n"); return 0; } struct usb_driver mouse_driver={ //.bus=&usb_bus, .name="usb_mouse", .CompanyID=1234, //.idVendor=1234, .ProductID=5678, //.idProduct=5678, .drv={ .name="mouse driver", .probe=mouse_probe, } }; int init_driver(void) { usb_driver_register(&mouse_driver); return 0; } void exit_driver(void) { usb_driver_unregister(&mouse_driver); } module_init(init_driver); module_exit(exit_driver); MODULE_LICENSE("GPL");