基于linux 4.9内核

源码:

drivers/usb/dw3/core.c

主要完成DesignWare USB3.0 Controller phy初始化,以及模式选择。

static struct platform_driver dwc3_driver = {.probe        = dwc3_probe,.remove        = dwc3_remove,.driver        = {.name    = "dwc3",.of_match_table    = of_match_ptr(of_dwc3_match),.acpi_match_table = ACPI_PTR(dwc3_acpi_match),.pm    = &dwc3_dev_pm_ops,},
};static int dwc3_probe(struct platform_device *pdev)
{struct device      *dev = &pdev->dev;struct resource       *res;struct dwc3        *dwc;
。。。res = platform_get_resource(pdev, IORESOURCE_MEM, 0); //获取资源if (!res) {dev_err(dev, "missing memory resource\n");return -ENODEV;}dwc->xhci_resources[0].start = res->start;dwc->xhci_resources[0].end = dwc->xhci_resources[0].start +DWC3_XHCI_REGS_END;dwc->xhci_resources[0].flags = res->flags;dwc->xhci_resources[0].name = res->name;res->start += DWC3_GLOBALS_REGS_START;/** Request memory region but exclude xHCI regs,* since it will be requested by the xhci-plat driver.*/regs = devm_ioremap_resource(dev, res); //获取内存空间dwc->regs   = regs;dwc->regs_size   = resource_size(res);/* default to highest possible threshold */lpm_nyet_threshold = 0xf;/* default to -3.5dB de-emphasis */tx_de_emphasis = 1;/** default to assert utmi_sleep_n and use maximum allowed HIRD* threshold value of 0b1100*/hird_threshold = 12;
//获取默认值,有些是从dts中读取的dwc->maximum_speed = usb_get_maximum_speed(dev);dwc->dr_mode = usb_get_dr_mode(dev);dwc->hsphy_mode = of_usb_get_phy_mode(dev->of_node);dwc->has_lpm_erratum = device_property_read_bool(dev,"snps,has-lpm-erratum");device_property_read_u8(dev, "snps,lpm-nyet-threshold",&lpm_nyet_threshold);dwc->is_utmi_l1_suspend = device_property_read_bool(dev,"snps,is-utmi-l1-suspend");device_property_read_u8(dev, "snps,hird-threshold",&hird_threshold);dwc->usb3_lpm_capable = device_property_read_bool(dev,"snps,usb3_lpm_capable");dwc->disable_scramble_quirk = device_property_read_bool(dev,"snps,disable_scramble_quirk");dwc->u2exit_lfps_quirk = device_property_read_bool(dev,"snps,u2exit_lfps_quirk");dwc->u2ss_inp3_quirk = device_property_read_bool(dev,"snps,u2ss_inp3_quirk");dwc->req_p1p2p3_quirk = device_property_read_bool(dev,"snps,req_p1p2p3_quirk");dwc->del_p1p2p3_quirk = device_property_read_bool(dev,"snps,del_p1p2p3_quirk");dwc->del_phy_power_chg_quirk = device_property_read_bool(dev,"snps,del_phy_power_chg_quirk");dwc->lfps_filter_quirk = device_property_read_bool(dev,"snps,lfps_filter_quirk");dwc->rx_detect_poll_quirk = device_property_read_bool(dev,"snps,rx_detect_poll_quirk");dwc->dis_u3_susphy_quirk = device_property_read_bool(dev,"snps,dis_u3_susphy_quirk");dwc->dis_u2_susphy_quirk = device_property_read_bool(dev,"snps,dis_u2_susphy_quirk");dwc->dis_enblslpm_quirk = device_property_read_bool(dev,"snps,dis_enblslpm_quirk");dwc->dis_rxdet_inp3_quirk = device_property_read_bool(dev,"snps,dis_rxdet_inp3_quirk");dwc->dis_u2_freeclk_exists_quirk = device_property_read_bool(dev,"snps,dis-u2-freeclk-exists-quirk");dwc->dis_del_phy_power_chg_quirk = device_property_read_bool(dev,"snps,dis-del-phy-power-chg-quirk");dwc->tx_de_emphasis_quirk = device_property_read_bool(dev,"snps,tx_de_emphasis_quirk");device_property_read_u8(dev, "snps,tx_de_emphasis",&tx_de_emphasis);device_property_read_string(dev, "snps,hsphy_interface",&dwc->hsphy_interface);device_property_read_u32(dev, "snps,quirk-frame-length-adjustment",&dwc->fladj);dwc->lpm_nyet_threshold = lpm_nyet_threshold;dwc->tx_de_emphasis = tx_de_emphasis;dwc->hird_threshold = hird_threshold| (dwc->is_utmi_l1_suspend << 4);platform_set_drvdata(pdev, dwc);dwc3_cache_hwparams(dwc);ret = dwc3_core_get_phy(dwc);pm_runtime_set_active(dev);pm_runtime_use_autosuspend(dev);pm_runtime_set_autosuspend_delay(dev, DWC3_DEFAULT_AUTOSUSPEND_DELAY);pm_runtime_enable(dev);ret = pm_runtime_get_sync(dev);pm_runtime_forbid(dev);ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE); //分配event buf空间
//获取usb mode(dr_mode),otg、host或者deviceret = dwc3_get_dr_mode(dwc);ret = dwc3_alloc_scratch_buffers(dwc); //分配暂存缓冲区ret = dwc3_core_init(dwc); //初始化PHY,获取模式。。。ret = dwc3_core_init_mode(dwc); //根据mode,分别初始化gadget,host和otgdwc3_debugfs_init(dwc);pm_runtime_put(dev);。。。。。。return ret;
}

