usb平台驱动

  1907  static struct platform_driver ti81xx_musb_driver = {
  1908          .remove         = __exit_p(ti81xx_remove),
  1909          .driver         = {
  1910                  .name   = "musb-ti81xx",
  1911                  .pm     = DEV_PM_OPS,
  1912          },
  1913  };
  1914
  1915  MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
  1916  MODULE_DESCRIPTION("AM35x MUSB Glue Layer");
  1917  MODULE_LICENSE("GPL v2");
  1918
  1919  static int __init ti81xx_glue_init(void)
  1920  {
  1921          return platform_driver_probe(&ti81xx_musb_driver, ti81xx_probe);
  1922  }
  1923  subsys_initcall(ti81xx_glue_init);

平台name = “musb-ti81xx”

运行ti81xx_probe

  1545  static int __init ti81xx_probe(struct platform_device *pdev)
  1546  {
  1547          struct ti81xx_glue *glue;
  1548          struct device *dev = &pdev->dev;
  1549          struct musb_hdrc_platform_data *plat = dev->platform_data;
  1550          struct omap_musb_board_data *data = plat->board_data;
  1551          int ret = 0, i;
  1552          struct resource *res;
  1553
  1554          /* allocate glue */
  1555          glue = kzalloc(sizeof(*glue), GFP_KERNEL);
  1556          if (!glue) {
  1557                  dev_err(&pdev->dev, "unable to allocate glue memory\n");
  1558                  ret = -ENOMEM;
  1559                  goto err0;
  1560          }
  1561
  1562          /* get memory resource */
  1563          glue->mem_pa = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1564          if (!glue->mem_pa) {
  1565                  dev_err(&pdev->dev, "failed to get usbss mem resourse\n");
  1566                  ret = -ENODEV;
  1567                  goto err1;
  1568          }
  1569
  1570          /* get memory resource */
  1571          res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "usbss-irq");
  1572          if (!res) {
  1573                  dev_err(&pdev->dev, "failed to get usbss irq resourse\n");
  1574                  ret = -ENODEV;
  1575                  goto err1;
  1576          }
  1577          glue->irq = res->start;
  1578
  1579          /* iomap for usbss mem space */
  1580          glue->mem_va =
  1581                  ioremap(glue->mem_pa->start, resource_size(glue->mem_pa));
  1582          if (!glue->mem_va) {
  1583                  dev_err(&pdev->dev, "usbss ioremap failed\n");
  1584                  ret = -ENOMEM;
  1585                  goto err1;
  1586          }
  1587          usbss_virt_base = glue->mem_va;
  1588
  1589          glue->first = 1;
  1590          glue->dev = &pdev->dev;
  1591          platform_set_drvdata(pdev, glue);
  1592
  1593          /* enable clocks */
  1594          pm_runtime_enable(&pdev->dev);
  1595          ret = pm_runtime_get_sync(&pdev->dev);
  1596          if (ret < 0) {
  1597                  dev_err(dev, "pm_runtime_get_sync FAILED");
  1598                  goto err2;
  1599          }
  1600
  1601          /* usb subsystem init */
  1602          usbotg_ss_init();
  1603
  1604          /* clear any USBSS interrupts */
  1605          writel(0, glue->mem_va + USBSS_IRQ_EOI);
  1606          writel(readl(glue->mem_va + USBSS_IRQ_STATUS),
  1607                                          glue->mem_va + USBSS_IRQ_STATUS);
  1608
  1609          /* create the child platform device for mulitple instances of musb */
  1610          for (i = 0; i <= data->instances; ++i) {
  1611  #ifdef CONFIG_USB_TI_CPPI41_DMA
  1612                  /* initialize the cppi41dma init */
  1613                  cppi41_init(i, glue->irq, data->instances+1);
  1614  #endif
  1615                  ret = ti81xx_create_musb_pdev(glue, i);
  1616                  if (ret != 0)
  1617                          goto err3;
  1618          }
  1619
  1620          return 0;
  1621
  1622  err3:
  1623          pm_runtime_put_sync(&pdev->dev);
  1624  err2:
  1625          pm_runtime_disable(&pdev->dev);
  1626          iounmap(glue->mem_va);
  1627  err1:
  1628          kfree(glue);
  1629  err0:
  1630          return ret;
  1631  }
  1632

