summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Moń <desowin@gmail.com>2021-06-27 12:20:56 +0200
committerTomasz Moń <desowin@gmail.com>2021-06-27 12:20:56 +0200
commita4ab6364236b4453e93b12ecba1e9f389f6edd2f (patch)
treeac2420cdd3004ebd7215b6d57c1805fc314d819f
parentead4bc07695765d0ad5d5a92793e74aaa40be410 (diff)
downloadrockbox-a4ab6364236b4453e93b12ecba1e9f389f6edd2f.tar.gz
rockbox-a4ab6364236b4453e93b12ecba1e9f389f6edd2f.zip
Sansa Connect: More reliable AVR communication
AVR requires bigger delays between retries. Read state instead of version for synchronization purposes as it shifts more bytes. Change-Id: Ib7fa980496d3bc7744a086b45e1865861ef58b88
-rw-r--r--firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c
index 056ba7b56a..a72faea7be 100644
--- a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c
+++ b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c
@@ -52,8 +52,8 @@
52#define dbgprintf(...) 52#define dbgprintf(...)
53#endif 53#endif
54 54
55#define AVR_DELAY_US 100 55#define AVR_DELAY_US 200
56#define AVR_MAX_RETRIES 3 56#define AVR_MAX_RETRIES 10
57 57
58#define CMD_SYNC 0xAA 58#define CMD_SYNC 0xAA
59#define CMD_CLOSE 0xCC 59#define CMD_CLOSE 0xCC
@@ -428,17 +428,29 @@ static bool avr_run_command(uint8_t opcode, uint8_t *data, size_t data_length)
428 return success; 428 return success;
429} 429}
430 430
431static bool avr_hid_get_state(void)
432{
433 uint8_t state[8];
434 if (avr_run_command(CMD_STATE, state, sizeof(state)))
435 {
436 avr_battery_status = state[6];
437 avr_battery_level = state[7];
438 parse_button_state(state);
439 return true;
440 }
441 return false;
442}
431 443
432static bool avr_hid_sync(void) 444static bool avr_hid_sync(void)
433{ 445{
434 uint8_t data;
435 int retry; 446 int retry;
436 for (retry = 0; retry < AVR_MAX_RETRIES; retry++) 447 for (retry = 0; retry < AVR_MAX_RETRIES; retry++)
437 { 448 {
438 if (avr_run_command(CMD_VER, &data, sizeof(data))) 449 if (avr_hid_get_state())
439 { 450 {
440 return true; 451 return true;
441 } 452 }
453 mdelay(100);
442 } 454 }
443 /* TODO: Program HID as it appears to be not programmed. 455 /* TODO: Program HID as it appears to be not programmed.
444 * To do so, unfortunately, AVR firmware would have to be written 456 * To do so, unfortunately, AVR firmware would have to be written
@@ -509,17 +521,6 @@ bool charging_state(void)
509 return (avr_battery_status & BATTERY_STATUS_CHARGING) != 0; 521 return (avr_battery_status & BATTERY_STATUS_CHARGING) != 0;
510} 522}
511 523
512static void avr_hid_get_state(void)
513{
514 uint8_t state[8];
515 if (avr_execute_command(CMD_STATE, state, sizeof(state)))
516 {
517 avr_battery_status = state[6];
518 avr_battery_level = state[7];
519 parse_button_state(state);
520 }
521}
522
523static uint32_t avr_hid_get_monotime(void) 524static uint32_t avr_hid_get_monotime(void)
524{ 525{
525 uint8_t tmp[4]; 526 uint8_t tmp[4];