Sansa Connect: Indicate charging status

Consider battery level down to 0 as safe as OF continues to operate
normally even when at level 0.

Change-Id: Ie3889e5662b9fa6588e20ad02d8953f29e28800c
This commit is contained in:
Tomasz Moń 2021-06-20 10:06:32 +02:00
parent 0faf978c3d
commit 2ca5774cf9
3 changed files with 41 additions and 28 deletions

View File

@ -180,7 +180,7 @@
#define FIRMWARE_OFFSET_FILE_DATA 8
/* Hardware controlled charging */
#define CONFIG_CHARGING CHARGING_SIMPLE
#define CONFIG_CHARGING CHARGING_MONITOR
#define CONFIG_USBOTG USBOTG_TNETV105

View File

@ -22,6 +22,7 @@
#include <stdio.h>
#include "config.h"
#include "system.h"
#include "power.h"
#include "kernel.h"
#include "logf.h"
#include "avr-sansaconnect.h"
@ -80,7 +81,17 @@ static const char avr_thread_name[] = "avr";
static struct semaphore avr_thread_trigger;
#endif
static int current_battery_level = 100;
/* OF bootloader will refuse to start software if low power is set
* Bits 3, 4, 5, 6 and 7 are unknown.
*/
#define BATTERY_STATUS_LOW_POWER (1 << 2)
#define BATTERY_STATUS_CHARGER_CONNECTED (1 << 1)
#define BATTERY_STATUS_CHARGING (1 << 0)
static uint8_t avr_battery_status;
#define BATTERY_LEVEL_NOT_DETECTED (1 << 7)
#define BATTERY_LEVEL_PERCENTAGE_MASK 0x7F
static uint8_t avr_battery_level = 100;
static inline unsigned short be2short(unsigned char* buf)
{
@ -289,8 +300,26 @@ void avr_hid_init(void)
int _battery_level(void)
{
/* Force shutoff when level read by AVR is 4 or lower */
return (current_battery_level > 4) ? current_battery_level : 0;
/* OF still plays music when level is at 0 */
if (avr_battery_level & BATTERY_LEVEL_NOT_DETECTED)
{
return 0;
}
return avr_battery_level & BATTERY_LEVEL_PERCENTAGE_MASK;
}
unsigned int power_input_status(void)
{
if (avr_battery_status & BATTERY_STATUS_CHARGER_CONNECTED)
{
return POWER_INPUT_USB_CHARGER;
}
return POWER_INPUT_NONE;
}
bool charging_state(void)
{
return (avr_battery_status & BATTERY_STATUS_CHARGING) != 0;
}
static void avr_hid_get_state(void)
@ -300,18 +329,16 @@ static void avr_hid_get_state(void)
CMD_CLOSE};
static unsigned char buf[11];
static unsigned char cmd_empty[1] = {0xCC};
spi_txrx(cmd, buf, sizeof(cmd));
/*
* buf[8] contains some battery/charger related information (unknown)
* buf[9] contains battery level in percents (0-100)
*/
current_battery_level = (int)buf[9];
spi_txrx(cmd_empty, NULL, 1); /* request interrupt on button press */
/* In very unlikely case the command has to be repeated */
do
{
spi_txrx(cmd, buf, sizeof(cmd));
}
while ((buf[1] != CMD_SYNC) || (buf[10] != CMD_CLOSE));
avr_battery_status = buf[8];
avr_battery_level = buf[9];
parse_button_state(buf);
}

View File

@ -74,21 +74,7 @@ void power_off(void)
avr_hid_power_off();
}
#if CONFIG_CHARGING
unsigned int power_input_status(void)
{
return POWER_INPUT_NONE;
}
/* Returns true if the unit is charging the batteries. */
bool charging_state(void)
{
return false;
}
#endif
void ide_power_enable(bool on)
{
(void)on;
}