usb主机控制程序

本文详细介绍了Linux内核中MUSB驱动的初始化过程,包括平台驱动的注册、MUSB驱动的probe函数、MUSB控制器的初始化、分配实例、创建HCD以及注册根集线器等步骤,深入理解USB驱动的内部运作。
摘要由CSDN通过智能技术生成
  2524
  2525  static struct platform_driver musb_driver = {
  2526          .driver = {
  2527                  .name           = (char *)musb_driver_name,
  2528                  .bus            = &platform_bus_type,
  2529                  .owner          = THIS_MODULE,
  2530                  .pm             = MUSB_DEV_PM_OPS,
  2531          },
  2532          .probe      = musb_probe,
  2533          .remove         = __exit_p(musb_remove),
  2534          .shutdown       = musb_shutdown,
  2535  };
  2536
  2537  /*-------------------------------------------------------------------------*/
  2538
  2539  static int __init musb_init(void)
  2540  {
  2541          if (usb_disabled())
  2542                  return 0;
  2543
  2544          pr_info("%s: version " MUSB_VERSION ", "
  2545                  "?dma?"
  2546                  ", "
  2547                  "otg (peripheral+host)",
  2548                  musb_driver_name);
  2549          return platform_driver_register(&musb_driver);
  2550  }
  2551
  2552  /* make us init after usbcore and i2c (transceivers, regulators, etc)
  2553   * and before usb gadget and host-side drivers start to register
  2554   */
  2555  fs_initcall(musb_init);
  2556
  2557  static void __exit musb_cleanup(void)
  2558  {
  2559          platform_driver_unregister(&musb_driver);
  2560  }
  2561  module_exit(musb_cleanup);

根据匹配运行probe

 2218
  2219  /* all implementations (PCI bridge to FPGA, VLYNQ, etc) should just
  2220   * bridge to a platform device; this driver then suffices.
  2221   */
  2222  static int __devinit musb_probe(struct platform_device *pdev)
  2223  {
  2224          struct device   *dev = &pdev->dev;
  2225          int             irq = platform_get_irq_byname(pdev, "mc");
  2226          int             status;
  2227          struct resource *iomem;
  2228          void __iomem    *base;
  2229          char    res_name[20];
  2230
  2231          if (pdev->id == -1)
  2232                  strcpy(res_name, "mc");
  2233          else
  2234                  sprintf(res_name, "musb%d-irq", pdev->id);
  2235          irq = platform_get_irq_byname(pdev, res_name);
  2236
  2237          if (pdev->id == -1)
  2238                  iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  2239          else {
  2240                  sprintf(res_name, "musb%d", pdev->id);
  2241                  iomem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
  2242                          res_name);
  2243          }
  2244
  2245          if (!iomem || irq <= 0)
  2246                  return -ENODEV;
  2247
  2248          base = ioremap(iomem->start, resource_size(iomem));
  2249          if (!base) {
  2250                  dev_err(dev, "ioremap failed\n");
  2251                  return -ENOMEM;
  2252          }
  2253
  2254          status = musb_init_controller(dev, irq, base);
  2255          if (status < 0)
  2256                  iounmap(base);
  2257
  2258          return status;
  2259  }
  2260

看到前面是获取中断号musb0-irq、获取内存资源musb0

2254行:musb_init_controller

 1953  /*
  1954   * Perform generic per-controller initialization.
  1955   *
  1956   * @pDevice: the controller (already clocked, etc)
  1957   * @nIrq: irq
  1958   * @mregs: virtual address of controller registers,
  1959   *      not yet corrected for platform-specific offsets
  1960   */
  1961  static int __devinit
  1962  musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
  1963  {
  1964          int                     status;
  1965          struct musb             *musb;
  1966          struct musb_hdrc_platform_data *plat = dev->platform_data;
  1967          struct platform_device *pdev = to_platform_device(dev);
  1968
  1969          /* The driver might handle more features than the board; OK.
  1970           * Fail when the board needs a feature that's not enabled.
  1971           */
  1972          if (!plat) {
  1973                  dev_dbg(dev, "no platform_data?\n");
  1974                  status = -ENODEV;
  1975                  goto fail0;
  1976          }
  1977
  1978          /* allocate */
  1979          musb = allocate_instance(dev, plat->config, ctrl);
  1980          if (!musb) {
  1981                  status = -ENOMEM;
  1982                  goto fail0;
  1983          }
  1984
  1985          pm_runtime_use_autosuspend(musb->controller);
  1986          pm_runtime_set_autosuspend_delay(musb->controller, 200);
  1987          pm_runtime_enable(musb->controller);
  1988
  1989          spin_lock_init(&musb->lock);
  1990          musb->board_mode = plat->mode;
  1991          musb->board_set_power = plat->set_power;
  1992          musb->min_power = plat->min_power;
  1993          musb->ops = plat->platform_ops;
  1994          musb->id = pdev->id;
  1995          musb->first = 1;
  1996          if (is_host_enabled(musb))
  1997                  spin_lock_init(&musb->gb_lock);
  1998
  1999          musb->fifo_mode = musb->ops->fifo_mode;
  2000
  2001  #ifndef CONFIG_MUSB_PIO_ONLY
  2002          musb->orig_dma_mask = dev->dma_mask;
  2003  #endif
  2004          if (musb->ops->flags & MUSB_GLUE_TUSB_STYLE) {
  2005                  musb_readb = __tusb_musb_readb;
  2006                  musb_writeb = __tusb_musb_writeb;
  2007          } else {
  2008                  musb_readb = __musb_readb;
  2009                  musb_writeb = __musb_writeb;
  2010          }
  2011
  2012          dev_info(dev, "dma type: %s\n", get_dma_name(musb));
  2013
  2014          /* The musb_platform_init() call:
  2015           *   - adjusts musb->mregs and musb->isr if needed,
  2016           *   - may initialize an integrated tranceiver
  2017           *   - initializes musb->xceiv, usually by otg_get_transceiver()
  2018           *   - stops powering VBUS
  2019           *
  2020           * There are various transceiver configurations.  Blackfin,
  2021           * DaVinci, TUSB60x0, and others integrate them.  OMAP3 uses
  2022           * external/discrete ones in various flavors (twl4030 family,
  2023           * isp1504, non-OTG, etc) mostly hooking up through ULPI.
  2024           */
  2025          musb->isr = generic_interrupt;
  2026          status = musb_platform_init(musb);
  2027          if (status < 0)
  2028                  goto fail1;
  2029
  2030          if (!musb->isr) {
  2031                  status = -ENODEV;
  2032                  goto fail3;
  2033          }
  2034
  2035          if (!musb->xceiv->io_ops) {
  2036                  musb->xceiv->io_priv = musb->mregs;
  2037                  musb->xceiv->io_ops = &musb_ulpi_access;
  2038          }
  2039
  2040  #ifndef CONFIG_MUSB_PIO_ONLY
  2041          if (dev->dma_mask) {
  2042                  struct dma_controller   *c;
  2043
  2044                  if (!musb->ops->dma_controller_create) {
  2045                          dev_err(dev, "no dma_controller_create for non-PIO mode!\n");
  2046                          status = -ENODEV;
  2047                          goto fail3;
  2048                  }
  2049                  c = musb->ops->dma_controller_create(musb, musb->mregs);
  2050                  musb->dma_controller = c;
  2051                  if (c)
  2052                          (void) c->start(c);
  2053          }
  2054  #endif
  2055          /* ideally this would be abstracted in platform setup */
  2056          if (!is_dma_capable() || !musb->dma_controller)
  2057                  dev->dma_mask = NULL;
  2058
  2059          /* be sure interrupts are disabled before connecting ISR */
  2060          musb_platform_disable(musb);
  2061          musb_generic_disable(musb);
  2062
  2063          /* setup musb parts of the core (especially endpoints) */
  2064          status = musb_core_init(plat->config->multipoint
  2065                          ? MUSB_CONTROLLER_MHDRC
  2066                          : MUSB_CONTROLLER_HDRC, musb);
  2067          if (status < 0)
  2068                  goto fail3;
  2069
  2070          /* Init IRQ workqueue before request_irq */
  2071          INIT_WORK(&musb->irq_work, musb_irq_work);
  2072
  2073          /* attach to the IRQ */
  2074          if (request_irq(nIrq, musb->isr, 0, dev_name(dev), musb)) {
  2075                  dev_err(dev, "request_irq %d failed!\n", nIrq);
  2076                  status = -ENODEV;
  2077                  goto fail3;
  2078          }
  2079          musb->nIrq = nIrq;
  2080  /* FIXME this handles wakeup irqs wrong */
  2081          if (enable_irq_wake(nIrq) == 0)
  2082                  musb->irq_wake = 1;
  2083          else
  2084                  musb->irq_wake = 0;
  2085
  2086          device_init_wakeup(dev, 1);
  2087
  2088          /* host side needs more setup */
  2089          if (is_host_enabled(musb)) {
  2090                  struct usb_hcd  *hcd = musb_to_hcd(musb);
  2091
  2092                  otg_set_host(musb->xceiv, &hcd->self);
  2093
  2094                  if (is_otg_enabled(musb))
  2095                          hcd->self.otg_port = 1;
  2096                  musb->xceiv->host = &hcd->self;
  2097                  hcd->power_budget = 2 * (plat->power ? : 250);
  2098
  2099                  /* program PHY to use external vBus if required */
  2100                  if (plat->extvbus) {
  2101                          u8 busctl = musb_read_ulpi_buscontrol(musb->mregs);
  2102                          busctl |= MUSB_ULPI_USE_EXTVBUS;
  2103                          musb_write_ulpi_buscontrol(musb->mregs, busctl);
  2104                  }
  2105          }
  2106
  2107          /* For the host-only role, we can activate right away.
  2108           * (We expect the ID pin to be forcibly grounded!!)
  2109           * Otherwise, wait till the gadget driver hooks up.
  2110           */
  2111          if (!is_otg_enabled(musb) && is_host_enabled(musb)) {
  2112                  struct usb_hcd  *hcd = musb_to_hcd(musb);
  2113
  2114                  MUSB_HST_MODE(musb);
  2115                  musb->xceiv->default_a = 1;
  2116                  musb->xceiv->state = OTG_STATE_A_IDLE;
  2117
  2118                  status = usb_add_hcd(musb_to_hcd(musb), -1, 0);
  2119                  device_set_wakeup_enable(dev, 0);
  2120                  hcd->self.uses_pio_for_control = 1;
  2121                  dev_dbg(musb->controller, "%s mode, status %d, devctl %02x %c\n",
  2122                          "HOST", status,
  2123                          musb_readb(musb->mregs, MUSB_DEVCTL),
  2124                          (musb_readb(musb->mregs, MUSB_DEVCTL)
  2125                                          & MUSB_DEVCTL_BDEVICE
  2126                                  ? 'B' : 'A'));
  2127
  2128          } else /* peripheral is enabled */ {
  2129                  MUSB_DEV_MODE(musb);
  2130                  musb->xceiv->default_a = 0;
  2131                  musb->xceiv->state = OTG_STATE_B_IDLE;
  2132
  2133                  status = musb_gadget_setup(musb);
  2134                  device_set_wakeup_enable(dev, 0);
  2135
  2136                  dev_dbg(musb->controller, "%s mode, status %d, dev%02x\n",
  2137                          is_otg_enabled(musb) ? "OTG" : "PERIPHERAL",
  2138                          status,
  2139                          musb_readb(musb->mregs, MUSB_DEVCTL));
  2140
  2141          }
  2142          if (status < 0)
  2143                  goto fail3;
  2144
  2145          status = musb_init_debugfs(musb);
  2146          if (status < 0)
  2147                  goto fail4;
  2148
  2149  #ifdef CONFIG_SYSFS
  2150          status = sysfs_create_group(&musb->controller->kobj, &musb_attr_group);
  2151          if (status)
  2152                  goto fail5;
  2153  #endif
  2154
  2155          dev_info(dev, "USB %s mode controller at %p using %s, IRQ %d\n",
  2156                          ({char *s;
  2157                           switch (musb->board_mode) {
  2158                           case MUSB_HOST:                s = "Host"; break;
  2159                           case MUSB_PERIPHERAL:  s = "Peripheral"; break;
  2160                           default:               s = "OTG"; break;
  2161                           }; s; }),
  2162                          ctrl,
  2163                          (is_dma_capable() && musb->dma_controller)
  2164                          ? "DMA" : "PIO",
  2165                          musb->nIrq);
  2166
  2167          if (status == 0) {
  2168                  u8 drvbuf[19];
  2169                  sprintf(drvbuf, "driver/musb_hdrc.%d", musb->id);
  2170                  musb_debug_create(drvbuf, musb);
  2171          }
  2172
  2173          if (is_host_enabled(musb)) {
  2174                  musb->gb_queue = create_singlethread_workqueue(dev_name(dev));
  2175                  if (musb->gb_queue == NULL)
  2176                          goto fail6;
  2177                  /* Init giveback workqueue */
  2178                  INIT_WORK(&musb->gb_work, musb_gb_work);
  2179          }
  2180
  2181          /* setup otg_timer */
  2182          if (is_otg_enabled(musb))
  2183                  setup_timer(&musb->otg_timer, musb_otg_timer_func,
  2184                                                  (unsigned long) musb);
  2185          return 0;
  2186
  2187  fail6:
  2188          if (is_host_enabled(musb))
  2189                  destroy_workqueue(musb->gb_queue);
  2190
  2191  fail5:
  2192          musb_exit_debugfs(musb);
  2193
  2194  fail4:
  2195          if (!is_otg_enabled(musb) && is_host_enabled(musb))
  2196                  usb_remove_hcd(musb_to_hcd(musb));
  2197          else
  2198                  musb_gadget_cleanup(musb);
  2199
  2200  fail3:
  2201          if (musb->irq_wake)
  2202                  device_init_wakeup(dev, 0);
  2203          musb_platform_exit(musb);
  2204
  2205  fail1:
  2206          dev_err(musb->controller,
  2207                  "musb_init_controller failed with status %d\n", status);
  2208
  2209          musb_free(musb);
  2210
  2211  fail0:
  2212
  2213          return status;
  2214
  2215  }

