close

下面是简单的反映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。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 丘猴子 的頭像
    丘猴子

    轉貼部落格

    丘猴子 發表在 痞客邦 留言(0) 人氣()