summaryrefslogtreecommitdiff
path: root/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c')
-rw-r--r--firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c53
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";
80static struct semaphore avr_thread_trigger; 81static struct semaphore avr_thread_trigger;
81#endif 82#endif
82 83
83static 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)
90static uint8_t avr_battery_status;
91
92#define BATTERY_LEVEL_NOT_DETECTED (1 << 7)
93#define BATTERY_LEVEL_PERCENTAGE_MASK 0x7F
94static uint8_t avr_battery_level = 100;
84 95
85static inline unsigned short be2short(unsigned char* buf) 96static inline unsigned short be2short(unsigned char* buf)
86{ 97{
@@ -289,8 +300,26 @@ void avr_hid_init(void)
289 300
290int _battery_level(void) 301int _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
311unsigned 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
320bool charging_state(void)
321{
322 return (avr_battery_status & BATTERY_STATUS_CHARGING) != 0;
294} 323}
295 324
296static void avr_hid_get_state(void) 325static 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