标签 linux 下的文章
设备识别模式(Device identification mode)在设备识别模式下,Host会复位eMMC设备,验证工作电压范围和访问模式,识别eMMC设备并为总线上的eMMC设备分配相对设备地址(RCA)。在设备识别模式下,所有数据通讯都只使用命令线(CMD)。下图显示了总线模式,操作模式和设备状态之间的关系。每个eMMC设备状态都与一个总线模式和一个操作模式相关联的。从上图可知,设备识别模式包含3个状态,分别是idle状态,ready状态和identification状态。设备复位 当eMMC设备接收到参数为0x00000000的GO_IDLE_STATE(CMD0)命令后,eMMC设备就会进入idle状态。下面3种情况会让eMMC设备进入idle状态:引导模式流程完成以后,eMMC设备会进入idle状态;在pre-boot状态,如果CMD线保持低电平时间少于74个时钟周期,eMMC设备会进入idle状态;如果eMMC设备没有使能引导模式,在上电以后eMMC设备会进入idle状态;在idle状态,eMMC设备的RCA地址会被初始化为默认值0x0001,Host会将CLK线上的时钟频率设置为识别时钟频率fod(识别时钟频率fod的最大值为400KHz)。参数为0x00000000的GO_IDLE_STATE(CMD0)命令在除inactive状态外的其他状态都是有效的。考虑到CMD0的兼容性,如果eMMC设备在除inactive状态外的其他状态接收到CMD0命令(参数为除了0xFFFFFFFA和0xF0F0F0F0以外的其他值),eMMC设备将会把CMD0命令(参数为除了0xFFFFFFFA和0xF0F0F0F0以外的其他值)当做复位命令并进入到idle状态。访问模式验证 Host可以通过CMD1命令读取eMMC设备的OCR寄存器来了解eMMC设备的寻址模式(Access Mode)。Access Mode决定了eMMC设备在响应Host的数据读写命令时,是怎样对eMMC设备的内部存储器进行寻址的。eMMC 5.1协议定义了两种寻址模式:字节寻址(byte mode)和扇区寻址(sector mode)。字节寻址采用的是32位宽的寻址位数,这种寻址机制限制了eMMC的最大容量为2GB。为了支持更大容量的eMMC,后续的eMMC协议(比如eMMC 5.1协议)增加了sector寻址方式(1 sector=512B)。容量大于2GB的eMMC,都是采用sector寻址的方式。Host通过发送SEND_OP_COND(CMD1)命令给eMMC设备来询问eMMC设备的电压,寻址方式以及是否就绪。如果eMMC设备处于忙状态,eMMC设备回复的固定格式响应内容为0x00FF_8080(eMMC设备容量小于或等于2GB)或者0x40FF_8080(eMMC设备容量大于2GB)。如果eMMC设备进入ready状态,eMMC设备回复的固定格式响应内容为0x80FF_8080(eMMC设备容量小于或等于2GB)或者0xC0FF_8080(eMMC设备容量大于2GB)。SEND_OP_COND(CMD1)命令参数的[30:29]位域的值可以表明Host可以处理的寻址方式(一般情况下CMD1的参数为0)。OCR寄存器相应位域的数值可以表明eMMC设备要求的寻址方式。只有eMMC设备进入ready状态之后,通过SEND_OP_COND(CMD1)命令获得的OCR寄存器值中的寻址模式才是有效的。设备识别过程 在eMMC设备上电之后,如果eMMC设备没有使能引导模式,或者pre-boot状态下CMD线保持低电平时间少于74个时钟周期,或者eMMC设备引导模式流程完成,那么eMMC设备会进入设备识别模式的idle状态。当然了在除inactive状态外的其他状态下,Host发送参数为0x00000000的GO_IDLE_STATE(CMD0)命令之后,eMMC设备也会进入设备识别模式的idle状态。在idle状态下,eMMC设备会进行一些内部初始化工作,Host需要不断的发送SEND_OP_COND(CMD1)命令来查询eMMC设备是否完成初始化。Host发送的CMD1命令参数中,包含了Host支持的寻址模式信息,eMMC设备接收到Host的寻址模式信息之后会与自身要求的寻址模式进行匹配,如果eMMC设备容量大于2GB,但是Host不支持扇区寻址模式,那么eMMC设备就会进入inactive状态。当eMMC设备完成初始化之后,eMMC设备就会进入ready状态,此时Host通过CMD1查询到eMMC设备处于ready状态就会停止CMD1命令的发送。eMMC设备处于ready状态时,OCR寄存器的[31]位为1。在ready状态下,Host发送ALL_SEND_CID(CMD2)命令来获取eMMC设备的CID寄存器信息,eMMC设备在接收到CMD2命令之后会将CID寄存器的[127:1]位的内容通过响应回复给Host,之后eMMC设备就进入identification状态。CID寄存器中存储的是eMMC设备的CID信息(Card IDentification),CID是eMMC设备的标识信息,CID具有唯一性。CID由厂商ID,设备信息,OEM信息,产品名称,产品版本,产品序列号,制造日期组成。在identification状态下,Host发送参数包含16位RCA的SET_RELATIVE_ADDR(CMD3)命令来给eMMC设备分配RCA,给eMMC设备完成RCA分配之后,就代表设备识别模式完成,eMMC设备会进入到数据传输模式的stand-by状态。eMMC设备默认的RCA地址为0x0001,Host会在identification状态下为eMMC设备分配RCA,RCA主要用于数据传输模式下Host选择具体的eMMC设备。设备识别模式下,eMMC设备的状态图如下所示:
综述Host和eMMC设备之间的所有通信都由Host控制。总线上的所有通信都是以Host发送一个Command给eMMC开始的,eMMC对于收到的不同Command会做出不同的response,当然了eMMC对于收到的部分Command可以不做response。eMMC总线协议定义了5种操作工作模式,包括:引导模式(Boot mode),设备识别模式(Device identification mode),数据传输模式(Data transfer mode),中断模式(Interrupt mode),非活动模式(Inactive mode)。各个模式的描述如下:引导模式(Boot mode):当eMMC设备在上电后或者eMMC设备接收到命令参数为0xF0F0F0F0的CMD0命令或者eMMC设备检测到复位信号时,eMMC设备将处于引导模式(Boot mode)。在引导模式(Boot mode)下,eMMC设备会将boot data发送给Host,boot data的内容通常情况下是系统的引导程序。设备识别模式(Device identification mode):在boot mode工作模式完成或者eMMC设备不支持boot mode工作模式时,eMMC设备将处于设备识别模式(Device identification mode)。在设备识别模式下,Host会对eMMC设备做一些初始化的工作,比如设置eMMC设备的工作电压,配置eMMC设备的寻址模式,给eMMC设备分配RCA地址等。eMMC设备将一直处于设备识别模式,直到eMMC设备收到SET_RELATIVE_ADDR(CMD3)命令。数据传输模式(Data transfer mode):一旦eMMC设备的RCA地址被分配之后,eMMC设备就会进入数据传输模式(Data transfer mode),也就是说设备识别模式(Device identification mode)结束之后eMMC设备就直接进入数据传输模式(Data transfer mode)。当Host识别到eMMC总线上的eMMC设备之后,Host也将进入数据传输模式(data transfer mode)。中断模式(Interrupt mode):Host和eMMC设备同时进入或者退出中断模式(Interrupt mode)。在中断模式下,不会有数据传输。在中断模式下,唯一允许的消息是来自Host或者eMMC设备的中断服务请求。非活动模式(Inactive mode):当eMMC设备在操作电压范围或者访问的模式无效时,eMMC设备将进入非活动模式(Inactive mode)。Host使用GO_INACTIVE_STATE(CMD15)命令也可以让eMMC设备进入非活动模式(Inactive mode)。eMMC设备在上电后将进入到pre-idle状态。下图显示了总线模式,操作模式和设备状态之间的关系。每个eMMC设备状态都与一个总线模式和一个操作模式相关联的。引导模式(Boot mode)在引导模式下,Host可以从eMMC设备读取boot data,在Host发送CMD1之前,通过保持CMD线为低或者发送参数为0xFFFFFFFA的CMD0命令。boot data可以从boot area或者user area读取,这取决于寄存器的设置。引导模式包含3个状态,分别是pre-idle状态,pre-boot状态和boot状态。引导分区(Boot partition) eMMC设备存在两个引导分区。引导分区的最小容量为128KB。引导分区的容量计算如下:Maximum boot partition size = 128KB x BOOT_SIZE_MULTBOOT_SIZE_MULT是EXT_CSD寄存器的[226]字节的内容。引导分区和用户区域是分开的,如下图所示:Host可以通过SWITCH(CMD6)命令设置EXT_CSD寄存器的[179]字节(PARTITION_CONFIG域)来选择引导分区。eMMC设备可以被配置为从用户区域引导,通过设置EXT_CSD寄存器[179]字节的BOOT_PARTITION_ENABLE位域的值为111b。EXT_CSD寄存器[179]字节的内容如下:引导总线宽度和数据访问配置 Host可以通过配置EXT_CSD寄存器的[177]字节(BOOT_BUS_CONDITIONS域)来设置引导模式下的速率模式和总线宽度。BOOT_BUS_CONDITIONS域的内容如下:在引导模式下,Host通过对BOOT_BUS_CONDITIONS域的配置,可以设置3种速率模式。在引导模式下,eMMC总线支持的速率模式如下:Mode NameData RateBus WidthFrequencyMax Data Transfer(implies x8 bus width)BackwardsCompatibility withlegacy MMC cardSingle1, 4, 80-26 MHz26 MB/sHigh Speed SDRSingle1, 4, 80-52 MHz52 MB/sHigh Speed DDRDual4, 80-52 MHz104 MB/sHS200 and HS400 is not supported during BOOT operation.在引导模式下,Host可以通过对BOOT_BUS_CONDITIONS域的RESET_BOOT_BUS_CONDITIONS位域配置,来选择在退出引导模式后,是复位还是保留当前总线的配置。如果RESET_BOOT_BUS_CONDITIONS的值为0,表示退出引导模式后会复位总线的设置,退出引导模式后总线会被复位为兼容模式(单速率,1bit总线宽度)。如果RESET_BOOT_BUS_CONDITIONS的值为1,表示退出引导模式后会保留引导模式的总线配置。Host通过配置EXT_CSD寄存器的[177]字节(BOOT_BUS_CONDITIONS域)来设置引导模式的总线配置,Host通过配置EXT_CSD寄存器的[185]字节(HS_TIMING域)和EXT_CSD寄存器的[183]字节(BUS_WIDTH域)来设置其他模式的总线配置。EXT_CSD寄存器的[177]字节(BOOT_BUS_CONDITIONS域)是非易失性的,掉电之后配置不会丢失。EXT_CSD寄存器的[185]字节(HS_TIMING域)和EXT_CSD寄存器的[183]字节(BUS_WIDTH域)是易失性的,掉电之后配置会丢失。引导操作(Boot operation) 在引导模式下,Host有两种方式可以让eMMC设备进入boot state,这两种方式分别定义为Original Boot和Alternative Boot,描述如下:Original Boot:拉低CMD信号并保持至少74个时钟周期。Alternative Boot:拉高CMD信号并保持至少74个时钟周期后,发送参数为0xFFFFFFFA的CMD0命令。Host可以通过SWITCH(CMD6)命令设置EXT_CSD寄存器的[179]字节(PARTITION_CONFIG域)的BOOT_ACK位段来选择是否eMMC设备发送boot acknowledge给Host。eMMC设备发送boot acknowledge以便于Host能够识别到eMMC设备处于引导模式。EXT_CSD寄存器[179]字节的内容如下:对于Original Boot,如果EXT_CSD寄存器[179]字节的BOOT_ACK设置为1,eMMC设备要在Host触发eMMC设备进入引导模式的50ms内,在DAT[0]数据线上发送"010"格式的boot acknowledge给Host。Original Boot的时序图如下所示:在引导模式下,拉低CMD信号并保持至少74个时钟周期,eMMC设备会进入boot state。在Host将CMD信号线变为高电平并准备发送下一个命令之前,至少需要56个时钟(8 clocks + 48 clocks)周期间隔。对于Alternative Boot,如果EXT_CSD寄存器[179]字节的BOOT_ACK设置为1,eMMC设备要在接收到参数为0xFFFFFFFA的CMD0命令的50ms内,在DAT[0]数据线上发送"010"格式的boot acknowledge给Host。Alternative Boot的时序图如下所示:对于Original Boot或者Alternative Boot,在eMMC设备发送boot acknowledge给Host之后,eMMC设备就会发送boot data给Host。引导模式下的状态图如下图所示:从引导模式下的状态图可知:1、在eMMC设备传输boot data给Host的过程中,Host可以打断数据的传输,提前结束boot state,具体方法如下:Original Boot:boot data传输过程中,Host拉高CMD信号;Alternative Boot:boot data传输过程中,Host发送参数为0x00000000的CMD0命令;2、在eMMC设备上电之后,会进入pre-idle状态:当EXT_CSD寄存器的[179]字节(PARTITION_CONFIG域)的BOOT_PARTITION_ENABLE位段的值为0,表示eMMC设备不使能引导功能,此时eMMC设备会直接从引导模式的pre-idle状态进入到设备识别模式的idle状态。当EXT_CSD寄存器的[179]字节(PARTITION_CONFIG域)的BOOT_PARTITION_ENABLE位段的值选择了引导分区,表示eMMC设备使能引导功能,eMMC设备会从引导模式的pre-idle状态进入到引导模式的pre-boot状态。
面向块的读命令(class 2) CMD16CMD16的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:0] block lengthR1SET_BLOCKLENSets the block length (in bytes) for allfollowing block commands (read andwrite). Default block length is specified inthe CSD.CMD16的参数[31:0]位域填写块长度,命令的类型为ac,CMD16的命令缩写为SET_BLOCKLEN,命令响应为R1,命令功能为设置接下来所有块操作命令(读和写)的块长度(以字节为单位),默认的块长度在CSD寄存器中被指定。CMD17CMD17的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] data addressR1READ_SINGLE_BLOCKReads a block of the size selected by theSET_BLOCKLEN command.CMD17的参数[31:0]位域填写数据地址,命令的类型为adtc,CMD17的命令缩写为READ_SINGLE_BLOCK,命令响应为R1,命令功能为从eMMC设备指定地址读取一块数据,数据块的长度由SET_BLOCKLEN命令(CMD16)设置或者使用默认的块长度。CMD18CMD18的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] data addressR1READ_MULTIPLE_BLOCKContinuously transfers data blocks fromDevice to host until interrupted by a stopcommand, or the requested number of datablocks is transmitted If sent as part of apacked read command, the argument shallcontain the first read data address in thepack (address of first individual readcommand inside the pack).CMD18的参数[31:0]位域填写数据地址,命令的类型为adtc,CMD18的命令缩写为READ_MULTIPLE_BLOCK,命令响应为R1,命令功能为从eMMC设备指定地址开始连续传输数据块到Host,直到被STOP_TRANSMISSION命令(CMD12)中断,或者已经读完请求的数据块数量。CMD21CMD21的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] stuff bitsR1SEND_TUNING_BLOCK128 clocks of tuning pattern (64 byte in 4bit mode or 128 byte in 8 bit mode) is sentfor HS200 optimal sampling pointdetection.CMD21的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD21的命令缩写为SEND_TUNING_BLOCK,命令响应为R1,命令功能为eMMC设备发送128个时钟的tuning模式数据(4位模式下64字节,8位模式下128字节)用于HS200模式下Host优化采样点。面向块的写命令(class 4) CMD23(default)CMD23(default)的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31] Reliable Write Request[30] ‘0’ non- packed[29] tag request[28:25] context ID[24]: forced programming[23:16] set to 0[15:0] number of blocksR1SET_BLOCK_COUNTnon-packed command versionDefines the number of blocks (read/write) and thereliable writer parameter (write) for a block read orwrite command.CMD23(default)的参数[31]位填写Reliable Write Request,[30]填写0,[29]位填写tag request,[28:25]位域填写context ID,[24]位填写forced programming,[23:16]位域填写0,[15:0]位域填写数据块数量,命令的类型为ac,CMD23(default)的命令缩写为SET_BLOCK_COUNT,命令响应为R1,命令功能为定义数据块的数量(用于读写)。CMD23(packed)CMD23(packed)的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31] set to 0[30] ‘1’ packed[29:16] set to 0[15:0] number ofblocksR1SET_BLOCK_COUNTpacked command versionDefines the number of blocks (read/write) for thefollowing packed write command or for the header ofthe following packed read command.CMD23(packed)的参数[31]位填写0,[30]填写1,[29:16]位域填写0,[15:0]位域填写数据块数量,命令的类型为ac,CMD23(packed)的命令缩写为SET_BLOCK_COUNT,命令响应为R1,命令功能为定义数据块的数量(用于读写)。CMD24CMD24的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] data addressR1WRITE_BLOCKWrites a block of the size selected by theSET_BLOCKLEN command.CMD24的参数[31:0]位域填写数据地址,命令的类型为adtc,CMD24的命令缩写为WRITE_BLOCK,命令响应为R1,命令功能为写一块数据到eMMC设备指定地址,数据块的长度由SET_BLOCKLEN命令(CMD16)设置或者使用默认的块长度。Data address for media =<2 GB is a 32 bit byte address and data address for media > 2 GB is a 32 bit sector (512 B) address.The transferred data must not cross a physical block boundary unless WRITE_BLK_MISALIGN is set in the CSD.CMD25CMD25的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] data addressR1WRITE_MULTIPLE_BLOCKContinuously writes blocks of data until aSTOP_TRANSMISSION follows or the requestednumber of block received.If sent as a packed command (either packed write, orthe header of packed read) the argument shall containthe first read/write data address in the pack (address offirst individual command inside the pack).CMD25的参数[31:0]位域填写数据地址,命令的类型为adtc,CMD25的命令缩写为WRITE_MULTIPLE_BLOCK,命令响应为R1,命令功能为连续写入数据块到eMMC设备指定地址,直到被STOP_TRANSMISSION命令(CMD12)中断,或者已经写完了请求的数据块数量。Data address for media =<2 GB is a 32 bit byte address and data address for media > 2 GB is a 32 bit sector (512 B) address.CMD26CMD26的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] stuff bitsR1PROGRAM_CIDProgramming of the Device identification register. Thiscommand shall be issued only once. The Devicecontains hardware to prevent this operation after thefirst programming. Normally this command is reservedfor the manufacturer.CMD26的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD26的命令缩写为PROGRAM_CID,命令响应为R1,命令功能为写eMMC设备的CID寄存器。CMD26命令只能烧写一次CID寄存器,正常情况下是制造商使用这个命令。CMD27CMD27的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] stuff bitsR1PROGRAM_CSDProgramming of the programmable bits of the CSD.CMD27的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD27的命令缩写为PROGRAM_CSD,命令响应为R1,命令功能为修改eMMC设备CSD寄存器的可编程位。CMD49CMD49的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] stuff bitsR1SET_TIMESets the real time clock according to the RTCinformation in the 512 B data block.CMD49的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD49的命令缩写为SET_TIME,命令响应为R1,命令功能为根据RTC信息数据块,设置eMMC设备的real time clock。擦除命令(class 5) CMD35CMD35的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:0] data addressR1ERASE_GROUP_STARTSets the address of the first erase groupwithin a range to be selected for eraseCMD35的参数[31:0]位域填写数据地址,命令的类型为ac,CMD35的命令缩写为ERASE_GROUP_START,命令响应为R1,命令功能为设置擦除操作的first erase group地址。CMD36CMD36的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:0] data addressR1ERASE_GROUP_ENDSets the address of the last erase groupwithin a continuous range to be selectedfor eraseCMD36的参数[31:0]位域填写数据地址,命令的类型为ac,CMD36的命令缩写为ERASE_GROUP_END,命令响应为R1,命令功能为设置擦除操作的last erase group地址。CMD38CMD38的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31] Securerequest[30:16] set to 0[15] ForceGarbage Collectrequest[14:2] set to 0[1] Discard Enable[0] Identify WriteBlocks for Erase(or TRIM Enable)R1bERASEErases all previously selected writeblocks according to argument bits.When all argument bits are zero CMD38will perform an erase on erase group(s).When Bit 0 = 1 and Bit 1=0 then CMD38will perform a TRIM on the sector(s).When Bit 0 =1 and Bit 1=1 then CMD38will perform a DISCARD on thesector(s).To maintain backward compatibility thedevice must not report an error if bits 31and 15 are set. The device behaviorwhen these are set is undefined.All other argument settings should triggeran ERROR.CMD38的参数[31]位填写Secure request,[30:16]位域填写0,[15]位填写Force Garbage Collect request,[14:2]位域填写0,[1]位填写Discard Enable,[0]位填写Identify Write Blocks for Erase,命令的类型为ac,CMD38的命令缩写为ERASE,命令响应为R1b,命令功能为根据参数位的配置擦除之前选择的数据块。擦除命令的参数如下表所示:eMMC 5.1总线协议标准主要提供了4种擦除数据的方法,以满足不同场景的擦除需求:擦除方式擦除单位描述EraseErase Group以Erase Group为擦除单位擦除数据,擦除完成后重新读取擦除地址的数据会返回全0或者1的数据,但在物理存储介质上,可能还保留着原始数据。TRIMWrite Block以Write Block为擦除单位擦除数据,擦除完成后重新读取擦除地址的数据会返回全0或者1的数据,但在物理存储介质上,可能还保留着原始数据。DiscardWrite Block以Write Block为擦除单位擦除数据,擦除完成后重新读取擦除地址的数据可能会返回擦除前的数据。Sanitize---将标记擦除的数据块的数据在物理介质上清除。这里主要讲讲Erase操作,其他的擦除操作,根据需要可以阅读下eMMC 5.1 spec。Erase操作的数据擦除单位为Erase Group。一个Erase Group由一个或者多个Write Block组成。eMMC设备的最基本的数据写单元为Write Block。Erase操作可以进行一个或者多个Erase Group的数据擦除。当EXT_CSD寄存器的[175]字节的ERASE_GROUP_DEF为0时,Erase Group的大小通过CSD寄存器的[46:42]位域的ERASE_GRP_SIZE和[41:37]位域的ERASE_GRP_MULT共同确定,计算公式如下:Erase Group Size = (ERASE_GRP_SIZE + 1) * (ERASE_GRP_MULT + 1)当EXT_CSD寄存器的[175]字节的ERASE_GROUP_DEF为1时,Erase Group的大小通过EXT_CSD寄存器的[224]字节的HC_ERASE_GRP_SIZE来设置,计算公式如下:Erase Group Size = HC_ERASE_GRP_SIZE * 512KBeMMC设备在执行Erase操作时,通常并不会进行实际物理数据的擦除,只是将待擦除的Erase Group中的Block从地址空间中unmap,然后从后台的空闲Block中选择已经完成物理擦除的Block,重新map到该地址空间中,然后告知Host端已完成Erase操作。实际物理擦除操作则在后台选择合适的时机进行。这样的逻辑可以减少Host执行Erase操作的等待时间,提高eMMC设备的响应速度。Host可以擦除eMMC设备连续范围内的Erase Group。擦除步骤主要分为以下3步:Host使用ERASE_GROUP_START(CMD35)命令定义Erase Group范围的起始地址;Host使用ERASE_GROUP_END(CMD36)命令定义Erase Group范围的最后地址;Host发送命令参数为0的ERASE(CMD38)命令给eMMC设备,用于开始擦除过程;设备锁定命令(class 7) CMD42CMD42的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] stuff bits.R1LOCK_UNLOCKUsed to set/reset the password orlock/unlock the Device. The size of the datablock is set by the SET_BLOCK_LENcommand.CMD42的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD42的命令缩写为LOCK_UNLOCK,命令响应为R1,命令功能为设置/复位password或者锁定/解锁eMMC设备。CMD42只能在SDR模式(single data rate)下使用。在DDR模式(dual data rate),CMD42不会被执行并且会被视为非法命令。CMD42的命令数据块结构如下图所示:SET_PWD:该位为1,表示设置一个新的password;CLR_PWD:该位为1,表示清除PWD;LOCK_UNLOCK:该位为1,表示锁定eMMC设备;该位为0,表示解锁eMMC设备;ERASE:该位为1,表示强制擦除操作(所有其他位应该为0),并且只发送命令字节;PWD_LEN:定义接下来的password的长度(以字节为单位)。有效的password的长度范围为:1-16字节;PWD:password数据;特定应用命令(class 8) CMD55CMD55的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:16] RCA[15:0] stuff bitsR1APP_CMDIndicates to the Device that the nextcommand is an application specificcommand rather than a standard commandCMD55的参数[31:16]位域填写RCA,[15:0]位域可以是任意值(默认填写0),命令的类型为ac,CMD55的命令缩写为APP_CMD,命令响应为R1,命令功能为告诉eMMC设备下个命令是特定应用命令,不是标准命令。CMD56CMD56的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:1] stuff bits.[0]: RD/WR1R1GEN_CMDUsed either to transfer a data block to theDevice or to get a data block from theDevice for general purpose / applicationspecific commands. The size of the datablock shall be set by theSET_BLOCK_LEN command.CMD56的参数[31:1]位域可以是任意值(默认填写0),[0]位填写数据传输方向,命令的类型为adtc,CMD56的命令缩写为GEN_CMD,命令响应为R1,命令功能为在通用命令或者特定应用命令中,用于传输一个数据块到eMMC设备或者从eMMC设备获取一个数据块。
概述 本文对eMMC 5.1协议定义的命令做一个简单的说明,以便在使用具体的命令时有个参考。eMMC 5.1协议定义的命令可以分为11类,具体分类描述如下:Basic commands (class 0 and class 1),基本命令;Block-oriented read commands (class 2),面向块的读命令;Class 3 commands,Class 3命令;Block-oriented write commands (class 4),面向块的写命令;Block-oriented write protection commands (class 6),面向块的写保护命令;Erase commands (class 5),擦除命令;I/O mode commands (class 9),I/O模式命令;Lock Device commands (class 7),设备锁定命令;Application-specific commands (class 8),特定应用命令;Security Protocols (class 10),安全协议命令;Command Queue (Class 11),命令队列命令;本文主要对常用的6类命令进行说明,其他不常用的命令遇到时查看手册即可:Basic commands (class 0 and class 1),基本命令;Block-oriented read commands (class 2),面向块的读命令;Block-oriented write commands (class 4),面向块的写命令;Erase commands (class 5),擦除命令;Lock Device commands (class 7),设备锁定命令;Application-specific commands (class 8),特定应用命令;基本命令(class 0 and class 1) CMD0CMD0的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionbc[31:0] 00000000NoneGO_IDLE_STATEResets the Device to idle statebc[31:0] F0F0F0F0NoneGO_PRE_IDLE_STATEResets the Device to pre-idle state---[31:0]FFFFFFFANoneBOOT_INITIATIONInitiate alternative boot operationCMD0带参数0x00000000时,命令的类型为bc,此时CMD0的命令缩写为GO_IDLE_STATE,命令无响应,命令功能为复位设备,让设备进入idle状态。CMD0带参数0xF0F0F0F0时,命令的类型为bc,此时CMD0的命令缩写为GO_PRE_IDLE_STATE,命令无响应,命令功能为复位设备,让设备进入pre-idle状态。CMD0带参数0xFFFFFFFA时,命令无类型,此时CMD0的命令缩写为BOOT_INITIATION,命令无响应,命令功能为让设备进入boot operation模式。考虑到CMD0的兼容性,如果eMMC设备收到CMD0命令,并且参数是除了0xFFFFFFFA或者0xF0F0F0F0以外的其他值,eMMC设备在除了Inactive状态的其他任何状态下,eMMC设备会将CMD0命令视为设备复位命令,并让eMMC设备进入idle状态。CMD1CMD1的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionbcr[31:0] OCR with-out busyR3SEND_OP_CONDAsks Device, in idle state, to send its OperatingConditions Register contents in the response on theCMD line.CMD1的参数可以根据OCR寄存器的位定义来填写,命令的类型为bcr,此时CMD1的命令缩写为SEND_OP_COND,命令响应为R3,命令功能为在idle状态下要求eMMC设备通过R3响应返回它的OCR寄存器的值。如果eMMC设备不支持boot operation模式,或者eMMC设备仅仅支持eMMC 4.2或者更早的版本,或者BOOT_PARTITION_ENABLE位被清除,在power-on之后eMMC设备会自动进入idle状态。处于idle状态的eMMC设备,除非收到CMD1,否则会忽略所有的总线事务。CMD1是一个特殊的同步命令,用来协商操作电压范围以及查看设备是否仍处在power-up序列。CMD1的响应除了包含eMMC设备的操作电压profile,还包含一个busy标志,用于指示eMMC设备仍处于power-up过程,并且没有准备好去identification。当R3中的busy位为0时,告诉Host当前的eMMC设备并没有准备好,Host需要重复发送CMD1和接收R3,直到eMMC设备准备好。当Host发送CMD1给eMMC设备,并且CMD1的参数带有有效电压范围,那么eMMC设备必须在1秒以内完成它的初始化。如果Host发送的CMD1的参数为0,那么就表示Host在询问eMMC卡的电压范围和busy状态。CMD2CMD2的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionbcr[31:0] stuff bitsR2ALL_SEND_CIDAsks Device to send its CID number on the CMD lineCMD2的参数[31:0]位域可以是任意值(默认填写0),默认将参数设置为0即可,命令的类型为bcr,CMD2的命令缩写为ALL_SEND_CID,命令响应为R2,命令功能为获取eMMC设备的CID寄存器内容,CID寄存器内容通过R2返回给Host。CMD3CMD3的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:16] RCA[15:0] stuff bitsR1SET_RELATIVE_ADDRAssigns relative address to the DeviceCMD3的参数[31:16]位域填写设置给eMMC设备的RCA,[15:0]位域可以是任意值(默认填写0),命令的类型为ac,CMD3的命令缩写为SET_RELATIVE_ADDR,命令响应为R1,命令功能为给eMMC设备分配RCA。一旦eMMC设备接收到CMD3,并且修改自身的RCA寄存器内容值为Host设置的RCA值之后,eMMC的设备状态将从Identification状态切换为Stand-by状态,并且eMMC设备不会再响应任何identification。此外,eMMC设备将把它的输出驱动方式从开漏输出(open-drain )切换为推挽输出(open-drain )。CMD4CMD4的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionbc[31:16] DSR[15:0] stuff bitsNoneSET_DSRPrograms the DSR of the DeviceCMD4的参数[31:16]位域填写设置给eMMC设备的DSR,[15:0]位域可以是任意值(默认填写0),命令的类型为bc,CMD4的命令缩写为SET_DSR,命令无响应,命令功能为设置eMMC设备的DSR(driver stage register)寄存器。CMD5CMD5的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:16] RCA[15]Sleep/Awake[14:0] stuff bitsR1bSLEEP_AWAKEToggles the Device between Sleep state and Standbystate.CMD5的参数[31:16]位域填写RCA,[15]位的值表示该命令是Sleep还是Awake命令,[14:0]位域可以是任意值(默认填写0),命令的类型为ac,CMD5的命令缩写为SLEEP_AWAKE,命令响应为R1b,命令功能为将eMMC设备的状态设置为Sleep状态或者Awake状态。eMMC设备在Sleep状态下的电源消耗是最小的,在Sleep状态下eMMC设备仅仅响应复位命令(参数为0x00000000或者0xF0F0F0F0的CMD0或者硬件复位)和SLEEP_AWAKE命令(CMD5),所有其他命令都会被eMMC设备忽略。CMD5的参数[15]位为1时表示该命令为Sleep命令。CMD5的参数[15]位为0时表示该命令为Awake命令。CMD6CMD6的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:26] Set to 0[25:24] Access[23:16] Index[15:8] Value[7:3] Set to 0[2:0] Cmd SetR1bSWITCHSwitches the mode of operation of the selected Deviceor modifies the EXT_CSD registers.CMD6的参数[31:26]位域填写0,[25:24]位域设置访问模式,[23:16]位域填写EXT_CSD寄存器的索引,[15:8]位域填写Value值,[7:3]位域填写0,[2:0]位域填写要切换的命令集,命令的类型为ac,CMD6的命令缩写为SWITCH,命令响应为R1b,命令功能为切换eMMC设备的操作模式或者修改eMMC设备的EXT_CSD寄存器。访问模式及其说明如下图所示:索引域([23:16]位域 Index)的取值范围为0-255,但是仅仅0-191范围内的值是有效的。如果索引域的值在192-255范围内,那么eMMC设备将不会执行任何的修改操作,并且SWITCH_ERROR状态位将被设置。CMD7CMD7的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:16] RCA[15:0] stuff bitsR1/R1bSELECT/DESELECT_CARDCommand toggles a device between the standby andtransfer states or between the programming anddisconnect states.NOTE In both cases the Device is selected by its ownrelative address and gets deselected by any other address;address 0 deselects the Device.CMD7的参数[31:16]位域填写RCA,[15:0]位域可以是任意值(默认填写0),命令的类型为ac,CMD7的命令缩写为SELECT/DESELECT_CARD,命令响应为R1/R1b,命令功能为切换eMMC设备的状态,在standby状态和transfer状态之间切换或者在programming状态和disconnect状态之间切换。当eMMC设备处于Stand-by状态时,CMD7(命令参数中RCA域为设备的RCA)能够将eMMC设备状态切换到Transfer状态。当eMMC设备处于Transfer状态并且eMMC设备之前被选中时,CMD7(命令参数中RCA域为除设备RCA外的其他值)能够将eMMC设备状态切换到Stand-by状态并且释放eMMC设备与Host之间的连接状态。当Host发送CMD7(命令参数中RCA域为0x0000)给eMMC设备时,eMMC设备将切换到Stand-by状态。当eMMC设备处于Transfer状态时,如果接收到了来自Host的CMD7(命令参数中RCA域为设备的RCA),那么eMMC设备将忽略该命令,或许该命令会被视为非法命令。当eMMC设备处于Disconnect状态时,CMD7(命令参数中RCA域为设备的RCA)能够将eMMC设备状态切换到Programming状态。当eMMC设备处于Programming状态并且eMMC设备之前被选中时,CMD7(命令参数中RCA域为除设备RCA外的其他值)能够将eMMC设备状态切换到Disconnect状态并且释放eMMC设备与Host之间的连接状态。当eMMC设备处于Programming状态时,如果接收到了来自Host的CMD7(命令参数中RCA域为设备的RCA),那么eMMC设备将忽略该命令,或许该命令会被视为非法命令。R1 while selecting from Stand-By State to Transfer State;R1b while selecting from Disconnected State to Programming State.CMD8CMD8的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] stuff bitsR1SEND_EXT_CSDDevice sends its EXT_CSD register as a block of data.CMD8的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD8的命令缩写为SEND_EXT_CSD,命令响应为R1,命令功能为请求eMMC设备通过数据块的方式将它的EXT_CSD寄存器内容发送给Host。CMD9CMD9的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:16] RCA[15:0] stuff bitsR2SEND_CSDAddressed Device sends its Device-specific data(CSD) on the CMD line.CMD9的参数[31:16]位域填写RCA,[15:0]位域可以是任意值(默认填写0),命令的类型为ac,CMD9的命令缩写为SEND_CSD,命令响应为R2,命令功能为获取eMMC设备的CSD寄存器内容,CSD寄存器内容通过R2返回给Host。CMD10CMD10的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:16] RCA[15:0] stuff bitsR2SEND_CIDAddressed Device sends its Device identification(CID) on CMD the line.CMD10的参数[31:16]位域填写RCA,[15:0]位域可以是任意值(默认填写0),命令的类型为ac,CMD10的命令缩写为SEND_CID,命令响应为R2,命令功能为获取eMMC设备的CID寄存器内容,CID寄存器内容通过R2返回给Host。CMD11该命令已被废弃。CMD12CMD12的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:16] RCA[15:1] stuff bits[0] HPIR1/R1bSTOP_TRANSMISSIONForces the Device to stop transmission. If HPI flag isset the device shall interrupt its internal operations in awell-defined timing.CMD12的参数[31:16]位域填写RCA,[15:1]位域可以是任意值(默认填写0),[0]位填写HPI,命令的类型为ac,CMD12的命令缩写为STOP_TRANSMISSION,命令响应为R1/R1b,命令功能为强制eMMC设备停止传输,如果HPI标志被置位,那么eMMC设备会在一个合适的时机打断它的内部操作。在任意时刻,所有的数据读命令都可以被STOP_TRANSMISSION命令(CMD12)终止。数据传输将会结束并且eMMC设备将返回到Transfer状态。读命令包括:READ_SINGLE_BLOCK(CMD17),READ_MULTIPLE_BLOCK(CMD18),SEND_TUNING_BLOCK(CMD21),SEND_WRITE_PROT(CMD30)。在任意时刻,所有的数据写命令都可以被STOP_TRANSMISSION命令(CMD12)终止。停止写命令的STOP_TRANSMISSION命令(CMD12)要在CMD7取消选择设备之前发送。写命令包括:WRITE_BLOCK(CMD24),WRITE_MULTIPLE_BLOCK(CMD25),PROGRAM_CID(CMD26),PROGRAM_CSD(CMD27)。RCA in CMD12 is used only if HPI bit is set. The argument does not imply any RCA check on the device side.R1 for read cases and R1b for write cases.CMD13CMD13的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:16] RCA[15] SQS[14:1] stuff bits[0] HPIR1SEND_STATUSIn case SQS bit = 0: Addressed Device sends its statusregister. If HPI flag is set the device shall interrupt itsinternal operations in a well-defined timing.In case SQS bit = 1: indicate that this is a QSR query.In response device shall send the QSR (Queue StatusRegister). In this case HPI must be set to ‘0’.CMD13的参数[31:16]位域填写RCA,[15]位填写SQS,[14:1]位域可以是任意值(默认填写0),[0]位填写HPI,命令的类型为ac,CMD13的命令缩写为SEND_STATUS,命令响应为R1,命令功能为查询eMMC设备的状态或者读取QSR寄存器值。CMD14CMD14的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] stuff bitsR1BUSTEST_RA host reads the reversed bus testing data pattern froma Device.CMD14的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD14的命令缩写为BUSTEST_R,命令响应为R1,命令功能为从eMMC设备读取翻转的总线测试数据。CMD15CMD15的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionac[31:16] RCA[15:0] stuff bitsNoneGO_INACTIVE_STATESets the Device to inactive stateCMD15的参数[31:16]位域填写RCA,[15:0]位域可以是任意值(默认填写0),命令的类型为ac,CMD15的命令缩写为GO_INACTIVE_STATE,命令无响应,命令功能为将eMMC设备切换到inactive状态。CMD19CMD19的命令类型,参数,响应类型,命令缩写和描述如下表所示:TypeArgumentRespAbbreviationCommand Descriptionadtc[31:0] stuff bitsR1BUSTEST_WA host sends the bus test data pattern to a Device.CMD19的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD19的命令缩写为BUSTEST_W,命令响应为R1,命令功能为Host发送总线测试数据给eMMC设备。
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。R1R1响应的数据长度为48 bits,其中[45:40]数据位域表示的是该响应对应命令的编号。[39:8]是一个32位大小的位域,主要用于反应设备的状态信息,具体的设备状态信息内容可以参考eMMC 5.1 spec的6.13 Device status章节。R1b和R1完全相同,只是R1b会在数据线DAT0上传输一个可选的busy信号。基于eMMC设备在接收命令之前的状态,eMMC设备在接收到一些命令之后可能会变得繁忙。R2R2响应的数据长度为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替换。R3R3响应的数据长度为48 bits。[39:8]是一个32位大小的位域,该位域将OCR寄存器的值作为CMD1的响应内容。R4R4响应的数据长度为48 bits。[39:8]是参数域,该位域包含寻址设备的RCA,要进行读写操作的寄存器地址以及寄存器内容。如果操作成功,参数域中的状态位将被置1。R4响应只作为对CMD39的响应。R5R5响应的数据长度为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模式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 tokenNegative CRC status tokeneMMC寄存器 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总线测试的数据格式如下图所示:
前言 下面首先简单的介绍了MMC,SD和SDIO,对这些名词有个概念即可。从本文开始会重点讲讲eMMC相关的内容(Linux MMC子系统系列文章介绍的eMMC协议为:eMMC 5.1协议),对eMMC相关的知识有了一定的了解之后,后续文章也会对Linux的MMC子系统做一个介绍,包括MMC子系统的初始化过程,MMC host驱动与host设备是如何匹配的,MMC host驱动的基本框架,MMC驱动和MMC卡设备是如何关联起来的,MMC子系统是如何实现块设备驱动的等等。对于MMC卡,SD卡或者SDIO接口的设备,Linux MMC子系统同样适用。好了,废话不多说,下面开始本文的内容吧。MMC SD SDIO介绍 MMC多媒体卡(MMC)全称Multi Media Card,是由西门子公司和SanDisk公司于1997年推出的多媒体记忆卡标准。MMC卡尺寸为32mm x 24mm x 1.4mm,它将存储单元和控制器一同做到了卡上,这种携带方便、可靠性高、重量轻的数据载体一经推出,市场占有率不断上升,广泛应用于移动电话,数码相机,MP3等产品。MMC卡具有MMC和SPI两种工作模式,MMC模式是默认工作模式,具有MMC的全部特性。而SPI模式则是MMC协议的一个子集,主要用于低速系统。SDSD卡(Secure Digital Memory Card)是一种基于半导体快闪存记忆器的新一代记忆存储设备。SD卡是由松下、东芝和SanDisk公司于1999年8月共同开发的新一代记忆卡标准,已完全兼容MMC标准。SD卡比MMC卡多了一个进行数据著作权保护的暗号认证功能。SD卡尺寸为32mm x 24mm x 2.1mm,长宽和MMC卡一样,只是比MMC卡厚了0.7mm,以容纳更大容量的存储单元。SD卡与MMC卡保持向上兼容,也就是说,MMC卡可以被新的设有SD卡插槽的设备存取,但是SD卡却不可以被设有MMC插槽的设备存取。SDIOSDIO全称为Secure Digital Input and Output,中文名称为:安全数字输入输出接口。SDIO是在SD标准上定义的一种外设接口,它使用SD的I/O接口来连接外围设备,并通过SD上的I/O数据接口与这些外围设备传输数据。现在已经有很多手持设备支持SDIO接口,而且许多SDIO外设也被开发出来,目前常见的SDIO外设有:WIFI Card、GPS Card、 Bluetooth Card等等。eMMC介绍 eMMC卡全称为Embedded Multi Media Card,是MMC协会所制定的内嵌式存储器标准规格。通俗点讲,eMMC就是一个类似于SD卡一样的存储芯片。eMMC主要应用于智能手机和平板电脑等产品。eMMC在封装中集成了一个控制器,提供标准接口来管理闪存,使得产品开发过程中不再需要考虑NAND Flash兼容性问题和管理问题,让产品开发人员能够专注于产品开发,缩短产品推向市场的时间。eMMC整体结构 eMMC的整体结构如下图所示:eMMC主要由设备控制器和存储阵列组成。设备控制器主要提供主机接口和存储管理功能。eMMC主机接口HOST和eMMC之间的接口连接如下图所示:eMMC与HOST之间的通信涉及的信号线描述如下:CLK:时钟线上的每个时钟周期,意味着命令线上传输了1bit命令,或者数据线上完成了1bit或者2bit的数据传输。时钟频率的范围为:0~最大时钟频率。CMD:该信号线主要用于传输HOST到eMMC的command和eMMC到HOST的response。DAT0~DAT7:用于传输数据的8bit数据线。在上电或者复位以后,仅仅只有DAT0数据线可以用于数据传输。可以通过eMMC主机控制器来配置eMMC的数据总线位宽,eMMC支持的数据线宽度有:1bit(DAT0),4bit(DAT0~DAT3),8bit(DAT0~DAT7)。Data Strobe:该信号是从eMMC设备输出给Host的时钟信号,频率和CLK信号相同,用于Host进行接收数据的同步。该信号只在HS400模式下使用,启用后可以提高数据传输的稳定性,省去总线tuning过程。HOST和eMMC之间的通信都是以HOST发送一个Command给eMMC开始的,eMMC对于收到的不同Command会做出不同的response,当然了eMMC对于收到的部分Command可以不做response。聊了这么久的eMMC,到底eMMC长什么样,大多数的eMMC芯片一般是黑色的外观,来欣赏下某厂商的eMMC芯片外观图:大多数的eMMC芯片一般采用BGA封装,下图是某厂商的BGA封装的eMMC芯片引脚图:eMMC接口各个引脚的输入输出类型以及相关描述可以参考下图进行理解:eMMC存储阵列eMMC的存储阵列是由非易失性的存储器组成,目前,绝大多数eMMC芯片内部的存储器都是由Nand Flash组成的。在智能手机或者其他嵌入式设备中,可以使用eMMC的存储阵列来存放操作系统,应用数据等信息。eMMC存储管理eMMC芯片内部的设备控制器具有存储管理功能,主要用于对Nand Flash的管理,包括:擦写均衡,坏块管理,ECC校验等。相比于直接将NAND Flash连接到Host端,采用eMMC芯片屏蔽了NAND Flash的物理特性,可以减少Host端软件的复杂度,让Host端专注于上层业务,省去对NAND Flash进行特殊的处理。同时,eMMC通过使用Cache、Memory Array等技术,在读写性能上也比NAND Flash要好很多。eMMC寻址 以前实现的eMMC协议(比如eMMC 4.1协议)采用的是32位域的字节寻址。这种寻址机制限制了eMMC的最大容量为2GB。为了支持更大容量的eMMC,后续的eMMC协议(比如eMMC 5.1协议)增加了sector寻址方式(1 sector=512B)。容量大于2GB的eMMC,都是采用sector寻址的方式。为了确定eMMC的寻址模式,主机可以读取eMMC的OCR寄存器,通过OCR寄存器的bit[30:29]可以知道eMMC的寻址模式。eMMC速率模式 随着eMMC协议的不断更新,eMMC总线的速率越来越高。为了兼容旧版本的eMMC,所有eMMC在上电启动或者Reset后,都会先进入兼容速率模式(Backwards Compatibility with legacy MMC card)。在完成对eMMC的初始化后,Host可以通过特定的流程,让eMMC进入其他高速率模式,目前支持以下几种速率模式。Extended CSD寄存器的HS_TIMING[185],可以配置总线速率模式。Extended CSD寄存器的BUS_WIDTH[183],可以配置配置总线宽度和Data Strobe。在一个时钟周期内,DAT0~DAT7信号线上传输1个比特时,就是SDR(Single Data Rate)模式。在一个时钟周期内,DAT0~DAT7信号线上传输2个比特时,就是DDR(Double Data Rate)模式。
Ubuntu释放VMware虚拟磁盘未使用空间在Windows 11中通过VMware安装Ubuntu 22.04做一些Linux相关的学习,刚安装的时候VMware虚拟磁盘空间也就6~7GB,但是没用几天,VMware虚拟磁盘空间就飙升到了20GB左右,着实吓人,下面讲讲如何释放VMware虚拟磁盘未使用空间,达到减小VMware虚拟磁盘占用空间的目的。下述内容有参考一些网友的文章,经过下述步骤VMware虚拟磁盘空间从20GB左右减少到10GB左右,释放了10GB空间,效果还是很明显的。清除apt缓存打开终端,并运行以下命令,可以查看到apt缓存有多少:sudo du -sh /var/cache/apt/archives如果你的Ubuntu系统已经使用很久的话,你将看到这个数字非常大。此时可以通过运行以下命令来清理apt缓存:xxxxxxxxxxsudo apt clean清空回收站将回收站中的文件清空,为后续释放VMware虚拟磁盘空间做准备。删除VMware drag_and_drop文件夹~/.cache/vmware/drag_and_drop文件夹是平时从Windows11拷贝文件到Ubuntu中的缓存,执行下述命令删除这些缓存内容。xxxxxxxxxxrm -rf ~/.cache/vmware/drag_and_drop查看磁盘占用情况在命令行执行命令baobab(baobab是Ubuntu自带的磁盘分析工具),可以知道磁盘的占用情况,我这里将/和/home是挂载到单独的分区的,因此分区工具也列出了/和/home各自的磁盘占用情况。/目录磁盘占用情况:/home目录磁盘占用情况:根据磁盘占用情况,可以删除一些无用的文件。释放未使用到的磁盘空间用0填充挂载点未使用的空间,然后删除填充文件,这样VMware就明确的知道这些空间是未被使用的,为后续的shrink操作能够有效的减小VMware虚拟磁盘空间提供基础。我的Ubuntu系统将/和/home是挂载到单独的分区的,如下图所示/dev/sda4挂载到/,/dev/sda5挂载到/home:从上图可以看出/和/home分配的空间都比较大,/分区大小为113GB,/home分区大小为133GB,因此释放空间也主要从/和/home入手,如果你有其他挂载点占用空间比较大,也可以按照下述步骤释放空间。释放/挂载点未使用到的空间用0填充/挂载点未使用到的空间,命令如下:xxxxxxxxxxsudo dd if=/dev/zero of=/wipefile bs=1M将缓存文件同步到磁盘,命令如下:xxxxxxxxxxsudo sync删除填充文件,命令如下:xxxxxxxxxxsudo rm -rf /wipefile执行下述命令,释放/挂载点未使用到的空间:xxxxxxxxxxsudo /usr/bin/vmware-toolbox-cmd disk shrink /释放/home挂载点未使用到的空间该步骤根据自己实际的分区情况进行选择使用。用0填充/home挂载点未使用到的空间,命令如下:xxxxxxxxxxsudo dd if=/dev/zero of=/home/wipefile bs=1M将缓存文件同步到磁盘,命令如下:xxxxxxxxxxsudo sync删除填充文件,命令如下:xxxxxxxxxxsudo rm -rf /home/wipefile执行下述命令,释放/home挂载点未使用到的空间:xxxxxxxxxxsudo /usr/bin/vmware-toolbox-cmd disk shrink /home使用VMware软件对磁盘进行一些操作执行完上述操作之后,关闭Ubuntu,然后在VMware界面中点击编辑虚拟机设置,在虚拟机设置界面中先点击压缩按钮对虚拟机磁盘进行压缩,之后点击碎片整理,最后关闭虚拟机设置界面。到这一步,看看Windows 11中Ubuntu的VMware虚拟磁盘空间是不是变的比以前小多了。
Ubuntu搭建ftp服务器本文将在Ubuntu 22.04上搭建ftp服务器,对于其他版本Ubuntu系统或者其他系列的Linux发行版,配置都差不多。下述内容配置好了匿名用户和Ubuntu本地用户登录ftp服务器,并能上传和删除文件。安装vsftpdsudo apt install vsftpdvsftpd服务在安装完成后会自动启动。通过下述命令可以查看vsftpd的状态:sudo systemctl status vsftpd配置vsftpd可以通过编辑/etc/vsftpd.conf文件来配置vsftpd服务器。大多数ftp配置在配置文件中都有描述。有关所有可用选项,可以官方vsftpd页面进行查询。执行下述命令打开/etc/vsftpd.conf文件:sudo vim /etc/vsftpd.conf配置FTP登录方式将/etc/vsftpd.conf文件中的anonymous_enable和local_enable设置成如下的配置:anonymous_enable:控制是否允许匿名登录。local_enable:控制是否允许Ubuntu的本地用户登录(ftp客户端可以使用Ubuntu的用户名和密码登录到ftp服务器中)。限制用户访问其他目录为防止FTP用户访问其主目录之外的其他目录,在/etc/vsftpd.conf文件中,取消chroot_local_user=YES的注释:chroot_local_user=YES并且在/etc/vsftpd.conf文件的末尾添加下述内容,设置ftp用户的主目录为/home:local_root=/home允许上传和删除操作在/etc/vsftpd.conf文件中,取消write_enable的注释,以允许对文件系统进行更改,例如上传和删除文件。在/etc/vsftpd.conf文件中,打开匿名用户的一些配置,如果下述配置在/etc/vsftpd.conf文件中没有,可以在配置文件中进行添加:设置匿名用户的默认目录在/etc/vsftpd.conf文件中,增加anon_root的配置,内容如下:anon_root=/home/ailsonjack/shareanon_root:设置匿名用户的默认路径。到这里已经完成了对/etc/vsftpd.conf文件的配置,保存退出/etc/vsftpd.conf文件的编辑。在/home/ailsonjack文件夹中创建share文件夹,命令如下:为了保证匿名用户能够顺利的上传和删除文件,需要在share文件夹中创建ftp文件夹,之后改变ftp文件夹的权限为777,匿名用户就只能在ftp文件夹中进行文件的上传或者删除。使配置生效设置完成/etc/vsftpd.conf文件之后,执行下述命令重启vsftpd来使设置生效:sudo systemctl restart vsftpd禁用防火墙为了确保ftp服务器能够正常工作,我这里简单的关闭防火墙,命令如下:sudo ufw disable关闭防火墙之后,可以执行下述命令查看防火墙的状态:sudo ufw status至此,Ubuntu搭建ftp服务器算是完成了,试试吧。
系统:Fedora-14-x86_64我这里的环境是在虚拟机中安装Fedora-14。由于Fedora-14比较老了,因此配置源以及其他一些操作就有些不一样,这里简单记录下我的配置,方便以后查找。使用在线源由于Fedora-14比较古老了,官方不再维护并且将其源路径更改了,因此源的配置也要进行变化。首先将 /etc/yum.repos.d/fedora.repo 进行备份(可以重命名为 fedora.repo.bak )。下面是可用的在线源配置,fedora.repo 文件内容如下:将 /etc/yum.repos.d/fedora.repo 中的文件内容更换为上述内容。验证在线源是否可用有可能之后的路径又会更改,在进行更新源操作之前,可以先确认下源的链接是否可用,分别用浏览器打开下面的3个链接,如果都能正常访问,那么说明在线源没有问题。如果在线源不能使用了,那么也可以考虑将Fedora-14的安装包 Fedora-14-x86_64-DVD.iso 作为本地源,这个配置在下面章节讲述。使用本地源在线源可用的情况下,可以跳过该小节。如果在线源不能使用了,那么我们可以将Fedora-14的安装包 Fedora-14-x86_64-DVD.iso 作为本地源,fedora.repo 文件内容如下:将 /etc/yum.repos.d/fedora.repo 中的文件内容更换为上述内容。备注:baseurl中的 %20 这里表示空格。在线源和本地源选择一种即可,建议当在线源不可用时,就使用本地源。更新源在更新了 fedora.repo 文件内容之后,依次执行下述命令完成更新源操作。上述命令执行的过程中没有报错,就表示源更新完成,之后可以使用下述命令查看源列表:yum repolist如果更新源过程中遇到了问题,可以看看下面的章节是否有提到。更新源遇到的问题Cannot retrieve repository metadata如果更新源的过程中,出现 Error: Cannot retrieve repository metadata (repomd.xml) for repository: updates. Please verify its path and try again 这样的信息,那么将 /etc/yum.repos.d/ 下面 updates 相关的文件进行重命名,我这里将 /etc/yum.repos.d/fedora-updates.repo 重命名为 /etc/yum.repos.d/fedora-updates.repo.bak 。如果更新源的过程中,出现 Error: Cannot retrieve repository metadata (repomd.xml) for repository: salt-latest. Please verify its path and try again 这样的信息,那么将 /etc/yum.repos.d/ 下面 salt-latest 相关的文件进行重命名 。经过上述的步骤之后,Fedora-14的源就配置好了,可以试试yum下载文件,应该OK了吧。
- 1
本站信息
目前本站共被浏览 165583 次
目前本站已经运行 3577 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
目前本站已经运行 3577 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
JLink V9掉固件修复(灯不亮) 3Zephyr笔记2 - 在STM32F429上运行HelloWorld 2计算NandFlash要传入的行地址和列地址 1Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式 0Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式 0Linux MMC子系统 - 4.eMMC 5.1常用命令说明(2) 0
最新评论
标签云
Linux嵌入式实用技巧ARM内核学习问题集合CC++编程语言阅读笔记汇编Linux内核完全注释Windows驱动开发计算机基础ARM11ARMv7-ASTM32IDESublimeLinux内核学习eMMCMMC子系统Ubuntu操作系统OfficeVMWareAPUEgccRTOS中断漫游世界随笔感悟开发工具软件应用编程VsCodearmccarmclang编译器ZephyrSPIJLink网卡驱动安装各种芯片库函数NFSμCOS内核sambaFlashUnix命令与脚本输入法Linux内核设计与实现gitRIFFWAVJATGFTPar8161安装centos有线上网μCGUI字库工程建立右键菜单网络文件系统Firefox百度NTFS文件系统CodeBlocksCentOS数据结构算法PhotoShop51KeilQTUltraEditscanfglibc宏定义UIDGID优先级娱乐天地SourceInsight磁盘扇区总线I2CPDFBComparePythonI2SFPUMakefileSWDCPUARP软件推荐FileZilla