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
This commit is contained in:
Tomasz Moń 2011-12-15 15:33:53 +00:00
parent 89aec97f3d
commit ddd594b03e
6 changed files with 18 additions and 8 deletions

View file

@ -228,7 +228,9 @@ static void spi_txrx(unsigned char *buf_tx, unsigned char *buf_rx, int n)
for (i = 0; i<n; i++) for (i = 0; i<n; i++)
{ {
IO_SERIAL1_TX_DATA = buf_tx[i]; IO_SERIAL1_TX_DATA = buf_tx[i];
udelay(100);
/* a short wait for AVR to process data */
sleep(HZ/1000);
do do
{ {
@ -248,7 +250,7 @@ static void spi_txrx(unsigned char *buf_tx, unsigned char *buf_rx, int n)
mutex_unlock(&avr_mtx); mutex_unlock(&avr_mtx);
} }
static void avr_hid_sync(void) void avr_hid_sync(void)
{ {
int i; int i;
unsigned char prg[4] = {CMD_SYNC, CMD_VER, CMD_FILL, CMD_CLOSE}; unsigned char prg[4] = {CMD_SYNC, CMD_VER, CMD_FILL, CMD_CLOSE};
@ -279,8 +281,6 @@ void avr_hid_init(void)
IO_SERIAL1_MODE = 0x6DB; IO_SERIAL1_MODE = 0x6DB;
mutex_init(&avr_mtx); mutex_init(&avr_mtx);
avr_hid_sync();
} }
/* defined in powermgmt-sansaconnect.c */ /* defined in powermgmt-sansaconnect.c */

View file

@ -24,6 +24,7 @@
#include "config.h" #include "config.h"
void avr_hid_sync(void);
void avr_hid_init(void); void avr_hid_init(void);
void avr_hid_enable_charger(void); void avr_hid_enable_charger(void);

View file

@ -133,6 +133,7 @@ void lcd_init_device(void)
/* Copy Rockbox frame buffer to the second framebuffer */ /* Copy Rockbox frame buffer to the second framebuffer */
lcd_update(); lcd_update();
avr_hid_sync();
avr_hid_lcm_power_on(); avr_hid_lcm_power_on();
/* set framebuffer address - OF sets RAM start address to 0x1000000 */ /* set framebuffer address - OF sets RAM start address to 0x1000000 */

View file

@ -60,6 +60,9 @@ void power_init(void)
/* Set LCM (LDO1) to 2.85V, Set CODEC and USB (LDO2) to 1.8V */ /* Set LCM (LDO1) to 2.85V, Set CODEC and USB (LDO2) to 1.8V */
tps65021_write_reg(0x08, 0x36); tps65021_write_reg(0x08, 0x36);
/* Enable internal charger */
avr_hid_enable_charger();
} }
void power_off(void) void power_off(void)

View file

@ -891,9 +891,9 @@ int sd_init(void)
bitclr16(&IO_CLK_MOD2, CLK_MOD2_MMC); bitclr16(&IO_CLK_MOD2, CLK_MOD2_MMC);
bitset16(&IO_CLK_INV, CLK_INV_MMC); bitset16(&IO_CLK_INV, CLK_INV_MMC);
/* mmc module clock: 75 Mhz (AHB) / 2 = ~37.5 Mhz */ /* mmc module clock: 75 Mhz (AHB) / 2 = ~37.5 Mhz
/* OF uses 1, but for some reason it freezes on us */ * (Frequencies above are taken from Sansa Connect's OF source code) */
IO_CLK_DIV3 = (IO_CLK_DIV3 & 0xFF00) | 0x02; IO_CLK_DIV3 = (IO_CLK_DIV3 & 0xFF00) | 0x01;
bitset16(&IO_CLK_MOD2, CLK_MOD2_MMC); bitset16(&IO_CLK_MOD2, CLK_MOD2_MMC);

View file

@ -310,6 +310,11 @@ void system_init(void)
else else
#endif #endif
{ {
#ifdef SANSA_CONNECT
/* Setting AHB divisor to 0 causes MMC/SD interface to lock */
clock_arm_slow = (1 << 8) | 3;
clock_arm_fast = (1 << 8) | 1;
#else
/* Set the slow and fast clock speeds used for boosting /* Set the slow and fast clock speeds used for boosting
* Slow Setup: * Slow Setup:
* ARM div = 4 ( 87.5 MHz ) * ARM div = 4 ( 87.5 MHz )
@ -320,6 +325,7 @@ void system_init(void)
*/ */
clock_arm_slow = (0 << 8) | 3; clock_arm_slow = (0 << 8) | 3;
clock_arm_fast = (1 << 8) | 1; clock_arm_fast = (1 << 8) | 1;
#endif
} }
/* M48XI disabled, USB buffer powerdown */ /* M48XI disabled, USB buffer powerdown */
@ -368,7 +374,6 @@ void system_init(void)
i2c_init(); i2c_init();
avr_hid_init(); avr_hid_init();
avr_hid_enable_charger();
#endif #endif
} }