diff options
-rw-r--r-- | firmware/SOURCES | 2 | ||||
-rw-r--r-- | firmware/export/i2c-pp5002.h | 11 | ||||
-rw-r--r-- | firmware/export/pp5002.h | 3 | ||||
-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.c | 6 |
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 |
258 | target/arm/i2c-pp5020.c | 258 | target/arm/i2c-pp5020.c |
259 | #elif CONFIG_I2C == I2C_PP5002 | 259 | #elif CONFIG_I2C == I2C_PP5002 |
260 | drivers/i2c-pp5002.c | 260 | target/arm/i2c-pp5002.c |
261 | #elif CONFIG_I2C == I2C_PNX0101 | 261 | #elif CONFIG_I2C == I2C_PNX0101 |
262 | drivers/i2c-pnx0101.c | 262 | drivers/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 | ||
30 | void i2c_init(void); | 41 | void 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 | ||
52 | static int pp_i2c_wait_not_busy(void) | 37 | static 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 | ||
96 | int pp_i2c_send_bytes(unsigned int addr, unsigned int len, unsigned char *data) | 81 | int 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 | ||
170 | void i2c_init(void) | 152 | void 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); |