bus.c 
#include <linux/device.h> 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/string.h> 
MODULE_AUTHOR("yue wen"); 
MODULE_LICENSE("Dual BSD/GPL"); 
static char *Version = "$Revision: 1.9 $"; 
static int my_match(struct device *dev, struct device_driver *driver) 
{ 
 return !strncmp(dev->init_name, driver->name, strlen(driver->name)); 
} 
static void my_bus_release(struct device *dev) 
{ 
 printk(KERN_DEBUG "my bus release\n"); 
} 
  
struct device my_bus = { 
 .init_name   = "my_bus0", 
 .release  = my_bus_release 
}; 
 
struct bus_type my_bus_type = { 
 .name = "my_bus", 
 .match = my_match, 
}; 
EXPORT_SYMBOL(my_bus); 
EXPORT_SYMBOL(my_bus_type); 
 
/* 
 * Export a simple attribute. 
 */ 
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; 
   
 /*创建属性文件*/  
 if (bus_create_file(&my_bus_type, &bus_attr_version)) 
  printk(KERN_NOTICE "Fail to create version attribute!\n"); 
  
 /*注册总线设备*/ 
 ret = device_register(&my_bus); 
 if (ret) 
  printk(KERN_NOTICE "Fail to register device:my_bus!\n"); 
   
 return ret; 
} 
static void my_bus_exit(void) 
{ 
 device_unregister(&my_bus); 
 bus_unregister(&my_bus_type); 
} 
module_init(my_bus_init); 
module_exit(my_bus_exit); 
 
device.c 
#include <linux/device.h> 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/string.h> 
MODULE_AUTHOR("yue wen"); 
MODULE_LICENSE("Dual BSD/GPL"); 
extern struct device my_bus;  
extern struct bus_type my_bus_type; 
 
static void my_dev_release(struct device *dev) 
{  
  
} 
struct device my_dev = { 
 .init_name="my_dev", 
 .bus = &my_bus_type,//新创建的设备挂载在my_bus总线上 
 .parent = &my_bus,//新创建的设备的父目录 
 .release = my_dev_release, 
}; 
/* 
 * Export a simple attribute. 
 */ 
static ssize_t mydev_show(struct device *dev,struct device_attribute *attr, char *buf) 
{ 
 return sprintf(buf, "%s\n", "This is my device!"); 
} 
static DEVICE_ATTR(dev, S_IRUGO, mydev_show, NULL); 
static int __init my_device_init(void) 
{ 
 int ret = 0; 
         
        /* 初始化设备 */ 
// strncpy(my_dev.init_name, "my_dev", NULL); 
         
        /*注册设备*/ 
 device_register(&my_dev); 
   
 /*创建属性文件*/ 
 device_create_file(&my_dev, &dev_attr_dev);//属性文件名称为dev 
  
 return ret;  
} 
static void my_device_exit(void) 
{ 
 device_unregister(&my_dev); 
} 
module_init(my_device_init); 
module_exit(my_device_exit); 
 
 
 
driver.c 
#include <linux/device.h> 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/string.h> 
MODULE_AUTHOR("yue wen"); 
MODULE_LICENSE("Dual BSD/GPL"); 
extern struct bus_type my_bus_type; 
static int my_probe(struct device *dev) 
{ 
    printk("Driver found device which my driver can handle!\n"); 
    return 0; 
} 
static int my_remove(struct device *dev) 
{ 
    printk("Driver found device unpluged!\n"); 
    return 0; 
} 
struct device_driver my_driver = { 
 .name = "my_dev", 
 .bus = &my_bus_type, 
 .probe = my_probe, 
        .remove = my_remove, 
}; 
/* 
 * Export a simple attribute. 
 */ 
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(&my_driver); 
   
 /*创建属性文件*/ 
 driver_create_file(&my_driver, &driver_attr_drv); 
  
 return ret;  
} 
static void my_driver_exit(void) 
{ 
 driver_unregister(&my_driver); 
} 
module_init(my_driver_init); 
module_exit(my_driver_exit); 
 
Makefile文件 
ifneq ($(KERNELRELEASE),) 
obj-m := device.o 
else 
  
KDIR := /opt/EmbedSky/linux-2.6.30.4 
all: 
 make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux- 
clean: 
 rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul* 
endif 
 
在加载driver.ko文件的时候出现了如图所示的信息,我在加载device.ko的时候也出现了但是修改之后通过了!提示好像是bus.c文件里的my_match函数有错误,大侠们帮我看看吧! 
 
 
 |