MUSB(4) --- OMAP2430 USB OTG Controller (Driver)

分类: Android平台

在上一个章节中,我们分析了MUSB device部分的内容.这些其实是比较死板僵硬的.按照SPEC一步步来就行了.
1. resources
(1) 在CPU上的registers的物理地址
(2) DMA interrupt的信息
(3) Controller的interrupt信息
2. platform data
这是MUSB 特性相关的内容.
musb_plat->musb_config->

点击(此处)折叠或打开

  1. static struct musb_hdrc_config musb_config = {
  2.     .fifo_mode    = 4,
  3.     .multipoint    = 1,
  4.     .dyn_fifo    = 1,
  5.     .num_eps    = 16,
  6.     .ram_bits    = 12,
  7. };
第二行: fifo_mode根据当前CPU的型号被设置为了5.这是体系结构相关的部分.没得选择.

-------------------------------------------------------------------------------------------上一节的总结-----------------------------------------------------------------------------------------
这一节的主要内容是OMAP2430 driver部分的源代码分析.以及它是如何注册到musb core中去的.
看到如下形式的代码,想必作为驱动工程师的你会感到无比亲切

点击(此处)折叠或打开

  1. static int __init omap2430_init(void)
  2. {
  3.     return platform_driver_probe(&omap2430_driver, omap2430_probe);
  4. }
  5. subsys_initcall(omap2430_init);
这个初始化函数可是字字珠玑:
(1) omap2430_driver
需要注意的只有这个name域,它是与device中的name遥相呼应的.每这个根本匹配不到,最终走到一起.
pm域是关于power management的operation 函数.主要是suspend,resume相关的.

点击(此处)折叠或打开

  1. static struct platform_driver omap2430_driver = {
  2.     .remove        = __exit_p(omap2430_remove),
  3.     .driver        = {
  4.         .name    = "musb-omap2430",
  5.         .pm    = DEV_PM_OPS,
  6.     },
  7. };
(2) omap2430_probe

点击(此处)折叠或打开

  1. static int __init omap2430_probe(struct platform_device *pdev)
  2. {
  3.     struct musb_hdrc_platform_data    *pdata = pdev->dev.platform_data;
  4.     struct platform_device        *musb;
  5.     struct omap2430_glue        *glue;
  6.     struct clk            *clk;

  7.     int                ret = -ENOMEM;

  8.     glue = kzalloc(sizeof(*glue), GFP_KERNEL);
  9.     if (!glue) {
  10.         dev_err(&pdev->dev, "failed to allocate glue context\n");
  11.         goto err0;
  12.     }

  13.     musb = platform_device_alloc("musb-hdrc", pdev->id);
  14.     if (!musb) {
  15.         dev_err(&pdev->dev, "failed to allocate musb device\n");
  16.         goto err1;
  17.     }

  18.     dev_set_name(&pdev->dev, "musb-omap2430");
  19.     clk = clk_get(&pdev->dev, "ick");
  20.     if (IS_ERR(clk)) {
  21.         dev_err(&pdev->dev, "failed to get clock\n");
  22.         ret = PTR_ERR(clk);
  23.         goto err2;
  24.     }

  25.     ret = clk_enable(clk);
  26.     if (ret) {
  27.         dev_err(&pdev->dev, "failed to enable clock\n");
  28.         goto err3;
  29.     }

  30.     musb->dev.parent        = &pdev->dev;
  31.     musb->dev.dma_mask        = &omap2430_dmamask;
  32.     musb->dev.coherent_dma_mask    = omap2430_dmamask;

  33.     glue->dev            = &pdev->dev;
  34.     glue->musb            = musb;
  35.     glue->clk            = clk;

  36.     pdata->platform_ops        = &omap2430_ops;

  37.     platform_set_drvdata(pdev, glue);

  38.     ret = platform_device_add_resources(musb, pdev->resource,
  39.             pdev->num_resources);
  40.     if (ret) {
  41.         dev_err(&pdev->dev, "failed to add resources\n");
  42.         goto err4;
  43.     }

  44.     ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
  45.     if (ret) {
  46.         dev_err(&pdev->dev, "failed to add platform_data\n");
  47.         goto err4;
  48.     }

  49.     ret = platform_device_add(musb);
  50.     if (ret) {
  51.         dev_err(&pdev->dev, "failed to register musb device\n");
  52.         goto err4;
  53.     }

  54.     return 0;

  55. err4:
  56.     clk_disable(clk);

  57. err3:
  58.     clk_put(clk);

  59. err2:
  60.     platform_device_put(musb);

  61. err1:
  62.     kfree(glue);

  63. err0:
  64.     return ret;
  65. }
line 4 & line 5是两个极为重要的变量.
GLUE相当于是上一节中对device的再包装.
下图给出了probe的初始化流程



首先probe创建了GLUE,并且初始化了GLUE的各个成员变量.line:40, 41, 42
其次创建了新的device.device name 是:musb-hdrc,这个device和pdev(musb-omap2430 )有着极为紧密的联系.
(1) line 16:创建的时候,第二个参数就是根据pdev->id
(2) musb->dev->parent域则是直接指向pdev
(3) resources 也是直接从pdev获取
(4) data 也是直接从pdev获取
还有一些其它的初始化工作,就不细究了.譬如:
line 46:设置drvdata的域为GLUE.
line 44:设置 omap2430_ops
从图里就可以清晰地看到,最后真正向上提供的是musb这么个设备.这是一层抽象.这里上层是指musb core.下一节我们会讨论musb core.
这里提一下这里的omap2430_ops.这些我们暂时不拎出来讨论,在后面遇到了我们再详细展开.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值