[元带你学: eMMC协议 24] eMMC Packed Command CMD23读(Read) 写(write) 操作详解

news2024/9/22 19:36:07

依JEDEC eMMC及经验辛苦整理,原创保护,禁止转载

专栏 《元带你学:eMMC协议》

内容摘要

全文 3200 字, 主要内容

目录

前言

1 Packed Commands 有什么用处?

2 Packed Commands 怎么实现?

Packed Write Flow

Packed Read Flow

3 Packed Command Header 要怎么填?

4 Packed Commands Error Handling 异常怎么定位?

5. Q/A

参考


前言

现实中,对 eMMC Device 随机读写的地址往往都不是连续的,每一个随机读写都需要通过一个独立的读写流程来实现,通常随机读写很慢。有没有好的办法呢?

1 Packed Commands 有什么用处?

eMMC 引入了 Packed Commands 机制,将多个地址不连续的数据写入请求封装到一个 Multiple Block Write 流程中,同时将多个地址不连续的数据读取请求封装的一个 Multiple Block Read 流程中,以此减少读写请求命令数量,减少host 和 eMMC 沟通次数, 提高数据读写的效率。

参考[EMMC Packed Command_emmc cmd23]

Packed Command 是 eMMC 4.5 引入的, 当时还是满有用的。但很可惜, 后面eMMC 引入的 Command Queue Read/Write 速度优势更明显,实现也更友好。所以支持 Packed Command 只是一个过渡期的功能, 就像当年的 Vista 操作系统, 只是昙花一现(介于XP 和 Window7 之间)。

我见过的平台其实都没有用过 packed command, 不是几乎没有,是真的没有。

如果你是host 端人员, 你的平台有这个功能, 你可以继续往下看, 如果没有就不用太花时间了解。细节很多, 但然而不实用。如果是设备端人员, 不好意思, 这个功能是必须的功能, 别人可以不用,你不能不支持,再不情愿也了解清楚吧。

2 Packed Commands 怎么实现?

怎么区分命令是packed command R/W还是 基本R/W?

如果 CMD23的参数的 bit30 置 1,就是打包命令了,未置1,就是普通R/W 的cmd23命令。

 图 Packed Command CMD23 和 普通 CMD23 区别

Packed Write Flow?

CMD23(块count N+1) + CMD25 + Data(N)

(1) 打包写命令可以使用设置了打包标志的SET_BLOCK_COUNT命令(CMD23)对几个写多块命令进行分组。

(2) 然后,WRITE_MULTIPLE_BLOCK (CMD25)应该紧随其后,第一个块包含如下所述的packkedcommand头。

(3) 然后,按照在 header中出现的顺序,将各个打包命令的所有数据扇区附加在报头之后发送。在这种情况下,CMD23中指定的块计数应该是各个写操作的所有块计数之和加上 heaer 的1。

Packed Read Flow

CMD23(块count 1) + CMD25 + Data(Header) + CMD23(块count N) + CMD18 + Data(N 块)

第二个CMD23 也可不下, 就变成

CMD23(设置count 1) + CMD25 + Data(Header) + CMD18 + Data

打包读命令可以使用SET_BLOCK_COUNT命令(CMD23)将几个读取多个块命令分组,该命令设置了Packed标志,块计数为1。

然后,WRITE_MULTIPLE_BLOCK (CMD25)应该只跟在报头后面。

然后,CMD23可以再次发送,并设置打包标志,块计数等于单个读取的所有块计数之和(这里的CMD23是可选的-允许开放式读取)。

然后是READ_MULTIPLE_BLOCK (CMD18)来读取打包的数据。主机不应该发送任何其他命令(除了CMD13 SEND_STATUS),直到打包的读命令序列完成(即不允许在发送头和读取数据之间插入命令),否则设备行为未定义。

 Command 带的地址怎么设?

在读和写的两种情况下,CMD25的参数(对于打包写和打包读的头)和CMD18的参数应该是由打包组中的第一个单独的读或写命令指定的相同地址。如果参数与第一个单独命令的地址不匹配,则未定义设备行为。

最多可以打包多少读写命令?

单个打包命令中可以打包的最大读或写命令数由设备分别在EXT_CSD的MAX_PACKED_READS和MAX_PACKED_WRITES字段中报告。

3 Packed Command Header 要怎么填?

图  Packed command Header Format

