[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH]Make sd card spi mode to support write operation
From: |
乔崇 |
Subject: |
[Qemu-devel] [PATCH]Make sd card spi mode to support write operation |
Date: |
Fri, 23 Apr 2010 08:39:33 +0800 |
User-agent: |
Mozilla-Thunderbird 2.0.0.22 (X11/20090706) |
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.
--
乔崇 qiaochong.ac.cn
龙芯技术服务中心
office:010-62600855-108
mobile:13521990614
2009年 11月 16日 星期一 10:31:04 CST
>From 150a98805f0238f7b692355b8de6b69b3ae3afc8 Mon Sep 17 00:00:00 2001
From: qiaochong <address@hidden>
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(-)
diff --git a/hw/ssi-sd.c b/hw/ssi-sd.c
index 5e74e5d..72a442c 100644
--- a/hw/ssi-sd.c
+++ b/hw/ssi-sd.c
@@ -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;
}
--
1.5.6.5
>From 96bc31a8103d19ef8876198c6ca99739deac0f2a Mon Sep 17 00:00:00 2001
From: qiaochong <address@hidden>
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(-)
diff --git a/hw/sd.c b/hw/sd.c
index 7b345e7..5569dc6 100644
--- a/hw/sd.c
+++ b/hw/sd.c
@@ -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)
diff --git a/hw/ssi-sd.c b/hw/ssi-sd.c
index 72a442c..6f196de 100644
--- a/hw/ssi-sd.c
+++ b/hw/ssi-sd.c
@@ -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;
--
1.5.6.5
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [PATCH]Make sd card spi mode to support write operation,
乔崇 <=