ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32F407外挂USB3320实现高速USB OTG硬件设计全解析

STM32F407外挂USB3320实现高速USB OTG硬件设计全解析 做了这么多年嵌入式硬件USB一直是我心里最“玄学”的外设之一。尤其是把STM32F407跑成高速USB OTG480Mbps这件事网上教程不少可真正从头把原理图画对、把板子调通的人并不多。前阵子我一个项目必须在F407上跑高速USB OTG主控这边枚举一直失败软件翻了个底朝天也没找到问题最后拿示波器逐脚量才发现坑居然在原理图上一个特别不起眼的地方。这篇文章就把我这次从零搭建STM32F407 USB3320高速USB OTG的完整硬件过程写出来包括方案选型、ULPI接口原理、原理图设计要点、PCB布局布线的关键细节以及调试时的实测数据和踩坑记录。适合正在做USB高速设备、OTG双角色切换或者想把F407高速口真正用起来的朋友参考目标是让你一次把硬件做对不再靠“改版”来解决问题。1. 为什么STM32F407做高速USB还得外挂PHY1.1 内置OTG_FS和OTG_HS的本质区别很多人第一次接触F407的USB会被数据手册上两个USB外设搞晕一个是OTG_FS另一个是OTG_HS。这两个名字看着差不多实际能力天差地别。OTG_FS全称是USB On-The-Go Full-Speed内置了完整的PHY引脚直接引出到芯片外面你只需要在DP/DM上接几个电阻电容就能工作最高速率12Mbps。OTG_HS则是High-Speed控制器最高支持480Mbps但它内部只集成了数字逻辑和收发器的数字部分没有模拟PHY想让DP/DM上真的跑出480Mbps信号必须外接一颗ULPI接口的物理层芯片。这就是很多人踩的第一个误区我用的F407明明带USB_OTG_HS为什么连USB座子就能跑高速不行必须外挂PHY。F407的OTG_HS控制器对外提供的是ULPI接口这是一组8位并行数据线加4根控制信号线必须接到PHY芯片由PHY完成串行化、编解码、高速握手、阻抗匹配等模拟工作。换句话说F407只负责“想”真正“说”高速信号的是USB3320这颗PHY。注意F407的OTG_FS的全速模式是12MbpsOTG_HS即使工作在FS模式下也必须配外部PHY才能把DP/DM引出来。没有外挂PHY时OTG_HS的引脚是悬空的U盘、网卡之类的设备插上去不会有任何反应。1.2 选USB3320而不是其他PHY芯片的理由做USB高速PHY可选的芯片不少常见的有USB3300、USB3320、USB2417等Microchip原SMSC的这两颗用得最多。USB3300和USB3320都是ULPI接口主要区别在I/O电压USB3300支持1.8V/3.3VUSB3320是3.3V单电源和F407的IO电平天然匹配不需要电平转换硬件设计更省事。我选USB3320还有几个实际原因。一是这颗芯片被ST官方评估板采用过网上能找到大量参考设计出问题了好查资料。二是封装是QFN-32手工焊接虽然比普通贴片难一点但用热风枪加好的焊膏完全能处理打样回来自己焊没问题。三是它带完整的OTG支持芯片上有VBUS和ID引脚可以直接配合F407的OTG_HS做双角色切换这比用两颗芯片加外部切换开关的方案简单得多。价格方面USB3320批量采购大概几块钱一颗相比高速USB整体方案的复杂度这笔成本非常划算。还有一个容易被忽略的点USB3320的驱动能力、输入灵敏度和静电防护都经过大量产品验证比用分立三极管搭电平转换的方案可靠太多了。硬件设计最重要的是减少不确定性选一颗成熟、大厂、有大量参考设计的PHY本身就是规避风险的第一步。2. ULPI接口到底在传输什么2.1 从UTMI到ULPI的引脚压缩要理解USB3320怎么工作的得先知道它和单片机之间那几根线是干什么的。USB2.0高速PHY最早的标准接口叫UTMI这个接口要传输8位数据、时钟、收发控制、线态检测等信号加起来快20根线对单片机引脚压力很大。后来业界出了ULPI标准把接口压缩成12根线8根双向数据线D[7:0]加4根控制线CLK、DIR、STP、NXT。压缩的代价是协议变复杂了。8根数据线是分时复用的某个时刻它传输的是收发数据另一个时刻可能传输的是寄存器的读写数据甚至传输的是PHY状态信息。USB3320内部有个状态机负责做这种切换而F407的OTG_HS控制器内部也有对应的ULPI主控逻辑两边按固定的时序配合。这就是为什么硬件设计时CLK、DIR、STP、NXT四根线一根都不能错接错一根整个协议就全乱了表现出来就是枚举失败、设备识别不到看起来就像“玄学”。2.2 CLK、DIR、STP、NXT四条控制线的配合逻辑先看CLK。ULPI接口的时钟不是单片机提供的而是PHY自己产生的。USB3320使用24MHz外部晶振内部PLL倍频后从CLKOUT引脚输出60MHz时钟。这个60MHz同时用于ULPI总线的数据传输F407的OTG_HS控制器就是靠这个60MHz时钟来采样D[7:0]上的数据的。为什么是60MHz因为ULPI在8位模式下最高传输速率就是60MHz×8bit480Mbps正好对上USB高速速率。DIR是Direction方向指示由PHY输出给单片机。当PHY正在向单片机发送数据时DIR拉高当单片机可以向PHY发送数据时DIR拉低。STP是Stop由单片机输出给PHY表示停止当前传输。NXT是Next由PHY输出用于控制数据流的节拍类似握手信号。这四个信号和数据线配合的逻辑是这样的单片机想发数据时先等DIR变为低电平然后把数据放在D[7:0]上并拉高STP请求发送PHY在NXT上给出响应一个周期传一个字节。反过来PHY想发数据时先把DIR拉高单片机检测到DIR为高后在每个时钟上升沿采样D[7:0]上的数据。这套时序不需要软件逐位操作F407的硬件控制器全自动处理但硬件工程师必须明白它的存在——如果布线时让CLK走线过长、被干扰时序就会不稳定数据采样出错问题极其难查。提示ULPI总线上除了数据还会周期性地传输PHY状态寄存器的值比如VBUS是否有效、ID脚是高还是低、线态是J还是K。F407靠这些状态自动完成设备插入检测、角色切换、挂起唤醒等动作。所以不要小看这8根数据线USB3230并不是一个“透明”的转发器它本身是一个完整的协议引擎。3. 原理图设计的核心环节3.1 电源与时基电路24MHz晶振和那些去耦电容USB3320的电源引脚不少主供电VDD是3.3V另有模拟电源VDDIO和锁相环电源。硬件设计时所有电源引脚都要就近放100nF去耦电容这个没有商量余地。除此之外在主电源入口放一个2.2uF~10uF的钽电容或陶瓷电容给瞬态电流提供能量储备。高速PHY在发送数据时内部电路会在短时间内抽取较大电流如果电源阻抗过高DP/DM上的信号幅度就会抖动眼图质量变差设备能枚举但传输不稳定这比完全不通更难排查。晶振电路是另一个关键点。USB3320使用24MHz并联谐振晶振接在XI和XO引脚之间两个引脚各接一个负载电容到地。负载电容的取值要根据晶振规格计算常见的是12pF~18pF。我用的24MHz晶振CL是12pF实际焊了2个12pF电容实测起振正常。晶振要靠近芯片放置走线尽量短两个负载电容先到晶振的GND引脚再到地平面。晶振下方不要走其他信号线特别是ULPI数据线容易串扰。USB3320的时钟输出CLKOUT默认是60MHz直接用一根短线接到F407的PA5。如果想让CLKOUT输出24MHz或其他频率可以通过ULPI寄存器配置这点在调试时比较有用先用示波器确认CLKOUT频率如果完全不输出问题大概率在晶振或供电而不是单片机配置。3.2 RREF电阻、USB差分对、VBUS与ID检测原理图上有个最容易被忽略、但影响极大的引脚RREF。它通常要接12KΩ精度1%电阻到地这颗电阻决定了PHY内部的偏置电流直接影响高速发射器的驱动强度和接收器的灵敏度。电阻值不对比如用了5%精度的或者贴错成10KΩ会出现一种特别让人抓狂的现象偶尔能枚举成功拷文件拷到一半设备掉线或者同一个板子换一台电脑表现不同。我第一次画板子时就犯了错RREF电阻漏接结果高速握手始终不成功设备只能以全速12Mbps工作折腾了整整一天。USB差分对DP/DM从USB3320出来建议走一段之后再加ESD保护器件。ESD防护优选专用的USB2.0高速ESD阵列比如USBLC6-2SC6放在USB座子旁边靠近连接器放置。这类器件本身的寄生电容很小不会破坏差分信号完整性但能有效防止插拔时的静电打坏PHY。不要图省事用普通的TVS管很多TVS的结电容高达几十皮法直接就把高速信号衰减得没法看了。VBUS和ID检测是OTG功能的基础。USB3320上有专用的VBUS引脚通过10KΩ电阻连接到USB座的VBUS电源芯片内部有比较器判断电压是否在有效范围。ID引脚直接连USB座的ID信号OTG设备靠ID脚的电平决定自己是主机还是设备ID接地表示作为A设备主机ID悬空表示作为B设备从机。这两个信号的状态通过ULPI总线自动上报给F407软件只需读取USB_OTG_HS控制器的状态寄存器即可不需要额外占用单片机IO做分压检测。这一点和OTG_FS的做法不同——F407内置的FS PHY需要你把VBUS分压到3.3V再接PA9而使用外挂PHY后这些活全交给USB3320了。3.3 复位、中断引脚与STM32F407的GPIO分配USB3320的复位引脚RESET_N是低电平有效。硬件上我用F407的一个普通GPIO比如PC1控制它。上电时先通过下拉电阻保持低电平单片机启动后延时10ms以上再拉高确保USB3320的晶振已经起振并稳定。很多人直接把RESET_N接到3.3V上觉得上电瞬间芯片自己就复位了这样也能工作但可靠性不如软件控制——特别是做热插拔、休眠唤醒这类操作时软件复位PHY会方便很多。USB3320还有一个中断输出引脚INTR_N低电平有效有事件时自动拉低。我的设计里留了这个引脚连接到F407的一个外部中断输入口用于设备拔出、唤醒等事件快速响应。如果软件比较简单这个引脚可以悬空但预留它在做OTG角色切换时非常好用。ULPI接口的引脚分配必须按照F407数据手册的复用表来不能随意接。我这次设计的接线关系如下USB3320引脚信号名STM32F407引脚DATA0ULPI_D0PA3DATA1ULPI_D1PB0DATA2ULPI_D2PB1DATA3ULPI_D3PB10DATA4ULPI_D4PB11DATA5ULPI_D5PB12DATA6ULPI_D6PB13DATA7ULPI_D7PB14CLKOUTULPI_CKPA5DIRULPI_DIRPC2NXTULPI_NXTPC3STPULPI_STPPC0RESET_NPHY_RSTPC1INTR_NPHY_INTPC4这里有个非常容易搞错的点很多刚接触的人以为USB的数据线要接到单片机的PA11/PA12因为那是OTG_FS的DP/DM引脚。错。使用OTG_HS 外挂PHY时单片机的PA11/PA12完全空闲DP/DM是USB3320和USB座子之间的事USB3320的DP/DM直接连到USB座的D/D-即可。单片机只通过上面这组ULPI总线和PHY通信。提示画原理图时我习惯把所有ULPI信号名命名成ULPI_D0~ULPI_D7、ULPI_CLK、ULPI_DIR、ULPI_NXT、ULPI_STP并在网络标号里加上PHY前缀比如PHY_ULPI_D0。这样导到PCB布线时一眼就能看出哪些网络是等长约束组省得后期自己对着密密麻麻的网络名找线。4. PCB布局布线稳定工作的另一半功劳4.1 差分对和时钟线的处理原理图画对了PCB布局布线同样马虎不得。USB2.0高速虽然速率只有480Mbps但信号的上升沿非常快实际等效频率远超480MHz对PCB走线的阻抗和回流路径很敏感。DP/DM必须按90Ω差分阻抗走线表层走线时根据板厚和介质参数计算线宽线距。通常4层板1.6mm厚度表层90Ω差分大概需要线宽0.2mm、线距0.1mm左右具体数值要让板厂按叠层帮你算不要自己拍脑袋。差分对要等长但USB2.0高速对等长的要求其实没有想象中那么苛刻DP/DM长度差控制在5mm以内基本没问题。更重要的是差分对内部不要打过孔整段走线尽量在顶层完整走完如果必须换层两边必须同步打过孔并且过孔附近要有回流地孔。差分对之间不要走其他信号周围保持至少3倍线宽的距离特别是时钟信号不能让CLK和DP/DM平行走长距离否则串扰会直接导致眼图闭合。CLKOUT这根线是60MHz时钟虽然没有差分对那么娇贵但也要远离其他信号最好用GND包一下。走线长度尽量短从USB3320的CLKOUT到F407的PA5实测控制在30mm以内走线过远会导致时钟沿变缓影响ULPI总线的建立保持时间。4.2 电源与地平面底部焊盘的作用QFN封装的USB3320底部有一个很大的裸露焊盘这个焊盘既是散热也是接地。PCB上对应位置必须开同样大小的铜皮并且打过孔阵列连接到地平面。很多人不知道这个底部焊盘如果不接地芯片工作起来会发热更严重的是地回路不完整会让DP/DM的信号质量急剧恶化。电源走线要先经过滤波电容再进入芯片电源引脚。在PCB上去耦电容应该放在芯片电源引脚的同侧尽量靠近引脚电容到引脚的距离最好小于2mm且先过电容再进芯片不要把去耦电容放得远远的那样高频噪声根本滤不掉。地平面必须是完整的一块不要在USB3320下方分割地。如果板子上有模拟地和数字地在这个芯片下也要统一成一个地否则回流路径绕一圈高速信号就会因为环路过大产生辐射和抖动。我这次用的是4层板第二层整层做地平面第三层走电源第四层留一点走线空间。这样USB3320和F407之间的ULPI信号都在顶层参考面是完整的第二层地平面信号质量非常稳定。两层板不是不能做但难度会高很多建议第一次做高速USB直接上4层板省下的调试时间远超板费差价。4.3 器件摆放与去耦电容的位置USB座子、ESD保护器件、USB3320这三者的位置关系要遵循“USB座子→ESD→PHY”的顺序从接口到芯片的距离越短越好。ESD器件要放在靠近USB座子的地方最好在差分线进入座子之前就完成防护。USB3320尽量靠近USB座子放置中间不要穿越其他大器件这样DP/DM走线最短。ULPI总线的走线长度没有统一要求但一个原则是所有ULPI信号线D0~D7、CLK、DIR、NXT、STP要尽量等长长度差控制在15mm以内。PCB布局时F407和USB3320要放在同一侧避免ULPI总线打太多过孔。走线顺序上先把DP/DM的高优先级处理好再处理ULPI数据线和控制线电源线最后铺铜。还有晶振的摆放位置晶振尽量靠近USB3320的XI/XO引脚晶振下方禁止走任何信号线两个负载电容也要靠近晶振放置。晶振的地引脚要直接连到地平面上不要共用一段细走线。这些细节看着琐碎但任何一个环节出了问题都会让最终的调试变成“换一块板子试试”的玄学循环。5. 上电后的调试步骤与实测记录5.1 先别接USB主机用万用表完成预检很多工程师一上电就急着把板子插到电脑上看能不能枚举这是效率最低的调试方式。我的习惯是先用万用表做一轮预检排除低级错误再上信号。上电后先量USB3320各电源引脚的电压3.3V必须准确纹波用示波器看应该在50mV以内。然后量RREF电阻两端电压正常会有0.5V左右的压降如果完全没有电压说明芯片没有正常工作查供电和复位。接下来用示波器探头夹在晶振的XI引脚上确认24MHz频率稳定起振。注意用10倍探头、带宽至少100MHz不要用1倍探头晶振信号幅度本身就不大1倍探头电容负载太大甚至会直接把振荡停振。晶振起振后再量CLKOUT引脚的输出应该能看到稳定的60MHz方波幅度接近3.3V。如果CLKOUT没有输出或频率不对优先检查晶振和复位时序不要急着去改软件。预检最后一步是量USB3320的ID引脚和VBUS引脚。拔掉USB线时ID脚应该为高电平或悬空VBUS脚为0V。插上USB线设备模式后VBUS脚应该能检测到5V经过分压后的电平ID脚保持高。如果VBUS检测不到检查USB座子的VBUS焊接和10K Ω电阻。5.2 高速Chirp波形到底是长什么样预检通过后把设备插到电脑上。这里有一个特别重要的知识点USB高速设备在枚举时并不是一开始就跑480Mbps。初始阶段是低速握手——设备作为全速设备主机先检测到D上的上拉电阻产生的高电平然后用12Mbps全速速率和设备通信之后双方再通过Chirp序列协商切换到480Mbps高速模式。整个过程是主机先发送一个持续至少1ms的“Chirp K”信号设备检测到之后在D上回复一串“KJ”交替的Chirp序列主机识别后切换为高速模式。用示波器抓DP/DM波形时把时基设为1ms/格触发电平设在200mV左右能看到完整的握手过程。如果设备端始终没有回复KJ序列说明PHY没有进入高速模式这时候最可能的原因就是RREF电阻接错或漏接以及USB3320的供电问题。如果能看到KJ序列但电脑仍显示设备为12Mbps说明信号质量不过关高速模式切换失败重点检查差分线阻抗、长度和ESD器件是否选型错误。我实测时发现用500MHz以上带宽的示波器看高速信号才有意义。480Mbps信号的基频是240MHz如果示波器带宽只有100MHz看到的眼图全是模糊的无法判断是真有问题还是示波器不够。没有高带宽示波器时最有效的判断方法就是看能不能正常枚举、数据传输稳不稳定把Chirp波形作为一个“是/否”的判定信号而不追求精确的眼图分析。5.3 HAL库软件配置中容易忽略的两个点硬件没问题软件配置也会有自己的坑。STM32CubeMX配置F407的OTG_HS时在USB_OTG_HS选项里选择External PHY并且确保时钟树中PLL48CLK时钟为48MHz。这个48MHz给OTG_HS控制器内部使用是设备枚举的基础时钟。很多人的USB_OTG_HS是HS模式但PLL48CLK配错了或没开启导致枚举失败。第二个容易忽略的是GPIO复用配置。ULPI接口的引脚必须配置为Alternate Function模式且AF编号要选正确。不同引脚的AF编号不一样例如PA3的ULPI_D0复用是AF10PB0是AF10PC0是AF10PA5是AF10。CubeMX中只要选择了USB_OTG_HS External PHY这些引脚会大部分自动配置好但RESET_N对应的PC1还是要手动设为GPIO输出。初始化代码中一定要在HAL_HCD_Init()或HAL_PCD_Init()之后再执行USB3320的复位释放操作否则PHY还没就绪初始化时序就会出错。软件配置过程中还有个小技巧如果设备插上电脑后出现“Unknown Device”先检查设备管理器的设备描述符是否读出为“Port Reset Failed”这多半是PHY的高速握手没成功而不是驱动问题。此时用一个USB协议分析仪或直接看示波器定位是主机端还是设备端的Chirp缺失比盲目改代码效率高得多。提示USB3320的寄存器可以通过ULPI接口访问STM32的HAL库中提供了HAL_PCD_ReadPHYRegister和HAL_PCD_WritePHYRegister之类的接口。调试时可以用这些接口读PHY的ID寄存器USB3320的器件ID是固定的如果读出来是0xFFFFFFFF或者全零说明单片机根本没和PHY正常通信优先查硬件而非软件逻辑。6. 常见问题与排查技巧实录6.1 枚举失败、未知设备与12Mbps陷阱这次项目前后踩了不少坑有几个问题非常典型值得专门写出来。第一个是枚举失败设备插入电脑毫无反应。这类问题绝大多数出在硬件上排查顺序是先确认USB3320的RREF电阻是否焊接正确再确认CLKOUT是否有60MHz输出接着用示波器抓VBUS引脚是否在插入瞬间出现5V的毛刺最后检查ULPI总线的接线是否按原理图逐根对应。第二个很经典的问题是设备能被识别但速率只有12Mbps。这类问题最迷惑人因为设备看起来“能用”U盘枚举到了但是速度怎么都上不去。你在设备管理器里能看到“USB Full-Speed device”但明明设计的是高速。此时要优先怀疑三件事RREF阻值不对导致高速发射器偏置不准DP/DM差分线阻抗严重偏离90ΩESD器件寄生电容过大。这三个原因都不好查建议从RREF开始确认因为一颗电阻的问题最好解决。第三个问题是间歇性掉线高速传输一段时间后设备自动断开。这类问题在原理图没明显错误时最常见的原因是电源瞬态响应不良。USB3320工作时电流是突变的如果3.3V电源的瞬态响应跟不上DP/DM的信号幅度就会周期性劣化导致主机端采样出错。解决办法是加强电源去耦在USB3320主电源脚和地之间增加104、105电容组合同时确保电源芯片的带宽足够。6.2 低速能通、高速不通的差分信号质量问题“低速通、高速不通”是USB高速设计中非常典型的故障现象。这个现象背后的逻辑是12Mbps全速信号的沿比较缓抗干扰能力强480Mbps高速信号的沿非常陡只要走线阻抗不连续、拐角太急、ESD电容偏大信号反射就会造成眼图闭合。如果你遇到这个现象先用万用表确认ESD器件的对地电容再用阻抗测试仪或者按板厂的经验值确认差分对阻抗。我在第二版板子上专门把DP/DM走线重新优化了一遍差分对走线长度由原来的40mm缩短到20mm过孔全部取消ESD器件从两条线的中间移到了座子外侧整个差分通道变得非常干净。改版后高速枚举一次通过连续拷大文件48小时没有掉线。这件事给我的教训是高速USB的信号完整性设计不是“锦上添花”而是“雪中送炭”对板子来说唯一能消除抖动的方式就是让物理通道尽量干净。6.3 问题速查表故障现象最可能原因排查动作解决办法插上无任何反应供电异常 / 复位未释放测电源电压、复位引脚电平确认3.3V供电软件延时10ms后拉高复位设备管理器中未知设备ULPI总线接线错误对照表格逐根量ULPI_D0~D7、CLK、DIR修正接线或PCB走线枚举成功但速率12MbpsRREF电阻错误 / 差分阻抗不匹配量RREF阻值查差分线阻抗计算换12KΩ 1%电阻调整线宽线距高速传输中掉线电源瞬态不良 / 去耦不足示波器看3.3V纹波增加去耦电容加强电源走线CLKOUT无输出晶振未起振 / 复位时序错误测XI引脚波形查复位引脚检查晶振和负载电容调整复位时序读PHY寄存器全0xFFULPI接口不通检查ULPI总线电平重点查DIR和CLK确认引脚复用AF配置检查焊接插上时偶尔识别不到USB座子接触不良 / ESD异常检查焊接换USB座换高质量USB座检查ESD器件焊接这张表基本上覆盖了我这次调试遇到的所有主要问题。如果是一张全新的F407 USB3320板子建议按照表里的顺序从前到后排查基本都能定位到根因。特别强调的是ULPI总线相关的问题用示波器单脚量很难判断抓8根数据线还需要逻辑分析仪。所以我建议在做板子时预留一个ULPI调试接口把D0~D7、CLK、DIR、NXT、STP全部引到测试点或排针上调试时接逻辑分析仪抓总线很快就能看出协议交互是否正常省去大量猜测时间。7. 几个提高成功率的细节习惯最后再分享几个我在实际项目中养成的硬件设计习惯。第一原理图中所有跟USB相关的网络命名一定要规范加统一前缀比如PHY_这样在PCB布线阶段不会被海量的网络淹没。第二USB3320的每个电源引脚旁边都要放0.1uF电容这个不能省芯片数据手册上推荐的就是这个值别用0.01uF代替也别用1uF代替按手册来这是经验。第三RREF电阻选1%精度哪怕贵一毛钱也要买1%的5%电阻在这个位置会引起收发偏置偏差后期排查成本远高于这点差价。还有一个很重要的点是上电调试时先不要插入任何USB设备先让单片机跑起来读一下PHY的ID寄存器确认通信正常。这个步骤看起来多此一举但它能把问题“二分法”切开如果ID寄存器都读不到说明单片机与PHY之间的ULPI链路有硬件问题如果能读到再插设备之后的排查就能集中在软件协议和信号质量上。这个习惯帮我节省了大量时间。USB高速设计并没有想象中那么“玄学”绝大多数不稳定问题都能追溯到具体的物理原因。只要把电源、时钟、复位、阻抗、地平面这五件事做对USB3320和STM32F407这套方案完全能稳定工作。真正让人觉得“玄”的往往不是原理上的复杂而是细节上的累积。希望这篇文章能让你在设计F407高速USB OTG时少走几步弯路把时间和精力花在真正有价值的系统功能上。
返回列表