summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-06-27 00:22:46 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-06-27 00:22:46 +0000
commit9614612830f05be75c82df1bb226c9375ae8c466 (patch)
tree0e7f9156bc5ab92181807c078f5dd921a4eee979
parent126d81ecf5e65fdf97ab82970e6a61639e0ad43a (diff)
downloadrockbox-9614612830f05be75c82df1bb226c9375ae8c466.tar.gz
rockbox-9614612830f05be75c82df1bb226c9375ae8c466.zip
Bit banged TEA5767 i2c driver was broken by -Os because delay loops were optimized away. Last byte was being acked when reading so fix that too. Calling all developers: seek out any C delay loops and make sure they're volatile.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13723 a1c6a512-1295-4272-9138-f99709370657
-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