我们看看dwc3_core_init@core.c做了什么?

static int dwc3_core_init(struct dwc3 *dwc)
{u32            hwparams4 = dwc->hwparams.hwparams4;u32         reg;int         ret;。。。。。。/* issue device SoftReset too *///软复位ret = dwc3_soft_reset(dwc);//初始化phy后如果是device设备再次软复位,host设置直接返回ret = dwc3_core_soft_reset(dwc);ret = dwc3_phy_setup(dwc); //PHY接口初始化。。。dwc3_core_num_eps(dwc); //获取in,out端点数ret = dwc3_setup_scratch_buffers(dwc);if (ret)goto err1;/* Adjust Frame Length */dwc3_frame_length_adjustment(dwc);usb_phy_set_suspend(dwc->usb2_phy, 0);usb_phy_set_suspend(dwc->usb3_phy, 0);ret = phy_power_on(dwc->usb2_generic_phy);ret = phy_power_on(dwc->usb3_generic_phy); //phy 上电ret = dwc3_event_buffers_setup(dwc);if (ret) {dev_err(dwc->dev, "failed to setup event buffers\n");goto err4;}switch (dwc->dr_mode) { //设置dr模式case USB_DR_MODE_PERIPHERAL:dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE);break;case USB_DR_MODE_HOST:dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_HOST);break;case USB_DR_MODE_OTG:dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);break;default:dev_warn(dwc->dev, "Unsupported mode %d\n", dwc->dr_mode);break;}。。。return ret;
}

dwc3_core_init_mode分别根据不同的模式,调用不同的初始化函数:

static int dwc3_core_init_mode(struct dwc3 *dwc)
{struct device *dev = dwc->dev;int ret;switch (dwc->dr_mode) {case USB_DR_MODE_PERIPHERAL: //gadget模式ret = dwc3_gadget_init(dwc);break;case USB_DR_MODE_HOST: //主机模式ret = dwc3_host_init(dwc);break;case USB_DR_MODE_OTG: //otg模式ret = dwc3_host_init(dwc);ret = dwc3_gadget_init(dwc);break;}return 0;
}

linux dwc3 usb驱动分析相关推荐

  1. linux下usb驱动编写

    linux下usb驱动编写(内核2.4)--2.6与此接口有区别2006-09-15 14:57我们知道了在Linux下如何去使用一些最常见的USB设备.但对于做系统设计的程序员来说,这是远远不够的, ...

  2. Linux系统USB驱动目录,linux安装usb驱动命令

    有时我们会用到usb设备,这时我们就要学会如何在linux系统下安装usb驱动了.下面由学习啦小编为大家整理了linux安装usb驱动命令的相关知识,希望大家喜欢! linux安装usb驱动命令 安装 ...

  3. Linux下USB驱动框架分析【转】

    转自:http://blog.csdn.net/brucexu1978/article/details/17583407 版权声明:本文为博主原创文章,未经博主允许不得转载. http://www.c ...

  4. Linux下USB驱动框架分析

    http://www.cnblogs.com/general001/articles/2319552.html http://blog.csdn.net/uruita/article/details/ ...

  5. linux内核usb驱动框架,基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析

    基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析 发布时间:2014-07-18 16:47:31来源:红联作者:linux08071151 driver/usb/host/ ...

  6. linux下usb驱动配置文件,Linux环境下USB的原理、驱动和配置

    随着生活水平的提高,人们对USB设备的使用也越来越多,鉴于Linux在硬件配置上尚不能全部即插即用,因此关于Linux如何配置和使用,成为困扰我们的一大问题.本文引用地址:http://www.eep ...

  7. Linux PCI网卡驱动分析

    http://www.uplinux.com/shizi/wenxian/4429.html Linux网卡驱动分析 学习应该是一个先把问题简单化,在把问题复杂化的过程.一开始就着手处理复杂的问题,难 ...

  8. linux nand 驱动,Linux NAND FLASH驱动分析(一)

    最近一直在忙着工作上的事情,好久都没有更新博客了,发现最近思想是比较混乱的.学任何东西都坚持不下去,既然选择驱动开发这条路就要坚持下去. 之前分析了Linux块设备驱动,是以内存块来模拟的虚拟块设备. ...

  9. linux 网卡驱动分析,基于linux下网卡驱动分析及实现技术研究

    摘    要 Linux技术是当前计算机技术中最大的一个热点,在我国以及全世界得到了迅猛的发展,被广泛的应用于嵌入式系统.服务器.网络系统.安全等领域.从而使得掌握在 Linux环境下的开发技术,成为 ...

最新文章

  1. 系列文章--AJAX技术系列总结
  2. pandas使用groupby函数进行分组聚合并使用agg函数将每个分组特定变量对应的多个内容组合到一起输出(merging content within a specific column of g
  3. mysql使用命令提示符创建库表
  4. JQuery/JS select标签动态设置选中值、设置禁止选择 button按钮禁止点击 select获取选中值...
  5. Python学习笔记:匿名函数
  6. DNSChanger路由器DNS劫持木马 新版本正在攻击家庭及小企业路由器 企图推送广告...
  7. 《 .NET软件设计新思维》一书作者MSDN课程日程
  8. js-JavaScript常见的创建对象的几种方式
  9. oracle表增加序列字段,Oracle创建表和创建序列和修改,增加sql字段
  10. VMware Workstation macOS Unlocker 下载慢的解决办法
  11. MQTT5协议报文格式
  12. 松本行弘为什么开发Ruby
  13. 洛谷P2386放苹果
  14. Windows 2003 从Oracle 9201 update to 9208
  15. 如何成为羽毛球高手?你距离一个真正的羽毛球高手还有多远?
  16. 利用Python+OpenCV对图像加密/解密
  17. 谷歌浏览器占CPU非常高的解决办法
  18. 五点三次平滑+python实现
  19. 【老生谈算法】matlab实现匈牙利算法源码——匈牙利算法
  20. 无人机动力系统测试的必要性

热门文章

  1. 不敢相信,技术栈,居然被P站秒了
  2. xson 1.0.2 发布,新增byte[] buffer,支持XCO
  3. 基于stm32f10x(原子)的电容触摸实验的个人解读 (16)
  4. 水面无人艇局部危险避障算法研究 参考文献
  5. redis案例1--标签实现
  6. 一次手机木马的清除记录(手机刷机)
  7. 如果VxRail要发朋友圈
  8. 增值电信业务经营许可证在怎么申请 办理攻略在这里
  9. 深入浅出!二叉树详解,包含C语言代码
  10. 《大数据之路-阿里巴巴大数据实践》读书笔记