summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Moń <desowin@gmail.com>2021-06-25 17:57:08 +0200
committerTomasz Moń <desowin@gmail.com>2021-06-25 18:30:11 +0200
commitead4bc07695765d0ad5d5a92793e74aaa40be410 (patch)
treedc56270774a354777801d201e24445017fb52457
parent373851095386dec79adff7927e9b23020a7fbf30 (diff)
downloadrockbox-ead4bc07695765d0ad5d5a92793e74aaa40be410.tar.gz
rockbox-ead4bc07695765d0ad5d5a92793e74aaa40be410.zip
Sansa Connect: Retry AVR commands only 3 times
If the commands repeatedly fail it is likely that the AVR is not programmed. In such case simply continue normal operation. This is especially important in bootloader as it makes it possible to load new rockbox build using bootloader USB mode. Otherwise, the only recovery option would be to use I2C serial. Change-Id: I4b0999833e9a906ec6353bdfdd5b68211f07ac81
-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)