提示:对您有帮助的话,希望三连支持一下,感谢啦

文章目录

  • 前言
  • 一、硬件是如何触发切换的?
  • 二、软件是如何切换的?
  • 三、功能的实现及一些问题
    • 问题一:如何设置开机默认的状态
    • 问题二:如何去掉原有的检测
    • 问题三:如何添加节点
  • 总结

前言

平台: rk3288 ,有USB2.0 OTG控制器* 1,USB2.0HOST* 1,EHCI*1(网上说也是USB2.0,具体区别不明)
项目需求:硬件上没有做 otg 模式切换的设计(host模式、device模式),
需要软件上来做软切换的设计。
一般的 otg 接口都是做硬件触发切换的,要想实现软切换,
首先要知道硬件原来是如何切换的,屏蔽掉硬件原来的切换检测代码,
再加上一个软切换的接口,思路明确,问题易解。

一、硬件是如何触发切换的?

otg 是使用DWC2同时实现HOST和DEVICE功能
控制器上引出5个脚,OTG_DM|PM,OTG_ID,OTG_VBUS,OTG_EXTR,另一个GPIOX
OTG_EXTR:43.2ohm到地,调节电阻可调节USB信号质量,不同芯片阻值不同
GPIOX:用于控制是否输出USB向外5V
OTG_VBUS:输入信号!别被名字骗了,用于USB DEVICE检测VBUS电平,连PC约为3V,无为0V
OTG_ID:输入信号,用于识别外接设备为模式(host,dev),默认上拉处于Dev,如果控制器进入HOST
文档描述:DWC2是通过检测 OTG_ID 脚上的电平来切换模式的,
OTG_ID 脚电平变化触发控制器的ID脚中断,然后由软件来切换模式。
由这个描述,可以认为之前修改思路是可以的。

二、软件是如何切换的?

rk3288的SDK中提供了两套驱动:dwc2,dwc_otg_310;用其一即可
这里使用的是dwc2驱动,找到如下函数:

irqreturn_t dwc2_handle_common_intr(int irq, void *dev)
{struct dwc2_hsotg *hsotg = dev;u32 gintsts;irqreturn_t retval = IRQ_NONE;spin_lock(&hsotg->lock);if (!dwc2_is_controller_alive(hsotg)) {dev_warn(hsotg->dev, "Controller is dead\n");goto out;}gintsts = dwc2_read_common_intr(hsotg);if (gintsts & ~GINTSTS_PRTINT)retval = IRQ_HANDLED;if (gintsts & GINTSTS_MODEMIS)dwc2_handle_mode_mismatch_intr(hsotg);if (gintsts & GINTSTS_OTGINT)dwc2_handle_otg_intr(hsotg);if (gintsts & GINTSTS_CONIDSTSCHNG)dwc2_handle_conn_id_status_change_intr(hsotg);if (gintsts & GINTSTS_DISCONNINT)dwc2_handle_disconnect_intr(hsotg);......
}

如代码所示,dwc给到中断后,会触发以上中断处理函数,
函数根据寄存器值来判断是何种中断,并进行相应操作,
不难看出如果ID电平变化,应该触发的是 dwc2_handle_conn_id_status_change_intr

static void dwc2_handle_conn_id_status_change_intr(struct dwc2_hsotg *hsotg)
{u32 gintmsk;/* Clear interrupt */dwc2_writel(GINTSTS_CONIDSTSCHNG, hsotg->regs + GINTSTS);/* Need to disable SOF interrupt immediately */gintmsk = dwc2_readl(hsotg->regs + GINTMSK);gintmsk &= ~GINTSTS_SOF;dwc2_writel(gintmsk, hsotg->regs + GINTMSK);dev_dbg(hsotg->dev, " ++Connector ID Status Change Interrupt++  (%s)\n",dwc2_is_host_mode(hsotg) ? "Host" : "Device");/** Need to schedule a work, as there are possible DELAY function calls.* Release lock before scheduling workq as it holds spinlock during* scheduling.*/if (hsotg->wq_otg) {spin_unlock(&hsotg->lock);queue_work(hsotg->wq_otg, &hsotg->wf_otg);spin_lock(&hsotg->lock);}
}

好像没看到具体的切换操作,最后面跑了一个work,来看下这个work

INIT_WORK(&hsotg->wf_otg, dwc2_conn_id_status_change);
static void dwc2_conn_id_status_change(struct work_struct *work)
{struct dwc2_hsotg *hsotg = container_of(work, struct dwc2_hsotg,wf_otg);u32 count = 0;u32 gotgctl;unsigned long flags;dev_dbg(hsotg->dev, "%s()\n", __func__);if (!hsotg->ll_phy_enabled && dwc2_is_host_mode(hsotg))dwc2_lowlevel_phy_enable(hsotg);gotgctl = dwc2_readl(hsotg->regs + GOTGCTL);dev_dbg(hsotg->dev, "gotgctl=%0x\n", gotgctl);dev_dbg(hsotg->dev, "gotgctl.b.conidsts=%d\n",!!(gotgctl & GOTGCTL_CONID_B));/* B-Device connector (Device Mode) */if (gotgctl & GOTGCTL_CONID_B) {dwc2_vbus_supply_exit(hsotg);/* Wait for switch to device mode */dev_dbg(hsotg->dev, "connId B\n");......} else {host:/* A-Device connector (Host Mode) */dev_dbg(hsotg->dev, "connId A\n");......}
}

看这注释,没错就是这里了,嘻嘻嘻。

三、功能的实现及一些问题

问题一:如何设置开机默认的状态

项目中OTG_ID明明是下拉的,但是开机后却发现是device,具体原因未明,在初始化时可做一下处理