1797行:allocate_instance

  1864
  1865  static struct musb *__devinit
  1866  allocate_instance(struct device *dev,
  1867                  struct musb_hdrc_config *config, void __iomem *mbase)
  1868  {
  1869          struct musb             *musb;
  1870          struct musb_hw_ep       *ep;
  1871          int                     epnum;
  1872          struct usb_hcd  *hcd;
  1873          struct musb_hdrc_platform_data *plat = dev->platform_data;
  1874
  1875          if (plat->mode != MUSB_PERIPHERAL) {
  1876                  hcd = usb_create_hcd(&musb_hc_driver, dev, dev_name(dev));
  1877                  if (!hcd)
  1878                          return NULL;
  1879                  /* usbcore sets dev->driver_data to hcd, and sometimes uses
  1880                   * that...
  1881                   */
  1882
  1883                  musb = hcd_to_musb(hcd);
  1884                  INIT_LIST_HEAD(&musb->control);
  1885                  INIT_LIST_HEAD(&musb->in_bulk);
  1886                  INIT_LIST_HEAD(&musb->out_bulk);
  1887                  INIT_LIST_HEAD(&musb->gb_list);
  1888
  1889                  hcd->uses_new_polling = 1;
  1890                  hcd->has_tt = 1;
  1891                  musb->vbuserr_retry = VBUSERR_RETRY_COUNT;
  1892          } else {
  1893                  musb = kzalloc(sizeof *musb, GFP_KERNEL);
  1894                  if (!musb)
  1895                          return NULL;
  1896          }
  1897          dev_set_drvdata(dev, musb);
  1898          musb->mregs = mbase;
  1899          musb->ctrl_base = mbase;
  1900          musb->nIrq = -ENODEV;
  1901          musb->config = config;
  1902          BUG_ON(musb->config->num_eps > MUSB_C_NUM_EPS);
  1903          for (epnum = 0, ep = musb->endpoints;
  1904                          epnum < musb->config->num_eps;
  1905                          epnum++, ep++) {
  1906                  ep->musb = musb;
  1907                  ep->epnum = epnum;
  1908          }
  1909
  1910          musb->controller = dev;
  1911
  1912          return musb;
  1913  }
  1914

咱们前面plat->mode = (MUSB_HOST << 4) | MUSB_OTG,所以这个条件语句成功。

1876行:usb_create_hcd(&musb_hc_driver, dev, dev_name(dev));这 回 才 是正 儿 八 经 的进 入 到 usb hcd 的 概念.这 个 函 数来 自drivers/usb/core/hcd.c:

  2280  /**
  2281   * usb_create_hcd - create and initialize an HCD structure
  2282   * @driver: HC driver that will use this hcd
  2283   * @dev: device for this HC, stored in hcd->self.controller
  2284   * @bus_name: value to store in hcd->self.bus_name
  2285   * Context: !in_interrupt()
  2286   *
  2287   * Allocate a struct usb_hcd, with extra space at the end for the
  2288   * HC driver's private data.  Initialize the generic members of the
  2289   * hcd structure.
  2290   *
  2291   * If memory is unavailable, returns NULL.
  2292   */
  2293  struct usb_hcd *usb_create_hcd(const struct hc_driver *driver,
  2294                  struct device *dev, const char *bus_name)
  2295  {
  2296          return usb_create_shared_hcd(driver, dev, bus_name, NULL);
  2297  }
  2298  EXPORT_SYMBOL_GPL(usb_create_hcd);

2296行:

  2213
  2214  /**
  2215   * usb_create_shared_hcd - create and initialize an HCD structure
  2216   * @driver: HC driver that will use this hcd
  2217   * @dev: device for this HC, stored in hcd->self.controller
  2218   * @bus_name: value to store in hcd->self.bus_name
  2219   * @primary_hcd: a pointer to the usb_hcd structure that is sharing the
  2220   *              PCI device.  Only allocate certain resources for the primary HCD
  2221   * Context: !in_interrupt()
  2222   *
  2223   * Allocate a struct usb_hcd, with extra space at the end for the
  2224   * HC driver's private data.  Initialize the generic members of the
  2225   * hcd structure.
  2226   *
  2227   * If memory is unavailable, returns NULL.
  2228   */
  2229  struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver,
  2230                  struct device *dev, const char *bus_name,
  2231                  struct usb_hcd *primary_hcd)
  2232  {
  2233          struct usb_hcd *hcd;
  2234
  2235          hcd = kzalloc(sizeof(*hcd) + driver->hcd_priv_size, GFP_KERNEL);
  2236          if (!hcd) {
  2237                  dev_dbg (dev, "hcd alloc failed\n");
  2238                  return NULL;
  2239          }
  2240          if (primary_hcd == NULL) {
  2241                  hcd->bandwidth_mutex = kmalloc(sizeof(*hcd->bandwidth_mutex),
  2242                                  GFP_KERNEL);
  2243                  if (!hcd->bandwidth_mutex) {
  2244                          kfree(hcd);
  2245                          dev_dbg(dev, "hcd bandwidth mutex alloc failed\n");
  2246                          return NULL;
  2247                  }
  2248                  mutex_init(hcd->bandwidth_mutex);
  2249                  dev_set_drvdata(dev, hcd);
  2250          } else {
  2251                  hcd->bandwidth_mutex = primary_hcd->bandwidth_mutex;
  2252                  hcd->primary_hcd = primary_hcd;
  2253                  primary_hcd->primary_hcd = primary_hcd;
  2254                  hcd->shared_hcd = primary_hcd;
  2255                  primary_hcd->shared_hcd = hcd;
  2256          }
  2257
  2258          kref_init(&hcd->kref);
  2259
  2260          usb_bus_init(&hcd->self);
  2261          hcd->self.controller = dev;
  2262          hcd->self.bus_name = bus_name;
  2263          hcd->self.uses_dma = (dev->dma_mask != NULL);
  2264
  2265          init_timer(&hcd->rh_timer);
  2266          hcd->rh_timer.function = rh_timer_func;
  2267          hcd->rh_timer.data = (unsigned long) hcd;
  2268  #ifdef CONFIG_USB_SUSPEND
  2269          INIT_WORK(&hcd->wakeup_work, hcd_resume_work);
  2270  #endif
  2271
  2272          hcd->driver = driver;
  2273          hcd->speed = driver->flags & HCD_MASK;
  2274          hcd->product_desc = (driver->product_desc) ? driver->product_desc :
  2275                          "USB Host Controller";
  2276          return hcd;
  2277  }
  2278  EXPORT_SYMBOL_GPL(usb_create_shared_hcd);

