Linux内核移植 part4:总线设备模型

总线设备模型(一)

标签: 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶玄青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值