当前位置: 首页 > news >正文

Linux MMC子系统 - 2.eMMC 5.1总线协议浅析

By: Ailson Jack
Date: 2023.10.27
个人博客:http://www.only2fire.com/
本文在我博客的地址是:http://www.only2fire.com/archives/161.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。

微信公众号:嵌入式那些事

eMMC总线拓扑

在eMMC总线中,可以有一个Host,多个eMMC设备。总线上的所有通信都是以Host发送一个Command给eMMC开始的,eMMC对于收到的不同Command会做出不同的response,当然了eMMC对于收到的部分Command可以不做response。Host一次只能与一个eMMC设备通信。

在上电启动后,Host会为所有eMMC设备依次分配相对地址(RCA,Relative card Address)。当Host需要和某一个eMMC设备通信时,会先通过RCA选中该eMMC设备,只有被选中的eMMC设备才会响应Host的Command。

eMMC总线协议

在系统上电复位后,Host必须使用eMMC总线协议指定的message来初始化eMMC设备。每个message都由下面的一个标记表示:

  • command:命令,一个命令是一个开始操作的标记。命令是由Host发给eMMC设备的。一个命令在CMD线上被串行传输。
  • response:响应,响应是由eMMC设备发送给Host,用于eMMC设备对先前收到命令的回复。一个响应在CMD线上被串行传输。
  • data:数据,数据可以从Host传输给eMMC设备,也可以从eMMC设备传输给Host。数据在数据线上被传输。用于传输数据的数据线可以是1个(DAT0),4个(DAT0-DAT3)或者8个(DAT0-DAT7)。

对于每一个数据线来说,在一个时钟周期可以传输1位数据,也就是SDR模式(single data rate)。当然了,在一个时钟周期可以传输2位数据,也就是DDR模式(dual data rate)。

eMMC的读和写命令是按照block为单位进行的。读和写可以是单块或者多块。读和写数据时,数据block后面会跟CRC。

eMMC读数据

Host从eMMC设备读取数据的流程图如下图所示:

在这里插入图片描述
如果Host发送的是Read Single Block的命令(CMD17),那么eMMC设备只会发送一个Block的数据(一个Block数据的字节数可以由Host通过CMD16命令设定或者为eMMC设备的默认值)。

如果Host发送的是Read Multiple Block的命令(CMD18),并且在发送CMD18之前,先发送一个SET BLOCK COUNT命令(CMD23)来设置需要读取的数据块数量,那么eMMC设备在传输完指定数量的数据块之后,会自动结束数据传输,不需要Host主动发送Stop Command(CMD12)。

如果Host发送的是Read Multiple Block的命令(CMD18),并且在发送CMD18之前,Host没有发送设置读取数据块数量的命令,那么eMMC设备会持续发送数据,直到Host主动发送Stop Command(CMD12)。

eMMC写数据

Host向eMMC设备写入数据的流程图如下图所示:

在这里插入图片描述
如果Host发送的是Write Single Block的命令(CMD24),那么eMMC设备只会将后续第一个Block的数据写入的存储器中(一个Block数据的字节数可以由Host通过CMD16命令设定或者为eMMC设备的默认值)。

如果Host发送的是Write Multiple Block的命令(CMD25),并且在发送CMD25之前,先发送一个SET BLOCK COUNT命令(CMD23)来设置需要写入的数据块数量,那么eMMC设备在接收完指定数量的数据块之后,会自动结束数据传输,不需要Host主动发送Stop Command(CMD12)。

如果Host发送的是Write Multiple Block的命令(CMD25),并且在发送CMD25之前,Host没有发送设置写入数据块数量的命令,那么eMMC设备会持续地将接收到的数据写入到存储器中,直到Host主动发送Stop Command(CMD12)。

eMMC设备在接收到一个Block的数据后,会进行CRC校验,然后将校验结果通过CRC Token发送给Host。发送完CRC Token后,如果CRC校验成功,eMMC设备会将数据写入到内部存储器,此时DAT0信号会拉低,作为Busy信号。Host会持续检测DAT0信号,直到为高电平时,才会接着发送下一个Block的数据。如果CRC校验失败,那么eMMC设备不会进行数据写入,此次传输的后续数据都会被忽略。

