diff options
author | Tomasz Moń <desowin@gmail.com> | 2011-12-15 15:33:53 +0000 |
---|---|---|
committer | Tomasz Moń <desowin@gmail.com> | 2011-12-15 15:33:53 +0000 |
commit | ddd594b03ea7209f1b17b1ce918e585c48bd1df8 (patch) | |
tree | ba3d050533f0ca319465ecfc46428f77597269b5 | |
parent | 89aec97f3d03ed66637574bfddea36040f94f0aa (diff) | |
download | rockbox-ddd594b03ea7209f1b17b1ce918e585c48bd1df8.tar.gz rockbox-ddd594b03ea7209f1b17b1ce918e585c48bd1df8.zip |
Sansa Connect: Use sleep() instead udelay() in AVR spi_txrx.
This should prevent buffer underruns that can occur during heavy use of buttons or scrollwheel.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31267 a1c6a512-1295-4272-9138-f99709370657
6 files changed, 18 insertions, 8 deletions
diff --git a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c index dedd017cf7..2ed69b6c9b 100644 --- a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c +++ b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c | |||
@@ -228,7 +228,9 @@ static void spi_txrx(unsigned char *buf_tx, unsigned char *buf_rx, int n) | |||
228 | for (i = 0; i<n; i++) | 228 | for (i = 0; i<n; i++) |
229 | { | 229 | { |
230 | IO_SERIAL1_TX_DATA = buf_tx[i]; | 230 | IO_SERIAL1_TX_DATA = buf_tx[i]; |
231 | udelay(100); | 231 | |
232 | /* a short wait for AVR to process data */ | ||
233 | sleep(HZ/1000); | ||
232 | 234 | ||
233 | do | 235 | do |
234 | { | 236 | { |
@@ -248,7 +250,7 @@ static void spi_txrx(unsigned char *buf_tx, unsigned char *buf_rx, int n) | |||
248 | mutex_unlock(&avr_mtx); | 250 | mutex_unlock(&avr_mtx); |
249 | } | 251 | } |
250 | 252 | ||
251 | static void avr_hid_sync(void) | 253 | void avr_hid_sync(void) |
252 | { | 254 | { |
253 | int i; | 255 | int i; |
254 | unsigned char prg[4] = {CMD_SYNC, CMD_VER, CMD_FILL, CMD_CLOSE}; | 256 | unsigned char prg[4] = {CMD_SYNC, CMD_VER, CMD_FILL, CMD_CLOSE}; |
@@ -279,8 +281,6 @@ void avr_hid_init(void) | |||
279 | IO_SERIAL1_MODE = 0x6DB; | 281 | IO_SERIAL1_MODE = 0x6DB; |
280 | 282 | ||
281 | mutex_init(&avr_mtx); | 283 | mutex_init(&avr_mtx); |
282 | |||
283 | avr_hid_sync(); | ||
284 | } | 284 | } |
285 | 285 | ||
286 | /* defined in powermgmt-sansaconnect.c */ | 286 | /* defined in powermgmt-sansaconnect.c */ |
diff --git a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.h b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.h index 64b44675f7..06fd2b2d72 100644 --- a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.h +++ b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.h | |||
@@ -24,6 +24,7 @@ | |||
24 | 24 | ||
25 | #include "config.h" | 25 | #include "config.h" |
26 | 26 | ||
27 | void avr_hid_sync(void); | ||
27 | void avr_hid_init(void); | 28 | void avr_hid_init(void); |
28 | 29 | ||
29 | void avr_hid_enable_charger(void); | 30 | void avr_hid_enable_charger(void); |
diff --git a/firmware/target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c index fcfc82e876..e53a15e94f 100644 --- a/firmware/target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c +++ b/firmware/target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c | |||
@@ -133,6 +133,7 @@ void lcd_init_device(void) | |||
133 | /* Copy Rockbox frame buffer to the second framebuffer */ | 133 | /* Copy Rockbox frame buffer to the second framebuffer */ |
134 | lcd_update(); | 134 | lcd_update(); |
135 | 135 | ||
136 | avr_hid_sync(); | ||
136 | avr_hid_lcm_power_on(); | 137 | avr_hid_lcm_power_on(); |
137 | 138 | ||
138 | /* set framebuffer address - OF sets RAM start address to 0x1000000 */ | 139 | /* set framebuffer address - OF sets RAM start address to 0x1000000 */ |
diff --git a/firmware/target/arm/tms320dm320/sansa-connect/power-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/power-sansaconnect.c index f73df98641..ecdf3b1a75 100644 --- a/firmware/target/arm/tms320dm320/sansa-connect/power-sansaconnect.c +++ b/firmware/target/arm/tms320dm320/sansa-connect/power-sansaconnect.c | |||
@@ -60,6 +60,9 @@ void power_init(void) | |||
60 | 60 | ||
61 | /* Set LCM (LDO1) to 2.85V, Set CODEC and USB (LDO2) to 1.8V */ | 61 | /* Set LCM (LDO1) to 2.85V, Set CODEC and USB (LDO2) to 1.8V */ |
62 | tps65021_write_reg(0x08, 0x36); | 62 | tps65021_write_reg(0x08, 0x36); |
63 | |||
64 | /* Enable internal charger */ | ||
65 | avr_hid_enable_charger(); | ||
63 | } | 66 | } |
64 | 67 | ||
65 | void power_off(void) | 68 | void power_off(void) |
diff --git a/firmware/target/arm/tms320dm320/sdmmc-dm320.c b/firmware/target/arm/tms320dm320/sdmmc-dm320.c index 7df2925e20..6c744755f2 100644 --- a/firmware/target/arm/tms320dm320/sdmmc-dm320.c +++ b/firmware/target/arm/tms320dm320/sdmmc-dm320.c | |||
@@ -891,9 +891,9 @@ int sd_init(void) | |||
891 | bitclr16(&IO_CLK_MOD2, CLK_MOD2_MMC); | 891 | bitclr16(&IO_CLK_MOD2, CLK_MOD2_MMC); |
892 | bitset16(&IO_CLK_INV, CLK_INV_MMC); | 892 | bitset16(&IO_CLK_INV, CLK_INV_MMC); |
893 | 893 | ||
894 | /* mmc module clock: 75 Mhz (AHB) / 2 = ~37.5 Mhz */ | 894 | /* mmc module clock: 75 Mhz (AHB) / 2 = ~37.5 Mhz |
895 | /* OF uses 1, but for some reason it freezes on us */ | 895 | * (Frequencies above are taken from Sansa Connect's OF source code) */ |
896 | IO_CLK_DIV3 = (IO_CLK_DIV3 & 0xFF00) | 0x02; | 896 | IO_CLK_DIV3 = (IO_CLK_DIV3 & 0xFF00) | 0x01; |
897 | 897 | ||
898 | bitset16(&IO_CLK_MOD2, CLK_MOD2_MMC); | 898 | bitset16(&IO_CLK_MOD2, CLK_MOD2_MMC); |
899 | 899 | ||
diff --git a/firmware/target/arm/tms320dm320/system-dm320.c b/firmware/target/arm/tms320dm320/system-dm320.c index 37d06f4343..abdca21627 100644 --- a/firmware/target/arm/tms320dm320/system-dm320.c +++ b/firmware/target/arm/tms320dm320/system-dm320.c | |||
@@ -310,6 +310,11 @@ void system_init(void) | |||
310 | else | 310 | else |
311 | #endif | 311 | #endif |
312 | { | 312 | { |
313 | #ifdef SANSA_CONNECT | ||
314 | /* Setting AHB divisor to 0 causes MMC/SD interface to lock */ | ||
315 | clock_arm_slow = (1 << 8) | 3; | ||
316 | clock_arm_fast = (1 << 8) | 1; | ||
317 | #else | ||
313 | /* Set the slow and fast clock speeds used for boosting | 318 | /* Set the slow and fast clock speeds used for boosting |
314 | * Slow Setup: | 319 | * Slow Setup: |
315 | * ARM div = 4 ( 87.5 MHz ) | 320 | * ARM div = 4 ( 87.5 MHz ) |
@@ -320,6 +325,7 @@ void system_init(void) | |||
320 | */ | 325 | */ |
321 | clock_arm_slow = (0 << 8) | 3; | 326 | clock_arm_slow = (0 << 8) | 3; |
322 | clock_arm_fast = (1 << 8) | 1; | 327 | clock_arm_fast = (1 << 8) | 1; |
328 | #endif | ||
323 | } | 329 | } |
324 | 330 | ||
325 | /* M48XI disabled, USB buffer powerdown */ | 331 | /* M48XI disabled, USB buffer powerdown */ |
@@ -368,7 +374,6 @@ void system_init(void) | |||
368 | 374 | ||
369 | i2c_init(); | 375 | i2c_init(); |
370 | avr_hid_init(); | 376 | avr_hid_init(); |
371 | avr_hid_enable_charger(); | ||
372 | #endif | 377 | #endif |
373 | } | 378 | } |
374 | 379 | ||