1555行给ti81xx_glue 分配内存。

1563行:获取资源; glue->mem_pa = 0x47400000;

1571行:获取中断资源:res->start = 17;

 glue->irq = res->start;

1580行:物理内存映射 glue->mem_va = 0x47400000;的虚拟内存

1587行:usbss_virt_base = glue->mem_va;

                           glue->first = 1;
  1590          glue->dev = &pdev->dev;

1591行:pdev->dev->p->driver_data =glue;

1602行:usbotg_ss_init

 142  static void usbotg_ss_init(void)
   143  {
   144          if (!usbss_init_done) {
   145                  usbss_init_done = 1;
   146
   147                  /* clear any USBSS interrupts */
   148                  usbss_write(USBSS_IRQ_EOI, 0);
   149                  usbss_write(USBSS_IRQ_STATUS, usbss_read(USBSS_IRQ_STATUS));
   150          }
   151  }

144行这个变量定义在本文件

static u8 usbss_init_done;初始化为0;

148和149行:

static inline void usbss_write(u32 offset, u32 data)
{
	if (!usbss_init_done)
		return ;
	writel(data, usbss_virt_base + offset);
}

就是给寄存器写入数据

/* USBSS EOI interrupt register */
#define USBSS_IRQ_EOI			0x0020
/* USBSS interrupt generation/status register */
#define USBSS_IRQ_STATUS_RAW		0x0024
/* USBSS interrupt status register */
#define USBSS_IRQ_STATUS		0x0028

这个函数就是clear any USBSS interrupts