static int dwc2_driver_probe(struct platform_device *dev)
{...if (hsotg->dr_mode != USB_DR_MODE_HOST) {retval = dwc2_gadget_init(hsotg, hsotg->irq);if (retval)goto error;hsotg->gadget_enabled = 1;}if (hsotg->dr_mode != USB_DR_MODE_PERIPHERAL) {retval = dwc2_hcd_init(hsotg, hsotg->irq);if (retval) {if (hsotg->gadget_enabled)dwc2_hsotg_remove(hsotg);goto error;}hsotg->hcd_enabled = 1;}
// addif (hsotg->dr_mode == USB_DR_MODE_OTG) {hsotg->dr_mode = USB_DR_MODE_HOST;dwc2_force_dr_mode(hsotg);}
// add end...
}

问题二:如何去掉原有的检测

去掉软件上对 id 切换的检测,方法:注释掉比较是否是 id 切换 if 语句。

问题三:如何添加节点

接口就做一个store就可以了,把 dwc2_conn_id_status_change 代码搬过去稍作修改即可。

总结

需要某功能前,应该仔细阅读一下源码,有没有提供相应功能,很多时候都是有相应接口的,
即便没有,源码中也大可能会有同功能的代码段,可以借鉴。

对您有帮助的话,点赞、收藏、关注、三连一波啦,感谢啦

rk 平台实现 otg 软切换相关推荐

  1. rk平台vr主板项目开发总结

    rk平台vr主板项目开发总结. 产品的形态: 需要配合标准的HDMI接口或usb dp接口的头显设备 需要对应的Android AR core开发的VR 应用程序,游戏等. 主要的功能模块: 基本的A ...

  2. 软切换、硬切换,垂直切换、水平切换

    1.软切换 (1)软切换是"先切换,后断开",移动节点只有在取得了与新基站的链接之后,才会中断与原基站的联系,因此在切换过程中没有中断,不会影响通话质量: (2)软切换由于是在频率 ...

  3. http 升级 https 影响原来的链接吗_360站长平台自动收录JS切换为https

    最近360搜索官方对外发布公告,原来的360站长平台自动收录JS已经切换为 https 协议,为了避免站点劫持以后不在提供 http 版本,为了不对网站造成影响,各位站长需及时替换!以下是360搜索官 ...

  4. linux 渲染程序图层管理,Linux驱动多图层开发--lcdc/framebuffer的注册(RK平台)

    目录 一.引言 Android图形系统系统篇之HWC的介绍 二.源码分析 ------>framebuffer框架 ------>2.RK平台下多图层代码分析 三.多图层的硬件lcdc支持 ...

  5. 记一次rk平台热点打开流程追踪记录

    记一次rk平台热点打开流程追踪记录 问题描述 rk平台偶现热点打开失败,错误日志如下: I/android.hardware.wifi@1.0-service: Starting legacy HAL ...

  6. cywdhd在RK平台的适配

    一.平台自带驱动 一般rk sdk在kernel4.4.194版本以上,都有适配了cypress的WiFi驱动cywdhd.现在适配到的大多数为cyw43438,cyw43455.cypress的驱动 ...

  7. 【软切换】WCDMA软切换技术的仿真

    1.软件版本 matlab2013b 2.本算法理论知识 切换是为保证移动用户通信的连续性,将用户当前的通信链路转移到其它小区的过程.切换是移动通信系统必须具备的最基本功能,也是移动通信系统中极为复杂 ...

  8. RK平台--EVS模块: (二)EVS框架介绍

    下面来介绍一下EVS的框架部分,具体工作目录可以查看以下文章 RK平台--EVS模块:(一)概述 Google EVS组件框图 EVS 应用 可作为参考实现的 C++ EVS 示例应用 (/packa ...

  9. RK平台--EVS模块: (一)概述

    最近在做车机camera相关的工作,由于手头上没有车载soc的板子,想着用RK3399实现car的EVS功能来熟悉一下android的Automotive 服务. 平台: 硬件soc--RK3399 ...

最新文章

  1. Apache HTTP Server搭建虚拟主机
  2. 开灯问题 简单模拟法
  3. Ognl标签常用例子 只能在Struts2中使用
  4. 关于Webstrom连接github的配置问题。
  5. python / 内置的数据结构概述
  6. 最详细的vue-cli工具构建vue项目教程
  7. 静态成员变量和静态成员函数(static)
  8. 【数据结构与算法】【算法思想】Dijkstra算法
  9. 持久代是方法区还是堆中的?
  10. 合成艺术字二 :使用的透明类以及所用的颜色选择器JS(完整事列源码)
  11. android intent enum,enum类型被intent所携带时需要注意的地方
  12. merge卷积和bn层的原理
  13. 蓝桥杯2019年第十届C/C++省赛A组第二题-数列求值
  14. css3-伪元素与伪类
  15. 程序猿的键盘侠养成:macOS 常用快捷键分享
  16. 【空间分析】7 叠置分析和缓冲区分析
  17. 2023年最新谷歌Google帐号Gmail邮箱账号怎么注册成功的方法与教程?
  18. 深入理解RunLoop
  19. mysql 过滤emoji表情_MySQL中emoji表情过滤
  20. JQuery动态生成Table表格

热门文章

  1. Android中播放本地SD卡中歌曲需要的添加的权限
  2. PostgreSQL扫描方法综述
  3. 托福经验分享:20天从93分考到105分
  4. ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13新特性大全
  5. Linux上安装编译lzo报错:Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run 已解决
  6. Spring Cloud Hystrix 服务容错保护
  7. Java项目:JSP中华传统美食网站平台管理系统
  8. 图像恢复(加噪与去噪)
  9. 【了解结构体与指针、数组、函数、字符串之间的关系】(学习笔记14--结构体)
  10. 华为机试—手机号码验证