mtk平台 mt_usb设备以及otg初始过程

本文详细介绍了MTK平台中USB设备的初始化过程,包括mt_usb驱动的注册、mt_usb_device的创建与注册,以及OTG设备的初始化与中断处理。在设备启动后,解析设备树并调用相应函数进行初始化,如设置电源、中断处理等。重点讨论了mt_usb_probe和mt_usb_dts_probe函数的作用,以及如何通过musb_platform_ops调用mt_usb_init等函数完成USB控制器的初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注册mt_usb驱动

kernel-3.18/drivers/misc/mediatek/usb20/mt6735/usb20.c

static int __init usb20_init(void)
{

        ......

platform_driver_register(&mt_usb_driver);                        //注册mt_usb驱动
return platform_driver_register(&mt_usb_dts_driver);       //根据设备节点,注册mt_usb设备

}

mt_usb_driver定义如下

static struct platform_driver mt_usb_driver = {
.remove = mt_usb_remove,
.probe = mt_usb_probe,
.driver = {
  .name = "mt_usb",
  },

};

对应的platform_device如下

static struct platform_device mt_usb_device = {
.name = "mt_usb",
.id = -1,

};

mt_usb_probe负责初始化mt_usb设备,mt_usb_probe在mt_usb设备注册时会通过设备模型被调用


mt_usb设备在哪里注册

在usb20_init函数中mt_usb驱动注册之后,紧接着又注册了mt_usb_dts驱动

static struct platform_driver mt_usb_dts_driver = {
.remove = mt_usb_dts_remove,
.probe = mt_usb_dts_probe,
.driver = {
  .name = "mt_dts_usb",
#ifdef CONFIG_OF
  .of_match_table = apusb_of_ids,
#endif
  },

};

当系统启动之后,解析设备树,当满足apusb_of_ids时候就会调用mt_usb_dts_probe函数

static int mt_usb_dts_probe(struct platform_device *pdev)

{

        ......

mt_usb_device.dev.of_node = pdev->dev.of_node;

retval = platform_device_register(&mt_usb_device); 

        ......

}

mt_usb_dts_probe中注册了mt_usb设备

#ifdef CONFIG_OF
static const struct of_device_id apusb_of_ids[] = {
{.compatible = "mediatek,mt6735-usb20",},
{},
};


static struct platform_device mt_usb_device = {
.name = "mt_usb",
.id = -1,

};

#endif

触发mt_usb_dts_probe函数被调用的设备节点如下

                usb0:usb20@11200000 {
                        compatible = "mediatek,mt6735-usb20";
                        cell-index = <0>;
                        reg = <0x11200000 0x10000>,
                                <0x11210000 0x10000>;
                        interrupts = <0 72 0x8>;
                        mode = <2>;
                        multipoint = <1>;
                        dyn_fifo = <1>;
                        soft_con = <1>;
                        dma = <1>;
                        num_eps = <16>;
                        dma_channels = <8>;
                        clocks = <&perisys PERI_USB0>;
                        clock-names = "usb0";
                        VUSB33-supply = <&mt_pmic_vusb33_ldo_reg>;
                        iddig_gpio = <0 1>;
                        drvvbus_gpio = <83 2>;

                };

初始化mt_usb设备

mt_usb_dts_probe函数中调用platform_device_register(&mt_usb_device); 根据Linux设备模型,此处会match到mt_usb_driver,调用mt_usb_probe函数

static int mt_usb_probe(struct platform_device *pdev)

{

        musb_hdrc_platform_data有三种角色[MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG]

struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
struct platform_device *musb;
struct mt_usb_glue *glue;
#ifdef CONFIG_OF
struct musb_hdrc_config *config;
struct device_node *np = pdev->dev.of_node;

#endif

        ......

musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
if (!musb) {
dev_err(&pdev->dev, "failed to allocate musb device\n");
goto err1;

}

        //初始化musb和pdata

        pdata->config = config;

musb->dev.parent = &pdev->dev;
musb->dev.dma_mask = &mt_usb_dmamask;

musb->dev.coherent_dma_mask = mt_usb_dmamask;

        ......

pdata->platform_ops = &mt_usb_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 err2;
}


ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
if (ret) {
dev_err(&pdev->dev, "failed to add platform_data\n");
goto err2;
}


ret = platform_device_add(musb);

        //创建各种节点

}


sta

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值