Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1174794
  • 博文数量: 93
  • 博客积分: 7185
  • 博客等级: 准将
  • 技术积分: 3560
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-02 13:54
文章分类
文章存档

2011年(43)

2010年(11)

2009年(27)

2008年(12)

分类:

2011-05-31 20:56:25

浅析wlan驱动和sd卡硬件绑定的简单流程


struct mmc_card *mmc_alloc_card(struct mmc_host *host)
{
    struct mmc_card *card;

    card = kzalloc(sizeof(struct mmc_card), GFP_KERNEL);
    if (!card)
        return ERR_PTR(-ENOMEM);

    card->host = host;

    device_initialize(&card->dev);

    card->dev.parent = mmc_classdev(host);//该 card对应parent为arm平台的SD控制器
    card->dev.bus = &mmc_bus_type;//总线为 mmc_bus_type,对应mmc_bus_match和mmc_bus_probe
    card->dev.release = mmc_release_card;

    return card;
}

static int mmc_bus_match(struct device *dev, struct device_driver *drv)
{
    return 1;//始终返 回1,所以mmc总线上设备匹配工作完全交由设备的驱动probe完成
}

static int mmc_bus_probe(struct device *dev)
{
    struct mmc_driver *drv = to_mmc_driver(dev->driver);
    struct mmc_card *card = dev_to_mmc_card(dev);

    return drv->probe(card);
// 对于sd卡drivers/mmc/card /block.c->module_init(mmc_blk_init)这是内核注册到mmc_bus上的驱 动,也是这里调用的drv->probe驱动
//mmc_blk_probe
// 感觉对于wlan来说,card并没有在总线上取得到驱动,仅仅func所在的sdio_bus_type总线上注册了 wlan驱动
}


struct sdio_func *sdio_alloc_func(struct mmc_card *card)
{
    struct sdio_func *func;

    func = kzalloc(sizeof(struct sdio_func), GFP_KERNEL);
    if (!func)
        return ERR_PTR(-ENOMEM);

    func->card = card;

    device_initialize(&func->dev);

    func->dev.parent = &card->dev;//设置 sysfs系统视图中的parent
    func->dev.bus = &sdio_bus_type;//设置所 在bus总线,对应总线mach和probe分别为sdio_bus_match和sdio_bus_probe
    func->dev.release = sdio_release_func;

    return func;
}

sbi_register()->sdio_register_driver(&wlan_sdio);这 样将wlan_sdio驱动注册到sdio_bus_type总线,当sd接口检测到sd设备插入,
之后,mmc_rescan()函 数会生成插入设备的sdio_func结构体,并这些结构体填充成sysfs文件系统目录和文件,最 后当调用sdio_add_func()
的device_add()的时候,会在device_attach(),通 过sdio_bus_match()调用和sdio_bus_probe()调 用之后调用wlan_probe()函数,最 后
将wlan驱动和插入到sd口的sdio网卡硬件绑定

阅读(1155) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~