summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c49
1 files changed, 33 insertions, 16 deletions
diff --git a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c
index 66cbb1931b..056ba7b56a 100644
--- a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c
+++ b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c
@@ -53,6 +53,7 @@
53#endif 53#endif
54 54
55#define AVR_DELAY_US 100 55#define AVR_DELAY_US 100
56#define AVR_MAX_RETRIES 3
56 57
57#define CMD_SYNC 0xAA 58#define CMD_SYNC 0xAA
58#define CMD_CLOSE 0xCC 59#define CMD_CLOSE 0xCC
@@ -428,26 +429,38 @@ static bool avr_run_command(uint8_t opcode, uint8_t *data, size_t data_length)
428} 429}
429 430
430 431
431static void avr_hid_sync(void) 432static bool avr_hid_sync(void)
432{ 433{
433 uint8_t data; 434 uint8_t data;
434 while (!avr_run_command(CMD_VER, &data, sizeof(data))) 435 int retry;
436 for (retry = 0; retry < AVR_MAX_RETRIES; retry++)
435 { 437 {
436 /* TODO: Program HID if failing for long time. 438 if (avr_run_command(CMD_VER, &data, sizeof(data)))
437 * To do so, unfortunately, AVR firmware would have to be written 439 {
438 * from scratch as OF blob cannot be used due to licensing. 440 return true;
439 */ 441 }
440 } 442 }
441 443 /* TODO: Program HID as it appears to be not programmed.
444 * To do so, unfortunately, AVR firmware would have to be written
445 * from scratch as OF blob cannot be used due to licensing.
446 */
447 return false;
442} 448}
443 449
444static void avr_execute_command(uint8_t opcode, uint8_t *data, size_t data_length) 450static bool avr_execute_command(uint8_t opcode, uint8_t *data, size_t data_length)
445{ 451{
446 while (!avr_run_command(opcode, data, data_length)) 452 int retry;
453 for (retry = 0; retry < AVR_MAX_RETRIES; retry++)
447 { 454 {
455 if (avr_run_command(opcode, data, data_length))
456 {
457 return true;
458 }
459
448 /* Resync and try again */ 460 /* Resync and try again */
449 avr_hid_sync(); 461 avr_hid_sync();
450 } 462 }
463 return false;
451} 464}
452 465
453void avr_hid_init(void) 466void avr_hid_init(void)
@@ -499,18 +512,22 @@ bool charging_state(void)
499static void avr_hid_get_state(void) 512static void avr_hid_get_state(void)
500{ 513{
501 uint8_t state[8]; 514 uint8_t state[8];
502 avr_execute_command(CMD_STATE, state, sizeof(state)); 515 if (avr_execute_command(CMD_STATE, state, sizeof(state)))
503 516 {
504 avr_battery_status = state[6]; 517 avr_battery_status = state[6];
505 avr_battery_level = state[7]; 518 avr_battery_level = state[7];
506 parse_button_state(state); 519 parse_button_state(state);
520 }
507} 521}
508 522
509static uint32_t avr_hid_get_monotime(void) 523static uint32_t avr_hid_get_monotime(void)
510{ 524{
511 uint8_t tmp[4]; 525 uint8_t tmp[4];
512 avr_execute_command(CMD_MONOTIME, tmp, sizeof(tmp)); 526 if (avr_execute_command(CMD_MONOTIME, tmp, sizeof(tmp)))
513 return (tmp[0]) | (tmp[1] << 8) | (tmp[2] << 16) | (tmp[3] << 24); 527 {
528 return (tmp[0]) | (tmp[1] << 8) | (tmp[2] << 16) | (tmp[3] << 24);
529 }
530 return 0;
514} 531}
515 532
516static void avr_hid_enable_wheel(void) 533static void avr_hid_enable_wheel(void)