Make sd card spi mode to support write operation
PATCH 1/1 Make sd card spi mode to support write operation
0001-accroding-sdcard-spi-protocal-should-at-least-wait-8.patch:
accroding sdcard spi protocal,should at least wait 8 spi clk,before response. 0002-make-sd-card-spi-mode-to-support-write.patch
make sd card spi mode to support write.
Signature · 6 lines
乔崇 qiaochong.ac.cn 龙芯技术服务中心 office:010-62600855-108 mobile:13521990614 2009年 11月 16日 星期一 10:31:04 CST
Quoted 1 line
From
150a98805f0238f7b692355b8de6b69b3ae3afc8Mon Sep 17 00:00:00 2001
From: qiaochong <[email protected]>
Date: Thu, 22 Apr 2010 20:11:47 +0800
Subject: [PATCH] accroding sdcard spi protocal,should at least wait 8 spi clk,before
response.
--- hw/ssi-sd.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
hw/ssi-sd.c +1 -0
@@ -155,6 +155,7 @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val) } s->mode =SSI_SD_RESPONSE ; s->response_pos =0 ; + s->stopping =1 ;/*proto need at least 8 clk before data out */ }else { s->cmdarg[s->arglen++] = val; }
Signature · 1 line
1.5.6.5
Quoted 1 line
From
96bc31a8103d19ef8876198c6ca99739deac0f2aMon Sep 17 00:00:00 2001
From: qiaochong <[email protected]>
Date: Thu, 22 Apr 2010 19:39:18 +0800
Subject: [PATCH] make sd card spi mode to support write.
--- hw/sd.c | 6 +----- hw/ssi-sd.c | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 7 deletions(-)
hw/sd.c +1 -5
@@ -900,13 +900,9 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,/* Block write commands (Class 4) */ case 24 :/* CMD24: WRITE_SINGLE_BLOCK */ -if (sd->spi) - goto unimplemented_cmd;switch (sd->state) {case sd_transfer_state:/* Writing in SPI mode not implemented. */ -if (sd->spi) -break ; sd->state = sd_receivingdata_state; sd->data_start = addr; sd->data_offset =0 ;
@@ -1643,7 +1639,7 @@ uint8_t sd_read_data(SDState *sd)int sd_data_ready (SDState *sd) { -return sd->state == sd_sendingdata_state; +return sd->state == sd_sendingdata_state?1 :sd->state == sd_receivingdata_state?2 :0 ; }void sd_enable (SDState *sd,int enable)
hw/ssi-sd.c +19 -2
@@ -30,6 +30,8 @@ typedef enum {SSI_SD_RESPONSE ,SSI_SD_DATA_START ,SSI_SD_DATA_READ , +SSI_SD_DATA_START_WRITE , +SSI_SD_DATA_WRITE , } ssi_sd_mode; typedef struct {
@@ -169,10 +171,13 @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)DPRINTF ("Response 0x%02x\n" , s->response[s->response_pos]);return s->response[s->response_pos++]; } -if (sd_data_ready (s->sd)) { +if (sd_data_ready (s->sd)==1 ) {DPRINTF ("Data read\n" ); s->mode =SSI_SD_DATA_START ; - }else { + }else if (sd_data_ready (s->sd)==2 ) { + s->mode =SSI_SD_DATA_START_WRITE ; + } +else {DPRINTF ("End of command\n" ); s->mode =SSI_SD_CMD ; }
@@ -188,6 +193,18 @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val) s->mode =SSI_SD_CMD ; }return val; +case SSI_SD_DATA_START_WRITE : +DPRINTF ("Start write block\n" ); +if (val==0xfe ) + s->mode =SSI_SD_DATA_WRITE ; +return 0xff ; +case SSI_SD_DATA_WRITE : +sd_write_data (s->sd,val); +if (!sd_data_ready (s->sd)) { +DPRINTF ("Data write end\n" ); + s->mode =SSI_SD_CMD ; + } +return 0xff ; }/* Should never happen. */ return 0xff ;
Signature · 1 line
1.5.6.5