第一个参数 struct hc_driver,这个结构体掀开了我们对 usb host controller driver 的认识,它来自 drivers/usb/core/hcd.h:

  202
   203  struct hc_driver {
   204          const char      *description;   /* "ehci-hcd" etc */
   205          const char      *product_desc;  /* product/vendor string */
   206          size_t          hcd_priv_size;  /* size of private data */
   207
   208          /* irq handler */
   209          irqreturn_t     (*irq) (struct usb_hcd *hcd);
   210
   211          int     flags;
   212  #define HCD_MEMORY      0x0001          /* HC regs use memory (else I/O) */
   213  #define HCD_LOCAL_MEM   0x0002          /* HC needs local memory */
   214  #define HCD_SHARED      0x0004          /* Two (or more) usb_hcds share HW */
   215  #define HCD_USB11       0x0010          /* USB 1.1 */
   216  #define HCD_USB2        0x0020          /* USB 2.0 */
   217  #define HCD_USB3        0x0040          /* USB 3.0 */
   218  #define HCD_MASK        0x0070
   219
   220          /* called to init HCD and root hub */
   221          int     (*reset) (struct usb_hcd *hcd);
   222          int     (*start) (struct usb_hcd *hcd);
   223
   224          /* NOTE:  these suspend/resume calls relate to the HC as
   225           * a whole, not just the root hub; they're for PCI bus glue.
   226           */
   227          /* called after suspending the hub, before entering D3 etc */
   228          int     (*pci_suspend)(struct usb_hcd *hcd, bool do_wakeup);
   229
   230          /* called after entering D0 (etc), before resuming the hub */
   231          int     (*pci_resume)(struct usb_hcd *hcd, bool hibernated);
   232
   233          /* cleanly make HCD stop writing memory and doing I/O */
   234          void    (*stop) (struct usb_hcd *hcd);
   235
   236          /* shutdown HCD */
   237          void    (*shutdown) (struct usb_hcd *hcd);
   238
   239          /* return current frame number */
   240          int     (*get_frame_number) (struct usb_hcd *hcd);
   241
   242          /* manage i/o requests, device state */
   243          int     (*urb_enqueue)(struct usb_hcd *hcd,
   244                                  struct urb *urb, gfp_t mem_flags);
   245          int     (*urb_dequeue)(struct usb_hcd *hcd,
   246                                  struct urb *urb, int status);
   247
   248          /*
   249           * (optional) these hooks allow an HCD to override the default DMA
   250           * mapping and unmapping routines.  In general, they shouldn't be
   251           * necessary unless the host controller has special DMA requirements,
   252           * such as alignment contraints.  If these are not specified, the
   253           * general usb_hcd_(un)?map_urb_for_dma functions will be used instead
   254           * (and it may be a good idea to call these functions in your HCD
   255           * implementation)
   256           */
   257          int     (*map_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb,
   258                                     gfp_t mem_flags);
   259          void    (*unmap_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb);
   260
   261          /* hw synch, freeing endpoint resources that urb_dequeue can't */
   262          void    (*endpoint_disable)(struct usb_hcd *hcd,
   263                          struct usb_host_endpoint *ep);
   264
   265          /* (optional) reset any endpoint state such as sequence number
   266             and current window */
   267          void    (*endpoint_reset)(struct usb_hcd *hcd,
   268                          struct usb_host_endpoint *ep);
   269
   270          /* root hub support */
   271          int     (*hub_status_data) (struct usb_hcd *hcd, char *buf);
   272          int     (*hub_control) (struct usb_hcd *hcd,
   273                                  u16 typeReq, u16 wValue, u16 wIndex,
   274                                  char *buf, u16 wLength);
   275          int     (*bus_suspend)(struct usb_hcd *);
   276          int     (*bus_resume)(struct usb_hcd *);
   277          int     (*start_port_reset)(struct usb_hcd *, unsigned port_num);
   278
   279                  /* force handover of high-speed port to full-speed companion */
   280          void    (*relinquish_port)(struct usb_hcd *, int);
   281                  /* has a port been handed over to a companion? */
   282          int     (*port_handed_over)(struct usb_hcd *, int);
   283
   284                  /* CLEAR_TT_BUFFER completion callback */
   285          void    (*clear_tt_buffer_complete)(struct usb_hcd *,
   286                                  struct usb_host_endpoint *);
   287
   288          /* xHCI specific functions */
   289                  /* Called by usb_alloc_dev to alloc HC device structures */
   290          int     (*alloc_dev)(struct usb_hcd *, struct usb_device *);
   291                  /* Called by usb_disconnect to free HC device structures */
   292          void    (*free_dev)(struct usb_hcd *, struct usb_device *);
   293          /* Change a group of bulk endpoints to support multiple stream IDs */
   294          int     (*alloc_streams)(struct usb_hcd *hcd, struct usb_device *udev,
   295                  struct usb_host_endpoint **eps, unsigned int num_eps,
   296                  unsigned int num_streams, gfp_t mem_flags);
   297          /* Reverts a group of bulk endpoints back to not using stream IDs.
   298           * Can fail if we run out of memory.
   299           */
   300          int     (*free_streams)(struct usb_hcd *hcd, struct usb_device *udev,
   301                  struct usb_host_endpoint **eps, unsigned int num_eps,
   302                  gfp_t mem_flags);
   303
   304          /* Bandwidth computation functions */
   305          /* Note that add_endpoint() can only be called once per endpoint before
   306           * check_bandwidth() or reset_bandwidth() must be called.
   307           * drop_endpoint() can only be called once per endpoint also.
   308           * A call to xhci_drop_endpoint() followed by a call to
   309           * xhci_add_endpoint() will add the endpoint to the schedule with
   310           * possibly new parameters denoted by a different endpoint descriptor
   311           * in usb_host_endpoint.  A call to xhci_add_endpoint() followed by a
   312           * call to xhci_drop_endpoint() is not allowed.
   313           */
   314                  /* Allocate endpoint resources and add them to a new schedule */
   315          int     (*add_endpoint)(struct usb_hcd *, struct usb_device *,
   316                                  struct usb_host_endpoint *);
   317                  /* Drop an endpoint from a new schedule */
   318          int     (*drop_endpoint)(struct usb_hcd *, struct usb_device *,
   319                                   struct usb_host_endpoint *);
   320                  /* Check that a new hardware configuration, set using
   321                   * endpoint_enable and endpoint_disable, does not exceed bus
   322                   * bandwidth.  This must be called before any set configuration
   323                   * or set interface requests are sent to the device.
   324                   */
   325          int     (*check_bandwidth)(struct usb_hcd *, struct usb_device *);
   326                  /* Reset the device schedule to the last known good schedule,
   327                   * which was set from a previous successful call to
   328                   * check_bandwidth().  This reverts any add_endpoint() and
   329                   * drop_endpoint() calls since that last successful call.
   330                   * Used for when a check_bandwidth() call fails due to resource
   331                   * or bandwidth constraints.
   332                   */
   333          void    (*reset_bandwidth)(struct usb_hcd *, struct usb_device *);
   334                  /* Returns the hardware-chosen device address */
   335          int     (*address_device)(struct usb_hcd *, struct usb_device *udev);
   336                  /* Notifies the HCD after a hub descriptor is fetched.
   337                   * Will block.
   338                   */
   339          int     (*update_hub_device)(struct usb_hcd *, struct usb_device *hdev,
   340                          struct usb_tt *tt, gfp_t mem_flags);
   341          int     (*reset_device)(struct usb_hcd *, struct usb_device *);
   342                  /* Notifies the HCD after a device is connected and its
   343                   * address is set
   344                   */
   345          int     (*update_device)(struct usb_hcd *, struct usb_device *);
   346          int     (*set_usb2_hw_lpm)(struct usb_hcd *, struct usb_device *, int);
   347  };

