USB HOST和device切换原理--基于imx8qm

2024-06-17 07:32

本文主要是介绍USB HOST和device切换原理--基于imx8qm,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

USB_HOST_GADGET_SWITCH

相关文件

  • kernel_imx\arch\arm64\boot\dts\freescale\fsl-imx8qm-mek-domu.dts: 如果开机固定为host模式,只需修改dr_mode = “host”;如果需要OTG功能切换,底层是根据ID PIN引脚的高低电平进行判断(host device),软件上通过otgsc register判断。
    &usbotg1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_usbotg1>;srp-disable;hnp-disable;adp-disable;power-polarity-active-high;disable-over-current;dr_mode = "host";status = "okay";
    };
    
  • kernel_imx/drivers/usb/common/common.c
    --------------------------------------------------
    platform_device->ci_get_platdata(dev, platdata);->usb_get_dr_mode(dev);
    --------------------------------------------------enum usb_dr_mode usb_get_dr_mode(struct device *dev)
    {               const char *dr_mode;int err;err = device_property_read_string(dev, "dr_mode", &dr_mode);if (err < 0)return USB_DR_MODE_UNKNOWN;return usb_get_dr_mode_from_string(dr_mode);
    }       
    EXPORT_SYMBOL_GPL(usb_get_dr_mode); 
  • kernel_imx\drivers\usb\chipidea\core.c: 由于我们ID脚悬空,则不适用OTG功能,在DTS中直接设置成host,则进入else判断分支。
    --------------------------------------------------
    ci_hdrc_probe->-> ci->role = ci_get_role(ci);
    --------------------------------------------------    
    static enum ci_role ci_get_role(struct ci_hdrc *ci)
    {if (ci->roles[CI_ROLE_HOST] && ci->roles[CI_ROLE_GADGET]) {if (ci->is_otg) {hw_write_otgsc(ci, OTGSC_IDIE, OTGSC_IDIE);return ci_otg_role(ci);} else {/** If the controller is not OTG capable, but support* role switch, the defalt role is gadget, and the* user can switch it through debugfs.*/return CI_ROLE_GADGET;}} else {return ci->roles[CI_ROLE_HOST]? CI_ROLE_HOST: CI_ROLE_GADGET;}
    }
    
  • kernel_imx/drivers/usb/chipidea/otg.c: 此为OTG功能时读取OTGSC寄存器进行判断。
    /**             * ci_otg_role - pick role based on ID pin state* @ci: the controller  */             
    enum ci_role ci_otg_role(struct ci_hdrc *ci)
    {enum ci_role role = hw_read_otgsc(ci, OTGSC_ID)? CI_ROLE_GADGET: CI_ROLE_HOST;return role;
    }  /*** hw_read_otgsc returns otgsc register bits value.* @mask: bitfield mask*/
    u32 hw_read_otgsc(struct ci_hdrc *ci, u32 mask)
    {struct ci_hdrc_cable *cable;u32 val = hw_read(ci, OP_OTGSC, mask);/** If using extcon framework for VBUS and/or ID signal* detection overwrite OTGSC register value*/cable = &ci->platdata->vbus_extcon;if (!IS_ERR(cable->edev)) {if (cable->changed)val |= OTGSC_BSVIS;elseval &= ~OTGSC_BSVIS;if (cable->connected)val |= OTGSC_BSV;elseval &= ~OTGSC_BSV;if (cable->enabled)val |= OTGSC_BSVIE;elseval &= ~OTGSC_BSVIE;}cable = &ci->platdata->id_extcon;if (!IS_ERR(cable->edev)) {if (cable->changed)val |= OTGSC_IDIS;elseval &= ~OTGSC_IDIS;if (cable->connected)val &= ~OTGSC_ID; /* host */elseval |= OTGSC_ID; /* device */if (cable->enabled)val |= OTGSC_IDIE;elseval &= ~OTGSC_IDIE;}return val & mask;
    }
    

这篇关于USB HOST和device切换原理--基于imx8qm的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068822

相关文章

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

Spring Boot实现多数据源连接和切换的解决方案

《SpringBoot实现多数据源连接和切换的解决方案》文章介绍了在SpringBoot中实现多数据源连接和切换的几种方案,并详细描述了一个使用AbstractRoutingDataSource的实... 目录前言一、多数据源配置与切换方案二、实现步骤总结前言在 Spring Boot 中实现多数据源连接

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于