mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 11:26:12 +08:00
mmcsd: add write ext csd reg support
Signed-off-by: wanggang26 <wanggang26@xiaomi.com>
This commit is contained in:
committed by
Petro Karashchenko
parent
90c0acce05
commit
dfffaee706
@@ -1007,6 +1007,54 @@ static void mmcsd_decode_scr(FAR struct mmcsd_state_s *priv, uint32_t scr[2])
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_MMCSD_IOCSUPPORT
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: mmcsd_switch
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Execute CMD6 to switch the mode of operation of the selected device or
|
||||||
|
* modify the EXT_CSD registers.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int mmcsd_switch(FAR struct mmcsd_state_s *priv, uint32_t arg)
|
||||||
|
{
|
||||||
|
/* After putting a slave into transfer state, master sends
|
||||||
|
* CMD6(SWITCH) to set the PARTITION_ACCESS bits in the EXT_CSD
|
||||||
|
* register, byte[179].After that, master can use the Multiple Block
|
||||||
|
* read and write commands (CMD23, CMD18 and CMD25) to access the
|
||||||
|
* RPMB partition.
|
||||||
|
* PARTITION_CONFIG[179](see 7.4.69)
|
||||||
|
* Bit[2:0] : PARTITION_ACCESS (before BOOT_PARTITION_ACCESS)
|
||||||
|
* User selects partitions to access:
|
||||||
|
* 0x0 : No access to boot partition (default)
|
||||||
|
* 0x1 : R/W boot partition 1
|
||||||
|
* 0x2 : R/W boot partition 2
|
||||||
|
* 0x3 : R/W Replay Protected Memory Block (RPMB)
|
||||||
|
* 0x4 : Access to General Purpose partition 1
|
||||||
|
* 0x5 : Access to General Purpose partition 2
|
||||||
|
* 0x6 : Access to General Purpose partition 3
|
||||||
|
* 0x7 : Access to General Purpose partition 4
|
||||||
|
*
|
||||||
|
* CMD6 Argument(see 6.10.4)
|
||||||
|
* [31:26] Set to 0
|
||||||
|
* [25:24] Access Bits
|
||||||
|
* 00 Command Set
|
||||||
|
* 01 Set Bits
|
||||||
|
* 10 Clear Bits
|
||||||
|
* 11 Write Byte
|
||||||
|
* [23:16] Index
|
||||||
|
* [15:8] Value
|
||||||
|
* [7:3] Set to 0
|
||||||
|
* [2:0] Cmd Set
|
||||||
|
*/
|
||||||
|
|
||||||
|
mmcsd_sendcmdpoll(priv, MMCSD_CMD6, arg);
|
||||||
|
return mmcsd_recv_r1(priv, MMCSD_CMD6);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_MMCSD_IOCSUPPORT */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: mmcsd_get_r1
|
* Name: mmcsd_get_r1
|
||||||
*
|
*
|
||||||
@@ -3200,6 +3248,15 @@ static int mmcsd_iocmd(FAR struct mmcsd_state_s *priv,
|
|||||||
priv->cid, sizeof(priv->cid));
|
priv->cid, sizeof(priv->cid));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MMCSD_CMDIDX6: /* Switch commands */
|
||||||
|
{
|
||||||
|
ret = mmcsd_switch(priv, ic_ptr->arg);
|
||||||
|
if (ret != OK)
|
||||||
|
{
|
||||||
|
ferr("ERROR: mmcsd_switch failed: %d\n", ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
#ifdef CONFIG_MMCSD_MMCSUPPORT
|
#ifdef CONFIG_MMCSD_MMCSUPPORT
|
||||||
case MMC_CMDIDX8: /* Get extended csd reg data */
|
case MMC_CMDIDX8: /* Get extended csd reg data */
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -155,9 +155,10 @@
|
|||||||
# define MMCSD_R1_STATE_DIS ((uint32_t)8 << MMCSD_R1_STATE_SHIFT) /* 8=Disconnect state */
|
# define MMCSD_R1_STATE_DIS ((uint32_t)8 << MMCSD_R1_STATE_SHIFT) /* 8=Disconnect state */
|
||||||
|
|
||||||
#define MMCSD_R1_READYFORDATA ((uint32_t)1 << 8) /* Buffer empty */
|
#define MMCSD_R1_READYFORDATA ((uint32_t)1 << 8) /* Buffer empty */
|
||||||
|
#define MMCSD_R1_SWITCHERROR ((uint32_t)1 << 7) /* Device mode switch error */
|
||||||
#define MMCSD_R1_APPCMD ((uint32_t)1 << 5) /* Next CMD is ACMD */
|
#define MMCSD_R1_APPCMD ((uint32_t)1 << 5) /* Next CMD is ACMD */
|
||||||
#define MMCSD_R1_AKESEQERROR ((uint32_t)1 << 3) /* Authentication error */
|
#define MMCSD_R1_AKESEQERROR ((uint32_t)1 << 3) /* Authentication error */
|
||||||
#define MMCSD_R1_ERRORMASK ((uint32_t)0xfdffe008) /* Error mask */
|
#define MMCSD_R1_ERRORMASK ((uint32_t)0xfdffe088) /* Error mask */
|
||||||
|
|
||||||
#define IS_STATE(v,s) ((((uint32_t)v)&MMCSD_R1_STATE_MASK)==(s))
|
#define IS_STATE(v,s) ((((uint32_t)v)&MMCSD_R1_STATE_MASK)==(s))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user