summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/fmradio_i2c.c52
-rw-r--r--firmware/drivers/i2c-coldfire.c7
2 files changed, 44 insertions, 15 deletions
diff --git a/firmware/drivers/fmradio_i2c.c b/firmware/drivers/fmradio_i2c.c
index 4e491093f0..2475084696 100644
--- a/firmware/drivers/fmradio_i2c.c
+++ b/firmware/drivers/fmradio_i2c.c
@@ -30,18 +30,38 @@
/* cute little functions, atomic read-modify-write */
/* SDA is GPIO1,23 */
-#define SDA_LO and_l(~0x00800000, &GPIO1_OUT) // and_b(~0x10, &PBDRL)
-#define SDA_HI or_l( 0x00800000, &GPIO1_OUT) // or_b( 0x10, &PBDRL)
-#define SDA_INPUT and_l(~0x00800000, &GPIO1_ENABLE) // and_b(~0x10, &PBIORL)
-#define SDA_OUTPUT or_l( 0x00800000, &GPIO1_ENABLE) // or_b( 0x10, &PBIORL)
-#define SDA ( 0x00800000 & GPIO1_READ) // (PBDR & 0x0010)
-
-/* SCL is GPIO, 3 */
-#define SCL_INPUT and_l(~0x00000008, &GPIO_ENABLE) // and_b(~0x02, &PBIORL)
-#define SCL_OUTPUT or_l( 0x00000008, &GPIO_ENABLE) // or_b( 0x02, &PBIORL)
-#define SCL_LO and_l(~0x00000008, &GPIO_OUT) // and_b(~0x02, &PBDRL)
-#define SCL_HI or_l( 0x00000008, &GPIO_OUT) // or_b( 0x02, &PBDRL)
-#define SCL ( 0x00000008 & GPIO_READ) // (PBDR & 0x0002)
+#ifdef IRIVER_H300_SERIES
+
+/* SDA is GPIO57 */
+#define SDA_LO and_l(~0x02000000, &GPIO1_OUT)
+#define SDA_HI or_l( 0x02000000, &GPIO1_OUT)
+#define SDA_INPUT and_l(~0x02000000, &GPIO1_ENABLE)
+#define SDA_OUTPUT or_l( 0x02000000, &GPIO1_ENABLE)
+#define SDA ( 0x02000000 & GPIO1_READ)
+
+/* SCL is GPIO56 */
+#define SCL_INPUT and_l(~0x01000000, &GPIO1_ENABLE)
+#define SCL_OUTPUT or_l( 0x01000000, &GPIO1_ENABLE)
+#define SCL_LO and_l(~0x01000000, &GPIO1_OUT)
+#define SCL_HI or_l( 0x01000000, &GPIO1_OUT)
+#define SCL ( 0x01000000 & GPIO1_READ)
+
+#else
+
+/* SDA is GPIO55 */
+#define SDA_LO and_l(~0x00800000, &GPIO1_OUT)
+#define SDA_HI or_l( 0x00800000, &GPIO1_OUT)
+#define SDA_INPUT and_l(~0x00800000, &GPIO1_ENABLE)
+#define SDA_OUTPUT or_l( 0x00800000, &GPIO1_ENABLE)
+#define SDA ( 0x00800000 & GPIO1_READ)
+
+/* SCL is GPIO3 */
+#define SCL_INPUT and_l(~0x00000008, &GPIO_ENABLE)
+#define SCL_OUTPUT or_l( 0x00000008, &GPIO_ENABLE)
+#define SCL_LO and_l(~0x00000008, &GPIO_OUT)
+#define SCL_HI or_l( 0x00000008, &GPIO_OUT)
+#define SCL ( 0x00000008 & GPIO_READ)
+#endif
/* delay loop to achieve 400kHz at 120MHz CPU frequency */
#define DELAY do { int _x; for(_x=0;_x<22;_x++);} while(0)
@@ -84,8 +104,8 @@ static void fmradio_i2c_ack(void)
SCL_INPUT; /* Set the clock to input */
while(!SCL) /* and wait for the slave to release it */
{
- SCL_OUTPUT; /* Set the clock to output */
SCL_HI;
+ SCL_OUTPUT; /* Set the clock to output */
SCL_INPUT; /* Set the clock to input */
DELAY;
}
@@ -111,8 +131,8 @@ static int fmradio_i2c_getack(void)
SCL_INPUT; /* Set the clock to input */
while(!SCL) /* and wait for the slave to release it */
{
- SCL_OUTPUT; /* Set the clock to output */
SCL_HI;
+ SCL_OUTPUT; /* Set the clock to output */
SCL_INPUT; /* Set the clock to input */
DELAY;
}
@@ -160,10 +180,12 @@ static unsigned char fmradio_i2c_inb(void)
/* clock in each bit, MSB first */
for ( i=0x80; i; i>>=1 ) {
SDA_INPUT; /* And set to input */
- SCL_HI;
+ DELAY;
DELAY;
if ( SDA )
byte |= i;
+ SCL_HI;
+ DELAY;
SCL_LO;
DELAY;
SDA_OUTPUT;
diff --git a/firmware/drivers/i2c-coldfire.c b/firmware/drivers/i2c-coldfire.c
index 0c83c1cb1a..ffdc4f29de 100644
--- a/firmware/drivers/i2c-coldfire.c
+++ b/firmware/drivers/i2c-coldfire.c
@@ -46,7 +46,14 @@ void i2c_init(void)
or_l(0x00000008, &GPIO_ENABLE);
or_l(0x00800000, &GPIO1_FUNCTION);
or_l(0x00000008, &GPIO_FUNCTION);
+#elif defined(IRIVER_H300_SERIES)
+ /* The FM chip has no pullup for SCL, so we have to bit-bang the
+ I2C for that one. */
+ or_l(0x03000000, &GPIO1_OUT);
+ or_l(0x03000000, &GPIO1_ENABLE);
+ or_l(0x03000000, &GPIO1_FUNCTION);
#endif
+
/* I2C Clock divisor = 576 => 119.952 MHz / 2 / 576 = 104.125 kHz */
MFDR = 0x14;