diff options
Diffstat (limited to 'firmware/drivers/fmradio_i2c.c')
-rw-r--r-- | firmware/drivers/fmradio_i2c.c | 25 |
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 | ||
86 | static void fmradio_i2c_start(void) | 85 | static 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 | ||
282 | static void fmradio_i2c_start(void) | 280 | static 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 | ||
373 | static unsigned char fmradio_i2c_inb(int ack) | 371 | static 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 |