eMMC无数据和无响应命令示意

在Host与eMMC设备的通信中,有部分命令是不需要进行数据传输的,还有部分命令不需要eMMC设备回复Response,示意图如下所示:

在这里插入图片描述

eMMC命令

eMMC命令类型

eMMC协议定义了4种类型的命令,包括:bc、bcr、ac和adtc,这些命令类型的说明如下:

  • bc:broadcast commands(bc),bc是广播命令,主机发送bc命令给eMMC设备后,eMMC设备不需要回复响应(response)。
  • bcr:broadcast commands with response(bcr),bcr是需要eMMC设备回复响应的广播命令。
  • ac:addressed(point-to-point) commands(ac),ac是数据线(DAT lines)无数据传输的(no data transfer)点对点(point-to-point)命令。
  • adtc:addressed(point-to-point) data transfer commands(adtc),adtc是数据线有数据传输的点对点命令。

所有的命令(command)和响应(response)都是在CMD线上进行传输的。发送命令或响应时先发送起始位(Start bit),最后发送结束位(End bit)。

eMMC命令格式

eMMC的Command格式如下图所示:

在这里插入图片描述
eMMC的Command由48 bits组成,所有的eMMC命令都以01开始,以1结尾。所有的eMMC命令都是在CMD线上进行传输的,发送命令时先发送命令的起始位(Start bit),最后发送命令的结束位(End bit)。eMMC命令各个位的说明如下图所示:

在这里插入图片描述

  • Start Bit:起始位,固定为0,在没有命令传输的情况下,CMD线上的信号保持高电平,当Host将Start Bit发送到总线上时,eMMC设备可以很方便检测到命令的Start Bit(CMD线上的信号由高电平变为低电平),并开始接收Command。
  • Transmission Bit:传输位,固定为1,该位指示CMD线上数据的传输方向,该位为1,表示CMD线上数据的传输方向为从Host到eMMC设备。
  • Command Index和Argument:命令索引和命令参数,Command Index和Argument是命令的具体内容,不同的命令Command Index不同,不同的命令Argument也不相同。
  • CRC:CRC校验值,包含Start Bit、Transmission Bit、Command Index和Argument内容的CRC校验值。
  • End Bit:结束位,固定为1。

eMMC命令类别

eMMC的命令被划分成多种不同的类别。每一种命令类别支持一个设备功能的子集。

Class 0是所有eMMC设备都必须支持的命令类别。其他的命令类别根据具体的设备类型可以是必须支持的,也可以是可选的。

eMMC命令类别描述如下:

在这里插入图片描述
Host可以通过读取CSD寄存器的CCC [95:84]位域,来了解当前eMMC设备对命令类别的支持情况,对应的位域值为1,就表示该eMMC设备支持对应的命令类别。

eMMC响应

eMMC响应有两种长度的数据包,分别为48 Bits和136 Bits,eMMC响应的格式如下图所示:

在这里插入图片描述
eMMC的响应由48 bits或者136 bits组成,所有的eMMC响应都以00开始,以1结尾。所有的eMMC响应都是在CMD线上进行传输的,eMMC设备发送响应时先发送响应的起始位(Start bit),最后发送响应的结束位(End bit)。

  • Start Bit:起始位,固定为0,在没有响应传输的情况下,CMD线上的信号保持高电平,当eMMC设备将Start Bit发送到总线上时,Host可以很方便检测到响应的Start Bit(CMD线上的信号由高电平变为低电平),并开始接收响应。
  • Transmission Bit:传输位,固定为0,该位指示CMD线上数据的传输方向,该位为0,表示CMD线上数据的传输方向为从eMMC设备到Host。
  • Content:响应的具体内容,不同的响应Content不同。
  • CRC:CRC校验值,包含Start Bit、Transmission Bit和Content内容的CRC校验值。
  • End Bit:结束位,固定为1。

eMMC有5种类型的响应,包括:R1,R2,R3,R4和R5。

