sdcard: handles more commands in SPI mode
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Alistair Francis <alistair.francis@xilinx.com> Message-id: 20180215221325.7611-13-f4bug@amsat.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
							parent
							
								
									a21208646d
								
							
						
					
					
						commit
						946897ce18
					
				
							
								
								
									
										27
									
								
								hw/sd/sd.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								hw/sd/sd.c
									
									
									
									
									
								
							@ -1386,9 +1386,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /* Application specific commands (Class 8) */
 | 
					    /* Application specific commands (Class 8) */
 | 
				
			||||||
    case 55:	/* CMD55:  APP_CMD */
 | 
					    case 55:	/* CMD55:  APP_CMD */
 | 
				
			||||||
        if (sd->rca != rca)
 | 
					        if (!sd->spi) {
 | 
				
			||||||
 | 
					            if (sd->rca != rca) {
 | 
				
			||||||
                return sd_r0;
 | 
					                return sd_r0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        sd->expecting_acmd = true;
 | 
					        sd->expecting_acmd = true;
 | 
				
			||||||
        sd->card_status |= APP_CMD;
 | 
					        sd->card_status |= APP_CMD;
 | 
				
			||||||
        return sd_r1;
 | 
					        return sd_r1;
 | 
				
			||||||
@ -1408,6 +1410,18 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case 58:    /* CMD58:   READ_OCR (SPI) */
 | 
				
			||||||
 | 
					        if (!sd->spi) {
 | 
				
			||||||
 | 
					            goto bad_cmd;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return sd_r3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case 59:    /* CMD59:   CRC_ON_OFF (SPI) */
 | 
				
			||||||
 | 
					        if (!sd->spi) {
 | 
				
			||||||
 | 
					            goto bad_cmd;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        goto unimplemented_spi_cmd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
    bad_cmd:
 | 
					    bad_cmd:
 | 
				
			||||||
        qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
 | 
					        qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
 | 
				
			||||||
@ -1431,6 +1445,9 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
 | 
				
			|||||||
    sd->card_status |= APP_CMD;
 | 
					    sd->card_status |= APP_CMD;
 | 
				
			||||||
    switch (req.cmd) {
 | 
					    switch (req.cmd) {
 | 
				
			||||||
    case 6:	/* ACMD6:  SET_BUS_WIDTH */
 | 
					    case 6:	/* ACMD6:  SET_BUS_WIDTH */
 | 
				
			||||||
 | 
					        if (sd->spi) {
 | 
				
			||||||
 | 
					            goto unimplemented_spi_cmd;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        switch (sd->state) {
 | 
					        switch (sd->state) {
 | 
				
			||||||
        case sd_transfer_state:
 | 
					        case sd_transfer_state:
 | 
				
			||||||
            sd->sd_status[0] &= 0x3f;
 | 
					            sd->sd_status[0] &= 0x3f;
 | 
				
			||||||
@ -1565,6 +1582,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
 | 
				
			|||||||
    default:
 | 
					    default:
 | 
				
			||||||
        /* Fall back to standard commands.  */
 | 
					        /* Fall back to standard commands.  */
 | 
				
			||||||
        return sd_normal_command(sd, req);
 | 
					        return sd_normal_command(sd, req);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    unimplemented_spi_cmd:
 | 
				
			||||||
 | 
					        /* Commands that are recognised but not yet implemented in SPI mode.  */
 | 
				
			||||||
 | 
					        qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
 | 
				
			||||||
 | 
					                      req.cmd);
 | 
				
			||||||
 | 
					        return sd_illegal;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
 | 
					    qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user