bus device driver写测试驱动的时候 空指针出错
内核版本:linux-2.6.33 宿主机ubuntu9.04 板子fl2440
最近学到这,也是按着某教学机构的程序照着写的3个驱动bus,device,driver
贴下代码
bus.c
#include <linux/device.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/string.h>MODULE_AUTHOR("Ying");MODULE_LICENSE("Dual BSD/GPL");static char *Version = "$Vying__1.0$" ;static int ying_match(struct device * dev , struct device_driver * drv){ return !strncmp(dev->init_name, drv->name, strlen(drv->name));}static void my_bus_release(struct device *dev){ printk(KERN_DEBUG "my bus release\n");}struct device ying_bus = { .init_name = "ying_bus0", .release = my_bus_release,};struct bus_type my_bus_type = { .name = "ying_bus" , .match = ying_match ,};EXPORT_SYMBOL(ying_bus);EXPORT_SYMBOL(my_bus_type);static ssize_t show_bus_version(struct bus_type* bus,char* buf){ return snprintf(buf, PAGE_SIZE, "%s\n", Version);}static BUS_ATTR(version,S_IRUGO,show_bus_version,NULL);static int __init my_bus_init(void){ int ret; /*注册总线*/ ret = bus_register(&my_bus_type); if(ret) return ret; printk("%d---",ret); /*注册属性文件*/ if(bus_create_file(&my_bus_type , &bus_attr_version)) printk("fail to attribute\n"); /*注册总线设备*/ ret = device_register(&ying_bus); if (ret) printk(KERN_NOTICE "Fail to register device:my_bus!\n"); return ret;}static void my_bus_exit(void){ device_unregister(&ying_bus); bus_unregister(&my_bus_type);}module_init(my_bus_init);module_exit(my_bus_exit);
#include <linux/device.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/string.h>MODULE_AUTHOR("ying");MODULE_LICENSE("Dual BSD/GPL");extern struct device ying_bus; extern struct bus_type my_bus_type;static void my_dev_release (struct device *dev){ printk("ying_dev release!!~\n");}struct device ying_dev = { .init_name = "ying_dev", .bus = &my_bus_type, .parent = &ying_bus, .release = my_dev_release,};static ssize_t mydev_show(struct device *dev,struct device_attribute *attr, char *buf){ return sprintf(buf, "%s\n", "This is ying device!");}static DEVICE_ATTR(dev, S_IRUGO, mydev_show, NULL);static int __init my_device_init(void){ int ret = 0; ret = device_register(&ying_dev); if(ret){ printk("fail to ying_dev\n"); return ret; } device_create_file(&ying_dev,&dev_attr_dev); return ret ;}static void my_device_exit(void){ void device_unregister(struct device* dev);}module_init(my_device_init);module_exit(my_device_exit);
#include <linux/device.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/string.h>MODULE_AUTHOR("David Xie");MODULE_LICENSE("Dual BSD/GPL");extern struct bus_type my_bus_type;static int my_probe(struct device *dev){ printk("Driver found device which ying driver can handle!\n"); return 0;}static int my_remove(struct device *dev){ printk("Driver found device unpluged!\n"); return 0;}struct device_driver ying_drv = { .name = "ying_dev", .bus = &my_bus_type, .probe = my_probe, .remove = my_remove,};static ssize_t mydriver_show(struct device_driver *driver, char *buf){ return sprintf(buf, "%s\n", "This is my driver!");}static DRIVER_ATTR(drv, S_IRUGO, mydriver_show, NULL);static int __init my_driver_init(void){ int ret = 0; /*注册驱动*/ driver_register(&ying_drv); /*创建属性文件*/ driver_create_file(&ying_drv, &driver_attr_drv); return ret; }static void my_driver_exit(void){ driver_unregister(&ying_drv);}module_init(my_driver_init);module_exit(my_driver_exit);