summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/SOURCES2
-rw-r--r--firmware/export/i2c-pp5002.h11
-rw-r--r--firmware/export/pp5002.h3
-rw-r--r--firmware/target/arm/i2c-pp5002.c (renamed from firmware/drivers/i2c-pp5002.c)47
-rw-r--r--firmware/target/arm/i2c-pp5020.c6
5 files changed, 31 insertions, 38 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index e393dc1678..00fbc74b67 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -257,7 +257,7 @@ target/arm/memset16-arm.S
257#if CONFIG_I2C == I2C_PP5020 257#if CONFIG_I2C == I2C_PP5020
258target/arm/i2c-pp5020.c 258target/arm/i2c-pp5020.c
259#elif CONFIG_I2C == I2C_PP5002 259#elif CONFIG_I2C == I2C_PP5002
260drivers/i2c-pp5002.c 260target/arm/i2c-pp5002.c
261#elif CONFIG_I2C == I2C_PNX0101 261#elif CONFIG_I2C == I2C_PNX0101
262drivers/i2c-pnx0101.c 262drivers/i2c-pnx0101.c
263#elif CONFIG_I2C == I2C_S3C2440 263#elif CONFIG_I2C == I2C_S3C2440
diff --git a/firmware/export/i2c-pp5002.h b/firmware/export/i2c-pp5002.h
index 68c0dda8f7..58324035a5 100644
--- a/firmware/export/i2c-pp5002.h
+++ b/firmware/export/i2c-pp5002.h
@@ -25,6 +25,17 @@
25#ifndef _I2C_PP5002_H 25#ifndef _I2C_PP5002_H
26#define _I2C_PP5002_H 26#define _I2C_PP5002_H
27 27
28#define I2C_CTRL (*(volatile unsigned char*)(I2C_BASE+0x00))
29#define I2C_ADDR (*(volatile unsigned char*)(I2C_BASE+0x04))
30#define I2C_DATA(X) (*(volatile unsigned char*)(I2C_BASE+0xc+(4*X)))
31#define I2C_STATUS (*(volatile unsigned char*)(I2C_BASE+0x1c))
32
33/* I2C_CTRL bit definitions */
34#define I2C_SEND 0x80
35
36/* I2C_STATUS bit definitions */
37#define I2C_BUSY (1<<6)
38
28/* TODO: Fully implement i2c driver */ 39/* TODO: Fully implement i2c driver */
29 40
30void i2c_init(void); 41void i2c_init(void);
diff --git a/firmware/export/pp5002.h b/firmware/export/pp5002.h
index b1bc6f4d01..41e8f4cce2 100644
--- a/firmware/export/pp5002.h
+++ b/firmware/export/pp5002.h
@@ -59,6 +59,7 @@
59#define DEV_RS (*(volatile unsigned long *)( 0xcf005030)) 59#define DEV_RS (*(volatile unsigned long *)( 0xcf005030))
60#define DEV_EN (*(volatile unsigned long *)( 0xcf005000)) 60#define DEV_EN (*(volatile unsigned long *)( 0xcf005000))
61 61
62#define DEV_I2C (1<<8)
62#define DEV_USB 0x400000 63#define DEV_USB 0x400000
63 64
64#define DEV_INIT (*(volatile unsigned long *)(0x70000020)) 65#define DEV_INIT (*(volatile unsigned long *)(0x70000020))
@@ -78,6 +79,8 @@
78#define IISFIFO_WR (*(volatile unsigned long*)(0xc0002540)) 79#define IISFIFO_WR (*(volatile unsigned long*)(0xc0002540))
79#define IISFIFO_RD (*(volatile unsigned long*)(0xc0002580)) 80#define IISFIFO_RD (*(volatile unsigned long*)(0xc0002580))
80 81
82#define I2C_BASE 0xc0008000
83
81#define TIMER1_CFG (*(volatile unsigned long *)(0xcf001100)) 84#define TIMER1_CFG (*(volatile unsigned long *)(0xcf001100))
82#define TIMER1_VAL (*(volatile unsigned long *)(0xcf001104)) 85#define TIMER1_VAL (*(volatile unsigned long *)(0xcf001104))
83#define TIMER2_CFG (*(volatile unsigned long *)(0xcf001108)) 86#define TIMER2_CFG (*(volatile unsigned long *)(0xcf001108))
diff --git a/firmware/drivers/i2c-pp5002.c b/firmware/target/arm/i2c-pp5002.c
index 7cb37f6090..ad6d50721d 100644
--- a/firmware/drivers/i2c-pp5002.c
+++ b/firmware/target/arm/i2c-pp5002.c
@@ -32,21 +32,6 @@
32 32
33/* Local functions definitions */ 33/* Local functions definitions */
34 34
35#define IPOD_I2C_BASE 0xc0008000
36#define IPOD_I2C_CTRL (IPOD_I2C_BASE+0x00)
37#define IPOD_I2C_ADDR (IPOD_I2C_BASE+0x04)
38#define IPOD_I2C_DATA0 (IPOD_I2C_BASE+0x0c)
39#define IPOD_I2C_DATA1 (IPOD_I2C_BASE+0x10)
40#define IPOD_I2C_DATA2 (IPOD_I2C_BASE+0x14)
41#define IPOD_I2C_DATA3 (IPOD_I2C_BASE+0x18)
42#define IPOD_I2C_STATUS (IPOD_I2C_BASE+0x1c)
43
44/* IPOD_I2C_CTRL bit definitions */
45#define IPOD_I2C_SEND 0x80
46
47/* IPOD_I2C_STATUS bit definitions */
48#define IPOD_I2C_BUSY (1<<6)
49
50#define POLL_TIMEOUT (HZ) 35#define POLL_TIMEOUT (HZ)
51 36
52static int pp_i2c_wait_not_busy(void) 37static int pp_i2c_wait_not_busy(void)
@@ -54,7 +39,7 @@ static int pp_i2c_wait_not_busy(void)
54 unsigned long timeout; 39 unsigned long timeout;
55 timeout = current_tick + POLL_TIMEOUT; 40 timeout = current_tick + POLL_TIMEOUT;
56 while (TIME_BEFORE(current_tick, timeout)) { 41 while (TIME_BEFORE(current_tick, timeout)) {
57 if (!(inb(IPOD_I2C_STATUS) & IPOD_I2C_BUSY)) { 42 if (!(I2C_STATUS & I2C_BUSY)) {
58 return 0; 43 return 0;
59 } 44 }
60 yield(); 45 yield();
@@ -74,11 +59,11 @@ int pp_i2c_read_byte(unsigned int addr, unsigned int *data)
74 } 59 }
75 60
76 /* clear top 15 bits, left shift 1, or in 0x1 for a read */ 61 /* clear top 15 bits, left shift 1, or in 0x1 for a read */
77 outb(((addr << 17) >> 16) | 0x1, IPOD_I2C_ADDR); 62 I2C_ADDR = ((addr << 17) >> 16) | 0x1 ;
78 63
79 outb(inb(IPOD_I2C_CTRL) | 0x20, IPOD_I2C_CTRL); 64 I2C_CTRL |= 0x20;
80 65
81 outb(inb(IPOD_I2C_CTRL) | IPOD_I2C_SEND, IPOD_I2C_CTRL); 66 I2C_CTRL |= I2C_SEND;
82 67
83 if (pp_i2c_wait_not_busy() < 0) 68 if (pp_i2c_wait_not_busy() < 0)
84 { 69 {
@@ -87,7 +72,7 @@ int pp_i2c_read_byte(unsigned int addr, unsigned int *data)
87 72
88 if (data) 73 if (data)
89 { 74 {
90 *data = inb(IPOD_I2C_DATA0); 75 *data = I2C_DATA(0);
91 } 76 }
92 77
93 return 0; 78 return 0;
@@ -95,7 +80,6 @@ int pp_i2c_read_byte(unsigned int addr, unsigned int *data)
95 80
96int pp_i2c_send_bytes(unsigned int addr, unsigned int len, unsigned char *data) 81int pp_i2c_send_bytes(unsigned int addr, unsigned int len, unsigned char *data)
97{ 82{
98 int data_addr;
99 unsigned int i; 83 unsigned int i;
100 84
101 if (len < 1 || len > 4) 85 if (len < 1 || len > 4)
@@ -109,20 +93,18 @@ int pp_i2c_send_bytes(unsigned int addr, unsigned int len, unsigned char *data)
109 } 93 }
110 94
111 /* clear top 15 bits, left shift 1 */ 95 /* clear top 15 bits, left shift 1 */
112 outb((addr << 17) >> 16, IPOD_I2C_ADDR); 96 I2C_ADDR = (addr << 17) >> 16;
113 97
114 outb(inb(IPOD_I2C_CTRL) & ~0x20, IPOD_I2C_CTRL); 98 I2C_CTRL &= ~0x20;
115 99
116 data_addr = IPOD_I2C_DATA0;
117 for ( i = 0; i < len; i++ ) 100 for ( i = 0; i < len; i++ )
118 { 101 {
119 outb(*data++, data_addr); 102 I2C_DATA(i) = *data++;
120 data_addr += 4;
121 } 103 }
122 104
123 outb((inb(IPOD_I2C_CTRL) & ~0x26) | ((len-1) << 1), IPOD_I2C_CTRL); 105 I2C_CTRL = (I2C_CTRL & ~0x26) | ((len-1) << 1);
124 106
125 outb(inb(IPOD_I2C_CTRL) | IPOD_I2C_SEND, IPOD_I2C_CTRL); 107 I2C_CTRL |= I2C_SEND;
126 108
127 return 0x0; 109 return 0x0;
128} 110}
@@ -169,10 +151,7 @@ int pp_i2c_send(unsigned int addr, int data0, int data1)
169 151
170void i2c_init(void) 152void i2c_init(void)
171{ 153{
172 /* From ipodlinux */ 154 DEV_EN |= 0x2; /* Enable I2C-should this be DEV_I2C rather than 0x2? */
173 155 DEV_RS |= DEV_I2C; /* Start I2C Reset */
174 outl(inl(0xcf005000) | 0x2, 0xcf005000); 156 DEV_RS &=~DEV_I2C; /* End I2C Reset */
175
176 outl(inl(0xcf005030) | (1<<8), 0xcf005030);
177 outl(inl(0xcf005030) & ~(1<<8), 0xcf005030);
178} 157}
diff --git a/firmware/target/arm/i2c-pp5020.c b/firmware/target/arm/i2c-pp5020.c
index 95a677ea01..ebd0318f0b 100644
--- a/firmware/target/arm/i2c-pp5020.c
+++ b/firmware/target/arm/i2c-pp5020.c
@@ -185,9 +185,9 @@ void i2c_init(void)
185 GPIOC_ENABLE &= ~0x20; 185 GPIOC_ENABLE &= ~0x20;
186#endif 186#endif
187 187
188 DEV_EN |= DEV_I2C; 188 DEV_EN |= DEV_I2C; /* Enable I2C */
189 DEV_RS |= DEV_I2C; 189 DEV_RS |= DEV_I2C; /* Start I2C Reset */
190 DEV_RS &=~DEV_I2C; 190 DEV_RS &=~DEV_I2C; /* End I2C Reset */
191 191
192 outl(0x0, 0x600060a4); 192 outl(0x0, 0x600060a4);
193 outl(0x80 | (0 << 8), 0x600060a4); 193 outl(0x80 | (0 << 8), 0x600060a4);