分类: LINUX
2012-02-09 18:22:08
一:SDIO简介
在介绍SDIO原理前,还是先来点SDIO知识的普及工作吧!
新兴的消费性电子产品不仅要求大容量,高速,而且要求数据的保密性。因此,美国MEI公司,美国SanDisk 公司,日本Toshiba 公司,组成联合小组推出SD Card协议规范。该协议规范定义了SD Memory Card和SDIO Card。
我们平常所说的SD卡即SD Memory Card(Secure Digital Memory Card安全数字存储卡),专为存储数据而设计。该协议规范定义了SD Memory 卡的电压范围为1.6~3.6V,默认模式下最大时钟为25Mhz,速率最大可达到12.5M字节/秒(4根数据线);高速模式下,最大时钟可达到50Mhz,速率最大可达到25M字节/秒(4根数据线)。并支持SPI传输模式。目前规范的V1.10版本最大容量只支持到2Gbyte,但未来可达到32Gbyte。
SDIO Card ,即Secure Digital Input/Output Card(安全数字输入输出卡),是与SD Memory Card兼容的一种卡。其兼容能力包括:机制,电气特性,功耗,信号,软件。SDIO Card是为高速数据I/O传输,低功耗移动电子设备而设计的。目前,应用在wifi,gps,gprs,条码扫描器等设备接口部分。其电压范围为2.0~3.6V。协议规范定义了两种类型的SDIO Card,即高速SDIO Card和低速SDIO Card。高速SDIO Card 支持SPI,1-bit SD 和4-bit SD 传输模式,其时钟最大可达到25Mhz,速率最大可达到10M字节/秒。低速SDIO Card,只需要SPI和1-bit SD 传输模式,4-bit模式可选,其时钟最大为400Khz。
二:深入SDIO
虽然,SDIO接口的产品越来越多,但相比SD Memory Card来说,网上的资料很少。也就是说,基本上要靠自己了,网络帮不了你什么忙!
S3C2410 datasheet中SDIO部分的介绍不够详细,很多部分仅仅提到,因此我怀疑sumsung们并不重视这一部分。或者说,他们不擅长这部分。
不管调试哪个从设备,第一步想到应该是去读出该设备的ID号,因为每个设备肯定是有ID号的,而且在其Datasheet中应该有说明,这是证明你读写寄存器最简单的方法了。对于很多I2C总线接口的设备,读出设备的ID号比较简单,只要读出存放该设备ID号的寄存器就OK了;但,针对SDIO接口规范,要读出SDIO卡的ID号,就不只操作一个寄存器这么简单了。因为,SDIO的最大速率达到10Mbyte,这么高的速率肯定是以其复杂的协议规范为代价的。
2.1 SDIO Signal Pins
三 读SDIO card ID 号
要读出ID号,需要对卡进行初始化工作。下面是我在S3c2410上调试conexant wifi card 时的初始化顺序
3.1 S3C2410—SDIO相关寄存器设置
对S3c2410的设置,要根据下列几种情况来考虑
1,polling方式;
2,interrupt 方式;
3,DMA方式;
因为,我最终是要用到DMA方式,所以我这里只介绍DMA方式的设置。(在调试过程中,一般是先从polling开始调试,因为其最简单)但,因初始化过程中只发送几个命令,所以,我还是采用的polling方式,即使用CMD53命令时,我才用到DMA。
而初始化时只需要设置rSDIPRE,rSDICON,rSDIDTIMER三个寄存器:
rSDIPRE:SDI 波特率设置寄存器,在发送数据前,波特率一般设置到400Khz;
rSDICON:SDI 控制寄存器,只需ByteOrder, FRST, CTYP置位;
rSDIDTIMER:数据超时寄存器;(等待SDI数据响应时间,一般设置到0xff00)
在设置完这些寄存器后应该delay 74个clock。
注意:发送每个命令前rSDICARG(命令参数寄存器),rSDICCON(命令控制寄存器)是必须设置的。
3.2 如何判断命令是否发送正确
命令发送后,需要根据rSDICSTA(命令状态寄存器), rSDIRSP0-3(命令响应寄存器)来判断是否正确响应。
rSDICSTA(命令状态寄存器)
如果,RspFin位置位,表示命令响应结束,但这并不代表命令响应正确,还有检测RspCrc, CmdTout 是否置位,如果置位则表示发生错误。(在发送cmd5时,crc位可以不管, 个人认为)在检测状态位的同时,还要判断RspIndex是否为你发送时的命令号。
rSDIRSP0-3(命令响应寄存器)要根据你所发送的命令来解析是否正确。
3.3 得到CIS 结构指针地址
3.3.1 什么是CIS
每个SDIO card 有一个CIS区域,在这个CIS区域内分成0-7八段,对应到FN0-FN7(Function Number 0-7)。而且,每个段的CIS都有一个CIS pointer(CIS 指针)指向其起始地址。(FN0-7代表每个SDIO卡支持功能数,发送CMD5后,响应R4的Number of I/O function 域指示卡所支持的最大功能号。即,如果Number of I/O function == 1,那么表示此卡支持FN0和FN1。FN0是每个卡都支持的,存放卡最基本的信息,Card Common Card Information Structure表示的就是这个意思,卡的ID号就存放在FN0所对应的CIS中,所以要读出卡的ID号,首先就要得到FN0所对应CIS的指针)
对,CIS(CIA)区域的读写操作是通过CMD52来实现的。
例:
我在得到conexant wifi card CIS指针时操作如下:
因为,卡ID号存放在common CIS内,所以我们需要操作FN0。根据SDIO协议规范FN0 CIS Pointer地址为0x09, 0x0A, 0x0B:
(见Simplified SDIO Card Specification.pdf 35page)因为,CMD52响应后返回数据为8bit,所以要送三次。第一次:
rSDICARG == 0x00001200;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x00001000;
解读0x00001200
0 000 0 0 00 0000 0000 0001 001 0 0000 0000
R/W flag |
Function Number |
RAW flag |
Stuff |
Register Address |
Stuff |
Write data or stuff bits |
1 3 1 1 17 1 8
解读0x00000B74(略)
解读0x00000A34(略)
解读0x00001000
0x00001000的低8位表示从地址0x09读出来的值为0x00;
第二次:
rSDICARG == 0x00001400;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x00001010;
解读0x00001400
0 000 0 0 00 0000 0000 0001 010 0 0000 0000
R/W flag |
Function Number |
RAW flag |
Stuff |
Register Address |
Stuff |
Write data or stuff bits |
1 3 1 1 17 1 8
解读0x00000B74(略) 解读0x00000A34(略)解读0x00001010
0x00001010的低8位表示从地址0x0a读出来的值为0x10;
第三次:
rSDICARG == 0x00001600;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x00001000;
解读0x00001600
0 000 0 0 00 0000 0000 0001 011 0 0000 0000
R/W flag |
Function Number |
RAW flag |
Stuff |
Register Address |
Stuff |
Write data or stuff bits |
1 3 1 1 17 1 8
解读0x00000B74(略)解读0x00000A34(略)
解读0x00001000
0x00001000的低8位表示从地址0x0b读出来的值为0x00;
最后,可以得到FN0 CIS指针地址为0x001000。
3.4 读出ID号
同样,读出ID号也是通过CMD52来实现的。(见5.2 CMD52及响应剖析)
我们可以从SDIO 协议规范中看出CIS 的整个区域地址范围为0x00001000~0x00017fff。
而,我刚才读出FN0 的CIS指针地址为0x001000,这证明是正确的。那么出厂时,这些CIS信息是如何存放在0x001000所在的区域的呢?以FN0为例,听我一一道来:
在0x001000起始的区域,SDIO 协议规范是以一个或多个链(连起来的列表)被称为数据块或tuples(便士)来组织这些CIS信息的。
每个链节点有三个域:
第一个域: 00 byte,表示tuple code号,也即TPL_CODE Tuple code: CISTPL_xxx(各种代码号见Table13-2);
第二个域:01 byte,表示tuple body字节数,也即到下一个节点的偏移地址;
第三个域:02~n+2 byte,表示tuple body内容;
有了这些知识,我们再来看我读写conexant wifi sdio card ID号的操作:
步骤一:读地址0x001000
rSDICARG == 0x00200000;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x 00001021;
解读0x00000B74(略)
解读0x00000A34(略)
解读0x00001021:0x00001021的低8位表示从地址0x001000读出来的值为0x21,查看table13-2得知为CISTPL_FUNCID
步骤二:读地址0x001001
rSDICARG == 0x00200200;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x00001002;
解读0x00000B74(略)
解读0x00000A34(略)
解读0x00001002:0x00001002的低8位表示从地址0x001001读出来的值为0x02,根据table13-1可知CISTPL_FUNCID的tuple body大小为2字节,读出来的第一个tuple code号并不为CISTPL_MANFID(0x20),而且知道其下一个节点的偏移量为2,需要继续读。
步骤三:读地址0x001004
rSDICARG == 0x00200800;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x00001022;
解读0x00000B74(略)
解读0x00000A34(略)
解读0x00001022:0x00001022的低8位表示从地址0x001004读出来的值为0x22,查看table13-2得知为CISTPL_FUNCE
步骤四:读地址0x001005
rSDICARG == 0x00200A00;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x00001004;
解读0x00000B74(略)
解读0x00000A34(略)
解读0x00001004:0x00001004的低8位表示从地址0x001005读出来的值为0x04,根据table13-1可知CISTPL_FUNCE的tuple body大小为4字节,读出来的第一个tuple code号并不为CISTPL_MANFID(0x20),而且知道其下一个节点的偏移量为4,需要继续读。
步骤五:读地址0x00100A
rSDICARG == 0x 00201400;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x00001020;
解读0x00000B74(略)
解读0x00000A34(略)
解读0x00001020:0x00001020的低8位表示从地址0x00100A读出来的值为0x20,查看table13-2得知为CISTPL_MANFID
步骤五:读地址0x00100C
rSDICARG == 0x 00201800;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x00001013;
解读0x00000B74(略)
解读0x00000A34(略)
解读0x00001013:0x00001013的低8位表示从地址0x00100C读出来的值为0x13,因为已得到CISTPL_MANFID节点号,根据Table13-1可直接读出tuple body信息,故此时地址为0x00100C,而非0x00100B。所以,读出来的值0x13即为conexant wifi sdio card ID号,这里你也可以读出0x00100B中的值,看CISTPL_MANFID的tuple body总共占多少字节,即可以把其所有信息读出来。
其实,开始我并不知道,这0x13就为conexant wifi sdio card ID 号,只是我把后续的三个字节读出来才知道。这后续的三个字节是003826,这咋一看也不知道什么东东,但是,在我看conexant提供的驱动代码时,发现其fireware文件名为03826.h,这样我就猜出来了。你想想,这CIS里不放些这样的信息,放什么信息呢?后来的操作,证明我的猜测是正确的,在探索真理的过程中,需要摸着石头过河,既然是探索,就要边走边看,柳暗花明的好事是常有的!
终于把如何读ID号写完,我要听听音乐了,上上网了。
五.多字节传输
ID号已经读出来了,
CMD52只是对单个寄存器进行读写操作,而SDIO的优势是多字节传输。SDIO的协议规范专门定义了一个命令CMD53来实现。
多字节传输又分流方式和块方式。(Stream Mode or Block Mode)
因为,要挂接DMA,所以我这里先介绍BlockMode。
5.1 如何着手
调试这类设备,一般是先写,然后读,看读出来的是否与写进去的相等。但,有时对一个全新的东西没有一点把握,此时可先读,看读出来的是不是那么回事。(如何把SDIO挂接到DMA上去,我这里就不介绍了)
5.2对CMD53的理解
S,D,Command Index,R/W Flag,CRC7,E这些域应该不用解释了;
Function Number:在实际配置命令参数时,应该设置为多少呢?还记得发送CMD后的响应值吗,你这里的值要根据它来设置,在我的例子中,CMD5返回值中Function Number为1(即可支持到FN0和FN1),因为FN0中存放的是common CIS,所以,要读写卡内存,应该用FN1,故这里设置到1.
Block Mode: 设置到1;
OP code: 设置到0(固定地址);(我还没有完全搞懂 )
RegisterAddress: 设置到0;(我还没有完全搞懂 )
Byte/BlockCount: 设置到2,表示只传输2个块。
注意:如果BlockMode设置到0,表示以流方式(Stream)传输,Byte/BlockCount就应该是要传输的字节数;如果BlockMode设置到1,表示以块方式(Block)传输,Byte/BlockCount就应该设置为要传输的块的数目。
5.3 以块方式读10个字节
5.3.1 CMD53配置
rSDICARG == 0x18000002;
rSDICCON == 0x00000B75;
响应
rSDICSTA == 0x00000A35;
rSDIRSP0 == 0x00001300;
解读0x00000B75(略)
解读0x00000A35(略)
解读0x00001300:参照R5可知发生了command out of range! invalid function number!两个错误。对于这两个问题,因Function Number错误只涉及到一个位,所以先解决这个问题。根据参考代码(我这里有一份Marvell-wifi-sdio-card代码)发现有操作CCCR的02寄存器,但当时也没有去在意这个操作,后来细读SDIO规范,发现I/O enable这个寄存器是个非常重要的寄存器。
看到了吗?I/O Enable控制着IOE1~IOE7,这七个IOE对应着FN1—FN7,
所以要用FN1功能就必须使能IOE1。
对I/O Enable的操作是通过CMD52来实现的。
5.3.2 对CCCR I/O Enable的操作
CMD52配置
rSDICARG == 0x80000402;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x00001002;
解读
0x00000B74(略)
0x00000A34(略)
0x00001002: 低8位表示写到I/O Enable寄存器的值为2。
回到5.3.1,再次发送CMD53(内容略)。
这次响应值为
rSDIRSP0 == 0x00001100;
说明invalid function number错误已解决;还剩下command out of range错误,造成这个错误的
原因比较多,所以很难定位。这个地方花了我比较长的时间,后来同事提醒我块的尺寸设置没有(他
当时也在帮我看着部分),我突然想起参考代码有这个动作,只不过他放在写块中,而我调试的是读
块动作。所以,我马上把这个动作加进去了,果然得到了回应码0x00001000;
5.3.3 对FN1的I/O block size的操作
CMD52配置
设置block size低8位
rSDICARG == 0x8002200A;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x0000100a;
解读 0x00000B74(略)
0x00000A34(略) 0x0000100a: 低8位表示设置到FN1 Block Size大小的低字节为0x0a。
设置block size高8位
rSDICARG == 0x80022200;
rSDICCON == 0x00000B74;
响应
rSDICSTA == 0x00000A34;
rSDIRSP0 == 0x00001000;
解读 0x00000B74(略)
0x00000A34(略) 0x00001000: 低8位表示设置到FN1 Block Size大小的高8位为0x00。回到5.3.1,再次发送CMD53(内容略)。这次响应值为
rSDIRSP0 == 0x00001000; OK!
而且,DMA中断发生了,并且得到了读出来的值。但,因不知道这读出来的20个字节为何物,所以还得先写,如果都以块操作应该没什么问题。
5.3 以块方式写10个字节
5.3.1 CMD53配置
rSDICARG == 0x98000002;
rSDICCON == 0x00000B75;
响应
rSDICSTA == 0x00000A35;
rSDIRSP0 == 0x00001000;
rSDIDSTA == 0x00000010;
解读0x00000B75(略)
解读0x00000A35(略)
解读0x00001000(OK)
解读0x00000010(发送完成)
5.4 Stream Mode存在的问题(具体操作略)
其实,最开始我以简单起见,一直都是以Stream Mode方式操作的。
先写20个字节,好像也没发现什么异常,但,发现读时DMA中断不能发生。这是何故呢?
在传送数据时还有个数据状态寄存器rSDIDSTA(其实,我每发送一个命令把所有的状态寄存器读打印出来了),发现在写块后,其值老为0x00000002,表示数据正在发送。明明发送完了,命令也正确响应,为什么还在发送呢?再后来,我又去掉写动作,只读,发现虽然把数据读出来,但数据状态寄存器rSDIDSTA老是0x00000001,表示正在接收。
在此,我徘徊了很久,而且百思不得其解!
一次偶然,我从Block Mode转到Stream Mode时忘了清S3c2410 SDIO 的数据控制寄存器rSDIDCON的【17】位,即Block Mode位,发现竟然读出了我想要的20个数据。我茫然,怎么会这样呢?既然是以Stream Mode方式,为什么S3C2410 SDIO数据控制寄存器要设成Block Mode方式呢?这难道是sumsung s3c2410 datasheet对SDIO部分介绍不够专业的原因?
5.5 s3c2410 sdio 块传输相关寄存器设置
只需注意rSDIDCON(数据控制寄存器)的设置:
写时设置为rSDIDCON = 0x0033b002;
读时设置为rSDIDCON = 0x002ba002;
六 SDIO协议规范—与—S3C2410寄存器对应关系
6.1 CMD5剖析
Cmd5 协议规范
S |
D |
Command Index 000101b |
Stuff bits |
I/O OCR
|
CRC7 |
E |
1 1 6 8 24 7 1
S(tart bit): Start bit. Always 0
D(irection): Direction. Always 1 indicates transfer from host to card
Command Index: Identifies the CMD5 command with a value of 000101b
Stuff Bits: Not used, shall be set to 0
I/O OCR: Operation Conditions Register. The supported minimum and maximum values for VDD. The layout of the OCR is shown follow
I/O OCR bit position |
VDD voltage window (in Volts) |
0-3 |
Reserved |
4 |
Reserved |
5 |
Reserved |
6 |
Reserved |
7 |
Reserved |
8 |
2.0-2.1 |
9 |
2.1-2.2 |
10 |
2.2-2.3 |
11 |
2.3-2.4 |
12 |
2.4-2.5 |
13 |
2.5-2.6 |
14 |
2.6-2.7 |
15 |
2.7-2.8 |
16 |
2.8-2.9 |
17 |
2.9-3.0 |
18 |
3.0-3.1 |
19 |
3.1-3.2 |
20 |
3.2-3.3 |
21 |
3.3-3.4 |
22 |
3.4-3.5 |
23 |
3.5-3.6 |
Table 1
CRC7: 7bits of CRC data
E(nd bit): End bit, always 1
在S3C2410中要发送CMD5需要设置rSDICARG ,rSDICCON ,两个寄存器。
rSDICARG:SDI 命令参数寄存器;
rSDICCON:SDI 命令控制寄存器;
这两个寄存器合起来构成SDIO协议规范中的CMD5命令。其中:
rSDICARG[24:0]=====================CMD5[31:8] 高8bit无效
rSDICCON[7:0]======================CMD5[47:40]
个人观点: CMD5的stuff bit ,CRC7bit ,Endbit可以不管。因为他们的值固定,s3c2410已把他们做到SDIO控制器里面去了,实际发送命令时,这些位都传过去了,只是我们看不到而已。
CMD5命令响应—与—S3C2410寄存器的对应关系
协议规定CMD5命令响应为R4,其响应格式为:
R4 响应格式
S |
D |
Reserved |
C |
Number Of I/O functions |
Memory present |
Stuff Bits |
I/O OCR |
Reserved |
E |
1 1 6 1 3 1 3 24 7 1
S(tart bit): Start bit. Always 0
D(irection): Direction. Always 0 indicates transfer from card to host
Reserved: Bits Reserved for future use. These bits shall be set to 1.
C(omplete): Set to 1 if card is ready to operate after initialization.
I/ OCR : See Table 1
Memory Present: Set to 1 if the card also contains SD memory . Set to 0 if the card is I/O only.Number of I/O Functions:Indicates the total number of I/O functions supported by this card. The range is 0-7. Note that the common area present on all I/O cards at Function 0 is not included in this count. The I/O functions shall be implemented sequentially beginning at function 1.
Stuff Bits : Not used ,shall be set to 0.
个人观点: R4的长度为48bit,因为很多位是固定的,因此,S3C2410把它做到了一个响应
寄存器中,即rSDIRSP0(响应寄存器0)。
发送CMD5命令后,通过Polling或interrupt方式读取rSDIRSP0中的值。我发
送CMD5(0x00000345)后得到的响应寄存器0的值为90FF8000。下面对90FF8000进行解码分析。
1 001 0 000 1111 1111 1000 0000 0000 0000
C |
Number Of I/O functions |
Memory Present |
Stuff Bits |
I/O OCR |
1 3 1 3 24
C(omplete) == 1 表示初始化完成;
Number Of I/O functions == 001 表示此SDIO card所支持的功能号为0~1;
Memory Present == 0 表示 此卡仅为I/O卡;
Stuff Bits == 000 (本应该为000)
I/O OCR == FF8000对应到Table1 ,即此卡支持的电压范围为【2.7v~3.6v】
6.2 CMD52及响应剖析
rSDICARG[7:0]=====================CMD52[15:8](Write Data or Stuff Bits)
rSDICARG[8]=====================CMD52[16] (Stuff)
rSDICARG[25:9]=====================CMD52[33:17] (Register Address)
rSDICARG[26]=====================CMD52[34] (Stuff)
rSDICARG[27]=====================CMD52[35] (RAW flag)
rSDICARG[30:28]=====================CMD52[38:36] (FunctionNumber)
rSDICARG[31]=====================CMD52[39] (R/W flag)
rSDICCON[7:0]======================CMD5[47:40](S/D/command index)
6.2.1 在S3c2410中,如何解读发送CMD52后的结果
在s3c2410中,解读任何一个命令发送后的状态是通过读取rSDICSTA(命令状态寄存器), rSDIRSP0-3(命令响应寄存器),然后分析的。以我读取conexant wifi SDIO card 出厂ID号为例,发送CMD52后,得到的这两个寄存器的值为:
rSDICSTA == 0x00000A34
rSDIRSP0 == 0x00001013
解码0x00000A34
0………..0 0 1 0 1 0 0011 0100
undefine |
Response CRC Fail |
Command Sent |
Command Time Out |
Response Receive End |
CMD line progress |
RspIndex |
18 1 1 1 1 1 8
Command Sent == 1 表示命令已发送;
ResponseReceiveEnd == 1 表示命令响应结束;
RspIndex == 0x34 表示命令号为52(0x34)
这表明命令状态OK。
解码0x00001013
0……0 0 0 01 0 0 0 0 0001 0011
undefine |
COM_CRC_ERROR |
illegal_COMMAND |
IO_CURRENT_STATE |
ERROR |
RFU |
FUNCTION_NUMBER |
OUT_OF_RANGE |
Read or Write Data |
16 1 1 2 1 1 1 1 8
IO_CURRENT_STATE == 01 表示 Execution CMD52 in CMD State;
Read or Write Data == 0x13 表示读出来的出厂ID号为0x13;
个人观点:CMD52 Response (R5)中的stuff域,E域因其值固定而在S3c2410中没有表现出来,而CRC7在rSDICSTA中有专门的crc位指示。而,S域,D域,CommandIndex域也在rSDICSTA中的【7:0】显示出来了,所以在rSDIRSP0中没有必要再显示这些值。
6.3 CMD53及响应剖析
rSDICARG[8:0]=====================CMD53[16:8] (Byte/Block Count)
rSDICARG[25:9]=====================CMD53[33:17] (Register Address)
rSDICARG[26]=====================CMD53[34] (OP Code)
rSDICARG[27]=====================CMD53[35] (Block Mode)
rSDICARG[30:28]=====================CMD53[38:36] (FunctionNumber)
rSDICARG[31]=====================CMD53[39] (R/W flag)
rSDICCON[7:0]======================CMD5[47:40](S/D/command index)
注意:CMD53的响应与CMD52一样为R5。
关于SD Group:
MEI(Matsu****a Electric Industrial Co.,LTD美国MEI公司,是无人值守自动支付电子交易系统,包括纸币器,硬币器,无现金支付系统,自动售货机管理解决方案的全球最大制造商之一),SanDisk Corporation(SanDisk, SanDisk 由 Dr. Eli Harari 在 1988 年创立,是一家在非易失性存储器技术方面享誉全球的国际性知名公司,已发展成为全球最大的闪存数据存储产品供应商。
同时为消费者(通过全球接近 200,000 个零售店面)和原始设备制造商 (OEM) 提供服务,SanDisk 设计、开发、制造和销售适用于各种电子系统和数字设备的闪存卡和其它产品。另外,SanDisk 还授权其它多个业界领先的公司使用其技术。
凭借闪存以紧凑、活动格式存储大量数据的功能,SanDisk 的产品已帮助推动数码相机、多功能移动电话、USB 闪存盘、MP3 音乐播放器和其它数字消费性设备的销售呈级数增长。
SanDisk 当前在美国拥有大约 720 项专利,在其它国家或地区拥有大约 400 项专利,而且是全球唯一一家有权制造和销售各种主要闪存卡格式的公司,这些格式包括 CompactFlash®、SD™、miniSD™、Micro SD、MultiMediaCard™、小型 MultiMediaCard (RS-MMC™ )、Memory Stick PRO™ 及相关的 Memory Stick™ 产品、xD-Picture 卡和™ USB 闪存盘。
),Toshiba Couporation(Toshiba,日本东芝)