linux驱动基础知识(1)--总线理解
Linux设备驱动归纳总结,觉得这里写的很好
http://blog.chinaunix.net/uid-25014876-id-59420.html
1. 总线、设备和驱动
2 bus.c
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/device.h>
- #include <linux/kernel.h>
- #include "bus.h"
- int usb_bus_match(struct device *dev, struct device_driver *drv){ /*使用container_of找出总线自己定义的结构体*/
- struct usb_device *usb_dev = container_of(dev, struct usb_device, dev);
- struct usb_driver *usb_drv = container_of(drv, struct usb_driver, drv);
- /*配对函数判断驱动和设备的生产厂商编号和设备编号是否一致*/
- if((usb_dev->VendorID == usb_drv->VendorID) &&(usb_dev->DeviceID == usb_drv->DeviceID)){
- printk("match success\n");
- return 1;
- }else{
- printk("match failed\n");
- return 0;
- }
- }
- struct bus_type usb_bus = {
- .name = "my_usb", //定义总线的名字为usb,注册成功后将在/sys/bus目录下看
- .match =usb_bus_match,
- };
- int usb_device_register(struct usb_device *usb_dev){
- usb_dev->dev.bus = &usb_bus; //设备device的总线为usb_bus
- return device_register(&usb_dev->dev); //注册此device
- }
- void usb_device_unregister(struct usb_device *usb_dev)
- {
- device_unregister(&usb_dev->dev);
- }
- EXPORT_SYMBOL(usb_device_register);
- EXPORT_SYMBOL(usb_device_unregister);
- /*总线提供的驱动注册函数*/
- int usb_driver_register(struct usb_driver *usb_drv){
- usb_drv->drv.bus = &usb_bus; //设置driver的总线为usb_bus
- return driver_register(&usb_drv->drv); //注册此driver
- }
- void usb_driver_unregister(struct usb_driver *usb_drv){
- driver_unregister(&usb_drv->drv);
- }
- EXPORT_SYMBOL(usb_driver_register);
- EXPORT_SYMBOL(usb_driver_unregister);
- static int __init usb_bus_init(void){
- int ret;
- ret = bus_register(&usb_bus);//总线注册,必须检测返回值
- if(ret){
- printk("bus create failed!\n");
- return ret;
- }
- printk("usb bus init\n");
- return ret;
- }
- static void __exit usb_bus_exit(void){
- bus_unregister(&usb_bus);
- printk("usb bus bye!\n");
- }
- module_init(usb_bus_init);
- module_exit(usb_bus_exit);
- MODULE_LICENSE("GPL");
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/device.h>
- #include <linux/kernel.h>
- #include "bus.h"
- extern struct bus_type usb_bus;
- void usb_dev_release(struct device *dev){
- printk("usb_dev_release\n");
- }
- struct usb_device mouse_dev = {
- .VendorID = 0x1122,
- .DeviceID = 0x3344,
- .dev = {
- .init_name = "usb_mouse",
- .release = usb_dev_release,
- },
- };
- static int __init usb_device_init(void){
- int ret;
- /*设备注册,注册成功后在/sys/device目录下创建目录usb_device*/
- ret = usb_device_register(&mouse_dev);
- if(ret){
- printk("device register failed!\n");
- return ret;
- }
- printk("usb device init\n");
- return ret;
- }
- static void __exit usb_device_exit(void){
- usb_device_unregister(&mouse_dev);
- printk("usb device bye!\n");
- }
- module_init(usb_device_init);
- module_exit(usb_device_exit);
- MODULE_LICENSE("GPL");
4 driver.c
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/device.h>
- #include <linux/kernel.h>
- #include "bus.h"
- int usb_driver_probe(struct device *dev){
- printk("usb_driver_probe\n");
- return 0;
- }
- int usb_driver_remove(struct device *dev){
- printk("usb_driver_remove\n");
- return 0;
- }
- struct usb_driver mouse_drv = {
- .VendorID = 0x1122,
- .DeviceID = 0x3344,
- .drv = {
- .name = "usb_mouse", //在/sys/中的驱动目录名字
- .probe = usb_driver_probe,
- .remove = usb_driver_remove,
- },
- };
- static int __init usb_driver_init(void){
- int ret;
- /*驱动注册,注册成功后在/sys/bus/usb/driver目录下创建目录usb_driver*/
- ret = usb_driver_register(&mouse_drv);
- if(ret){
- printk("driver register failed!\n");
- return ret;
- }
- printk("usb driver init\n");
- return ret;
- }
- static void __exit usb_driver_exit(void){
- usb_driver_unregister(&mouse_drv);
- printk("usb driver bye!\n");
- }
- module_init(usb_driver_init);
- module_exit(usb_driver_exit);
- MODULE_LICENSE("GPL");
5 Makefile
- ifeq ($(KERNELRELEASE),)
- KERNELDIR ?= /usr/src/linux-headers-3.19.0-39-generic
- PWD :=$(shell pwd)
- modules:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
- modules_install:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
- clear:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules.order Module.symvers
- .PHONY: modules modules_install clean
- else
- obj-m:= bus.o device.o driver.o
- endif