亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 1707 | 回復(fù): 0
打印 上一主題 下一主題

順藤摸瓜之usb storage-- usb_stor_init() [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2007-12-29 14:49 |只看該作者 |倒序?yàn)g覽

/*
*
*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的注冊(cè)是將driver 結(jié)構(gòu)add 到 usb bus list中,在match成功后會(huì)將且add 到device結(jié)構(gòu)中,然后執(zhí)行storage_probe()
細(xì)節(jié):
  1. usb_stor_init()
  2. {
  3.        //初始化usb_driver結(jié)構(gòu)
  4.        retval = usb_register(&usb_storage_driver);//注冊(cè)u(píng)sb_register 驅(qū)動(dòng)結(jié)構(gòu)
  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等待隊(duì)列
  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記數(shù)減1?
  21.        if (bus) {
  22.               error = kobject_set_name(&drv->kobj, "%s", drv->name);設(shè)置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,并調(diào)用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) {//執(zhí)行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 結(jié)構(gòu)中
  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. }
復(fù)制代碼


本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/49/showart_452946.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP