diff options
Diffstat (limited to 'firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c')
-rw-r--r-- | firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c | 53 |
1 files changed, 40 insertions, 13 deletions
diff --git a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c index 47c5489657..9d91093a02 100644 --- a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c +++ b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <stdio.h> | 22 | #include <stdio.h> |
23 | #include "config.h" | 23 | #include "config.h" |
24 | #include "system.h" | 24 | #include "system.h" |
25 | #include "power.h" | ||
25 | #include "kernel.h" | 26 | #include "kernel.h" |
26 | #include "logf.h" | 27 | #include "logf.h" |
27 | #include "avr-sansaconnect.h" | 28 | #include "avr-sansaconnect.h" |
@@ -80,7 +81,17 @@ static const char avr_thread_name[] = "avr"; | |||
80 | static struct semaphore avr_thread_trigger; | 81 | static struct semaphore avr_thread_trigger; |
81 | #endif | 82 | #endif |
82 | 83 | ||
83 | static int current_battery_level = 100; | 84 | /* OF bootloader will refuse to start software if low power is set |
85 | * Bits 3, 4, 5, 6 and 7 are unknown. | ||
86 | */ | ||
87 | #define BATTERY_STATUS_LOW_POWER (1 << 2) | ||
88 | #define BATTERY_STATUS_CHARGER_CONNECTED (1 << 1) | ||
89 | #define BATTERY_STATUS_CHARGING (1 << 0) | ||
90 | static uint8_t avr_battery_status; | ||
91 | |||
92 | #define BATTERY_LEVEL_NOT_DETECTED (1 << 7) | ||
93 | #define BATTERY_LEVEL_PERCENTAGE_MASK 0x7F | ||
94 | static uint8_t avr_battery_level = 100; | ||
84 | 95 | ||
85 | static inline unsigned short be2short(unsigned char* buf) | 96 | static inline unsigned short be2short(unsigned char* buf) |
86 | { | 97 | { |
@@ -289,8 +300,26 @@ void avr_hid_init(void) | |||
289 | 300 | ||
290 | int _battery_level(void) | 301 | int _battery_level(void) |
291 | { | 302 | { |
292 | /* Force shutoff when level read by AVR is 4 or lower */ | 303 | /* OF still plays music when level is at 0 */ |
293 | return (current_battery_level > 4) ? current_battery_level : 0; | 304 | if (avr_battery_level & BATTERY_LEVEL_NOT_DETECTED) |
305 | { | ||
306 | return 0; | ||
307 | } | ||
308 | return avr_battery_level & BATTERY_LEVEL_PERCENTAGE_MASK; | ||
309 | } | ||
310 | |||
311 | unsigned int power_input_status(void) | ||
312 | { | ||
313 | if (avr_battery_status & BATTERY_STATUS_CHARGER_CONNECTED) | ||
314 | { | ||
315 | return POWER_INPUT_USB_CHARGER; | ||
316 | } | ||
317 | return POWER_INPUT_NONE; | ||
318 | } | ||
319 | |||
320 | bool charging_state(void) | ||
321 | { | ||
322 | return (avr_battery_status & BATTERY_STATUS_CHARGING) != 0; | ||
294 | } | 323 | } |
295 | 324 | ||
296 | static void avr_hid_get_state(void) | 325 | static void avr_hid_get_state(void) |
@@ -300,18 +329,16 @@ static void avr_hid_get_state(void) | |||
300 | CMD_CLOSE}; | 329 | CMD_CLOSE}; |
301 | 330 | ||
302 | static unsigned char buf[11]; | 331 | static unsigned char buf[11]; |
303 | static unsigned char cmd_empty[1] = {0xCC}; | ||
304 | |||
305 | spi_txrx(cmd, buf, sizeof(cmd)); | ||
306 | 332 | ||
307 | /* | 333 | /* In very unlikely case the command has to be repeated */ |
308 | * buf[8] contains some battery/charger related information (unknown) | 334 | do |
309 | * buf[9] contains battery level in percents (0-100) | 335 | { |
310 | */ | 336 | spi_txrx(cmd, buf, sizeof(cmd)); |
311 | current_battery_level = (int)buf[9]; | 337 | } |
312 | 338 | while ((buf[1] != CMD_SYNC) || (buf[10] != CMD_CLOSE)); | |
313 | spi_txrx(cmd_empty, NULL, 1); /* request interrupt on button press */ | ||
314 | 339 | ||
340 | avr_battery_status = buf[8]; | ||
341 | avr_battery_level = buf[9]; | ||
315 | parse_button_state(buf); | 342 | parse_button_state(buf); |
316 | } | 343 | } |
317 | 344 | ||