总线设备模型(一)

总线设备模型(一)

标签: linux系统

1. 引言

本文介绍linux内核是如何支持总线设备驱动框架的。因为amba相关的代码结构比较简单,代码目录位于drivers/amba/下,源代码只有两个文件,分别为bus.c和tegra-ahb.c,相关头文件include/linux/amba/bus.h。我们可以通过阅读这部分代码来了解内核的设备模型。主要内容包含以下几个方面:
- 注册方式
- 设备管理
- 功耗管理
- 事件管理
其中最后两项是和内核其他子系统密切关联的。

2. 主要模块

  1. 总线注册
/* * Primecells are part of the Advanced Microcontroller Bus Architecture, * so we call the bus "amba". */
struct bus_type amba_bustype = {
    .name       = "amba",
    .dev_attrs  = amba_dev_attrs,
    .match      = amba_match,
    .uevent     = amba_uevent,
    .pm     = &amba_pm,
};

static int __init amba_init(void)
{
    return bus_register(&amba_bustype);
}

设备属性
amba_bustype中的amba_dev_attrs成员
事件响应
amba_bustype中有个amba_uevent成员
功耗管理
amba_bustype中的amba_pm成员

  1. 设备注册
    调用内核的device_initialize()接口,初始化struct device,并将dev.bus设置为amba_bustype.这些工作都在amba_device_initialize()中完成。
/** * amba_device_register - register an AMBA device * @dev: AMBA device to register * @parent: parent memory resource * * Setup the AMBA device, reading the cell ID if present. * Claim the resource, and register the AMBA device with * the Linux device manager. */
int amba_device_register(struct amba_device *dev, struct resource *parent)
{
    amba_device_initialize(dev, dev->dev.init_name);
    dev->dev.init_name = NULL;

    return amba_device_add(dev, parent);
}

添加amba设备的流程如图2-1所示

图 2-1 添加设备

  1. 驱动注册
    和设备注册一样,将struct device_driver中的成员bus设为amba_bustype,接着绑定probe,remove,shutdown接口,然后调用driver_register()接口就可以完成驱动注册,最终会调用amba_bustype中的match函数来和之前注册的device匹配。
/** * amba_driver_register - register an AMBA device driver * @drv: amba device driver structure * * Register an AMBA device driver with the Linux device model * core. If devices pre-exist, the drivers probe function will * be called. */
int amba_driver_register(struct amba_driver *drv)
{
    drv->drv.bus = &amba_bustype;

#define SETFN(fn) if (drv->fn) drv->drv.fn = amba_##fn
    SETFN(probe);
    SETFN(remove);
    SETFN(shutdown);

    return driver_register(&drv->drv);
}

你可能感兴趣的:(linux,框架,源代码,kernel)