免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1697 | 回复: 0
打印 上一主题 下一主题

顺藤摸瓜之usb storage-- usb_stor_init() [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-29 14:49 |只看该作者 |倒序浏览

/*
*
*kernel:2.6.18
*file:Storage/usb.c
*Copyright (C) 2007, freegnu
*
*/

大概流程:usb_stor_init ()->usb_register()->bus_add_driver()->driver_attach()
                    ->storage_probe
一句话:usb driver的注册是将driver 结构add 到 usb bus list中,在match成功后会将且add 到device结构中,然后执行storage_probe()
细节:
  1. usb_stor_init()
  2. {
  3.        //初始化usb_driver结构
  4.        retval = usb_register(&usb_storage_driver);//注册usb_register 驱动结构
  5.        if (retval == 0) {
  6.               printk(KERN_INFO "USB Mass Storage support registered.\n");
  7.               usb_usual_set_present(USB_US_TYPE_STOR);
  8.        }
  9.        return retval;
  10. }
  11. usb_register()->usb_register_driver()->driver_register()
  12. driver_register()
  13. {
  14.        klist_init(&drv->klist_devices, klist_devices_get, klist_devices_put);//初始化klist链表
  15.        init_completion(&drv->unloaded);//初始化unloaded等待队列
  16.        return bus_add_driver(drv);
  17. }
  18. bus_add_driver()//将driver add 到bus中,和devicer中
  19. {
  20.        struct bus_type * bus = get_bus(drv->bus);//获取总线类型,并将object记数减1?
  21.        if (bus) {
  22.               error = kobject_set_name(&drv->kobj, "%s", drv->name);设置kobje->name
  23.               if (error) {
  24.                      put_bus(bus);
  25.                      return error;
  26.               }
  27.               drv->kobj.kset = &bus->drivers;
  28.               if ((error = kobject_register(&drv->kobj))) {
  29.                      put_bus(bus);
  30.                      return error;
  31.               }
  32.               driver_attach(drv);//绑定device 和driver,并调用probe
  33.               klist_add_tail(&drv->knode_bus, &bus->klist_drivers);//将 drvier add 到bus中
  34.               module_add_driver(drv->owner, drv);
  35.               driver_add_attrs(bus, drv);
  36.               add_bind_files(drv);
  37.        }
  38.        return error;
  39. }
  40. driver_attach()->bus_for_each_dev()->__driver_attach()->driver_probe_device()
  41. int driver_probe_device(struct device_driver * drv, struct device * dev)
  42. {
  43.        int ret = 0;
  44.        if (drv->bus->match && !drv->bus->match(dev, drv))//match dev和driver
  45.               goto Done;
  46.        pr_debug("%s: Matched Device %s with Driver %s\n",
  47.                drv->bus->name, dev->bus_id, drv->name);
  48.        dev->driver = drv;
  49.        if (dev->bus->probe) {//usb bus不提供probe()
  50.               ret = dev->bus->probe(dev);
  51.               if (ret) {
  52.                      dev->driver = NULL;
  53.                      goto ProbeFailed;
  54.               }
  55.        } else if (drv->probe) {//执行usb driver中提供的probe()
  56.               ret = drv->probe(dev);
  57.               if (ret) {
  58.                      dev->driver = NULL;
  59.                      goto ProbeFailed;
  60.               }
  61.        }
  62.        device_bind_driver(dev);
  63.        ret = 1;
  64.        pr_debug("%s: Bound Device %s to Driver %s\n",
  65.                drv->bus->name, dev->bus_id, drv->name);
  66.        goto Done;
  67. ProbeFailed:
  68.        if (ret == -ENODEV || ret == -ENXIO) {
  69.               /* Driver matched, but didn't support device
  70.                * or device not found.
  71.                * Not an error; keep going.
  72.                */
  73.               ret = 0;
  74.        } else {
  75.               /* driver matched but the probe failed */
  76.               printk(KERN_WARNING
  77.                      "%s: probe of %s failed with error %d\n",
  78.                      drv->name, dev->bus_id, ret);
  79.        }
  80. Done:
  81.        return ret;
  82. }
  83. int usb_device_match(struct device *dev, struct device_driver *drv)
  84. {
  85.        struct usb_interface *intf;
  86.        struct usb_driver *usb_drv;
  87.        const struct usb_device_id *id;
  88.        /* check for generic driver, which we don't match any device with */
  89.        if (drv == &usb_generic_driver)
  90.               return 0;
  91.        intf = to_usb_interface(dev);
  92.        usb_drv = to_usb_driver(drv);
  93.     id = usb_match_id(intf, usb_drv->id_table);//若match成功返回usb driver 结构中
  94.                                    //提供的   id_table表的id
  95.        if (id)
  96.               return 1;
  97.        id = usb_match_dynamic_id(intf, usb_drv);
  98.        if (id)
  99.               return 1;
  100.        return 0;
  101. }
复制代码


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/49/showart_452946.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP