From 5630056259db2dd0c3f0c05072dd1e2d96cd772c Mon Sep 17 00:00:00 2001 From: gdisirio Date: Thu, 1 Nov 2007 11:53:44 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@79 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARM7-LPC214x-GCC/mmcsd.c | 97 ++++++++++++++++++++++++++++++++++ demos/ARM7-LPC214x-GCC/mmcsd.h | 31 +++++++++++ 2 files changed, 128 insertions(+) create mode 100644 demos/ARM7-LPC214x-GCC/mmcsd.c create mode 100644 demos/ARM7-LPC214x-GCC/mmcsd.h diff --git a/demos/ARM7-LPC214x-GCC/mmcsd.c b/demos/ARM7-LPC214x-GCC/mmcsd.c new file mode 100644 index 000000000..ee4c2a93f --- /dev/null +++ b/demos/ARM7-LPC214x-GCC/mmcsd.c @@ -0,0 +1,97 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +#include "lpc214x.h" +#include "lpc214x_ssp.h" + +#include "mmcsd.h" + +static EventSource MMCInsertEventSource; + +void MMCInit(void) { + + chEvtInit(&MMCInsertEventSource); +} + +/* + * Initializes a card after the power up by selecting the SPI mode. + */ +BOOL mmcInit(void) { + + /* + * Starting initialization with slow clock mode. + */ + SetSSP(254, CR0_DSS8BIT | CR0_FRFSPI | CR0_CLOCKRATE(0), 0); + + /* + * SPI mode selection. + */ + sspRW(NULL, NULL, 16); /* 128 clock pulses without ~CS asserted. */ + int i = 0; + while (TRUE) { + chThdSleep(10); + if (mmcSendCommand(0, 0) == 0x01) + break; + if (++i >= CMD0_RETRY) + return TRUE; + } + + /* + * Initialization. + */ + i = 0; + while (TRUE) { + BYTE8 b; + chThdSleep(10); + b = mmcSendCommand(0, 0); + if (b == 0x00) + break; + if (b != 0x01) + return TRUE; + if (++i >= CMD1_RETRY) + return TRUE; + } + + /* + * Full speed. + */ + SetSSP(2, CR0_DSS8BIT | CR0_FRFSPI | CR0_CLOCKRATE(0), 0); + return FALSE; +} + +/* + * Sends a simple command and returns a R1-type response. + */ +BYTE8 mmcSendCommand(BYTE8 cmd, ULONG32 arg) { + BYTE8 buf[6]; + + buf[0] = 0x40 | cmd; + buf[1] = arg >> 24; + buf[2] = arg >> 16; + buf[3] = arg >> 8; + buf[4] = arg; + buf[5] = 0x95; /* Valid for CMD0 ingnored by other commands. */ + sspAcquireBus(); + sspRW(NULL, buf, 6); + sspRW(buf, NULL, 1); + sspReleaseBus(); + return buf[0]; +} diff --git a/demos/ARM7-LPC214x-GCC/mmcsd.h b/demos/ARM7-LPC214x-GCC/mmcsd.h new file mode 100644 index 000000000..40a559955 --- /dev/null +++ b/demos/ARM7-LPC214x-GCC/mmcsd.h @@ -0,0 +1,31 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _MMCSD_H_ +#define _MMCSD_H_ + +#define CMD0_RETRY 10 +#define CMD1_RETRY 100 + +void MMCInit(void); + +BOOL mmcInit(void); +BYTE8 mmcSendCommand(BYTE8 cmd, ULONG32 arg); + +#endif /* _MMCSD_H_*/