diff options
-rw-r--r-- | firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c | 49 |
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 | ||
431 | static void avr_hid_sync(void) | 432 | static 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 | ||
444 | static void avr_execute_command(uint8_t opcode, uint8_t *data, size_t data_length) | 450 | static 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 | ||
453 | void avr_hid_init(void) | 466 | void avr_hid_init(void) |
@@ -499,18 +512,22 @@ bool charging_state(void) | |||
499 | static void avr_hid_get_state(void) | 512 | static 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 | ||
509 | static uint32_t avr_hid_get_monotime(void) | 523 | static 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 | ||
516 | static void avr_hid_enable_wheel(void) | 533 | static void avr_hid_enable_wheel(void) |