1611行:这个for循环只有一次instances=1; 

        cppi41_init(i, glue->irq, data->instances+1);

  460  int __devinit cppi41_init(u8 id, u8 irq, int num_instances)
   461  {
   462          struct usb_cppi41_info *cppi_info = &usb_cppi41_info[id];
   463          u16 numch, blknum, order;
   464          u32 i;
   465
   466          /* init cppi info structure  */
   467          cppi_info->dma_block = 0;
   468          for (i = 0 ; i < USB_CPPI41_NUM_CH ; i++)
   469                  cppi_info->ep_dma_ch[i] = i + (15 * id);
   470
   471          cppi_info->q_mgr = 0;
   472          cppi_info->num_tx_comp_q = 15;
   473          cppi_info->num_rx_comp_q = 15;
   474          cppi_info->tx_comp_q = id ? tx_comp_q1 : tx_comp_q;
   475          cppi_info->rx_comp_q = id ? rx_comp_q1 : rx_comp_q;
   476          cppi_info->bd_intr_ctrl = 1;
   477          cppi_info->sched_tbl_ctrl = 0;
   478          cppi_info->version = usbss_read(USBSS_REVISION);
   479
   480          if (cppi41_init_done)
   481                  return 0;
   482
   483          blknum = cppi_info->dma_block;
   484
   485          /* Queue manager information */
   486          cppi41_queue_mgr[0].num_queue = 159;
   487          cppi41_queue_mgr[0].queue_types = CPPI41_FREE_DESC_BUF_QUEUE |
   488                                                  CPPI41_UNASSIGNED_QUEUE;
   489          cppi41_queue_mgr[0].base_fdbq_num = 0;
   490          cppi41_queue_mgr[0].assigned = assigned_queues;
   491
   492          /* init DMA block */
   493          cppi41_dma_block[0].num_tx_ch = 30;
   494          cppi41_dma_block[0].num_rx_ch = 30;
   495          cppi41_dma_block[0].tx_ch_info = tx_ch_info;
   496
   497          /* initilize cppi41 dma & Qmgr address */
   498          cppi41_dma_base = ioremap(TI81XX_USB_CPPIDMA_BASE,
   499                                          TI81XX_USB_CPPIDMA_LEN);
   500
   501          cppi41_queue_mgr[0].q_mgr_rgn_base = CPPI41_ADDR(QMGR_RGN_OFFS);
   502          cppi41_queue_mgr[0].desc_mem_rgn_base = CPPI41_ADDR(QMRG_DESCRGN_OFFS);
   503          cppi41_queue_mgr[0].q_mgmt_rgn_base = CPPI41_ADDR(QMGR_REG_OFFS);
   504          cppi41_queue_mgr[0].q_stat_rgn_base = CPPI41_ADDR(QMGR_STAT_OFFS);
   505          cppi41_dma_block[0].global_ctrl_base = CPPI41_ADDR(DMA_GLBCTRL_OFFS);
   506          cppi41_dma_block[0].ch_ctrl_stat_base = CPPI41_ADDR(DMA_CHCTRL_OFFS);
   507          cppi41_dma_block[0].sched_ctrl_base = CPPI41_ADDR(DMA_SCHED_OFFS);
   508          cppi41_dma_block[0].sched_table_base = CPPI41_ADDR(DMA_SCHEDTBL_OFFS);
   509
   510          /* Initialize for Linking RAM region 0 alone */
   511          cppi41_queue_mgr_init(cppi_info->q_mgr, 0, 0x3fff);
   512
   513          numch =  USB_CPPI41_NUM_CH * 2 * num_instances;
   514          cppi41_dma_block[0].num_max_ch = numch;
   515
   516          order = get_count_order(numch);
   517
   518          /* TODO: check two teardown desc per channel (5 or 7 ?)*/
   519          if (order < 5)
   520                  order = 5;
   521
   522          cppi41_dma_block_init(blknum, cppi_info->q_mgr, order,
   523                          dma_sched_table, numch);
   524
   525          /* attach to the IRQ */
   526          if (request_irq(irq, cppi41dma_Interrupt, 0, "cppi41_dma", 0))
   527                  printk(KERN_INFO "request_irq %d failed!\n", irq);
   528          else
   529                  printk(KERN_INFO "registerd cppi-dma Intr @ IRQ %d\n", irq);
   530
   531          cppi41_init_done = 1;
   532
   533          printk(KERN_INFO "Cppi41 Init Done Qmgr-base(%p) dma-base(%p)\n",
   534                  cppi41_queue_mgr[0].q_mgr_rgn_base,
   535                  cppi41_dma_block[0].global_ctrl_base);
   536
   537          /* enable all usbss the interrupts */
   538          usbss_write(USBSS_IRQ_EOI, 0);
   539          usbss_write(USBSS_IRQ_ENABLE_SET, USBSS_INTR_FLAGS);
   540          usbss_write(USBSS_IRQ_DMA_ENABLE_0, 0xFFFeFFFe);
   541
   542          printk(KERN_INFO "Cppi41 Init Done\n");
   543
   544          return 0;
   545  }
   546

   467          cppi_info->dma_block = 0;
   468          for (i = 0 ; i < USB_CPPI41_NUM_CH ; i++)//循环15次
   469                  cppi_info->ep_dma_ch[i] = i + (15 * id);
   470
   471          cppi_info->q_mgr = 0;
   472          cppi_info->num_tx_comp_q = 15;
   473          cppi_info->num_rx_comp_q = 15;
   474          cppi_info->tx_comp_q = id ? tx_comp_q1 : tx_comp_q;//tx_comp_q
   475          cppi_info->rx_comp_q = id ? rx_comp_q1 : rx_comp_q;//rx_comp_q
   476          cppi_info->bd_intr_ctrl = 1;
   477          cppi_info->sched_tbl_ctrl = 0;