每个 hcd 都得对应这么一个结构体变量.比如咱们的MUSB HDRC,drivers\usb\musb\musb_host.c中就有这么一段:

 2496  const struct hc_driver musb_hc_driver = {
  2497          .description            = "musb-hcd",
  2498          .product_desc           = "MUSB HDRC host driver",
  2499          .hcd_priv_size          = sizeof(struct musb),
  2500          .flags                  = HCD_USB2 | HCD_MEMORY,
  2501
  2502          /* not using irq handler or reset hooks from usbcore, since
  2503           * those must be shared with peripheral code for OTG configs
  2504           */
  2505
  2506          .start                  = musb_h_start,
  2507          .stop                   = musb_h_stop,
  2508
  2509          .get_frame_number       = musb_h_get_frame_number,
  2510
  2511          .urb_enqueue            = musb_urb_enqueue,
  2512          .urb_dequeue            = musb_urb_dequeue,
  2513          .endpoint_disable       = musb_h_disable,
  2514
  2515          .hub_status_data        = musb_hub_status_data,
  2516          .hub_control            = musb_hub_control,
  2517          .bus_suspend            = musb_bus_suspend,
  2518          .bus_resume             = musb_bus_resume,
  2519          /* .start_port_reset    = NULL, */
  2520          /* .hub_irq_enable      = NULL, */
  2521  };

继续看,2233行,一个变态的数据结构还不够,还得来一个更变态的.struct usb_hcd,这意思很
明确,有一个 hcd 就得有这么一个结构体,也是来自 drivers/usb/core/hcd.h:

   68  /*-------------------------------------------------------------------------*/
    69
    70  struct usb_hcd {
    71
    72          /*
    73           * housekeeping
    74           */
    75          struct usb_bus          self;           /* hcd is-a bus */
    76          struct kref             kref;           /* reference counter */
    77
    78          const char              *product_desc;  /* product/vendor string */
    79          int                     speed;          /* Speed for this roothub.
    80                                                   * May be different from
    81                                                   * hcd->driver->flags & HCD_MASK
    82                                                   */
    83          char                    irq_descr[24];  /* driver + bus # */
    84
    85          struct timer_list       rh_timer;       /* drives root-hub polling */
    86          struct urb              *status_urb;    /* the current status urb */
    87  #ifdef CONFIG_USB_SUSPEND
    88          struct work_struct      wakeup_work;    /* for remote wakeup */
    89  #endif
    90
    91          /*
    92           * hardware info/state
    93           */
    94          const struct hc_driver  *driver;        /* hw-specific hooks */
    95
    96          /* Flags that need to be manipulated atomically because they can
    97           * change while the host controller is running.  Always use
    98           * set_bit() or clear_bit() to change their values.
    99           */
   100          unsigned long           flags;
   101  #define HCD_FLAG_HW_ACCESSIBLE          0       /* at full power */
   102  #define HCD_FLAG_SAW_IRQ                1
   103  #define HCD_FLAG_POLL_RH                2       /* poll for rh status? */
   104  #define HCD_FLAG_POLL_PENDING           3       /* status has changed? */
   105  #define HCD_FLAG_WAKEUP_PENDING         4       /* root hub is resuming? */
   106  #define HCD_FLAG_RH_RUNNING             5       /* root hub is running? */
   107  #define HCD_FLAG_DEAD                   6       /* controller has died? */
   108
   109          /* The flags can be tested using these macros; they are likely to
   110           * be slightly faster than test_bit().
   111           */
   112  #define HCD_HW_ACCESSIBLE(hcd)  ((hcd)->flags & (1U << HCD_FLAG_HW_ACCESSIBLE))
   113  #define HCD_SAW_IRQ(hcd)        ((hcd)->flags & (1U << HCD_FLAG_SAW_IRQ))
   114  #define HCD_POLL_RH(hcd)        ((hcd)->flags & (1U << HCD_FLAG_POLL_RH))
   115  #define HCD_POLL_PENDING(hcd)   ((hcd)->flags & (1U << HCD_FLAG_POLL_PENDING))
   116  #define HCD_WAKEUP_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING))
   117  #define HCD_RH_RUNNING(hcd)     ((hcd)->flags & (1U << HCD_FLAG_RH_RUNNING))
   118  #define HCD_DEAD(hcd)           ((hcd)->flags & (1U << HCD_FLAG_DEAD))
   119
   120          /* Flags that get set only during HCD registration or removal. */
   121          unsigned                rh_registered:1;/* is root hub registered? */
   122          unsigned                rh_pollable:1;  /* may we poll the root hub? */
   123          unsigned                msix_enabled:1; /* driver has MSI-X enabled? */
   124
   125          /* The next flag is a stopgap, to be removed when all the HCDs
   126           * support the new root-hub polling mechanism. */
   127          unsigned                uses_new_polling:1;
   128          unsigned                wireless:1;     /* Wireless USB HCD */
   129          unsigned                authorized_default:1;
   130          unsigned                has_tt:1;       /* Integrated TT in root hub */
   131
   132          int                     irq;            /* irq allocated */
   133          void __iomem            *regs;          /* device memory/io */
   134          u64                     rsrc_start;     /* memory/io resource start */
   135          u64                     rsrc_len;       /* memory/io resource length */
   136          unsigned                power_budget;   /* in mA, 0 = no limit */
   137
   138          /* bandwidth_mutex should be taken before adding or removing
   139           * any new bus bandwidth constraints:
   140           *   1. Before adding a configuration for a new device.
   141           *   2. Before removing the configuration to put the device into
   142           *      the addressed state.
   143           *   3. Before selecting a different configuration.
   144           *   4. Before selecting an alternate interface setting.
   145           *
   146           * bandwidth_mutex should be dropped after a successful control message
   147           * to the device, or resetting the bandwidth after a failed attempt.
   148           */
   149          struct mutex            *bandwidth_mutex;
   150          struct usb_hcd          *shared_hcd;
   151          struct usb_hcd          *primary_hcd;
   152
   153
   154  #define HCD_BUFFER_POOLS        4
   155          struct dma_pool         *pool[HCD_BUFFER_POOLS];
   156
   157          int                     state;
   158  #       define  __ACTIVE                0x01
   159  #       define  __SUSPEND               0x04
   160  #       define  __TRANSIENT             0x80
   161
   162  #       define  HC_STATE_HALT           0
   163  #       define  HC_STATE_RUNNING        (__ACTIVE)
   164  #       define  HC_STATE_QUIESCING      (__SUSPEND|__TRANSIENT|__ACTIVE)
   165  #       define  HC_STATE_RESUMING       (__SUSPEND|__TRANSIENT)
   166  #       define  HC_STATE_SUSPENDED      (__SUSPEND)
   167
   168  #define HC_IS_RUNNING(state) ((state) & __ACTIVE)
   169  #define HC_IS_SUSPENDED(state) ((state) & __SUSPEND)
   170
   171          /* more shared queuing code would be good; it should support
   172           * smarter scheduling, handle transaction translators, etc;
   173           * input size of periodic table to an interrupt scheduler.
   174           * (ohci 32, uhci 1024, ehci 256/512/1024).
   175           */
   176
   177          /* The HC driver's private data is stored at the end of
   178           * this structure.
   179           */
   180          unsigned long hcd_priv[0]
   181                          __attribute__ ((aligned(sizeof(s64))));
   182  };
   183

 所以 usb_create_hcd 这个函数就是为 struct usb_hcd 申请内存空间,并且初始化.我们来看
它具体如何初始化的.

2235 行是申请内存,并且初值为 0.

2240行:咱们传入primary_hcd =null

2249行:dev->driver_data 等于咱们这里申请好的 hcd.

而 2258行就是初始化一个引用计数,struct usb_hcd 也不是白贴出来了,至少我们可以看到它
有一个成员 struct kref kref,这玩艺说白了就是一个引用计数的变量.

2260行:struct usb_hcd 中有一个成员struct usb_bus self,我们说了一个主机控制器就意味着

一条总线,所以这里又出来另一个结构体,struct usb_bus,
 

  320   * Allocated per bus (tree of devices) we have:
   321   */
   322  struct usb_bus {
   323          struct device *controller;      /* host/master side hardware */
   324          int busnum;                     /* Bus number (in order of reg) */
   325          const char *bus_name;           /* stable id (PCI slot_name etc) */
   326          u8 uses_dma;                    /* Does the host controller use DMA? */
   327          u8 uses_pio_for_control;        /*
   328                                           * Does the host controller use PIO
   329                                           * for control transfers?
   330                                           */
   331          u8 otg_port;                    /* 0, or number of OTG/HNP port */
   332          unsigned is_b_host:1;           /* true during some HNP roleswitches */
   333          unsigned b_hnp_enable:1;        /* OTG: did A-Host enable HNP? */
   334          unsigned sg_tablesize;          /* 0 or largest number of sg list entries */
   335
   336          int devnum_next;                /* Next open device number in
   337                                           * round-robin allocation */
   338
   339          struct usb_devmap devmap;       /* device address allocation map */
   340          struct usb_device *root_hub;    /* Root hub */
   341          struct usb_bus *hs_companion;   /* Companion EHCI bus, if any */
   342          struct list_head bus_list;      /* list of busses */
   343
   344          int bandwidth_allocated;        /* on this bus: how much of the time
   345                                           * reserved for periodic (intr/iso)
   346                                           * requests is used, on average?
   347                                           * Units: microseconds/frame.
   348                                           * Limits: Full/low speed reserve 90%,
   349                                           * while high speed reserves 80%.
   350                                           */
   351          int bandwidth_int_reqs;         /* number of Interrupt requests */
   352          int bandwidth_isoc_reqs;        /* number of Isoc. requests */
   353
   354  #ifdef CONFIG_USB_DEVICEFS
   355          struct dentry *usbfs_dentry;    /* usbfs dentry entry for the bus */
   356  #endif
   357
   358  #if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE)
   359          struct mon_bus *mon_bus;        /* non-null when associated */
   360          int monitored;                  /* non-zero when monitored */
   361  #endif
   362  };