R1

R1响应的数据长度为48 bits,其中[45:40]数据位域表示的是该响应对应命令的编号。[39:8]是一个32位大小的位域,主要用于反应设备的状态信息,具体的设备状态信息内容可以参考eMMC 5.1 spec的6.13 Device status章节。

在这里插入图片描述
R1b和R1完全相同,只是R1b会在数据线DAT0上传输一个可选的busy信号。基于eMMC设备在接收命令之前的状态,eMMC设备在接收到一些命令之后可能会变得繁忙。

R2

R2响应的数据长度为136 bits。[127:1]是一个127位大小的位域,该位域将CID寄存器的值作为CMD2和CMD10的响应内容。[127:1]位域也可以将CSD寄存器的值作为CMD9的响应内容。CID和CSD寄存器的[127:1]位作为R2响应内容被传输,CID和CSD寄存器的保留位[0]由于该位的值总是1,因此保留位[0]被R2响应的End bit替换。

在这里插入图片描述

R3

R3响应的数据长度为48 bits。[39:8]是一个32位大小的位域,该位域将OCR寄存器的值作为CMD1的响应内容。

在这里插入图片描述

R4

R4响应的数据长度为48 bits。[39:8]是参数域,该位域包含寻址设备的RCA,要进行读写操作的寄存器地址以及寄存器内容。如果操作成功,参数域中的状态位将被置1。R4响应只作为对CMD39的响应。

在这里插入图片描述

R5

R5响应的数据长度为48 bits。如果该响应由Host产生,那么RCA[31:16]位域的值应该为0。R5响应只作为对CMD40的响应。

在这里插入图片描述

eMMC数据块

eMMC数据块由Start bit、Data、CRC和End bit组成。下面对不同总线宽度和数据速率(Date Rate)下,各个数据块的格式进行一个简单的说明。

1位总线宽度 SDR模式

在这里插入图片描述
CRC为Data的16 bitCRC校验值,不包含起始位。

4位总线宽度 SDR模式

在这里插入图片描述
各个数据线上的CRC为对应数据线的Data的16 bit CRC校验值。

8位总线宽度 SDR模式

在这里插入图片描述
各个数据线上的CRC为对应数据线的Data的16 bit CRC校验值。

4位总线宽度 DDR模式

在这里插入图片描述
DDR模式下,在时钟的上升沿和下降沿数据线都会传输数据。在时钟的上升沿传输数据的奇数字节(字节1,3,5 …),在时钟的下降沿传输数据的偶数字节(字节2,4,6 …)。

在DDR模式下,每个数据线上有两个相互交织的CRC16,时钟上升沿的CRC比特组成odd CRC16,时钟下降沿的CRC比特组成even CRC16。odd CRC16用于校验该数据线上所有上升沿比特组成的数据,even CRC16用于校验该数据线上所有下降沿比特组成的数据。

8位总线宽度 DDR模式

在这里插入图片描述

eMMC CRC status token

在Host向eMMC设备写数据过程中,eMMC设备接收到Host发送的一个数据块之后,会进行CRC校验,如果校验成功,eMMC设备会在对应的数据线上向Host回复一个Positive CRC status token(“010”),如果校验失败,eMMC设备会在对应的数据线上向Host回复一个Negative CRC status token(“101”)。

在Host从eMMC设备读取数据的过程中,Host接收到eMMC设备发送的一个数据块之后,也会进行CRC校验,但是不论校验成功还是校验失败,Host都不会向eMMC设备回复CRC status token。

Positive CRC status token

在这里插入图片描述

Negative CRC status token

在这里插入图片描述

eMMC寄存器

eMMC 5.1协议定义了7个寄存器:OCR,CID,CSD,EXT_CSD,RCA,DSR和QSR,下面简单的列举常用的6个寄存器。