blknum = cppi_info->dma_block;

    /* Queue manager information */

    cppi41_queue_mgr[0].num_queue = 159;

    cppi41_queue_mgr[0].queue_types = CPPI41_FREE_DESC_BUF_QUEUE |

                        CPPI41_UNASSIGNED_QUEUE;

    cppi41_queue_mgr[0].base_fdbq_num = 0;

    cppi41_queue_mgr[0].assigned = assigned_queues;

    /* init DMA block */

    cppi41_dma_block[0].num_tx_ch = 30;

    cppi41_dma_block[0].num_rx_ch = 30;

    cppi41_dma_block[0].tx_ch_info = tx_ch_info;

498行:映射内存cppi41_dma_base  //0x47402000

500~508行:#define CPPI41_ADDR(offs) ((void *)((u32)cppi41_dma_base + (offs - 0x2000)))

 501          cppi41_queue_mgr[0].q_mgr_rgn_base (0x47404000)
   502          cppi41_queue_mgr[0].desc_mem_rgn_base//(0x47405000)
   503          cppi41_queue_mgr[0].q_mgmt_rgn_base//(0x47406000)
   504          cppi41_queue_mgr[0].q_stat_rgn_base //
   505          cppi41_dma_block[0].global_ctrl_base
   506          cppi41_dma_block[0].ch_ctrl_stat_base 
   507          cppi41_dma_block[0].sched_ctrl_base
   508          cppi41_dma_block[0].sched_table_base 

511行:511          cppi41_queue_mgr_init(cppi_info->q_mgr, 0, 0x3fff);

 81
    82  int cppi41_queue_mgr_init(u8 q_mgr, dma_addr_t rgn0_base, u16 rgn0_size)
    83  {
    84          void __iomem *q_mgr_regs;
    85          void *ptr;
    86
    87          if (q_mgr >= cppi41_num_queue_mgr)
    88                  return -EINVAL;
    89
    90          q_mgr_regs = cppi41_queue_mgr[q_mgr].q_mgr_rgn_base;
    91          ptr = dma_alloc_coherent(NULL, rgn0_size * 4,
    92                                   &linking_ram[q_mgr].phys_addr,
    93                                   GFP_KERNEL | GFP_DMA);
    94          if (ptr == NULL) {
    95                  printk(KERN_ERR "ERROR: %s: Unable to allocate "
    96                         "linking RAM.\n", __func__);
    97                  return -ENOMEM;
    98          }
    99          linking_ram[q_mgr].virt_addr = ptr;
   100          linking_ram[q_mgr].size = rgn0_size * 4;
   101
   102          cppi_writel(linking_ram[q_mgr].phys_addr,
   103                          q_mgr_regs + QMGR_LINKING_RAM_RGN0_BASE_REG);
   104          DBG("Linking RAM region 0 base @ %p, value: %x\n",
   105              q_mgr_regs + QMGR_LINKING_RAM_RGN0_BASE_REG,
   106              cppi_readl(q_mgr_regs + QMGR_LINKING_RAM_RGN0_BASE_REG));
   107
   108          cppi_writel(rgn0_size, q_mgr_regs + QMGR_LINKING_RAM_RGN0_SIZE_REG);
   109          DBG("Linking RAM region 0 size @ %p, value: %x\n",
   110              q_mgr_regs + QMGR_LINKING_RAM_RGN0_SIZE_REG,
   111              cppi_readl(q_mgr_regs + QMGR_LINKING_RAM_RGN0_SIZE_REG));
   112
   113          ptr = kzalloc(BITS_TO_LONGS(cppi41_queue_mgr[q_mgr].num_queue) *
   114                          sizeof(long), GFP_KERNEL);
   115          if (ptr == NULL) {
   116                  printk(KERN_ERR "ERROR: %s: Unable to allocate queue bitmap.\n",
   117                         __func__);
   118                  dma_free_coherent(NULL, rgn0_size * 4,
   119                                    linking_ram[q_mgr].virt_addr,
   120                                    linking_ram[q_mgr].phys_addr);
   121                  return -ENOMEM;
   122          }
   123          allocated_queues[q_mgr] = ptr;
   124
   125          return 0;
   126  }
   127  EXPORT_SYMBOL(cppi41_queue_mgr_init);
   128