usb_bus_init 来自drivers/usb/core/hcd.c,很显然,它就是初始化struct usb_bus结构体指
针.而这个结构体变量 hcd->self 的内存已经在刚才为 hcd 申请内存的时候一并申请了.
 

   878  /*-------------------------------------------------------------------------*/
   879
   880  /**
   881   * usb_bus_init - shared initialization code
   882   * @bus: the bus structure being initialized
   883   *
   884   * This code is used to initialize a usb_bus structure, memory for which is
   885   * separately managed.
   886   */
   887  static void usb_bus_init (struct usb_bus *bus)
   888  {
   889          memset (&bus->devmap, 0, sizeof(struct usb_devmap));
   890
   891          bus->devnum_next = 1;
   892
   893          bus->root_hub = NULL;
   894          bus->busnum = -1;
   895          bus->bandwidth_allocated = 0;
   896          bus->bandwidth_int_reqs  = 0;
   897          bus->bandwidth_isoc_reqs = 0;
   898
   899          INIT_LIST_HEAD (&bus->bus_list);
   900  }
   901

devnum_next 在总线初始化的时候会被设为 1,

回到 usb_create_shared_hcd中来,又是几行赋值,飘过

倒是 2265行引起了我的注意,又是可恶的时间机制,init_timer,这个函数我们也见过多次
了,usb-storage 里见过,hub 里见过,斑驳的陌生终于在时间的抚摸下变成了今日的熟悉.这里
我们设置的函数是 rh_timer_func,而传递给这个函数的参数是 hcd.这个函数具体做什么我们
走着瞧,不过你放心,咱们这个故事里会多次接触到这个 timer,想逃是逃不掉的,躲得过初一躲不
过十五.

2269行,INIT_WORK 咱们也在 hub 驱动里见过了,这里这个 hcd_resume_work 什么时候会
被调用咱们也到时候再看.

剩下两行赋值,2272行没啥好说的,struct usb_hcd 有一个 struct hc_driver 的结构体指针成
员,所以就这样把它和咱们这个 uhci_driver 给联系起来了.而在 uhci_driver 中我们看到,其中
有一个 product_desc 被赋值为"MUSB HDRC host driver",所以这里也赋给
hcd->product_desc,因为 struct hc_driver 和 struct usb_hcd 这两个结构体中都有一个成
员const char *product_desc。

至此,usb_create_hcd 结束了,返回了这个申请好赋好值的 hcd.我们继续回到allocate_instance

函数中来

初始化控制链表、bulk in 、bulk out 链表、初始化gb_list链表

hcd->uses_new_polling = 1;

        hcd->has_tt = 1;

        musb->vbuserr_retry = VBUSERR_RETRY_COUNT;

退出allocate_instance

接下来2206行:musb_platform_init

Kernel_3.2_for_Linux\drivers\usb\musb\musb_core.h

static inline int musb_platform_init(struct musb *musb)
{
	if (!musb->ops->init)
		return -EINVAL;

	return musb->ops->init(musb);
}

这里运行ti81xx_musb_init初始化,咱们现在先略过

2040~2053行:dma的操作

主要运行cppi41_dma_controller_create

 1597  /**
  1598   * cppi41_dma_controller_create -
  1599   * instantiate an object representing DMA controller.
  1600   */
  1601  struct dma_controller * __devinit
  1602  cppi41_dma_controller_create(struct musb  *musb, void __iomem *mregs)
  1603  {
  1604          struct cppi41 *cppi;
  1605
  1606          cppi = kzalloc(sizeof *cppi, GFP_KERNEL);
  1607          if (!cppi)
  1608                  return NULL;
  1609
  1610          /* Initialize the CPPI 4.1 DMA controller structure */
  1611          cppi->musb  = musb;
  1612          cppi->controller.start = cppi41_controller_start;
  1613          cppi->controller.stop  = cppi41_controller_stop;
  1614          cppi->controller.channel_alloc = cppi41_channel_alloc;
  1615          cppi->controller.channel_release = cppi41_channel_release;
  1616          cppi->controller.channel_program = cppi41_channel_program;
  1617          cppi->controller.channel_abort = cppi41_channel_abort;
  1618          cppi->cppi_info = (struct usb_cppi41_info *)&usb_cppi41_info[musb->id];;
  1619          cppi->en_bd_intr = cppi->cppi_info->bd_intr_ctrl;
  1620          cppi->txfifo_intr_enable = musb->txfifo_intr_enable;
  1621          cppi->tx_isoc_sched_enable = musb->tx_isoc_sched_enable;
  1622          INIT_WORK(&cppi->txdma_work, txdma_completion_work);
  1623          INIT_WORK(&cppi->rxdma_work, rxdma_completion_work);
  1624
  1625          /*
  1626           * Extra IN token has been seen when a file is transferred from one MSC
  1627           * device to other due to xDMA IP bug when multiple masters access
  1628           * mentor controller register space.
  1629           * As a software workaround use transparent mode and correct data toggle
  1630           * when they go wrong.
  1631           * This issue is expected to be fixed in RTL version post 0xD.
  1632           * Since RTL version is not available to distinguish the fix, based on
  1633           * soc revision the rxdma generic rndis shall be enabled/disabled by
  1634           * platform driver as mentioned below
  1635           * set cppi_info->grndis_for_host_rx = 1 to enable
  1636           *                      rxdma generic rndis mode
  1637           * set cppi_info->grndis_for_host_rx = 0 and
  1638           *      cppi->musb->datatog_fix = 0 to disable the rxdma generic rndis.
  1639           */
  1640          if (cppi->cppi_info->rx_dma_mode == USB_GENERIC_RNDIS_MODE)
  1641                  cppi->musb->datatog_fix = 0;
  1642          else
  1643                  cppi->musb->datatog_fix = 1;
  1644          dev_dbg(musb->controller, "musb%d: %s cppi41 rxdma mode\n",
  1645                  musb->id, cppi->cppi_info->rx_dma_mode ? "generic rndis" :
  1646                          "transparent");
  1647
  1648          /* enable infinite mode only for ti81xx silicon rev2 */
  1649          if (cpu_is_am33xx() || cpu_is_ti816x()) {
  1650                  /*
  1651                   * to enable inf_mode, generic rndis mode must be
  1652                   * enabled. also datatog_fix must be set to zero
  1653                   */
  1654                  cppi->cppi_info->rx_inf_mode = 0;
  1655                  dev_dbg(musb->controller, "cppi41dma supports infinite mode\n");
  1656          }
  1657
  1658          return &cppi->controller;
  1659  }
  1660  EXPORT_SYMBOL(cppi41_dma_controller_create);

这就是初始化。返回cppi->controller

接着运行start函数cppi41_controller_start

 2118行                  status = usb_add_hcd(musb_to_hcd(musb), -1, 0);

