SPRD的MUSB驱动(2)sp7862

1 篇文章 0 订阅

https://github.com/trywent/note/blob/f13af8abfdfe1faa90ff9e03a7a51403de1e36dd/device/sp7862/kernel_usbhttps://github.com/trywent/note/blob/f13af8abfdfe1faa90ff9e03a7a51403de1e36dd/device/sp7862/kernel_usb

/*********************************************************
 ums510 模拟侧

 sc27xx模拟部分接口,typec。监听连接断开,发送事件给musb

*/
usb: usb@5fff0000 {
 compatible = "sprd,sharkl5-musb", "sprd,sharkl5pro-musb";
 usb-phy = <&hsphy>;
}@sharkl5Pro.dtsi


extcon_gpio: extcon-gpio {
 compatible = "linux,extcon-usb-gpio";
 vbus-gpio = <&pmic_eic 0 GPIO_ACTIVE_HIGH>;
}

&hsphy {
 vdd-supply = <&vddusb33>;
 extcon = <&extcon_gpio>;
}@ums512-1h10.dts

//驱动初始
sc27xx_typec_init-->platform_driver_register(&sc27xx_typec_driver)
sc27xx_typec_driver = {
	.probe = sc27xx_typec_probe,
	.driver = {
		.name = "sc27xx-typec",
		.of_match_table = typec_sprd_match,
	},
}@c27xx_typec.c

//phy设备的父设备是usb
sc27xx_typec_probe(struct platform_device *pdev){
- struct sc27xx_typec *sc = devm_kzalloc(&pdev->dev, sizeof(*sc), GFP_KERNEL)
  //创建struct extcon_dev 并注册.usb设备通过父设备节点获取这个设备
- sc->edev = devm_extcon_dev_allocate(&pdev->dev, sc27xx_typec_cable)	
- devm_extcon_dev_register(&pdev->dev, sc->edev)
- platform_set_drvdata(pdev, sc)
}@sc27xx_typec.c


//中断处理
sc27xx_typec_interrupt(int irq, void *data){
  //读取状态
- struct sc27xx_typec *sc = data
- regmap_read(sc->regmap, sc->base + SC27XX_INT_MASK, &event)
- regmap_read(sc->regmap, sc->base + SC27XX_STATUS, &sc->state)
  //连接
- sc27xx_typec_connect(sc, sc->state)
  //断开
- sc27xx_typec_disconnect(sc, sc->state)
}@sc27xx_typec.c


//节点
/sys/class/typec/


bsp/kernel/kernel4.14/drivers/usb/typec/sc27xx_typec.c
/*********************************************************
 phy硬件 管理供电,usb使能,充电
*/
sprd_hsphy_driver_init-->platform_driver_register(&sprd_hsphy_driver)
platform_driver sprd_hsphy_driver = {
	.probe = sprd_hsphy_probe,
	.driver = {
		.name = "sprd-hsphy",
		.of_match_table = sprd_hsphy_match,
	},
}@phy-sprd-sharkl5.c

sprd_hsphy_probe(struct platform_device *pdev){
- struct sprd_hsphy *phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL)
- struct usb_otg *otg = devm_kzalloc(&pdev->dev, sizeof(*otg), GFP_KERNEL)
- phy->phy.dev = dev
- platform_set_drvdata(pdev, phy)
- usb_add_phy_dev(&phy->phy)
}@phy-sprd-sharkl5.c


bsp/kernel/kernel4.14/drivers/usb/phy/phy-sprd-sharkl5.c

/*********************************************************
 ap数字侧 musb控制器
*/
&usb {
	extcon = <&extcon_gpio>, <&pmic_typec>;
	//vbus-supply = <&vddvbus>;
}
@ums512-1h10.dts

musb_sprd_driver_init-->platform_driver_register(&musb_sprd_driver)
-->musb_sprd_probe(struct platform_device *pdev){
  //和硬件的连接
- struct sprd_glue *glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL)
- glue->xceiv = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0)
  //usb host设备
- struct platform_device_info pinfo
- pdata.platform_ops = &sprd_musb_ops
- pinfo.name = "musb-hdrc"	//创建musb设备,匹配驱动musb_driver
- pinfo.data = &pdata
- glue->musb = platform_device_register_full(&pinfo)
  //vbus/id脚控制
- if (of_property_read_bool(node, "extcon")) {
	- glue->edev = extcon_get_edev_by_phandle(glue->dev, 0)		//vbus通知
	- glue->vbus_nb.notifier_call = musb_sprd_vbus_notifier
	- extcon_register_notifier(glue->edev, EXTCON_USB,&glue->vbus_nb)
	- glue->id_edev = extcon_get_edev_by_phandle(glue->dev, 1)	//id脚通知
	- glue->id_nb.notifier_call = musb_sprd_id_notifier
	- extcon_register_notifier(glue->id_edev,EXTCON_USB_HOST,&glue->id_nb)
	}
  //获取连接状态
- musb_sprd_detect_cable(glue)
}@musb_sprd.c


bsp/kernel/kernel4.14/drivers/usb/musb/musb_sprd.c
/*********************************************************
 musb驱动 创建hcd

*/

module_platform_driver(musb_driver)-->
platform_driver musb_driver = {
	.driver = {
		.name		= (char *)musb_driver_name,//MUSB_DRIVER_NAME "musb-hdrc"
		.bus		= &platform_bus_type,
	},
	.probe		= musb_probe,
}@musb_core.c

musb_probe(struct platform_device *pdev){
- struct device	*dev = &pdev->dev
- int		irq = platform_get_irq_byname(pdev, "mc")
- base = devm_ioremap_resource(dev, iomem)
- musb_init_controller(dev, irq, base){
	- struct musb	*musb = allocate_instance(dev, plat->config, ctrl){
		- struct musb *musb = devm_kzalloc(dev, sizeof(*musb), GFP_KERNEL)
		- INIT_LIST_HEAD(&musb->control)
		- musb_host_alloc(musb)-->usb_create_hcd(&musb_hc_driver, dev, dev_name(dev))@musb_host.c	//创建hcd
		}
	- musb_platform_init(musb)
	}
}@musb_core.c



bsp/kernel/kernel4.14/drivers/usb/musb/musb_host.c
bsp/kernel/kernel4.14/drivers/usb/musb/musb_core.c

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值