87行:q_mgr >= cppi41_num_queue_mgr(q_mgr  =0;cppi41_num_queue_mgr =1)

91行:分配dma

102行:写入dma物理地址

108行:写入大小

113行给队列分配内存,赋值

退出

514行 cppi41_dma_block[0].num_max_ch =60

order =6;

522行: cppi41_dma_block_init(blknum, cppi_info->q_mgr, order,dma_sched_table, numch);

队列初始化

526行申请中断

接下来使能enable all usbss the interrupts

退出cppi41_init

进入ti81xx_create_musb_pdev

  1460  static int __devinit ti81xx_create_musb_pdev(struct ti81xx_glue *glue, u8 id)
  1461  {
  1462          struct device *dev = glue->dev;
  1463          struct platform_device *pdev = to_platform_device(dev);
  1464          struct musb_hdrc_platform_data  *pdata = dev->platform_data;
  1465          struct omap_musb_board_data *bdata = pdata->board_data;
  1466          struct platform_device  *musb;
  1467          struct resource *res;
  1468          struct resource resources[2];
  1469          char res_name[10];
  1470          int ret = 0;
  1471
  1472          /* get memory resource */
  1473          sprintf(res_name, "musb%d", id);
  1474          res = platform_get_resource_byname(pdev, IORESOURCE_MEM, res_name);
  1475          if (!res) {
  1476                  dev_err(dev, "%s get mem resource failed\n", res_name);
  1477                  ret = -ENODEV;
  1478                  goto err0;
  1479          }
  1480          res->parent = NULL;
  1481          resources[0] = *res;
  1482
  1483          /* get irq resource */
  1484          sprintf(res_name, "musb%d-irq", id);
  1485          res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, res_name);
  1486          if (!res) {
  1487                  dev_err(dev, "%s get irq resource failed\n", res_name);
  1488                  ret = -ENODEV;
  1489                  goto err0;
  1490          }
  1491          res->parent = NULL;
  1492          resources[1] = *res;
  1493
  1494          /* allocate the child platform device */
  1495          musb = platform_device_alloc("musb-hdrc", id);
  1496          if (!musb) {
  1497                  dev_err(dev, "failed to allocate musb device\n");
  1498                  goto err0;
  1499          }
  1500
  1501          musb->id                        = id;
  1502          musb->dev.parent                = dev;
  1503          musb->dev.dma_mask              = &musb_dmamask;
  1504          musb->dev.coherent_dma_mask     = musb_dmamask;
  1505
  1506          glue->musb[id]                  = musb;
  1507
  1508          pdata->platform_ops             = &ti81xx_ops;
  1509
  1510          ret = platform_device_add_resources(musb, resources, 2);
  1511          if (ret) {
  1512                  dev_err(dev, "failed to add resources\n");
  1513                  goto err1;
  1514          }
  1515
  1516          if (id == 0)
  1517                  pdata->mode = bdata->mode & USB0PORT_MODEMASK;
  1518          else
  1519                  pdata->mode = (bdata->mode & USB1PORT_MODEMASK)
  1520                                          >> USB1PORT_MODESHIFT;
  1521
  1522          dev_info(dev, "musb%d, board_mode=0x%x, plat_mode=0x%x\n",
  1523                                          id, bdata->mode, pdata->mode);
  1524
  1525          ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
  1526          if (ret) {
  1527                  dev_err(dev, "failed to add platform_data\n");
  1528                  goto err1;
  1529          }
  1530
  1531          ret = platform_device_add(musb);
  1532          if (ret) {
  1533                  dev_err(dev, "failed to register musb device\n");
  1534                  goto err1;
  1535          }
  1536
  1537          return 0;
  1538
  1539  err1:
  1540          platform_device_put(musb);
  1541  err0:
  1542          return ret;
  1543  }
  1544

看到这里创建平台设备,名称分别为“musb0”“musb1”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值