这个函数位于drivers/usb/core/hcd.c 中:

  2384  /**
  2385   * usb_add_hcd - finish generic HCD structure initialization and register
  2386   * @hcd: the usb_hcd structure to initialize
  2387   * @irqnum: Interrupt line to allocate
  2388   * @irqflags: Interrupt type flags
  2389   *
  2390   * Finish the remaining parts of generic HCD initialization: allocate the
  2391   * buffers of consistent memory, register the bus, request the IRQ line,
  2392   * and call the driver's reset() and start() routines.
  2393   */
  2394  int usb_add_hcd(struct usb_hcd *hcd,
  2395                  unsigned int irqnum, unsigned long irqflags)
  2396  {
  2397          int retval;
  2398          struct usb_device *rhdev;
  2399
  2400          dev_info(hcd->self.controller, "%s\n", hcd->product_desc);
  2401
  2402          /* Keep old behaviour if authorized_default is not in [0, 1]. */
  2403          if (authorized_default < 0 || authorized_default > 1)
  2404                  hcd->authorized_default = hcd->wireless? 0 : 1;
  2405          else
  2406                  hcd->authorized_default = authorized_default;
  2407          set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
  2408
  2409          /* HC is in reset state, but accessible.  Now do the one-time init,
  2410           * bottom up so that hcds can customize the root hubs before khubd
  2411           * starts talking to them.  (Note, bus id is assigned early too.)
  2412           */
  2413          if ((retval = hcd_buffer_create(hcd)) != 0) {
  2414                  dev_dbg(hcd->self.controller, "pool alloc failed\n");
  2415                  return retval;
  2416          }
  2417
  2418          if ((retval = usb_register_bus(&hcd->self)) < 0)
  2419                  goto err_register_bus;
  2420
  2421          if ((rhdev = usb_alloc_dev(NULL, &hcd->self, 0)) == NULL) {
  2422                  dev_err(hcd->self.controller, "unable to allocate root hub\n");
  2423                  retval = -ENOMEM;
  2424                  goto err_allocate_root_hub;
  2425          }
  2426          hcd->self.root_hub = rhdev;
  2427
  2428          switch (hcd->speed) {
  2429          case HCD_USB11:
  2430                  rhdev->speed = USB_SPEED_FULL;
  2431                  break;
  2432          case HCD_USB2:
  2433                  rhdev->speed = USB_SPEED_HIGH;
  2434                  break;
  2435          case HCD_USB3:
  2436                  rhdev->speed = USB_SPEED_SUPER;
  2437                  break;
  2438          default:
  2439                  retval = -EINVAL;
  2440                  goto err_set_rh_speed;
  2441          }
  2442
  2443          /* wakeup flag init defaults to "everything works" for root hubs,
  2444           * but drivers can override it in reset() if needed, along with
  2445           * recording the overall controller's system wakeup capability.
  2446           */
  2447          device_set_wakeup_capable(&rhdev->dev, 1);
  2448
  2449          /* HCD_FLAG_RH_RUNNING doesn't matter until the root hub is
  2450           * registered.  But since the controller can die at any time,
  2451           * let's initialize the flag before touching the hardware.
  2452           */
  2453          set_bit(HCD_FLAG_RH_RUNNING, &hcd->flags);
  2454
  2455          /* "reset" is misnamed; its role is now one-time init. the controller
  2456           * should already have been reset (and boot firmware kicked off etc).
  2457           */
  2458          if (hcd->driver->reset && (retval = hcd->driver->reset(hcd)) < 0) {
  2459                  dev_err(hcd->self.controller, "can't setup\n");
  2460                  goto err_hcd_driver_setup;
  2461          }
  2462          hcd->rh_pollable = 1;
  2463
  2464          /* NOTE: root hub and controller capabilities may not be the same */
  2465          if (device_can_wakeup(hcd->self.controller)
  2466                          && device_can_wakeup(&hcd->self.root_hub->dev))
  2467                  dev_dbg(hcd->self.controller, "supports USB remote wakeup\n");
  2468
  2469          /* enable irqs just before we start the controller */
  2470          if (usb_hcd_is_primary_hcd(hcd)) {
  2471                  retval = usb_hcd_request_irqs(hcd, irqnum, irqflags);
  2472                  if (retval)
  2473                          goto err_request_irq;
  2474          }
  2475
  2476          hcd->state = HC_STATE_RUNNING;
  2477          retval = hcd->driver->start(hcd);
  2478          if (retval < 0) {
  2479                  dev_err(hcd->self.controller, "startup error %d\n", retval);
  2480                  goto err_hcd_driver_start;
  2481          }
  2482
  2483          /* starting here, usbcore will pay attention to this root hub */
  2484          rhdev->bus_mA = min(500u, hcd->power_budget);
  2485          if ((retval = register_root_hub(hcd)) != 0)
  2486                  goto err_register_root_hub;
  2487
  2488          retval = sysfs_create_group(&rhdev->dev.kobj, &usb_bus_attr_group);
  2489          if (retval < 0) {
  2490                  printk(KERN_ERR "Cannot register USB bus sysfs attributes: %d\n",
  2491                         retval);
  2492                  goto error_create_attr_group;
  2493          }
  2494          if (hcd->uses_new_polling && HCD_POLL_RH(hcd))
  2495                  usb_hcd_poll_rh_status(hcd);
  2496
  2497          /*
  2498           * Host controllers don't generate their own wakeup requests;
  2499           * they only forward requests from the root hub.  Therefore
  2500           * controllers should always be enabled for remote wakeup.
  2501           */
  2502          device_wakeup_enable(hcd->self.controller);
  2503          return retval;
  2504
  2505  error_create_attr_group:
  2506          clear_bit(HCD_FLAG_RH_RUNNING, &hcd->flags);
  2507          if (HC_IS_RUNNING(hcd->state))
  2508                  hcd->state = HC_STATE_QUIESCING;
  2509          spin_lock_irq(&hcd_root_hub_lock);
  2510          hcd->rh_registered = 0;
  2511          spin_unlock_irq(&hcd_root_hub_lock);
  2512
  2513  #ifdef CONFIG_USB_SUSPEND
  2514          cancel_work_sync(&hcd->wakeup_work);
  2515  #endif
  2516          mutex_lock(&usb_bus_list_lock);
  2517          usb_disconnect(&rhdev);         /* Sets rhdev to NULL */
  2518          mutex_unlock(&usb_bus_list_lock);
  2519  err_register_root_hub:
  2520          hcd->rh_pollable = 0;
  2521          clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
  2522          del_timer_sync(&hcd->rh_timer);
  2523          hcd->driver->stop(hcd);
  2524          hcd->state = HC_STATE_HALT;
  2525          clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
  2526          del_timer_sync(&hcd->rh_timer);
  2527  err_hcd_driver_start:
  2528          if (usb_hcd_is_primary_hcd(hcd) && hcd->irq >= 0)
  2529                  free_irq(irqnum, hcd);
  2530  err_request_irq:
  2531  err_hcd_driver_setup:
  2532  err_set_rh_speed:
  2533          usb_put_dev(hcd->self.root_hub);
  2534  err_allocate_root_hub:
  2535          usb_deregister_bus(&hcd->self);
  2536  err_register_bus:
  2537          hcd_buffer_destroy(hcd);
  2538          return retval;
  2539  } 
  2540  EXPORT_SYMBOL_GPL(usb_add_hcd);

2407 行,设置一个 flag,至于设了干嘛用,等遇到了再说.

2413行:hcd_buffer_create,初始化一个 buffer 池.现在是时候说一说 DMA 了.我们知道一个
USB 主机控制器控制着一条 USB 总线,而 USB 主机控制器的一项重要工作是什么呢?在内存和
USB 总线之间传输数据.这个过程可以使用 DMA 或者不使用 DMA,不使用 DMA 的方式即所谓
的 PIO 方式.DMA 代表着 Direct Memory Access,即直接内存访问.
 

  36
    37  /* SETUP primitives */
    38
    39  /**
    40   * hcd_buffer_create - initialize buffer pools
    41   * @hcd: the bus whose buffer pools are to be initialized
    42   * Context: !in_interrupt()
    43   *
    44   * Call this as part of initializing a host controller that uses the dma
    45   * memory allocators.  It initializes some pools of dma-coherent memory that
    46   * will be shared by all drivers using that controller, or returns a negative
    47   * errno value on error.
    48   *
    49   * Call hcd_buffer_destroy() to clean up after using those pools.
    50   */
    51  int hcd_buffer_create(struct usb_hcd *hcd)
    52  {
    53          char            name[16];
    54          int             i, size;
    55
    56          if (!hcd->self.controller->dma_mask &&
    57              !(hcd->driver->flags & HCD_LOCAL_MEM))
    58                  return 0;
    59
    60          for (i = 0; i < HCD_BUFFER_POOLS; i++) {
    61                  size = pool_max[i];
    62                  if (!size)
    63                          continue;
    64                  snprintf(name, sizeof name, "buffer-%d", size);
    65                  hcd->pool[i] = dma_pool_create(name, hcd->self.controller,
    66                                  size, size, 0);
    67                  if (!hcd->pool[i]) {
    68                          hcd_buffer_destroy(hcd);
    69                          return -ENOMEM;
    70                  }
    71          }
    72          return 0;
    73  }
    74

看 64 行,调用了 dma_pool_create 函数,这个函数就是真正去创建内存池
的函数,或者更准确地讲,创建一个DMA池,内核中定义了一个结构体,struct dma_pool,如果创建失败就调用
hcd_buffer_destroy,还是来自同一个文件
 

    75
    76  /**
    77   * hcd_buffer_destroy - deallocate buffer pools
    78   * @hcd: the bus whose buffer pools are to be destroyed
    79   * Context: !in_interrupt()
    80   *
    81   * This frees the buffer pools created by hcd_buffer_create().
    82   */
    83  void hcd_buffer_destroy(struct usb_hcd *hcd)
    84  {
    85          int i;
    86
    87          for (i = 0; i < HCD_BUFFER_POOLS; i++) {
    88                  struct dma_pool *pool = hcd->pool[i];
    89                  if (pool) {
    90                          dma_pool_destroy(pool);
    91                          hcd->pool[i] = NULL;
    92                  }
    93          }
    94  }
    95

看得出这里调用的是 dma_pool_destroy,其作用不言自明.
那么创建池子和销毁池子的函数我们知道了,如何从池子里索取或者把索取的释放回去呢?对应
的两个函数分别是,dma_pool_alloc 和 dma_pool_free,而这两个函数正是与我们说的
usb_buffer_alloc 以及 usb_buffer_free 相联系的.于是我们来看这两个函数的代码,来自
drivers/usb/core/usb.c:
 

  96
    97  /* sometimes alloc/free could use kmalloc with GFP_DMA, for
    98   * better sharing and to leverage mm/slab.c intelligence.
    99   */
   100
   101  void *hcd_buffer_alloc(
   102          struct usb_bus          *bus,
   103          size_t                  size,
   104          gfp_t                   mem_flags,
   105          dma_addr_t              *dma
   106  )
   107  {
   108          struct usb_hcd          *hcd = bus_to_hcd(bus);
   109          int                     i;
   110
   111          /* some USB hosts just use PIO */
   112          if (!bus->controller->dma_mask &&
   113              !(hcd->driver->flags & HCD_LOCAL_MEM)) {
   114                  *dma = ~(dma_addr_t) 0;
   115                  return kmalloc(size, mem_flags);
   116          }
   117
   118          for (i = 0; i < HCD_BUFFER_POOLS; i++) {
   119                  if (size <= pool_max[i])
   120                          return dma_pool_alloc(hcd->pool[i], mem_flags, dma);
   121          }
   122          return dma_alloc_coherent(hcd->self.controller, size, dma, mem_flags);
   123  }
   124
   125  void hcd_buffer_free(
   126          struct usb_bus          *bus,
   127          size_t                  size,
   128          void                    *addr,
   129          dma_addr_t              dma
   130  )
   131  {
   132          struct usb_hcd          *hcd = bus_to_hcd(bus);
   133          int                     i;
   134
   135          if (!addr)
   136                  return;
   137
   138          if (!bus->controller->dma_mask &&
   139              !(hcd->driver->flags & HCD_LOCAL_MEM)) {
   140                  kfree(addr);
   141                  return;
   142          }
   143
   144          for (i = 0; i < HCD_BUFFER_POOLS; i++) {
   145                  if (size <= pool_max[i]) {
   146                          dma_pool_free(hcd->pool[i], addr, dma);
   147                          return;
   148                  }
   149          }
   150          dma_free_coherent(hcd->self.controller, size, addr, dma);
   151  }