打包的命令头在数据的第一个块(DATA_SECTOR_SIZE[61]- 0x00)上发送,如果是打包的写命令,则在数据的前8个块(DATA_SECTOR_SIZE[61]=0x01)上发送,如果是打包的读命令,则在读取打包的数据之前发送一个单独的写命令。该结构包含:

  • 结构的版本-一个字节来指示未来兼容性的版本;应设置为Ox01
  • R/W标志-Ox01为打包读,Ox02为打包写
  • 表中的表项数
  • 然后,对于每个条目: 

       (1) 单个命令的CMD23参数(4字节),格式化为CMD23,包括"count "字段和各种标志字段(高  位),'打包'位总是'0'(除了'打包'位,所有其他CMD23参数位仍然允许在报头中)。每个单独的读写命令不应是开放式的。如果头中cmd23参数的[15:0]位被设置为0,则设备行为未定义。

        (2) CMD18或CMD25的参数(4字节)-由单个命令读取/写入的地址

4 Packed Commands Error Handling 异常怎么定位?

如果发生错误, 后面命令还会执行吗?

不会的,如果单个命令中的一个导致失败,则不会执行同一打包命令中的后面的单个命令。

如果出错了, 还会继续和 host 传数据吗?

对于打包读取,设备可能会为未执行的命令传输一些数据(可能是随机的),以完成指定的块数量(因为主机正在等待所有块)。者,它可以在故障点停止传输数据,从而导致超时。对于打包写,设备应该忽略未执行命令的传输

在任何失败的情况下,EXT_CSD中的PACKED_COMMAND_STATUS字段中的通用错误标志被设置(例如,错误的头,包中的命令多于设备支持的命令等)。

如果在打包命令中的单个命令期间出现任何错误,则应设置“错误索引”标志以及通用错误,并且EXT_CSD中的PACKED_FAILURE_INDEX字段应报告失败命令的头块中的索引, 即heaer 中哪一条 Command 出错。

如果发生异常, 在Command 的 response 能侦测到吗?

此外,如果主机通过向EXCEPTION_EVENTS_CTRL写入一个值'1'来启用PACKED_COMMAND_STATUS,则异常事件位可能会在PACKED_COMMAND_STATUS中报告一个非零状态。一旦使能,如果PACKED_COMMAND_STATUS不为零,则设备状态中的异常位(在每个R1响应中报告)将被设置。

当使用打包命令时,命令响应中的错误报告可能会延迟到实际打包读/写传输(传输打包数据的CMD25或CMD18)之后的命令。例如,如果一个打包的命令访问了超出范围的地址。ADDRESS_OUT_OF_RANGE错误可能会延迟.

5. Q/A

哪些分区不能用 Packed Command?

Boot 和 RPMB 不能用, 其他分区可以用。

Packed Command 可以用于做 FFU 吗?

不可以

Packed Command  支持 Cache ON 吗?

支持

Packed Command  reliable write 和 force program 吗?

支持

有更多问题,可在评论区留言给我。


参考

[1] JEDEC eMMC 5.1

[2] EMMC Packed Command_emmc cmd23_申小白的博客-CSDN博客

免责声明

本文根据公开信息整理,旨在介绍更多的存储知识,所载文章仅为作者观点,不构成投资或商用建议。本文仅用于学习交流, 不允许商用。若有疑问或有侵权行为请联系作者处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/735790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【爬虫】5.4 Selenium 实现用户登录

目录 任务目标 创建模拟网站 创建服务器程序 键盘输入动作 鼠标点击动作 编写爬虫程序 任务目标 Selenium 查找的 HTML 元素是一个 WebElemen t对象, 这个对象不但可以获取元素的属性值,而且还能执行一 些键盘输入send_keys()与鼠标点击click()的动…

leetcode 617. 合并二叉树

2023.7.9 这题要求合并两二叉树,若节点重叠则将节点值相加。 和之前不同的是需要同时对两棵树进行操作,我选用队列来做这题。 大致思路:通过遍历两棵树的对应节点,将节点值相加并合并到第一棵树上。如果某个节点为空,…

Squid 缓存服务器

Squid 缓存服务器 作为应用层的代理服务软件,Squid 主要提供缓存加速和应用层过滤控制的功能 ☆什么是缓存代理 当客户机通过代理来请求 Web 页面时 指定的代理服务器会先检查自己的缓存,如果缓存中已经有客户机需要访问的页面,则直接将缓…

Qt实现思维导图功能(五)

前文链接:Qt实现思维导图功能(四) 思维导图纵向分布模式:模式一 百度网盘体验地址: 链接:https://pan.baidu.com/s/1YNSBiFOUwnSSKvHsBvOT3g 提取码:ifyc动态演示效果 静态展示图片 前文BUG维…

Linux 网络IO管理(epoll实现)