名称宽度(字节)说明实现
OCR4操作条件寄存器(Operation conditions register)。通过广播命令获取寄存器信息,包含设备的供电类型和寻址模式。必须
CID16卡识别寄存器(Card IDentification)。包含识别设备的唯一码。必须
CSD16卡特定数据寄存器(Card Specific Data)。包含卡操作状态的具体信息。必须
Extended CSD512扩展卡特定数据寄存器(Extended Card Specific Data)。包含设备的容量和当前模式信息。必须
RCA2相对地址寄存器(Relative card address)。在初始化过程中,由主机控制器动态分配的地址。必须
DSR2驱动等级寄存器(Driver Stage Register)。配置设备的输出驱动。可选

eMMC总线测试过程

在SDR模式下,Host通过发送CMD19和CMD14可以进行eMMC总线测试过程(Bus testing procedure),测试eMMC接口的硬件引脚连接性。在DDR模式下,不支持总线测试,CMD19和CMD14被认为是非法命令。

在SDR模式下进行eMMC总线测试时,首先Host发送CMD19给eMMC设备,接着Host在每根数据线上发送特定格式的数据给eMMC。然后,Host发送CMD14给eMMC设备,请求eMMC设备回复翻转的数据。Host可以通过对接收到的翻转数据进行比较,就能知道eMMC接口的引脚引脚连接情况。

1bit总线宽度时,eMMC总线测试的数据格式如下图所示:

在这里插入图片描述
4bit总线宽度时,eMMC总线测试的数据格式如下图所示:

在这里插入图片描述
8bit总线宽度时,eMMC总线测试的数据格式如下图所示:

在这里插入图片描述
欢迎关注博主的公众号(微信搜索公众号:嵌入式那些事),可以扫描下面的公众号二维码:

在这里插入图片描述
如果文中有什么问题欢迎指正,毕竟博主的水平有限。

如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^。

排版更好的内容见我博客的地址:http://www.only2fire.com/archives/161.html

注:转载请注明出处,谢谢!^_^

相关文章:

Linux MMC子系统 - 2.eMMC 5.1总线协议浅析

By: Ailson Jack Date: 2023.10.27 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/archives/161.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。…...

时序预测 | Python实现ARIMA-LSTM自回归移动差分模型结合长短期记忆神经网络时间序列预测

时序预测 | Python实现ARIMA-LSTM自回归移动差分模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-LSTM自回归移动差分模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Python实现ARIMA-LSTM自…...

【Linux】部署单机OA项目及搭建spa前后端分离项目

目录 部署OA项目 ​编辑 搭建spa前后端分离项目 后端 前端 配置坏境变量 部署OA项目 在虚拟机中,将项目打包成war文件放置到tomcat根目录下的webapps文件目录下 再在主机数据库中连接数据库,并定义数据库名导入相关的表 继续进入tomcat目录下双击点…...

2023中国计算机大会:蚂蚁集团连发两支百万级科研基金

10月26日,中国计算机学会(CCF)主办的第二十届中国计算机大会(CNCC2023)在沈阳举行。在“CCF-蚂蚁科研基金及产学研合作交流活动”上,蚂蚁集团发布了2023年度“CCF-蚂蚁科研基金”绿色计算及隐私计算两支百万级专项基金&#xff0c…...

Knife4j使用教程(三) -- 实体类的配置注解(@ApiModel与@ApiModelProperty 的 认识与使用)

目录 1. @ApiModel与@ApiModelProperty的区分 2. @ApiModel注解 3. @ApiModelProperty注解 3.1 value属性 3.2 name属性...

计算机网络【CN】IPV4报文格式

版本(4bit):IPV4/IPV6首部长度(4bit):标识首部的长度 单位是4B最小为:20B最大为:60(15*4)B总长度(16bit):整个数据报&…...

SQL server数据库单用户模式如何退出

