注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

总线、设备、驱动模型分析  

2012-09-14 03:09:30|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
上一节的input模型体现了分层的模型,而本节的平台设备驱动模型则体现了分离的概念,本节我们来深入分析一下它的框架:
注册驱动:
platform_driver_register(struct platform_driver *drv)
      drv->driver.bus = &platform_bus_type;
      drv->driver.probe = platform_drv_probe;
      drv->driver.remove = platform_drv_remove;
      drv->driver.shutdown = platform_drv_shutdown;
      driver_register(&drv->driver);
            bus_add_driver(drv);
                //将drv加入平台总线下的驱动链表
                kobject_init_and_add(&priv->kobj, &driver_ktype, NULL, "%s", drv->name);
                //下面的代码试图将drv绑定到dev
                driver_attach(drv);
                //对平台总线下设备链表进行遍历,调用__driver_attach以找到与drv匹配的设备
                bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
                      __driver_attach
                               driver_match_device(drv, dev)      
                                     //调用drv->bus->match来判断drv与设备是否匹配
                                     drv->bus->match ? drv->bus->match(dev, drv) : 1;
                                      platform_match
                                           //根据dev和drv的名字是否一致来判断是否匹配
                                           strcmp(pdev->name, drv->name)
                                       //如果匹配继续执行
                                      driver_probe_device(drv, dev);
                                            really_probe(dev, drv);
                                                   //我们看到调用了drv里面注册的probe函数
                                                   drv->probe(dev);

注册设备:
platform_device_register(struct platform_device *pdev)
       platform_device_add(pdev);
            device_add(&pdev->dev);
                 //将dev加入平台总线下的设备链表
                 bus_add_device(dev);
                 bus_probe_device(dev);
                     //对平台总线下驱动链表进行遍历,调用 __device_attach以找到与dev匹配的驱动
                     bus_for_each_drv(dev->bus, NULL, dev, __device_attach);
                            __device_attach
                                 driver_match_device(drv, dev)
                                         //依旧是调用drv->bus->match来找到名字一样的设备与驱动
                                        drv->bus->match ? drv->bus->match(dev, drv) : 1;

总线注册:
我们从入口函数head.S说起:
b start_kernel
      rest_init();
           kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
           kernel_init
                do_basic_setup();
                      driver_init();
                            platform_bus_init();
                                  bus_register(&platform_bus_type);

如此一来这个总线、设备、驱动模型就很清楚了,我们再来总结一下:
首先在系统启动的时候会注册平台总线,当我们注册设备的时候,就会将该设备加入到平台总线旗下的驱动列表中,并且遍历驱动看是否有跟设备名字相同的驱动,如果有的话,就会调用驱动的probe函数。同样在注册驱动的时候,会将该驱动加入到平台总线旗下的驱动列表中,并且遍历设备看是否有跟驱动名字相同的设备,如果有的话,就会调用驱动的probe函数。

所有编写平台总线、设备、驱动模型的驱动程序,最起始的工作要在probe函数里面完成!
  评论这张
 
阅读(827)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017