看见了吧,最终调用的就是dma_pool_alloc和dma_pool_free.那么主机控制器到底支持不支
持 DMA 操作呢?看见上面这个 dma_mask 了么?默认情况下,dma_mask 在总线枚举的时候


static u64 musb_dmamask = DMA_BIT_MASK(32);

把 dma_mask 设置为 0x00ffffff.因为标准的 设备都是32位的寻址的,所以标准情况就是设置的DMA_BIT_MASK(32)

要不,总结一下?以上这几个 DMA 函数我们就不细讲了.但需要对某些地方单独拿出来讲.


第一,hcd_buffer_alloc 函数中,111 行,判断,如果 dma_mask 为 NULL,说明这个主机控制器
不支持 DMA,那么使用原始的方法申请内存,即 kmalloc.然后申请好了就直接返回,而不会继续
去执行下面的那个 dma_pool_alloc 函数.同样的判断在 hcd_buffer_free 中也是一样的,没有
DMA 的就直接调用 kfree 释放内存,而不需要调用 dma_pool_free 了.


第二,你应该注意到这里还有另外两个函数我们根本没提起, dma_alloc_coherent 和
dma_free_coherent,这两个函数也是用来申请DMA内存的,但是它们适合申请比较大的内存,
比如N个page的那种,而DMA池的作用本来就是提供给小打小闹式的内存申请的.当前的USB
子系统里在 drivers/usb/core/buffer.c 中定义了一个数组:

 24  /* FIXME tune these based on pool statistics ... */
    25  static const size_t     pool_max[HCD_BUFFER_POOLS] = {
    26          /* platforms without dma-friendly caches might need to
    27           * prevent cacheline sharing...
    28           */
    29          32,
    30          128,
    31          512,
    32          PAGE_SIZE / 2
    33          /* bigger --> allocate pages */
    34  };
    35

HCD_BUFFER_POOLS 这个宏的值为 4.结合 hcd_buffer_alloc 函数里面那个循环来看,可以
知道,你要是申请个 32 个字节以内,128 个字节以内,512 个字节以内,或者最多二分之一个
PAGE_SIZE 以内的,就直接使用这个内存池了,否则的话,就得用那个 dma_alloc_coherent了.
释放的时候也一样.
第三,struct usb_hcd 结构体有这么一个成员,struct dma_pool *pool
[HCD_BUFFER_POOLS], 这个数组的值是在 hcd_buffer_create 中赋上的,即当时以这个
pool_max 为模型创建了 4 个池子,所以 hcd_buffer_alloc 里就可以这样用.
第四,至于像 dma_pool_create/dma_pool_alloc/dma_alloc_coherent 这些函数具体怎么
实现的我想任何一个写设备驱动程序的都不用关心吧

讲完了 hcd_buffer_create 让我们还是回到 usb_add_hcd 中来,继续往下走.


下一个函数,2148 行,usb_register_bus.我们说过,一个 USB 主机控制器就意味着一条 USB
总线,因为主机控制器控制的正是一条总线.古人说,猫走不走直线,完全取决于耗子,而数据走不
走总线,完全取决于主机控制器.
所以这里作为主机控制器的驱动,我们必须从软件的角度来说,注册一条总线.来自drivers/usb/core/hcd.c:

  902  /*-------------------------------------------------------------------------*/
   903
   904  /**
   905   * usb_register_bus - registers the USB host controller with the usb core
   906   * @bus: pointer to the bus to register
   907   * Context: !in_interrupt()
   908   *
   909   * Assigns a bus number, and links the controller into usbcore data
   910   * structures so that it can be seen by scanning the bus list.
   911   */
   912  static int usb_register_bus(struct usb_bus *bus)
   913  {
   914          int result = -E2BIG;
   915          int busnum;
   916
   917          mutex_lock(&usb_bus_list_lock);
   918          busnum = find_next_zero_bit (busmap.busmap, USB_MAXBUS, 1);
   919          if (busnum >= USB_MAXBUS) {
   920                  printk (KERN_ERR "%s: too many buses\n", usbcore_name);
   921                  goto error_find_busnum;
   922          }
   923          set_bit (busnum, busmap.busmap);
   924          bus->busnum = busnum;
   925
   926          /* Add it to the local list of buses */
   927          list_add (&bus->bus_list, &usb_bus_list);
   928          mutex_unlock(&usb_bus_list_lock);
   929
   930          usb_notify_add_bus(bus);
   931
   932          dev_info (bus->controller, "new USB bus registered, assigned bus "
   933                    "number %d\n", bus->busnum);
   934          return 0;
   935
   936  error_find_busnum:
   937          mutex_unlock(&usb_bus_list_lock);
   938          return result;
   939  }
   940

918行 :可知这里 busmap 则一共有 64 位.也就是说一共可以有 64 条 USB 总线.
 

930行,usb_notify_add_bus添加到设备。

好了,usb_register_bus 算是看完了,再一次回到 usb_add_hcd 中来.

2421行;usb_alloc_dev,多么熟悉啊,在讲 hub 驱动时这就是那个八大函数的第一个.这里做的就
是为 Root Hub 申请了一个 struct usb_device 结构体,并且初始化,将返回值赋给指针 rhdev.
回顾这个函数我们可以知道,Root Hub 的 parent 指针指向了 Controller 本身
 

2428行,确定 rhdev 的 speed,UHCI 和 OHCI 都是源于曾经的 USB1.1,而 EHCI 才是来自
USB2.0.只有 USB2.0 才定义了高速的设备,以前的设备只有两种速度,低速和全速.也只有
EHCI 的驱动才定义了一个 flag,HCD_USB2.所以咱们这里记录的 rhdev->speed 就是
USB_SPEED_FULL.不过我需要再次提醒一下,hcd->driver 在咱们的故事里就是那个
hc_driver,即 musb_hc_driver,有且只有这一个 driver.

2447行,device_set_wakeup_capable.也是咱们在 hub 驱动中见过的.第二个参数是 1 就意味着我们
把 Root Hub 的 Wakeup 能力打开了.正如注释里说的那样,你要是看不惯,你可以在自己的
driver 里面把它关掉.

2458 行,如果 musb_hc_driver中有 reset 函数,就调用它,咱们的 musb_hc_driver里面显然是没有

2471行:中断.看driver有没有一个irq函数,如果没有,就简单的记录hcd->irq为-1,hcd->irq
就是用来记录传说中的中断号的.如果有,那就有事情要做了当然,现在不用执行它,只是需要为它

做点事情.最重要的当然就是request_irq 这个函数.我们先来看看它直观的效果

 接下来,2477 行,下一个函数,driver->start 被调用.musb_h_start

static int musb_h_start(struct usb_hcd *hcd)
{
	struct musb	*musb = hcd_to_musb(hcd);

	/* NOTE: musb_start() is called when the hub driver turns
	 * on port power, or when (OTG) peripheral starts.
	 */
	hcd->state = HC_STATE_RUNNING;
	musb->port1_status = 0;
	return 0;
}

回到 usb_add_hcd 之后,2484 行,得出 rhdev 的 bus_mA,这个咱们在 Hub 驱动中已经讲过.
有些主机控制器是需要设置 power_budget,咱们没有设置过,就是默认值 0,所以这里得到的是
bus_mA就是0,0表示没有限制,hub驱动中我们看到了对于没有限制的情况我们是给每个端口
设置为最多 500mA,因为通常来讲计算机的 usb 端口能提供的最多就是 500mA
2485行,register_root_hub,来自 drivers/usb/core/hcd.c.

 967  /**
   968   * register_root_hub - called by usb_add_hcd() to register a root hub
   969   * @hcd: host controller for this root hub
   970   *
   971   * This function registers the root hub with the USB subsystem.  It sets up
   972   * the device properly in the device tree and then calls usb_new_device()
   973   * to register the usb device.  It also assigns the root hub's USB address
   974   * (always 1).
   975   */
   976  static int register_root_hub(struct usb_hcd *hcd)
   977  {
   978          struct device *parent_dev = hcd->self.controller;
   979          struct usb_device *usb_dev = hcd->self.root_hub;
   980          const int devnum = 1;
   981          int retval;
   982
   983          usb_dev->devnum = devnum;
   984          usb_dev->bus->devnum_next = devnum + 1;
   985          memset (&usb_dev->bus->devmap.devicemap, 0,
   986                          sizeof usb_dev->bus->devmap.devicemap);
   987          set_bit (devnum, usb_dev->bus->devmap.devicemap);
   988          usb_set_device_state(usb_dev, USB_STATE_ADDRESS);
   989
   990          mutex_lock(&usb_bus_list_lock);
   991
   992          usb_dev->ep0.desc.wMaxPacketSize = cpu_to_le16(64);
   993          retval = usb_get_device_descriptor(usb_dev, USB_DT_DEVICE_SIZE);
   994          if (retval != sizeof usb_dev->descriptor) {
   995                  mutex_unlock(&usb_bus_list_lock);
   996                  dev_dbg (parent_dev, "can't read %s device descriptor %d\n",
   997                                  dev_name(&usb_dev->dev), retval);
   998                  return (retval < 0) ? retval : -EMSGSIZE;
   999          }
  1000
  1001          retval = usb_new_device (usb_dev);
  1002          if (retval) {
  1003                  dev_err (parent_dev, "can't register root hub for %s, %d\n",
  1004                                  dev_name(&usb_dev->dev), retval);
  1005          }
  1006          mutex_unlock(&usb_bus_list_lock);
  1007
  1008          if (retval == 0) {
  1009                  spin_lock_irq (&hcd_root_hub_lock);
  1010                  hcd->rh_registered = 1;
  1011                  spin_unlock_irq (&hcd_root_hub_lock);
  1012
  1013                  /* Did the HC die before the root hub was registered? */
  1014                  if (HCD_DEAD(hcd))
  1015                          usb_hc_died (hcd);      /* This time clean up */
  1016          }
  1017
  1018          return retval;
  1019  }
  1020
  1021

