diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2007-11-01 11:53:44 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2007-11-01 11:53:44 +0000 |
commit | 5630056259db2dd0c3f0c05072dd1e2d96cd772c (patch) | |
tree | 0982e82c5714bf687c59bf471a665b8663aeb863 /demos | |
parent | b2c9fee64c7f09ac2859e550fa20286f349d2ec0 (diff) | |
download | ChibiOS-5630056259db2dd0c3f0c05072dd1e2d96cd772c.tar.gz ChibiOS-5630056259db2dd0c3f0c05072dd1e2d96cd772c.tar.bz2 ChibiOS-5630056259db2dd0c3f0c05072dd1e2d96cd772c.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@79 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'demos')
-rw-r--r-- | demos/ARM7-LPC214x-GCC/mmcsd.c | 97 | ||||
-rw-r--r-- | demos/ARM7-LPC214x-GCC/mmcsd.h | 31 |
2 files changed, 128 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>.
+*/
+
+#include <ch.h>
+
+#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 <http://www.gnu.org/licenses/>.
+*/
+
+#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_*/
|