From patchwork Fri Apr 23 00:39:33 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: QiaoChong X-Patchwork-Id: 50775 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 3A605B7C48 for ; Fri, 23 Apr 2010 10:41:34 +1000 (EST) Received: from localhost ([127.0.0.1]:42469 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O56xX-00077c-Dq for incoming@patchwork.ozlabs.org; Thu, 22 Apr 2010 20:41:31 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O56wy-00077W-Fx for qemu-devel@nongnu.org; Thu, 22 Apr 2010 20:40:56 -0400 Received: from [140.186.70.92] (port=43353 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O56wx-00077N-6O for qemu-devel@nongnu.org; Thu, 22 Apr 2010 20:40:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O56wv-00060m-8R for qemu-devel@nongnu.org; Thu, 22 Apr 2010 20:40:55 -0400 Received: from webmail.ict.ac.cn ([159.226.39.7]:52367 helo=ict.ac.cn) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O56wu-0005zq-Hw for qemu-devel@nongnu.org; Thu, 22 Apr 2010 20:40:53 -0400 Received: (qmail 27988 invoked by uid 507); 23 Apr 2010 08:44:10 +0800 Received: from unknown (HELO ?192.168.110.140?) (qiaochong@10.2.1.99) by ict.ac.cn with SMTP; 23 Apr 2010 08:44:10 +0800 Message-ID: <4BD0EC45.9010107@loongson.cn> Date: Fri, 23 Apr 2010 08:39:33 +0800 From: =?GB2312?B?x8ez5w==?= User-Agent: Mozilla-Thunderbird 2.0.0.22 (X11/20090706) MIME-Version: 1.0 To: qemu-devel@nongnu.org X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) Subject: [Qemu-devel] [PATCH]Make sd card spi mode to support write operation X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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. From 96bc31a8103d19ef8876198c6ca99739deac0f2a Mon Sep 17 00:00:00 2001 From: qiaochong 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