summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/SOURCES5
-rw-r--r--firmware/drivers/rtc/rtc_mr100.c114
-rw-r--r--firmware/drivers/sw_i2c.c (renamed from firmware/target/coldfire/iriver/h100/sw_i2c-h100.c)44
-rw-r--r--firmware/export/config-mrobe100.h2
-rw-r--r--firmware/export/config.h1
-rw-r--r--firmware/export/sw_i2c.h4
6 files changed, 160 insertions, 10 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index eaa4cb32cb..9330576145 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -148,6 +148,8 @@ drivers/rtc/rtc_s3c2440.c
drivers/rtc/rtc_as3514.c
#elif (CONFIG_RTC == RTC_RX5X348AB)
drivers/rtc/rtc_rx5x348ab.c
+#elif (CONFIG_RTC == RTC_MR100)
+drivers/rtc/rtc_mr100.c
#endif /* (CONFIG_RTC == RTC_) */
#endif /* SIMULATOR */
@@ -523,12 +525,12 @@ target/coldfire/iriver/audio-iriver.c
#ifdef IRIVER_H100_SERIES
#ifndef SIMULATOR
+drivers/sw_i2c.c
target/coldfire/ata-as-coldfire.S
target/coldfire/iriver/ata-iriver.c
target/coldfire/iriver/lcd-remote-iriver.c
target/coldfire/iriver/system-iriver.c
target/coldfire/iriver/fmradio_i2c-iriver.c
-target/coldfire/iriver/h100/sw_i2c-h100.c
target/coldfire/iriver/h100/adc-h100.c
target/coldfire/iriver/h100/backlight-h100.c
target/coldfire/iriver/h100/button-h100.c
@@ -661,6 +663,7 @@ target/arm/tms320dm320/dsp-dm320.c
#ifdef MROBE_100
#ifndef SIMULATOR
+drivers/sw_i2c.c
target/arm/ata-as-arm.S
target/arm/ata-pp5020.c
target/arm/wmcodec-pp.c
diff --git a/firmware/drivers/rtc/rtc_mr100.c b/firmware/drivers/rtc/rtc_mr100.c
new file mode 100644
index 0000000000..96d84156a7
--- /dev/null
+++ b/firmware/drivers/rtc/rtc_mr100.c
@@ -0,0 +1,114 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2008 by Robert Kukla
+ *
+ * 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.
+ *
+ ****************************************************************************/
+#include "rtc.h"
+#include "logf.h"
+#include "sw_i2c.h"
+#include "i2c-pp.h"
+
+/* The RTC chip is unknown, the information about it was gathered by
+ * reverse engineering the bootloader.
+ */
+
+#define RTC_ADDR 0x60
+
+#define RTC_CMD_CTRL 0 /* OF uses it with single byte 1 or 2 */
+#define RTC_CMD_UNKN 1 /* OF uses it with single byte 8 */
+#define RTC_CMD_DATA 2
+#define RTC_CMD_TEST 7 /* OF uses it with single byte 0xAA */
+
+/* private */
+
+static void reverse_bits(unsigned char* v, int size) {
+
+ int i,j,in,out=0;
+
+ for(j=0; j<size; j++) {
+ in = v[j];
+ for(i=0; i<8; i++) {
+ out |= (in & 1);
+ in = in >>1;
+ out = out<<1;
+ }
+ v[j] = out>>1;
+ }
+}
+
+static int sw_i2c(int access, unsigned char chip, unsigned char cmd,
+ unsigned char* buf, int count) {
+ int i;
+
+ i2c_lock();
+ GPIOC_ENABLE |= 0x00000030;
+
+ chip|=cmd<<1;
+
+ if(access == SW_I2C_READ) {
+ i = sw_i2c_read(chip, 0, buf, count);
+ reverse_bits(buf, count);
+ } else {
+ reverse_bits(buf, count);
+ i = sw_i2c_write(chip, 0, buf, count);
+ }
+
+ GPIOC_ENABLE &= ~0x00000030;
+ i2c_unlock();
+
+ return i;
+}
+
+/* public */
+
+void rtc_init(void)
+{
+ sw_i2c_init();
+
+ /* to set a time while buttons are stil not working
+ unsigned char v[7] = {0x00,0x47,0x17,0x06,0x03,0x02,0x08};
+ rtc_write_datetime(v);
+ */
+}
+
+int rtc_read_datetime(unsigned char* buf)
+{
+ int i;
+ unsigned char v[7];
+
+ i = sw_i2c(SW_I2C_READ, RTC_ADDR, RTC_CMD_DATA, v, 7);
+
+ v[4] &= 0x3f; /* mask out p.m. flag */
+
+ for(i=0; i<7; i++)
+ buf[i] = v[6-i];
+
+ return i;
+}
+
+int rtc_write_datetime(unsigned char* buf)
+{
+ int i;
+ unsigned char v[7];
+
+ for(i=0; i<7; i++)
+ v[i]=buf[6-i];
+
+ i = sw_i2c(SW_I2C_WRITE, RTC_ADDR, RTC_CMD_DATA, v, 7);
+
+ return i;
+}
+
diff --git a/firmware/target/coldfire/iriver/h100/sw_i2c-h100.c b/firmware/drivers/sw_i2c.c
index 3b2cdc4042..c1f6868226 100644
--- a/firmware/target/coldfire/iriver/h100/sw_i2c-h100.c
+++ b/firmware/drivers/sw_i2c.c
@@ -24,11 +24,30 @@
/**
* I2C-functions are copied and ported from fmradio.c.
- * later fixed, adapted and moved to a seperate file so they can be re-used by the rtc-ds1339c code by Robert Kukla
+ * later fixed, adapted and moved to a seperate file so they can be re-used
+ * by the rtc-ds1339c and later by the m:robe-100 code by Robert Kukla
*/
/* cute little functions, atomic read-modify-write */
+#ifdef MROBE_100
+
+/* SCL is GPIOC, 4 */
+#define SCL (GPIOC_INPUT_VAL & 0x00000010)
+#define SCL_OUT_LO GPIOC_OUTPUT_VAL&=~0x00000010
+#define SCL_LO GPIOC_OUTPUT_EN |= 0x00000010
+#define SCL_HI GPIOC_OUTPUT_EN &=~0x00000010
+
+/* SDA is GPIOC, 5 */
+#define SDA (GPIOC_INPUT_VAL & 0x00000020)
+#define SDA_OUT_LO GPIOC_OUTPUT_VAL&=~0x00000020
+#define SDA_LO GPIOC_OUTPUT_EN |= 0x00000020
+#define SDA_HI GPIOC_OUTPUT_EN &=~0x00000020
+
+#define DELAY do { volatile int _x; for(_x=0;_x<22;_x++);} while(0)
+
+#else
+
/* SCL is GPIO, 12 */
#define SCL ( 0x00001000 & GPIO_READ)
#define SCL_OUT_LO and_l(~0x00001000, &GPIO_OUT)
@@ -54,10 +73,15 @@
); \
})
+#endif
+
void sw_i2c_init(void)
{
+#ifndef MROBE_100
or_l(0x00001000, &GPIO_FUNCTION);
or_l(0x00002000, &GPIO1_FUNCTION);
+#endif
+
SDA_HI;
SCL_HI;
SDA_OUT_LO;
@@ -192,7 +216,7 @@ static unsigned char sw_i2c_inb(void)
return byte;
}
-int sw_i2c_write(unsigned char chip, unsigned char location, const unsigned char* buf, int count)
+int sw_i2c_write(unsigned char chip, unsigned char location, unsigned char* buf, int count)
{
int i;
@@ -203,14 +227,18 @@ int sw_i2c_write(unsigned char chip, unsigned char location, const unsigned char
sw_i2c_stop();
return -1;
}
-
+
+#ifdef MROBE_100 /* does not use register addressing */
+ (void) location;
+#else
sw_i2c_outb(location);
if (!sw_i2c_getack())
{
sw_i2c_stop();
return -2;
}
-
+#endif
+
for (i=0; i<count; i++)
{
sw_i2c_outb(buf[i]);
@@ -229,7 +257,10 @@ int sw_i2c_write(unsigned char chip, unsigned char location, const unsigned char
int sw_i2c_read(unsigned char chip, unsigned char location, unsigned char* buf, int count)
{
int i;
-
+
+#ifdef MROBE_100 /* does not use register addressing */
+ (void) location;
+#else
sw_i2c_start();
sw_i2c_outb((chip & 0xfe) | SW_I2C_WRITE);
if (!sw_i2c_getack())
@@ -244,7 +275,8 @@ int sw_i2c_read(unsigned char chip, unsigned char location, unsigned char* buf,
sw_i2c_stop();
return -2;
}
-
+#endif
+
sw_i2c_start();
sw_i2c_outb((chip & 0xfe) | SW_I2C_READ);
if (!sw_i2c_getack())
diff --git a/firmware/export/config-mrobe100.h b/firmware/export/config-mrobe100.h
index 0d49023b63..f796d10abb 100644
--- a/firmware/export/config-mrobe100.h
+++ b/firmware/export/config-mrobe100.h
@@ -43,7 +43,7 @@
/* define this if you have a real-time clock */
#ifndef BOOTLOADER
-//#define CONFIG_RTC RTC_E8564
+#define CONFIG_RTC RTC_MR100
#endif
/* Define this if you have a software controlled poweroff */
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 1f29a4f207..4d2f70fa86 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -161,6 +161,7 @@
#define RTC_RX5X348AB 9
#define RTC_TCC77X 10
#define RTC_TCC780X 11
+#define RTC_MR100 12
/* USB On-the-go */
#define USBOTG_ISP1362 1362 /* iriver H300 */
diff --git a/firmware/export/sw_i2c.h b/firmware/export/sw_i2c.h
index 42dccad742..dd48a6206f 100644
--- a/firmware/export/sw_i2c.h
+++ b/firmware/export/sw_i2c.h
@@ -24,7 +24,7 @@
#define SW_I2C_READ 1
void sw_i2c_init(void);
-int sw_i2c_write(unsigned char chip, unsigned char location, const unsigned char* buf, int count);
-int sw_i2c_read (unsigned char chip, unsigned char location, unsigned char* buf, int count);
+int sw_i2c_write(unsigned char chip, unsigned char location, unsigned char* buf, int count);
+int sw_i2c_read (unsigned char chip, unsigned char location, unsigned char* buf, int count);
#endif