这个函数的意图很明显,我们说过,Host Controller 通常是带有一个 Root Hub 的,常言说得好,
不想吃天鹅肉的癞蛤蟆不是好癞蛤蟆,同样,不集成 Root Hub 的主机控制器也不是好主机控制
器,常言又说了,吃了天鹅肉的癞蛤蟆还是癞蛤蟆,同样,集成了 Root Hub 的主机控制器也还是主
机控制器.


980行,root hub 的 devnum 设置为 1,毫无疑问.因为整棵设备树就是起源于 Root Hub,如果
把 usb 设备树比做水泊梁山一百单八好汉,那么 Root Hub 就相当于及时雨宋江,他不做老大谁
做老大.
984行,从现在开始记录 bus 的 devnum_next,从 2 开始.

801,802,803 行,初始化 bus 的 devmap,并且把 root hub 的那把交椅先给占了.
804 行,usb_set_device_state(),不用多说了吧,hub driver 中那个八大函数中的第二
个.Root Hub 说:我准备好了!于是为它把状态设置为 USB_STATE_ADDRESS.
紧接着,808 和 809 行,设置 Root Hub 的 wMaxPacketSize 为 64,然后获取 Root Hub 的设
备描述符.
817 行,usb_new_device,我们更加不会陌生,hub driver 中八大函数的第七个.这个函数结束
之后,咱们的 Root Hub 就算从软件的角度来说彻底融入了整个 usb 世界,或者说这一步就算是
真正的注册了.一切顺利的话返回 0.
1011 行,设置 rh_registered 为 1.顾名思义,告诉全世界,咱们这个 HCD 的 Root Hub 现在算是
有户口的人了.
1012行这个 if 就是为变态们准备的,你这里正在注册呢,也不知哪位哥们儿缺德,帮你把主机控制
器 的 驱 动 给 卸 载 了,比 如 他 卸 载 了 uhci-hcd,那 么 usb_remove_hcd 会 被 执 行,于 是
hcd->state会被设置为HC_STATE_HALT,真遇上这么一件倒霉事那咱也没办法,没啥好说的,
执行usb_hc_died吧.这个函数是用来汇报说主机控制器不正常的shutdown了.这个函数并不
复杂,但是有好几处调用了它,咱们稍微看一下,来自 drivers/usb/core/hcd.c:

  2168
  2169  /**
  2170   * usb_hc_died - report abnormal shutdown of a host controller (bus glue)
  2171   * @hcd: pointer to the HCD representing the controller
  2172   *
  2173   * This is called by bus glue to report a USB host controller that died
  2174   * while operations may still have been pending.  It's called automatically
  2175   * by the PCI glue, so only glue for non-PCI busses should need to call it.
  2176   *
  2177   * Only call this function with the primary HCD.
  2178   */
  2179  void usb_hc_died (struct usb_hcd *hcd)
  2180  {
  2181          unsigned long flags;
  2182
  2183          dev_err (hcd->self.controller, "HC died; cleaning up\n");
  2184
  2185          spin_lock_irqsave (&hcd_root_hub_lock, flags);
  2186          clear_bit(HCD_FLAG_RH_RUNNING, &hcd->flags);
  2187          set_bit(HCD_FLAG_DEAD, &hcd->flags);
  2188          if (hcd->rh_registered) {
  2189                  clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
  2190
  2191                  /* make khubd clean up old urbs and devices */
  2192                  usb_set_device_state (hcd->self.root_hub,
  2193                                  USB_STATE_NOTATTACHED);
  2194                  usb_kick_khubd (hcd->self.root_hub);
  2195          }
  2196          if (usb_hcd_is_primary_hcd(hcd) && hcd->shared_hcd) {
  2197                  hcd = hcd->shared_hcd;
  2198                  if (hcd->rh_registered) {
  2199                          clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
  2200
  2201                          /* make khubd clean up old urbs and devices */
  2202                          usb_set_device_state(hcd->self.root_hub,
  2203                                          USB_STATE_NOTATTACHED);
  2204                          usb_kick_khubd(hcd->self.root_hub);
  2205                  }
  2206          }
  2207          spin_unlock_irqrestore (&hcd_root_hub_lock, flags);
  2208          /* Make sure that the other roothub is also deallocated. */
  2209  }
  2210  EXPORT_SYMBOL_GPL (usb_hc_died);
void usb_kick_khubd(struct usb_device *hdev)
{
	struct usb_hub *hub = hdev_to_hub(hdev);

	if (hub)
		kick_khubd(hub);
}

关于 kick_khubd 我想就不用多说了吧,hub driver 中最重要的函数之一.我们知道这个函数会
触发 hub_events(),在 hub_events 中判断出 hub 处于了 USB_STATE_NOTATTACHED 的
状态,就会调用 hub_pre_reset 去处理那些后事.
接下来就该是 usb_hcd_poll_rh_status 了.这个函数在咱们整个故事将出现多次,甚至可以说
在任何一个 HCD 的故事中都将出现多次.为了继续走下去,我们必须做一个伟大的假设.假设现
在 Root Hub 上还没有连接任何设备,也就是说此时此刻,usb 设备树上只有 Root Hub 形单影
只.没有人来陪伴他,他只能静静的看青春难依难舍,只能听寂寞在唱歌,轻轻的,狠狠的,歌声是这
么残忍让人忍不住泪流成河.
我们以此为上下文开始往下看.
usb_hcd_poll_rh_status 来自 drivers/usb/core/hcd.c:

  680  /*-------------------------------------------------------------------------*/
   681
   682  /*
   683   * Root Hub interrupt transfers are polled using a timer if the
   684   * driver requests it; otherwise the driver is responsible for
   685   * calling usb_hcd_poll_rh_status() when an event occurs.
   686   *
   687   * Completions are called in_interrupt(), but they may or may not
   688   * be in_irq().
   689   */
   690  void usb_hcd_poll_rh_status(struct usb_hcd *hcd)
   691  {
   692          struct urb      *urb;
   693          int             length;
   694          unsigned long   flags;
   695          char            buffer[6];      /* Any root hubs with > 31 ports? */
   696
   697          if (unlikely(!hcd->rh_pollable))
   698                  return;
   699          if (!hcd->uses_new_polling && !hcd->status_urb)
   700                  return;
   701
   702          length = hcd->driver->hub_status_data(hcd, buffer);
   703          if (length > 0) {
   704
   705                  /* try to complete the status urb */
   706                  spin_lock_irqsave(&hcd_root_hub_lock, flags);
   707                  urb = hcd->status_urb;
   708                  if (urb) {
   709                          clear_bit(HCD_FLAG_POLL_PENDING, &hcd->flags);
   710                          hcd->status_urb = NULL;
   711                          urb->actual_length = length;
   712                          memcpy(urb->transfer_buffer, buffer, length);
   713
   714                          usb_hcd_unlink_urb_from_ep(hcd, urb);
   715                          spin_unlock(&hcd_root_hub_lock);
   716                          usb_hcd_giveback_urb(hcd, urb, 0);
   717                          spin_lock(&hcd_root_hub_lock);
   718                  } else {
   719                          length = 0;
   720                          set_bit(HCD_FLAG_POLL_PENDING, &hcd->flags);
   721                  }
   722                  spin_unlock_irqrestore(&hcd_root_hub_lock, flags);
   723          }
   724
   725          /* The USB 2.0 spec says 256 ms.  This is close enough and won't
   726           * exceed that limit if HZ is 100. The math is more clunky than
   727           * maybe expected, this is to make sure that all timers for USB devices
   728           * fire at the same time to give the CPU a break in between */
   729          if (hcd->uses_new_polling ? HCD_POLL_RH(hcd) :
   730                          (length == 0 && hcd->status_urb != NULL))
   731                  mod_timer (&hcd->rh_timer, (jiffies/(HZ/4) + 1) * (HZ/4));
   732  }
   733  EXPORT_SYMBOL_GPL(usb_hcd_poll_rh_status);
   734
   735  /* timer callback */
   736  static void rh_timer_func (unsigned long _hcd)
   737  {
   738          usb_hcd_poll_rh_status((struct usb_hcd *) _hcd);
   739  }
   740

前 面 两 个 if 对 咱 们 来 说 肯 定 是 不 满 足 的 .rh_registered 咱 们 刚 刚 才 设 置 为 1.
uses_new_polling 咱们也在 uhci_start()中设置为了 1.所以,咱们继续昂首挺胸的往前走.
702行,driver->hub_status_data 是每个 driver 自己定义的musb_hub_status_data

  203
   204  /* Caller may or may not hold musb->lock */
   205  int musb_hub_status_data(struct usb_hcd *hcd, char *buf)
   206  {
   207          struct musb     *musb = hcd_to_musb(hcd);
   208          int             retval = 0;
   209
   210          /* called in_irq() via usb_hcd_poll_rh_status() */
   211          if (musb->port1_status & 0xffff0000) {
   212                  *buf = 0x02;
   213                  retval = 1;
   214          }
   215          return retval;
   216  }

usb_hcd_poll_rh_status 这个函数完成usb_add_hcd完成

现在虽然最伟大的 probe 函数就这样结束了。。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值