文章目录 1、网络IO模型1.1、阻塞IO(blocking IO)1.2、非阻塞IO(non-blocking IO)1.3、多路复用 IO(IO multiplexing)1.4、异步 IO(Asynchronous I/O)1.5、信号驱动 IO(s…

可恶的剪绳子问题

1. 剑指 Offer 14- I. 剪绳子 题目描述:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最…

3.6.共享内存的学习

目录 前言1. 共享内存2. shared memory案例3. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习精简 CUDA 教程-共享…

基于Qt5 实现的简易慕课爬取程序

基于Qt5 实现的简易慕课爬取程序 一、项目概述二、源代码 一、项目概述 名称:MookScrapy 这个项目主要是使用了 Qt 里面的 QNetworkAccessManager 去下载慕课网站的数据 https://coding.imooc.com,也就是这个网站里面的卡片信息。然后做一定的分析和展示…

【架构设计】酒店预订应用的系统设计架构(如 Airbnb、OYO)

Airbnb、Booking.com 和 OYO 等酒店预订应用程序如何提供从酒店列表到预订再到付款的流畅流程?而且都没有一个小故障!在此博客中,您将获得对此的详细解释。由于它们非常庞大,以至于它们需要处理大量的用户流量。所以要管理这些&am…

计算机视觉:卷积核的参数可以通过反向传播学习到吗?

本文重点 在深度学习中,卷积神经网络(Convolutional Neural Networks, CNN)是一种常用的神经网络结构,其中卷积核是CNN的核心组件之一。卷积核是一个小矩阵,用于对输入数据进行卷积操作。卷积操作可以提取输入数据的特征,通过不同的卷积核可以提取不同的特征。 在前面课…

Wireshark TS | 二谈访问网页失败

前言 又一个访问网页失败的案例,该案例来自于 Wireshark sharkfest 2018 - Point And ShootPacket,其中的 Case 2 Cannot see homepage,描述的是来自 OSAKA 的用户抱怨访问一些网站页面不能显示,但是另外一些网站页面可以&#x…

软件测试岗位新标准:ISTQB认证与软件测试工程师职业发展

随着信息技术的飞速发展,软件测试行业也变得越来越重要。软件测试是保证软件质量的关键环节,因此,软件测试工程师的岗位也越来越受到重视。 ISTQB认证成为了衡量软件测试工程师职业能力的标准。 下面领测国际ISTQB考试认证中心就带您了解一下…

depot_tools问题记录 - 执行fetch/gclient命令无响应

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 在研究将Dart dill文件序列化为可读文本时遇到的问题。 开发环境 macOS: 13.4 问题描述 之前使用depot_tools中的fetch/gclient命令还是正常的,今天想实测--no-history参数时突然遇到命令无响应的情况…

Redis 删除 key用 del 和 unlink 有啥区别?

问题 del 和 unlink 有啥区别啊?为什么String类型删除不会做异步删除? 彬彬回答 DEL 和 UNLINK 都是同步的释放 key 对象,区别是怎么释放后面的 value 对象 DEL 每次都是同步释放 value 部分,如果 value 很大,例如一…

Openssh升级方法详解

项目组linux服务器被绿盟扫描出openssh 1.0.2版本有漏洞,需要升级到7.5版本,以下是升级过程: 第一步 安装Telnet服务 先下Openssh软件包 看你需要什么版本http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/ 1.查看当前的ssh服务版本 …

【前端】网页开发精讲与实战 HTML Day 2

🚀Write In Front🚀 📝个人主页:令夏二十三 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:前端 💬总结:希望你看完之后,能对你有…

看完这篇 教你玩转渗透测试靶机Vulnhub——The Planets:Mercury

Vulnhub靶机The Planets:Mercury渗透测试详解 Vulnhub靶机介绍:Vulnhub靶机下载:Vulnhub靶机安装:Vulnhub靶机漏洞详解:①:信息收集:②:漏洞发现:③:SSH登入:…

架构师进阶之路 - 微服务怎么划分

目录 微服务划分目标 业务、技术、团队导向规划服务 领域检查 依赖DAG检查 分布式事务检查 性能分布检查 稳定(易变)性检查 调用链检查 微服务划分目标 我们常说服务的合理划分是微服务成功的重中之重,一个合理的服务划分应该符合一下…

SQL中如何用快照,恢复被误删的数据?

什么是快照 数据库快照是sql server 2005的一个新功能。MSDN上对它的定义是: 数据库快照是数据库(称为“源数据库”)的只读静态视图。在创建时,每个数据库快照在事务上都与源数据库一致。在创建数据库快照时,源数据库…

THREE.JS镜头随鼠标晃动效果

为了让动画更灵活并且简单 借助gsap让其具有更多可能,在未来更容易扩充其他动效 gsap Dom跟随鼠标移动 gsap.quickTo() 首先要监听鼠标移动,并且将移动的值转换到 -1 和 1 之间 方便处理 private mousemove(e: MouseEvent) {const x (e.clientX / inner…