MUSB(4) --- OMAP2430 USB OTG Controller (Driver)
2013-12-17 15:42:18
分类: Android平台
在上一个章节中,我们分析了MUSB device部分的内容.这些其实是比较死板僵硬的.按照SPEC一步步来就行了.
1. resources
(1) 在CPU上的registers的物理地址
(2) DMA interrupt的信息
(3) Controller的interrupt信息
2. platform data
这是MUSB 特性相关的内容.
musb_plat->musb_config->
第二行: fifo_mode根据当前CPU的型号被设置为了5.这是体系结构相关的部分.没得选择.
-------------------------------------------------------------------------------------------上一节的总结-----------------------------------------------------------------------------------------
这一节的主要内容是OMAP2430 driver部分的源代码分析.以及它是如何注册到musb core中去的.
看到如下形式的代码,想必作为驱动工程师的你会感到无比亲切
这个初始化函数可是字字珠玑:
(1) omap2430_driver
需要注意的只有这个name域,它是与device中的name遥相呼应的.每这个根本匹配不到,最终走到一起.
pm域是关于power management的operation 函数.主要是suspend,resume相关的.
(2) omap2430_probe
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.这些我们暂时不拎出来讨论,在后面遇到了我们再详细展开.
1. resources
(1) 在CPU上的registers的物理地址
(2) DMA interrupt的信息
(3) Controller的interrupt信息
2. platform data
这是MUSB 特性相关的内容.
musb_plat->musb_config->
点击(此处)折叠或打开
- static struct musb_hdrc_config musb_config = {
- .fifo_mode = 4,
- .multipoint = 1,
- .dyn_fifo = 1,
- .num_eps = 16,
- .ram_bits = 12,
- };
-------------------------------------------------------------------------------------------上一节的总结-----------------------------------------------------------------------------------------
这一节的主要内容是OMAP2430 driver部分的源代码分析.以及它是如何注册到musb core中去的.
看到如下形式的代码,想必作为驱动工程师的你会感到无比亲切
点击(此处)折叠或打开
- static int __init omap2430_init(void)
- {
- return platform_driver_probe(&omap2430_driver, omap2430_probe);
- }
- subsys_initcall(omap2430_init);
(1) omap2430_driver
需要注意的只有这个name域,它是与device中的name遥相呼应的.每这个根本匹配不到,最终走到一起.
pm域是关于power management的operation 函数.主要是suspend,resume相关的.
点击(此处)折叠或打开
- static struct platform_driver omap2430_driver = {
- .remove = __exit_p(omap2430_remove),
- .driver = {
- .name = "musb-omap2430",
- .pm = DEV_PM_OPS,
- },
- };
点击(此处)折叠或打开
- static int __init omap2430_probe(struct platform_device *pdev)
- {
- struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
- struct platform_device *musb;
- struct omap2430_glue *glue;
- struct clk *clk;
-
- int ret = -ENOMEM;
-
- glue = kzalloc(sizeof(*glue), GFP_KERNEL);
- if (!glue) {
- dev_err(&pdev->dev, "failed to allocate glue context\n");
- goto err0;
- }
-
- musb = platform_device_alloc("musb-hdrc", pdev->id);
- if (!musb) {
- dev_err(&pdev->dev, "failed to allocate musb device\n");
- goto err1;
- }
-
- dev_set_name(&pdev->dev, "musb-omap2430");
- clk = clk_get(&pdev->dev, "ick");
- if (IS_ERR(clk)) {
- dev_err(&pdev->dev, "failed to get clock\n");
- ret = PTR_ERR(clk);
- goto err2;
- }
-
- ret = clk_enable(clk);
- if (ret) {
- dev_err(&pdev->dev, "failed to enable clock\n");
- goto err3;
- }
-
- musb->dev.parent = &pdev->dev;
- musb->dev.dma_mask = &omap2430_dmamask;
- musb->dev.coherent_dma_mask = omap2430_dmamask;
-
- glue->dev = &pdev->dev;
- glue->musb = musb;
- glue->clk = clk;
-
- pdata->platform_ops = &omap2430_ops;
-
- platform_set_drvdata(pdev, glue);
-
- ret = platform_device_add_resources(musb, pdev->resource,
- pdev->num_resources);
- if (ret) {
- dev_err(&pdev->dev, "failed to add resources\n");
- goto err4;
- }
-
- ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
- if (ret) {
- dev_err(&pdev->dev, "failed to add platform_data\n");
- goto err4;
- }
-
- ret = platform_device_add(musb);
- if (ret) {
- dev_err(&pdev->dev, "failed to register musb device\n");
- goto err4;
- }
-
- return 0;
-
- err4:
- clk_disable(clk);
-
- err3:
- clk_put(clk);
-
- err2:
- platform_device_put(musb);
-
- err1:
- kfree(glue);
-
- err0:
- return ret;
- }
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.这些我们暂时不拎出来讨论,在后面遇到了我们再详细展开.