这些就是 AilsonJack 写的文章啦
 2023-11-26T17:31:45.718960    |      Linux MMC子系统    |     AilsonJack    |     暂无评论    |     61 views
设备识别模式(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设备的状态图如下所示:
LinuxLinux内核学习eMMCMMC子系统 阅读全文»
 2023-11-19T10:56:42.559897    |      Linux MMC子系统    |     AilsonJack    |     暂无评论    |     79 views
综述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状态。
LinuxLinux内核学习eMMCMMC子系统 阅读全文»
 2023-11-12T21:25:55.575502    |      Linux MMC子系统    |     AilsonJack    |     暂无评论    |     85 views
面向块的读命令(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设备获取一个数据块。
LinuxLinux内核学习eMMCMMC子系统 阅读全文»
 2023-11-05T20:05:51.895980    |      Linux MMC子系统    |     AilsonJack    |     暂无评论    |     108 views
概述 本文对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设备。
LinuxLinux内核学习eMMCMMC子系统 阅读全文»
 2023-10-27T22:38:18.360379    |      Linux MMC子系统    |     AilsonJack    |     暂无评论    |     83 views
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总线测试的数据格式如下图所示:
LinuxLinux内核学习eMMCMMC子系统 阅读全文»
 2023-10-21T11:09:27.283796    |      Linux MMC子系统    |     AilsonJack    |     暂无评论    |     78 views
前言 下面首先简单的介绍了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)模式。
LinuxLinux内核学习eMMCMMC子系统 阅读全文»
 2023-10-14T11:41:06.811588    |      ARMv7-A    |     AilsonJack    |     暂无评论    |     69 views
ARMv7-A 那些事 - 7.栈回溯浅析在嵌入式开发过程中,经常需要对代码进行调试来解决各种各样的问题,常用的调试手段有:(1)、开发环境搭配硬件仿真器进行在线调试。优点:调试过程中能够清楚的知道各个寄存器的值以及各个变量的值,程序的执行流程也能够一目了然。缺点:板卡需要引出硬件仿真器的连接口,并且需要购买硬件仿真器。(2)、通过调试串口打印信息梳理程序的执行流程,结合代码分析问题产生的原因。优点:足够简单,通过增加较多的打印信息来分析问题出现的位置,再结合代码分析问题产生的原因。缺点:没法准确的定位问题产生的位置和原因。(3)、在应用或者操作系统死机的时候,根据操作系统输出的异常栈信息进行分析,再结合镜像或者应用的反汇编代码进行定位。通常这种方法和方法(2)结合使用。本文主要简单的讲讲栈回溯,对于以后去理解操作系统的异常栈处理打个基础吧。ARM处理器的栈回溯主要有两种方式:一种是基于栈帧寄存器(FP)的栈回溯,另一种是unwind形式的栈回溯。本文主要讲讲基于栈帧寄存器(FP)的栈回溯。栈回溯相关寄存器在栈回溯过程中,主要涉及如下寄存器:R15:又叫程序计数器(Program Counter)PC,PC主要用于存放CPU取指的地址。R14:又叫链接寄存器(Link register)LR,LR主要用于存放函数的返回地址,即当函数返回时,知道自己该回到哪儿去继续运行。R13:又叫堆栈指针寄存器(Stack pointer)SP,SP通常用于保存堆栈地址,在使用入栈和出栈指令时,SP中的堆栈地址会自动的更新。R12:又叫内部过程调用暂存寄存器(Intra-Procedure-call scratch register)IP,主要用于暂存SP。R11:又叫帧指针寄存器(Frame pointer)FP,通常指向一个函数的栈帧底部,表示一个函数栈的开始位置。ARM栈帧结构依据AAPCS (ARM Archtecture Procedure Call Standard)规范,当调用子函数时,子函数一开始的代码总是会执行压栈操作来保留父函数的相关信息,压栈步骤示例如下所示:每个函数都有自己的栈空间,这一部分称为栈帧。栈帧在函数被调用的时候创建,在函数返回后销毁。每个函数的栈帧是由SP寄存器和FP寄存器来界定的,ARM栈帧结构典型示意图如下所示:上图描述的栈帧,main函数和func1函数的示意代码如下:每个函数的栈帧中都会保存调用该函数之前的PC、LR、SP、FP寄存器的值;如果函数具有参数并且函数内部使用了局部变量,那么函数栈帧中也会保存函数的参数和局部变量;如果被调用的子函数参数过多,那么多余的参数会通过父函数的栈进行传递。比如func1函数的参数p5通过main函数的栈帧进行传递的。(注:编译器的版本不同,函数栈帧中参数和局部变量的压栈顺序可能不同,PC,LR,SP和FP这4个寄存器的压栈顺序一般是固定的)函数栈帧中的PC和LR均指向代码段,PC表示执行入栈指令时CPU正在取指的地址,LR表示当前函数返回后继续执行的地址。栈回溯原理在栈回溯的过程中,我们主要利用FP寄存器进行栈回溯。通过FP就可以知道当前函数的栈底,从而可以找到存储在栈帧中的LR寄存器的数据,这个数据就是函数的返回地址。同时也可以找到保存在函数栈帧中的上一级函数FP的数据,这个数据指向了上一级函数的栈底,按照同样的方法可以找出上一级函数栈帧中存储的LR和FP数据,就知道哪个函数调用了上一级函数以及这个函数的栈底地址。这就是栈回溯的流程,整个流程以FP为核心,依次找出每个函数栈帧中存储的LR和FP数据,计算出函数返回地址和上一级函数栈底地址,从而找出每一级函数调用关系。栈回溯编译选项当gcc的编译选项带有-mapcs-frame时,编译出来的代码能够将PC,LR,SP和FP寄存器的值压入函数的栈帧中。默认情况下gcc的编译选项为-mno-apcs-frame,此时编译出来的代码不一定会将PC,LR,SP和FP这四个寄存器的值压入函数的栈帧中,可能只会将LR和FP寄存器的值压入函数的栈帧中。关于-mapcs-frame选项,gcc的手册描述如下:我这里使用的gcc信息如下:虽然gcc手册上说-mapcs-frame选项被废弃了,但是只有添加了该选项,编译出来的代码才会将PC,LR,SP和FP寄存器的值压入函数的栈帧中。我这里编译代码仍然使用-mapcs-frame选项,有知道该选项对应的新的栈帧配置选项的兄弟可以告知我一下。栈回溯示例根据前面的内容,这里简单的写了一个栈回溯的示例,函数调用流程为:main -> test_a -> test_b -> test_c。函数的源代码如下:上述函数的反汇编内容如下:当程序运行到test_c()函数的return c;代码处时,FP的值为0x9FDFFF94,此时内存数据如下:test_c()函数的栈底为0x9FDFFF94,可以得到test_c()函数栈帧中LR为0x800021C8、FP为0x9FDFFFB4,LR是test_c()函数执行完成后的返回地址,与反汇编代码中test_b()函数调用完test_c()之后的下一个执行地址一致:FP为0x9FDFFFB4表示test_b()函数的栈底为0x9FDFFFB4,有了test_b()函数的栈底就可以得到test_b()函数栈帧中LR为0x80002194、FP为0x9FDFFFDC,从而知道test_b()函数执行完成后的返回地址以及test_a()函数的栈底,依次逐级回溯,就可以知道程序的整个运行流程了。在栈回溯的过程中我们可以利用addr2line工具辅助我们对程序执行流程的分析。
ARMARMv7-A嵌入式 阅读全文»
 2023-10-07T14:58:03.699768    |      ARMv7-A    |     AilsonJack    |     暂无评论    |     25 views
ARMv7-A 那些事 - 6.常用汇编指令对于搞嵌入式驱动或者操作系统的人来说,掌握汇编语言的使用还是比较重要的,毕竟有时候在分析定位问题的时候,多多少少都会有汇编的身影。本文主要讲讲ARM指令集格式以及常用的ARM汇编指令(主要包括LDR和STR指令,LDM和STM指令,push和pop指令,MOV指令,CPS指令,MRS和MSR指令,MRC和MCR指令,其余指令暂时没列出来,用到时可以查看ARM手册进行了解)。ARM指令集格式ARMv7架构是一个32位的处理器架构。同时ARM架构是一个加载/存储体系结构,所有的数据处理操作需要在通用寄存器中完成。要学习了解处理器的汇编指令,那么首先可以看看汇编指令的通用表达式,具体的指令也就是使用具体的指令和参数代替通用表达式的参数。ARM指令集的指令表达如下所示:opcode{<cond>}{S} <Rd>, <Rn> {, <Rm>}opcode:指令助记符,比如LDR,STR,MOV等。{}:大括号括起来的内容表示可选。<>:<>括起来的内容是必须的。cond:条件码,比如EQ,NE,CS等,条件码的内容如下图所示:S:可选的后缀,如果指令中添加了S,那么指令的执行结果将会影响到CPSR寄存器的标志位域。Rd:目标寄存器。Rn:第一个操作数寄存器。Rm:第二个操作数寄存器。在了解了ARM指令的表达式之后,下面就讲讲常用的汇编指令。LDR和STR指令LDR指令用于从内存中读取数据存储到通用寄存器中。STR指令用于将通用寄存器中的值存储到内存中。LDR指令的语法如下所示:STR指令的语法如下所示:type:操作的数据宽度,可以是:B(unsigned byte),SB(signed byte),H(unsigned halfword),SH(signed halfword)。cond:条件码。Rt:目标寄存器。Rn:存储内存操作基地址的寄存器。Rm:存储偏移量的寄存器。offset:立即数。!:如果存在,表示最终的地址要写回Rn。T:表示处理器是在用户模式下访问内存地址。加载存储指令有4种寻址方式,LDR的操作描述如下(STR指令的操作类似):寄存器寻址:要寻址的地址存放在寄存器中。前变基寻址:在内存访问之前,将寄存器中的内存地址加上偏移量之后作为新的内存地址进行内存访问。指令形式为:LDR Rt, [Rn, Op2]。偏移量Op2可以是正数或者是负数,可以是一个立即数,可以是另一个寄存器的值,可以是另一个寄存器中的数据进行移位之后的值。带写回的前变基寻址:指令形式为:LDR Rt, [Rn, Op2]!。该寻址模式和前变基寻址一样,只是在访问完内存之后Rn寄存器中的值就更新为运算之后得到的新内存地址的值。带写回的后变基寻址:指令形式为:LDR Rt, [Rn], #offset和LDR Rt, [Rn], +/-Rm。将寄存器Rn中存储的数值作为内存地址,将该内存地址中的数据读出来存储到Rt寄存器中,然后将内存地址加减立即数offset或者Rm寄存器中的数值得到新的内存地址存储到Rn寄存器中。上面说的这些有可能不太好懂,下面简单的列举几个例子吧:STR指令的操作和LDR指令类似,这里就不列举了。LDR伪指令LDR相关的伪指令语法如下所示:下面是LDR伪指令简单的使用:LDM和STM指令LDM指令用于加载指定地址上的数据保存到一个或者多个寄存器中。STM指令用于将一个或者多个寄存器中的数据存储到指定地址上。LDM和STM指令主要用于现场保护和数据复制。LDM指令的语法如下所示:LDM{addr_mode}{cond} Rn{!},reglist{^}STM指令的语法如下所示:STM{addr_mode}{cond} Rn{!},reglist{^}addr_mode:地址模式,用于数据块传输的地址模式,如下所示:也可以使用相应的面向堆栈的寻址模式,如下所示:cond:条件码。Rn:Rn存储了用于传输的初始地址。!:如果存在,表示最终的地址要写回Rn。reglist:用{}括起来的一个寄存器或者多个寄存器组成的列表。它可以是一个寄存器范围。如果{}中的寄存器超过一个,那么寄存器或者寄存器范围之间通过逗号(,)分隔。^:如果在除了USR模式和SYS模式下存在该符号,意味着将发生下述的两个动作:当寄存器列表中不包含PC时,加载/存储的是USR模式的寄存器,而不是当前模式的寄存器。在使用LDM指令时,如果寄存器列表中包含PC时,那么除了正常的多寄存器传送外,会将SPSR 拷贝到CPSR 中,这可用于异常处理返回。上面的内容可能不是很好理解,下面简单的列举写例子:LDMIA和STMIA例子LDMIA例子如下所示:STMIA例子如下所示:LDMIB和STMIB例子LDMIB例子如下所示:STMIB例子如下所示:LDMDA和STMDA例子LDMDA例子如下所示:STMDA例子如下所示:LDMDB和STMDB例子LDMDB例子如下所示:STMDB例子如下所示:现场保护在数据块的传输中:STMDB和LDMIA对应使用,STMIA和LDMDB对应使用。在堆栈操作中:STMFD和LDMFD对应使用,STMFA和LDMFA对应使用。在子程序或者异常处理时,使用LDMFD和STMFD进行现场保护的例子如下:同样的可以使用STMDB和LDMIA指令进行现场保护,因此上述代码可以修改成下述形式:push和pop指令push和pop指令主要用于子程序或者异常的现场保护。push指令用于将寄存器内容压入堆栈。pop指令用于将堆栈中的内容恢复到寄存器中。push指令的语法如下所示:PUSH{cond} reglistpop指令的语法如下所示:POP{cond} reglistcond:条件码。reglist:用{}括起来的一个寄存器或者多个寄存器组成的列表。它可以是一个寄存器范围。如果{}中的寄存器超过一个,那么寄存器或者寄存器范围之间通过逗号(,)分隔。push指令等价于STMDB指令。pop指令等价于LDMIA指令。使用push指令和pop指令保护现场的例子如下所示:MOV指令MOV指令主要用于将数据搬移到寄存器中。MOV指令的语法如下所示:S:可选的后缀,如果指令中添加了S,那么指令的执行结果将会影响到CPSR寄存器的标志位域。cond:条件码。Rn:目标寄存器。Rm:源寄存器。imm:立即数。MOV指令的使用例子如下:CPS指令可以通过CPS(Change Processor State)指令来修改处理器模式。CPS指令也可以用来使能或者禁止异常。CPS指令的语法如下所示:mode是处理器的模式编码,比如在从其他模式下切换到SYS模式,使用下述代码即可:IE使能中断或者终止。ID禁止中断或者终止。iflags由下面的一种或者几种组成:a:表示异步终止(asynchronous abort);i:表示中断(IRQ);f:表示快中断(FIQ);下述代码是CPS指令的一些简单用法:MRS与MSR指令MRS和MSR指令可用于读写程序状态寄存器CPSR,APSR和SPSR。在ARM处理器中,只有MRS指令可以从程序状态寄存器CPSR,APSR和SPSR中读出数据到通用寄存器中。MRS指令操作程序状态寄存器的语法如下:MRS{cond} Rd, psrcond为条件码。Rd为目标寄存器,Rd不允许为R15。psr为程序状态寄存器CPSR,APSR或者SPSR。MRS指令的示例代码如下所示:MSR指令可以用来写程序状态寄存器CPSR,APSR和SPSR的全部或者部分域。MSR指令操作程序状态寄存器的语法如下:cond为条件码。psr为程序状态寄存器CPSR或者SPSR。constant是一个8位立即数。ARM文档对于constant的介绍如下:constant is an 8-bit pattern rotated by an even number of bits within a 32-bit word. (Not available in Thumb.)Rm是源寄存器。fields由下面的一个或者多个组合而成:c:xPSR[7:0],控制位域;x:xPSR[15:8],扩展位域;s:xPSR[23:16],状态位域;f:xPSR[31:24],标志位域;MSR指令的示例代码如下所示:只有在除用户模式外的其他模式下才能够修改状态寄存器。MRC和MCR指令ARMv7-A体系结构的处理器提供了MRC和MCR指令用于对协处理器进行读写操作。MRC指令用于将协处理器中的寄存器数据读取到ARM通用寄存器中。MCR指令用于将ARM通用寄存器中的数据写入到协处理器的寄存器中。MRCMRC指令的语法如下所示:MRC{cond} coproc, opc1, Rt, CRn, CRm{, opc2}cond为条件码。coproc为协处理器名称,CP0~CP15协处理器分别对应名称p0~p15。opc1为协处理器要执行的操作码,取指范围为0~7。Rt为ARM通用寄存器,用于存储读取到的协处理器寄存器数据。CRn为协处理器寄存器,对于CP15协处理器来说,CRn取值范围为c0~c15。CRm为协处理器寄存器,对于CP15协处理器来说,通过CRm和opc2一起来确定CRn对应的具体寄存器。opc2为可选的协处理器执行操作码,取指范围为0~7,当不需要的时候要设置为0。MRC指令使用示例如下:MCRMCR指令的语法如下所示:MCR{cond} coproc, opc1, Rt, CRn, CRm{, opc2}cond为条件码。coproc为协处理器名称,CP0~CP15协处理器分别对应名称p0~p15。opc1为协处理器要执行的操作码,取指范围为0~7。Rt为ARM通用寄存器,用于存储要写入到协处理器寄存器中的数据。CRn为协处理器寄存器,对于CP15协处理器来说,CRn取值范围为c0~c15。CRm为协处理器寄存器,对于CP15协处理器来说,通过CRm和opc2一起来确定CRn对应的具体寄存器。opc2为可选的协处理器执行操作码,取指范围为0~7,当不需要的时候要设置为0。MCR指令使用示例如下:
ARMARMv7-A嵌入式 阅读全文»
 2023-10-01T15:56:59.169093    |      ARMv7-A    |     AilsonJack    |     暂无评论    |     28 views
ARMv7-A 那些事 - 5.CP15协处理器协处理器概述ARM架构通过支持协处理器来扩展处理器的功能。ARM架构的处理器支持最多16个协处理器,通常称为CP0~CP15。下述的协处理器被ARM用于特殊用途:CP15:提供系统控制功能,主要用于配置MMU、TLB和Cache等功能。CP14:主要用于控制系统Debug功能。CP10、CP11:两个协处理器一起提供了对浮点运算和向量操作的支持,这两个协处理器主要用于控制和配置浮点功能和高级SIMD指令扩展。其他协处理器被ARM保留用于将来使用。本文主要说说CP15协处理器。CP15协处理器总览CP15是系统控制协处理器,主要用于对ARM处理器核心支持的许多特性功能进行配置。CP15协处理器支持16个32位主寄存器(primary register),命名为c0~c15。c0~c15主寄存器各自又有多个32位的物理寄存器(physical register)。CP15协处理器的大多数寄存器不能在USR模式下访问,只能在除USR模式外的其他模式下访问。下面列出c0~c15中比较常用的寄存器:primary registerphysical register描述c0MIDR主ID寄存器,用于记录版本信息c0MPIDR多核处理器情况下,提供一种方法来唯一标识集群中的各个核心c1SCTLR系统控制寄存器c1ACTLR辅助控制寄存器c1CPACR协处理器访问控制寄存器,控制访问除了CP14和CP15的协处理器c1SCR安全配置寄存器,被TrustZone使用c2、c3TTBR0一级转换页表基址寄存器0c2、c3TTBR1一级转换页表基址寄存器1c2、c3TTBCR页表转换控制寄存器c5、c6DFSR数据异常(Data Fault)状态寄存器c5、c6IFSR指令异常(Instruction Fault)状态寄存器c5、c6DFAR数据异常(Data Fault)地址寄存器c5、c6IFAR指令异常(Instruction Fault)地址寄存器c7branch predictorcache和分支预测管理功能c7barrier数据和指令屏障操作c8TLBTLB操作c9performance monitors性能监视器c12VBAR提供非监视模式处理异常的异常基地址c12MVBAR提供监视模式处理异常的异常基地址c13CONTEXTIDR上下文ID寄存器c15CBAR配置基址寄存器,为GIC和本地时钟类型外设提供基地址在CP15协处理器中,c0~c15每个主处理器下面有多个物理寄存器,上述表格只列出了部分常用的物理寄存器。协处理器操作指令ARMv7-A体系结构的处理器提供了MRC和MCR指令用于对协处理器进行读写操作。MRC指令用于将CP15协处理器中的寄存器数据读取到ARM通用寄存器中。MCR指令用于将ARM通用寄存器中的数据写入到CP15协处理器的寄存器中。MRCMRC指令的语法如下所示:MRC{cond} coproc, opc1, Rt, CRn, CRm{, opc2}cond为条件码。coproc为协处理器名称,CP0~CP15协处理器分别对应名称p0~p15。opc1为协处理器要执行的操作码,取指范围为0~7。Rt为ARM通用寄存器,用于存储读取到的协处理器寄存器数据。CRn为协处理器寄存器,对于CP15协处理器来说,CRn取值范围为c0~c15。CRm为协处理器寄存器,对于CP15协处理器来说,通过CRm和opc2一起来确定CRn对应的具体寄存器。opc2为可选的协处理器执行操作码,取指范围为0~7,当不需要的时候要设置为0。MRC指令使用示例如下:MCRMCR指令的语法如下所示:MCR{cond} coproc, opc1, Rt, CRn, CRm{, opc2}cond为条件码。coproc为协处理器名称,CP0~CP15协处理器分别对应名称p0~p15。opc1为协处理器要执行的操作码,取指范围为0~7。Rt为ARM通用寄存器,用于存储要写入到协处理器寄存器中的数据。CRn为协处理器寄存器,对于CP15协处理器来说,CRn取值范围为c0~c15。CRm为协处理器寄存器,对于CP15协处理器来说,通过CRm和opc2一起来确定CRn对应的具体寄存器。opc2为可选的协处理器执行操作码,取指范围为0~7,当不需要的时候要设置为0。MCR指令使用示例如下:CP15协处理器主寄存器组成CP15协处理器有c0~c15总共16个主寄存器,在每个主寄存器下面,又有多个物理寄存器。下图总结了CP15协处理器的寄存器组织形式:上图对于MRC和MCR指令所要使用到的一些参数都标明了,对于想要访问CP15协处理器相关寄存器,只需要看图填写好参数就行了。下面具体列一下c0~c15各个主寄存器的组成。CP15协处理器c0寄存器组成主寄存器c0主要提供ID相关的功能,c0寄存器的组成如下图所示:CP15协处理器c1寄存器组成主寄存器c1主要提供系统控制相关的功能,c1寄存器的组成如下图所示:在CP15协处理器的寄存器中,系统控制寄存器SCTLR是被访问的比较多的寄存器。对SCTLR寄存器的访问需要在PL1或者更高的特权等级。SCTLR寄存器的位关系如下图所示:位标志说明30TEThumb异常使能,控制在异常发生时(包括reset),将会进入哪种指令集,0:ARM指令集,1:Thumb指令集27NMFI不可屏蔽的FIQ支持,0:软件可以通过写CPSR.F位来屏蔽FIQ,1:软件不可以通过写CPSR.F位来屏蔽FIQ25EE在进入异常处理时的大小端模式配置,0:小端,1:大端22U表明是否使用对齐模式21FIFIQ配置使能13V选择异常向量表基址,0:0x00000000,1:0xffff000012I指令cache使能11Z分支预测使能2C数据cache使能1A对齐检查使能0MMMU使能CP15协处理器c2 c3寄存器组成主寄存器c2和c3主要提供内存保护和内存控制相关的功能,c2和c3寄存器的组成如下图所示:CP15协处理器c4寄存器组成在任何基于ARMv7实现的处理器中,协处理器CP15的c4寄存器没有被使用。CP15协处理器c5 c6寄存器组成主寄存器c5和c6主要提供内存系统错误上报功能,c5和c6寄存器的组成如下图所示:CP15协处理器c7寄存器组成主寄存器c7主要提供cache维护,地址转换和内存屏障操作相关的功能,c7寄存器的组成如下图所示:CP15协处理器c8寄存器组成主寄存器c8主要提供TLB维护相关的功能,c8寄存器的组成如下图所示:CP15协处理器c9寄存器组成主寄存器c9保留用于分支预测,cache和TCM操作,c9寄存器的组成如下图所示:CP15协处理器c10寄存器组成主寄存器c10主要提供内存重映射和TLB控制相关的功能,c10寄存器的组成如下图所示:CP15协处理器c11寄存器组成主寄存器c11保留用于TCM DMA操作,c11寄存器的组成如下图所示:CP15协处理器c12寄存器组成主寄存器c12提供安全扩展功能,c12寄存器的组成如下图所示:CP15协处理器c13寄存器组成主寄存器c13提供进程ID、上下文ID和线程ID处理功能,c13寄存器的组成如下图所示:CP15协处理器c14寄存器组成主寄存器c14保留用于通用定时器功能,c14寄存器的组成如下图所示:CP15协处理器c15寄存器组成主寄存器c15由处理器实现决定。这里只是简单的将CP15各个主寄存器的组成列出来了,方便在使用MRC和MCR指令配置CP15主寄存器时,查看指令各个参数的设置,以及对照配置的具体寄存器,至于寄存器的具体内容由于篇幅原因就不列出来了,CP15寄存器的细节可以参考ARMv7AR手册的B3.17章节内容。
ARMARMv7-A嵌入式 阅读全文»
  • 1

  本站信息

目前本站共被浏览 156897 次
目前本站已经运行 3373 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号