On 2/28/21 8:33 PM, Sai Pavan Boddu wrote: > From: Vincent Palatin <vpala...@chromium.org> > > Sends the EXT_CSD register as response to CMD8. > > Signed-off-by: Vincent Palatin <vpala...@chromium.org> > Signed-off-by: Sai Pavan Boddu <sai.pavan.bo...@xilinx.com> > --- > hw/sd/sd.c | 52 ++++++++++++++++++++++++++++++++++++---------------- > 1 file changed, 36 insertions(+), 16 deletions(-) > > diff --git a/hw/sd/sd.c b/hw/sd/sd.c > index a26695b..181e7e2 100644 > --- a/hw/sd/sd.c > +++ b/hw/sd/sd.c > @@ -1141,24 +1141,37 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, > SDRequest req) > } > break; > > - case 8: /* CMD8: SEND_IF_COND */ > - if (sd->spec_version < SD_PHY_SPECv2_00_VERS) { > - break; > - } > - if (sd->state != sd_idle_state) { > - break; > - } > - sd->vhs = 0; > - > - /* No response if not exactly one VHS bit is set. */ > - if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + 1))) { > - return sd->spi ? sd_r7 : sd_r0; > - } > + case 8: /* CMD8: SEND_IF_COND / SEND_EXT_CSD */ > + if (sd->emmc) { > + switch (sd->state) { > + case sd_transfer_state: > + /* MMC : Sends the EXT_CSD register as a Block of data */ > + sd->state = sd_sendingdata_state; > + memcpy(sd->data, sd->ext_csd, sizeof(sd->ext_csd)); > + sd->data_start = addr; > + sd->data_offset = 0; > + return sd_r1; > + default: > + break; > + }
This is big enough to be a SDCardClass handler. Thanks, C. > + } else { > + if (sd->spec_version < SD_PHY_SPECv2_00_VERS) { > + break; > + } > + if (sd->state != sd_idle_state) { > + break; > + } > + sd->vhs = 0; > > - /* Accept. */ > - sd->vhs = req.arg; > - return sd_r7; > + /* No response if not exactly one VHS bit is set. */ > + if (!(req.arg >> 8) || (req.arg >> (ctz32(req.arg & ~0xff) + > 1))) { > + return sd->spi ? sd_r7 : sd_r0; > + } > > + /* Accept. */ > + sd->vhs = req.arg; > + return sd_r7; > + } > case 9: /* CMD9: SEND_CSD */ > switch (sd->state) { > case sd_standby_state: > @@ -2081,6 +2094,13 @@ uint8_t sd_read_byte(SDState *sd) > sd->state = sd_transfer_state; > break; > > + case 8: /* CMD8: SEND_EXT_CSD on MMC */ > + ret = sd->data[sd->data_offset++]; > + if (sd->data_offset >= sizeof(sd->ext_csd)) { > + sd->state = sd_transfer_state; > + } > + break; > + > case 9: /* CMD9: SEND_CSD */ > case 10: /* CMD10: SEND_CID */ > ret = sd->data[sd->data_offset ++]; >