diff options
-rw-r--r-- | firmware/SOURCES | 5 | ||||
-rw-r--r-- | firmware/drivers/rtc/rtc_mr100.c | 114 | ||||
-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.h | 2 | ||||
-rw-r--r-- | firmware/export/config.h | 1 | ||||
-rw-r--r-- | firmware/export/sw_i2c.h | 4 |
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 |