根据网上的说法,用下面的方式尝试即可退出 进入ssms数据库管理软件执行下面的sql语句 -- 第一步执行USE [master] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO--建一个存储过程,断开所有用户连接。 create proc [dbo].[killspid] (dbn…...

QT mqtt 在子线程中使用

qtmqtt 在子线程中使用_qt在子线程里mqtt无法new-CSDN博客文章浏览阅读524次。解决问题:QMqttClient - connection not made from another thread在qt中使用多线的qtmqtt客户端发送接收数据_qt在子线程里mqtt无法newhttps://blog.csdn.net/qq_35708970/article/deta…...

Tomcat运维以及优化

Tomcat常用运维命令 # 查看版本/opt/data/app/tomcat-9.0.82/bin/catalina.sh version## 启动 /opt/data/app/tomcat-9.0.82/bin/startup.sh # 停止 /opt/data/app/tomcat-9.0.82/bin/shutdown.sh调整JVM 参数 方式1 vim /opt/data/app/tomcat-9.0.82/bin/catalina.sh # OS…...

C++设计模式_14_Facade门面模式

本篇介绍的Facade门面模式属于“接口隔离”模式的一种,以下进行详细介绍。 文章目录 1. “接口隔离”模式1. 1 典型模式 2. 系统间耦合的复杂度3. 动机(Motivation)4. 模式定义5. Facade门面模式的代码实现6. 结构7. 要点总结8. 其他参考 1. “接口隔离”模式 在组…...

正点原子嵌入式linux驱动开发——外置RTC芯片PCF8563

上一章学习了STM32MP1内置RTC外设,了解了Linux系统下RTC驱动框架。一般的应用场合使用SOC内置的RTC就可以了,而且成本也低,但是在一些对于时间精度要求比较高的场合,SOC内置的RTC就不适用了。这个时候需要根据自己的应用要求选择合…...

自动驾驶感知算法面经(20+)

原文链接: https://zhuanlan.zhihu.com/p/656952371 本人2022年4月和2023年7月两次跳槽找工作,面经总结在这里,希望可以帮到需要的朋友。 项目相关的问题主要和经历有关,参考性不大。 2023年7月 1. 文远知行 自动标注算法岗位 项目经历问…...

计算机操作系统重点概念整理-第二章 进程管理【期末复习|考研复习】

第二章 进程管理 【期末复习|考研复习】 计算机操作系统系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第二章 进程管理 【期末复习|考研复习】前言二、进程管理2.1进…...

如何学好C++?学习C和C++的技巧是什么?

如何学好C?学习C和C的技巧是什么? 你这三个问题,前两个都是意思是差不多的,那么怎么怎么学习C/C我来问答一下:最近很多小伙伴找我,说想要一些C资料,然后我根据自己从业十年经验,熬夜搞了几个通…...

leetcode_39 组合总和

1. 题意 给定一个数组&#xff0c;和一个目标值&#xff1b;求得所有数组中所有和为目标值的元素序列。 组合总数 2. 题解 回溯列举每一个可能的序列&#xff0c;注意去重。 2.1 我的解法 class Solution { public:void gen(vector<vector<int>> &ans,co…...

【登录安全测试】

登录安全测试是确保系统的用户身份验证机制和登录过程的安全性的重要步骤。以下是一些常见的登录安全测试方面的考虑&#xff1a; 账号密码验证&#xff1a;验证系统是否能有效地验证用户的账号和密码&#xff0c;包括对密码长度、复杂性和有效性的限制。测试应包括正常和异常…...

MySQL -- 数据类型

MySQL – 数据类型 文章目录 MySQL -- 数据类型一、数据类型1.数据类型分类2.数值类型2.1.tinyint2.2.bit2.3小数类型 3.字符串类型3.1.char3.2.varchar 4.时间和日期类型5.enum和set 一、数据类型 1.数据类型分类 2.数值类型 2.1.tinyint tinyint类型的数值范围是-128 ~ 127…...

Windows11搭建kafka-python环境

文章目录 安装软件javazookeeperkafka命令行调试环境python-kafka环境参数解释名词解释定义基础架构同步发送、异步发送消息队列的两种模式消费者与消费组幂等性文件清理策略kafka消费模式offset作用kafka消费顺序如何保证参考文献安装软件 java 下载jdk,配置环境变量JAVA_H…...

一篇了解springboot3请求参数种类及接口测试

SpringBoot3数据请求&#xff1a; 原始数据请求&#xff1a; //原始方式RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParameter("name");String age request.getParam…...

CFD模拟仿真理论知识:流体仿真应用

CFD模拟仿真理论知识:流体仿真应用 本文将介绍CFD(Computational Fluid Dynamics,计算流体动力学)模拟仿真理论知识的原理、方法和应用。通过本文对CFD的深入理解,并了解如何运用这一理论解决实际问题。...

ElevenLabs语音克隆失败率骤降63%的关键:训练集音频信噪比阈值、时长分布与语速归一化黄金公式

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs英文语音生成的底层架构演进 ElevenLabs 的语音合成系统并非基于传统拼接或参数化 TTS 框架&#xff0c;而是构建在端到端神经声码器与自监督语音表征联合优化的混合架构之上。其核心演进路径…...

3分钟解锁CAJ文件:如何将知网专属格式转换为可搜索PDF

3分钟解锁CAJ文件&#xff1a;如何将知网专属格式转换为可搜索PDF 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换&#xff0c;成功与否&#xff0c;皆是玄学。 项目地址: https://gitcode.com/gh…...

087、机器人运动学:雅可比矩阵

087、机器人运动学:雅可比矩阵 一、一个让我熬夜三天的调试故事 去年做六轴协作机器人末端力控的时候,遇到一个诡异的问题:机器人末端在某个位姿下,明明关节速度指令给得很平滑,末端速度却突然跳变,导致力控震荡。当时我盯着示波器上的速度曲线,百思不得其解——运动学…...

扬州尊客酒店用品厂:十一年用心,值得信赖

扎根扬州&#xff0c;十一年用心&#xff1a;一家把 “靠谱” 刻进骨子里的酒店用品厂在扬州生态科技新城&#xff0c;有这样一家企业&#xff1a;没有花哨噱头&#xff0c;不玩虚头宣传&#xff0c;只埋头做一件事 —— 把酒店客房里那些不起眼的一次性用品&#xff0c;做到让…...

Infinity Router:构建统一流量网关的架构设计与生产实践

1. 项目概述&#xff1a;一个面向未来的路由聚合器 最近在折腾一个很有意思的项目&#xff0c;叫“Infinity Router”。这名字听起来挺唬人的&#xff0c;但说白了&#xff0c;它就是一个 路由聚合器 。不过&#xff0c;它和我们平时在项目里用的那些路由库&#xff08;比如 …...

终极GitHub加速指南:如何免费将下载速度提升10倍以上

终极GitHub加速指南&#xff1a;如何免费将下载速度提升10倍以上 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 对于国内开发者来…...

Android 显示框架:SurfaceFlinger与合成策略探析

1. SurfaceFlinger的核心角色解析 第一次拆解Android显示系统时&#xff0c;我被SurfaceFlinger这个名称逗笑了——"Surface抛洒者"&#xff1f;后来发现这个命名意外地准确。想象你正在布置多屏艺术展&#xff0c;SurfaceFlinger就是那个决定每幅画作展示位置、叠加…...

如何永久保存微信聊天记录?终极指南:从导出到年度报告完整流程

如何永久保存微信聊天记录&#xff1f;终极指南&#xff1a;从导出到年度报告完整流程 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHu…...

构建企业级数据集成平台:解锁非标准数据源的.NET适配器框架实践

1. 项目概述与核心价值最近在和一些做企业级应用集成的朋友聊天&#xff0c;大家普遍提到一个痛点&#xff1a;从大型商业软件&#xff08;比如SAP、Oracle EBS&#xff09;或者一些老旧的、文档不全的遗留系统中抽取数据时&#xff0c;经常会遇到各种“非标准”的数据格式。这…...

Codex 杀进 Chrome!接管了我的浏览器后,我在摸鱼

家人们&#xff0c;Codex 这次真的往普通电脑工作流里钻了。 OpenAI 已经宣布&#xff0c;Codex 现在可以直接在 macOS 和 Windows 的 Chrome 中运行。 它可以和 Chrome 里的应用、网站配合得更好&#xff0c;还能在后台标签页之间并行运行&#xff0c;不会一直占用你的键盘鼠标…...