以前,我研究过SanDisk的microSD卡,该卡可用于写密集型应用(例如行车记录仪)。然后,我研究了速度测试的结果,并考虑了卡中使用哪种类型的NAND闪存。SanDisk不会发布有关卡的内部结构的详细说明,所以我别无选择,只能自己对卡进行反向工程。
技术支持失败
为了挖掘信息,我向SanDisk支持小组发送了一封电子邮件,询问他们在其High Endurance系列中使用的是哪种类型的NAND Flash,以及诸如P / E(程序/擦除)周期数和通用性等耐久性指标。写入的兆字节数(TBW)。不幸的是,SanDisk支持人员无法提供令人满意的答案,因为他们没有提供未发布的规范中未指定的信息。有人告诉我他们所有的卡都使用MLC Flash,如果您将TLC Flash 3位称为“ MLC”(与Samsung一样),这是正确的。
尊敬的杰森,
谢谢您与SanDisk全球客户支持联系。感谢您成为SanDisk系列的一员。
我们了解您想进一步了解我们的SanDisk高耐用性视频监控卡。让我们通知您,我们所有的存储卡都使用多级单元闪存技术。但是,闪存的读/写周期数未发布或记录。仅发布读写速度,即100 MB / s和40 MB / s。64GB卡可以录制长达10,000小时的全高清视频。详细信息可以在这里找到。
SANDISK高端视频监控microSD卡
谨此向...
我会给他们一块奖牌,上面写着“您尝试过”。
SD卡剖析
microSD卡可能看起来像单片设备。但是,这些卡由许多不同的芯片组成,每个芯片起着不同的作用。最简单的SD卡将具有一个控制器,该控制器控制NAND闪存芯片并与主机(PC,相机等)以及NAND闪存本身(由一个或多个闪存晶体组成)通信。 Bunnie Studios博客上有一篇有关SD卡构造的出色文章,其中包括对仿冒品及其制造的描述。
典型SD卡的框图
经常(但并非总是)找到MicroSD卡用于在生产中对NAND闪存进行编程和测试的测试站点。它们可用于恢复数据,或在控制器或固件有故障的情况下重新使用microSD卡。它们允许您将卡变成简单的NAND闪存-您可以在Gao Louis的博客上阅读有关此内容的信息。请注意,对于这样的测试站点(甚至在一个制造商内部)没有标准,但是,某些制造商,特别是SanDisk,具有促进反向工程的模式。
蹲伏控制器,潜伏测试垫
MicroSD卡属于“单片式”闪存设备,因为它们将控制器和NAND闪存组合成一个不可分离的封装。许多制造商正在将闪存数据总线带到隐藏的(几乎没有文档)测试站点。在他们的帮助下,其他存储卡和USB闪存驱动器制造商可以生产出价格低廉的故障零件驱动器。可以简单地关闭控制器,并且可以像使用普通芯片一样使用闪光灯。
对于SanDisk卡,其测试站点的引脚排列上的信息极少。每一代都有其自己的差异,但布局基本上保持不变。这种差异可能是致命的,因为有时会交换电源和接地的引脚(如果极性不正确,芯片将立即死亡!)。
我的卡(以及昂贵的产品线中的许多公司的卡-不是Ultra)都具有测试垫,该测试垫没有覆盖清漆,而是覆盖有带有激光切割序列号的某种丝网印刷环氧树脂。我进行了预热,刮擦并设法从测试垫上除去了这种非常脆弱的涂层。为此,我还删除了序列号-可能这就像保修印章一样。
环氧测试垫
概述测试
垫去除了环氧涂层的痕迹后,我遇到了熟悉的测试垫布局,下面还添加了一些其他测试垫。
创建接口模块
接口模块的概念非常简单。对于每个测试垫,我们拔出一条导线,引出一个更大的垫以便于访问,并将普通的SD总线连接到SD连接器,以便控制器在修补NAND Flash总线的同时完成其工作。考虑到测试站点的规模较小且数量众多,结果可能有些草率。
接口模块组件
接口模块,放大照片
首先,将带有双面胶带的卡片粘贴到面包板上。然后,我给所有焊盘镀锡,并在卡的Vcc和GND焊盘上焊接一个小的1uF陶瓷电容器。我使用40 AWG(0.1mm)漆包线将每个测试垫连接到面包板上的相应引脚。连同其他站点,总计28条微小的电线!
对于SD连接器,我使用了带有设备的电缆,该设备用于维修HTC的Android手机“ XTC 2 Clip它像“灵活的远程SD卡”一样工作,并通过一条小的柔性电缆路由信号。我用铜带包裹了电缆,以防止噪声和放大,然后将其焊接到面包板的外垫上,以增强结构,然后镀锡电缆的末端,并将漆包线连接到卡的引脚,然后我将带有电阻的LED插入电源线,以便可以看到卡何时通电。
公交车分析
分布了所有测试接触点的测试站点之后,我可以开始了解这些接触点对访问卡内NAND闪存的作用。
通常,针脚布局与大多数SanDisk microSD卡相同。
为了分析所有引脚的信号,我使用了DSLogic Plus逻辑分析仪... 数据传输的引脚排列是已知的,最艰巨的工作已经完成(数据总线,控制,地址,命令,写保护,忙/闲状态)。但是,并不是每个触点的作用都是显而易见的-我发现引脚排列包括允许与NAND Flash配合使用的最小总线数-控制总线除外,它使控制器进入复位模式并使它与数据总线控制断开连接(这在以后很重要) ...
通过以DSLogic可用的最大速度监听数据总线(并使用可用的32MB缓冲区),我能够在初始化时编译从控制器发送到NAND闪存的清晰命令列表。
总线侦听和NAND I / O的基础知识(写入命令,地址,读取数据)
我专门寻找了两个命令:RESET(0xFF)和READ ID(0x90)。查找命令序列时,重要的是要知道何时以及如何更改数据和控制总线。我将尝试逐步解释所有内容。如果您有兴趣,我推荐Micron的手册,该手册介绍了NAND Flash的基础知识,并提供了有关其工作原理的更多信息。
使用逻辑分析仪跟踪SanDisk高耐久性128GB RESET命令。虚线标记了写入和重置命令的外观。
使用逻辑分析仪跟踪SanDisk高耐久性128GB RESET命令。虚线标记了读/写命令的外观。
当将RESET命令发送到NAND闪存时,/ CE(片选,低电平有效)总线首先被下拉。然后将CLE总线(命令锁存启用)上拉;数据总线被设置为其预定值0xFF(二进制);然后/ WE(写使能,低电平有效)总线从高电压变为低电压,然后又回到高电平(当/ WE总线从低电压变为高电压时,来自数据总线的数据被传输至芯片,即所谓的信号沿“); CLE总线被拉回原位,恢复正常。然后,闪存芯片将R / B(就绪/繁忙状态)总线拉低,以指示它正忙于复位,并在完成后将总线拉回到顶层。
READ ID命令的工作方式类似,不同之处在于将命令0x90(1001 0000)写入数据总线后,它拉高ALE(地址锁存使能)总线而不是CLE,并写入0x00(所有二进制零),结果为/ WE到较低状态。芯片将写入其的NAND Flash ID传输到内部读取寄存器,并在总线/ RE的每个边缘上从器件读取数据(读取使能,低电平有效);对于大多数设备,这是4到8字节的数据。
NAND闪存ID
每个NAND闪存设备都有自己的(大部分)唯一标识符,该标识符将其与特定制造商和其他特定于制造商的功能数据相关联。换句话说,仅由JEDEC技术协会分配的制造商ID定义良好。
第一个字节指示芯片的制造商,其余字节(从2到6)定义设备的特性-所有这些均由制造商自己确定。大多数NAND制造商都不愿发布设备规格,SanDisk(以及扩展名为Toshiba / Kioxia)对这些数据非常严格,不过在线泄漏的Toshiba数据表有些过时。由于这些公司共享制造能力,因此可以得出有根据的猜测,即制造商定义的数据中的数据结构可以相互匹配。
至于128GB SanDisk High Endurance卡,它使用的NAND Flash ID为0x45 48 9A B3 7E 72 0D 0E。其中一些数字可以与东芝规格进行比较:
| 字节(十六进制) | |
|---|---|
| 45
|
: SanDisk
|
| 48
|
I/O : 1.8 volts ( )
: 128 ( ) |
| 9A
|
NAND: TLC (Triple-Level Cell / 3 )
/CE: 4 ( 4 32 ) |
| B3
|
: 12 (768 )
: 16 384 / 16 |
| 7E
|
/CE: 8 (2 )
|
| 72
|
:
: BiCS3 3D NAND |
| 0D
|
( )
|
| 0E
|
( )
|
尽管并非所有字节值都可以明确确定,但我能够确定SanDisk High Endurance卡使用BiCS3 3D TLC NAND闪存-至少这是3D NAND,在可靠性方面大大超过了传统的平面NAND。不幸的是,仅凭此信息无法告知控制器在写操作中是否利用了SLC缓存机制。
根据Flash ID的前四个字节及其与Silicon Motion公司用于SM3271 USB Flash控制器和SM2258XT控制器的工具的配置文件行的比较,确定芯片制造过程的几何形状无DRAM SSD。这些工具分别从SDTNAIAMA-256G和SDUNBIEMM-32G芯片提供了所谓的SKU,但是在我看来,这与该卡中的闪存配置不符。
外部控制
我想确保从NAND闪存中获取正确的ID,因此我连接了德州仪器(TI)MSP430FR2433调试板,并编写了最简单的代码以发送必要的RESET和READ ID命令,并尝试从JEDEC参数页芯片的隐藏参数中并行提取其他数据。
我遇到的第一个障碍是,每当我尝试发送RESET命令时,MSP430都会复位,这表明MSP430板的有限电源无法应对该电流。当总线争用时可能会发生这种情况“当两个设备相互竞争时,试图同时对某个数字总线施加高电压和低电压。我不确定我了解发生了什么,因为没有关于如何关闭内置卡控制器的免费信息。是(因此,他“释放”了NAND总线,并允许其他设备控制它。)
我发现A1测试板(见图)是控制器的复位总线,如果将其电压保持在较低位置,控制器完全释放在NAND Flash的bus.After控制,从微控制器我的代码能够正确地和不受阻碍。读取闪存ID
读取闪存ID从卡
JEDEC设置页面...或至少SanDisk做了它!
JEDEC参数页面(如果有)包含Flash芯片的详细特性-比NAND Flash ID更详细-而且更加标准化。但是事实证明,SanDisk选择忽略该标准并使用它自己的标准!通常页面以ASCII字符串“ JEDEC”开头,但是我发现一个重复的字符串“ SNDK”(交易所上的公司名称)和其他与JEDEC规范中的任何内容都不匹配的数据!好吧,值得一试。
我使用了之前显示的同一Arduino草图收集了数据,并接收了1536个字节的数据。在Ideone上,我编写了一个小程序,将前512个字节转换为整齐的HEX转储:
Offset 00:01:02:03:04:05:06:07:08:09:0A:0B:0C:0D:0E:0F 0123456789ABCDEF
------ --+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- ----------------
0x0000 53 4E 44 4B 53 4E 44 4B 53 4E 44 4B 53 4E 44 4B SNDKSNDKSNDKSNDK
0x0010 53 4E 44 4B 53 4E 44 4B 53 4E 44 4B 53 4E 44 4B SNDKSNDKSNDKSNDK
0x0020 08 08 00 08 06 20 00 02 01 48 9A B3 00 05 08 41 ..... ...H.....A
0x0030 48 63 6A 08 08 00 08 06 20 00 02 01 48 9A B3 00 Hcj..... ...H...
0x0040 05 08 41 48 63 6A 08 08 00 08 06 20 00 02 01 48 ..AHcj..... ...H
0x0050 9A B3 00 05 08 41 48 63 6A 08 08 00 08 06 20 00 .....AHcj..... .
0x0060 02 01 48 9A B3 00 05 08 41 48 63 6A 08 08 00 08 ..H.....AHcj....
0x0070 06 20 00 02 01 48 9A B3 00 05 08 41 48 63 6A 08 . ...H.....AHcj.
0x0080 08 00 08 06 20 00 02 01 48 9A B3 00 05 08 41 48 .... ...H.....AH
0x0090 63 6A 08 08 00 08 06 20 00 02 01 48 9A B3 00 05 cj..... ...H....
0x00A0 08 41 48 63 6A 08 08 00 08 06 20 00 02 01 48 9A .AHcj..... ...H.
0x00B0 B3 00 05 08 41 48 63 6A 08 08 00 08 06 20 00 02 ....AHcj..... ..
0x00C0 01 48 9A B3 00 05 08 41 48 63 6A 08 08 00 08 06 .H.....AHcj.....
0x00D0 20 00 02 01 48 9A B3 00 05 08 41 48 63 6A 08 08 ...H.....AHcj..
0x00E0 00 08 06 20 00 02 01 48 9A B3 00 05 08 41 48 63 ... ...H.....AHc
0x00F0 6A 08 08 00 08 06 20 00 02 01 48 9A B3 00 05 08 j..... ...H.....
0x0100 41 48 63 6A 08 08 00 08 06 20 00 02 01 48 9A B3 AHcj..... ...H..
0x0110 00 05 08 41 48 63 6A 08 08 00 08 06 20 00 02 01 ...AHcj..... ...
0x0120 48 9A B3 00 05 08 41 48 63 6A 08 08 00 08 06 20 H.....AHcj.....
0x0130 00 02 01 48 9A B3 00 05 08 41 48 63 6A 08 08 00 ...H.....AHcj...
0x0140 08 06 20 00 02 01 48 9A B3 00 05 08 41 48 63 6A .. ...H.....AHcj
0x0150 08 08 00 08 06 20 00 02 01 48 9A B3 00 05 08 41 ..... ...H.....A
0x0160 48 63 6A 08 08 00 08 06 20 00 02 01 48 9A B3 00 Hcj..... ...H...
0x0170 05 08 41 48 63 6A 08 08 00 08 06 20 00 02 01 48 ..AHcj..... ...H
0x0180 9A B3 00 05 08 41 48 63 6A 08 08 00 08 06 20 00 .....AHcj..... .
0x0190 02 01 48 9A B3 00 05 08 41 48 63 6A 08 08 00 08 ..H.....AHcj....
0x01A0 06 20 00 02 01 48 9A B3 00 05 08 41 48 63 6A 08 . ...H.....AHcj.
0x01B0 08 00 08 06 20 00 02 01 48 9A B3 00 05 08 41 48 .... ...H.....AH
0x01C0 63 6A 08 08 00 08 06 20 00 02 01 48 9A B3 00 05 cj..... ...H....
0x01D0 08 41 48 63 6A 08 08 00 08 06 20 00 02 01 48 9A .AHcj..... ...H.
0x01E0 B3 00 05 08 41 48 63 6A 08 08 00 08 06 20 00 02 ....AHcj..... ..
0x01F0 01 48 9A B3 00 05 08 41 48 63 6A 08 08 00 08 06 .H.....AHcj.....
使用DSLogic分析仪进行的进一步分析表明,控制器需要一个4128字节(4K + 32字节)的参数页,并填充与上述相同的重复数据。
重设问题
检查逻辑分析仪中的数据后,我发现控制器发送了两次READ ID命令,但这是第一次不重置Flash(这通常需要在给芯片加电之后立即完成!)。稍微地说,芯片返回的数据很奇怪。
| 字节(十六进制) | 描述 |
|---|---|
| 98
|
制造商:东芝
|
| 00
|
I / O电压:未知(无数据)
设备容量:未知(无数据) |
| 90
|
NAND类型:SLC(单级单元/每个单元1位)
闪存芯片/ CE:1 |
| 93
|
块大小:4 MB(不包括备用区)页面
大小:16,384字节/ 16 kb(不包括备用区) |
| 76
|
矩阵/ CE:2
|
| 72
|
接口类型:异步
过程几何:平面70 nm |
起初这使我感到困惑,因为我试图通过仅解析逻辑来获取ID。但是,在与在NAND闪存数据恢复方面具有丰富经验的人交谈之后,我了解到这是SanDisk设备的规范。他们对特殊命令和数据结构非常松懈。如果您相信第四个字节,则块大小为4 MB,这对于现代Flash芯片似乎是合理的。其余信息对我来说没有意义,除了第一个字节说芯片制造商是东芝。
结论
为了解决SanDisk长期卡中使用哪种芯片这一简单问题,我走得太远了。他们似乎可以自豪地谈论使用3D NAND技术来提高可靠性和长期运行-但是没有!
档案
对于那些感兴趣的人,我将其打开后的数据发布到卡中。我还发布了一个Arduino的草图,允许您手动读取NAND ID和参数页面: