summaryrefslogtreecommitdiff
path: root/firmware/drivers/fmradio_i2c.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/fmradio_i2c.c')
-rw-r--r--firmware/drivers/fmradio_i2c.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/firmware/drivers/fmradio_i2c.c b/firmware/drivers/fmradio_i2c.c
index 62761b3aa7..b17a979288 100644
--- a/firmware/drivers/fmradio_i2c.c
+++ b/firmware/drivers/fmradio_i2c.c
@@ -80,8 +80,7 @@ int fmradio_i2c_read(unsigned char address, unsigned char* buf, int count)
80#endif 80#endif
81 81
82/* delay loop to achieve 400kHz at 120MHz CPU frequency */ 82/* delay loop to achieve 400kHz at 120MHz CPU frequency */
83#define DELAY do { int _x; for(_x=0;_x<22;_x++);} while(0) 83#define DELAY do { volatile int _x; for(_x=0;_x<22;_x++);} while (0)
84
85 84
86static void fmradio_i2c_start(void) 85static void fmradio_i2c_start(void)
87{ 86{
@@ -207,8 +206,6 @@ static unsigned char fmradio_i2c_inb(void)
207 SDA_OUTPUT; 206 SDA_OUTPUT;
208 } 207 }
209 208
210 fmradio_i2c_ack();
211
212 return byte; 209 return byte;
213} 210}
214 211
@@ -248,9 +245,11 @@ int fmradio_i2c_read(int address, unsigned char* buf, int count)
248 245
249 if (fmradio_i2c_getack()) 246 if (fmradio_i2c_getack())
250 { 247 {
251 for (i=0; i<count; i++) 248 for (i=count; i>0; i--)
252 { 249 {
253 buf[i] = fmradio_i2c_inb(); 250 *buf++ = fmradio_i2c_inb();
251 if (i != 1)
252 fmradio_i2c_ack();
254 } 253 }
255 } 254 }
256 else 255 else
@@ -276,8 +275,7 @@ int fmradio_i2c_read(int address, unsigned char* buf, int count)
276#define SCL (PBDR & 0x0002) 275#define SCL (PBDR & 0x0002)
277 276
278/* arbitrary delay loop */ 277/* arbitrary delay loop */
279#define DELAY do { int _x; for(_x=0;_x<20;_x++);} while (0) 278#define DELAY do { volatile int _x; for(_x=0;_x<20;_x++);} while (0)
280
281 279
282static void fmradio_i2c_start(void) 280static void fmradio_i2c_start(void)
283{ 281{
@@ -370,7 +368,7 @@ static void fmradio_i2c_outb(unsigned char byte)
370 SDA_HI; 368 SDA_HI;
371} 369}
372 370
373static unsigned char fmradio_i2c_inb(int ack) 371static unsigned char fmradio_i2c_inb(void)
374{ 372{
375 int i; 373 int i;
376 unsigned char byte = 0; 374 unsigned char byte = 0;
@@ -385,8 +383,6 @@ static unsigned char fmradio_i2c_inb(int ack)
385 SDA_OUTPUT; 383 SDA_OUTPUT;
386 } 384 }
387 385
388 fmradio_i2c_ack(ack);
389
390 return byte; 386 return byte;
391} 387}
392 388
@@ -424,8 +420,11 @@ int fmradio_i2c_read(int address, unsigned char* buf, int count)
424 fmradio_i2c_start(); 420 fmradio_i2c_start();
425 fmradio_i2c_outb(address | 1); 421 fmradio_i2c_outb(address | 1);
426 if (fmradio_i2c_getack()) { 422 if (fmradio_i2c_getack()) {
427 for (i=0; i<count; i++) { 423 for (i=count; i>0; i--)
428 buf[i] = fmradio_i2c_inb(0); 424 {
425 *buf++ = fmradio_i2c_inb();
426 if (i != 1)
427 fmradio_i2c_ack(ack);
429 } 428 }
430 } 429 }
431 else 430 else