下面是简单的反映bus, device, driver之间关系的代码。将一个名为zldevice的设备,一个名为zldriver的驱动挂在一个名为zlbus的总线上。
下面是一个虚拟总线的代码:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <asm/io.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zl");
struct bus_type zl_bus = {
.name = "zlbus", //this string will be show as /sys/bus/zlbus
};
EXPORT_SYMBOL(zl_bus);
int test_init(void)
{
int ret = 0;
bus_register(&zl_bus);
return ret;
}
void test_exit(void)
{
bus_unregister(&zl_bus);
}
module_init(test_init);
module_exit(test_exit);
|
插入以上虚拟总线代码编译生成的模块后:
1.在/sys/bus/目录下有zlbus目录生成,
2.在/sys/bus/zlbus/下有devices,drivers两个目录和drivers_autoprobe,drivers_probe,uevent三个文件出现。
下面是接在zl_bus虚拟总线下的一个设备的代码:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <asm/io.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zl");
extern struct bus_type zl_bus;
struct device zl_device_struct = {
//.bus_id = "zldevice", //2.6.13
.init_name = "zldevice", //2.6.36, this string will be show as /sys/devices/zldevice
.bus = &zl_bus,
};
int test_init(void)
{
int ret = 0;
device_register(&zl_device_struct);
return ret;
}
void test_exit(void)
{
device_unregister(&zl_device_struct);
}
module_init(test_init);
module_exit(test_exit);
|
插入以上虚拟设备代码编译生成的模块后:
1.有/sys/devices/zldevice目录生成。
2.有/sys/bus/zlbus/devices/zldevice文件生成。并且/sys/bus/zlbus/devices/zldevice -> ../../../devices/zldevice
4.以上zldevice目录下有power目录,及uevent,subsystem文件出现。
5.其中subsystem -> ../../bus/zlbus
下面是接在zl_bus虚拟总线下的一个驱动的代码:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <asm/io.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zl");
extern struct bus_type zl_bus;
struct device_driver zl_driver_struct = {
.name = "zldriver", //this string will be show as/sys/bus/zlbus/drivers/zldriver
.bus = &zl_bus,
};
int test_init(void)
{
int ret = 0;
driver_register(&zl_driver_struct);
return ret;
}
void test_exit(void)
{
driver_unregister(&zl_driver_struct);
}
module_init(test_init);
module_exit(test_exit);
|
插入以上虚拟设备驱动代码编译生成的模块后:
1.在/sys/bus/zlbus/drivers目录下有zldriver目录生成。
2./sys/bus/zlbus/drivers/zldriver目录下有bind,unbind,uevent文件及zldevice出现。
3.其中zldevice -> ../../../../devices/zldevice。