summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm/olympus
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/olympus')
-rw-r--r--firmware/target/arm/olympus/mrobe-500/spi-mr500.c77
-rw-r--r--firmware/target/arm/olympus/mrobe-500/spi-target.h29
2 files changed, 106 insertions, 0 deletions
diff --git a/firmware/target/arm/olympus/mrobe-500/spi-mr500.c b/firmware/target/arm/olympus/mrobe-500/spi-mr500.c
new file mode 100644
index 0000000000..6c0d4b5990
--- /dev/null
+++ b/firmware/target/arm/olympus/mrobe-500/spi-mr500.c
@@ -0,0 +1,77 @@
+/*
+ * SPI interface driver for the DM320 SoC
+ *
+ * Copyright (C) 2007 shirour <mrobefan@gmail.com>
+ * Copyright (C) 2007 Catalin Patulea <cat@vv.carleton.ca>
+ *
+ * This program 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 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "system.h"
+
+#define GIO_TS_ENABLE (1<<2)
+#define clr_gio_enable() outw(GIO_TS_ENABLE, IO_GIO_BITSET1)
+#define set_gio_enable() outw(GIO_TS_ENABLE, IO_GIO_BITCLR1)
+
+int dm320_spi_block_transfer(const uint8_t *tx_bytes, unsigned int tx_size,
+ uint8_t *rx_bytes, unsigned int rx_size)
+{
+ /* Activate the slave select pin */
+ set_gio_enable();
+
+ while (tx_size--)
+ {
+ /* Send one byte */
+ IO_SERIAL0_TX_DATA = *tx_bytes++;
+
+ /* Wait until transfer finished */
+ while (IO_SERIAL0_RX_DATA & 0x100);
+ }
+
+ while (rx_size--)
+ {
+ /* Make the clock tick */
+ IO_SERIAL0_TX_DATA = 0;
+
+ /* Wait until transfer finished */
+ unsigned short data;
+ while ((data = IO_SERIAL0_RX_DATA) & 0x100);
+
+ *rx_bytes++ = data & 0xff;
+ }
+
+ clr_gio_enable();
+
+ return 0;
+}
+
+void dm320_spi_init(void)
+{
+ /* Set SCLK idle level = 0 */
+ IO_SERIAL0_MODE |= (1<<10);
+
+ /* Enable TX */
+ IO_SERIAL0_TX_ENABLE = 0x0001;
+
+ /* Set GIO 18 to output for touch screen slave enable */
+ outw(inw(IO_GIO_DIR1)&~GIO_TS_ENABLE, IO_GIO_DIR1);
+ clr_gio_enable();
+}
diff --git a/firmware/target/arm/olympus/mrobe-500/spi-target.h b/firmware/target/arm/olympus/mrobe-500/spi-target.h
new file mode 100644
index 0000000000..ebaacb45a0
--- /dev/null
+++ b/firmware/target/arm/olympus/mrobe-500/spi-target.h
@@ -0,0 +1,29 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id: $
+ *
+ * Copyright (C) 2007 by Catalin Patulea
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#ifndef SPI_TARGET_H
+#define SPI_TARGET_H
+
+#include <inttypes.h>
+
+void dm320_spi_init(void);
+int dm320_spi_block_transfer(const uint8_t *tx_bytes, unsigned int tx_size,
+ uint8_t *rx_bytes, unsigned int rx_size);
+
+#endif