1
0
Fork 0
forked from len0rd/rockbox

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 #define FIRMWARE_OFFSET_FILE_DATA 8
/* Hardware controlled charging */ /* Hardware controlled charging */
#define CONFIG_CHARGING CHARGING_SIMPLE #define CONFIG_CHARGING CHARGING_MONITOR
#define CONFIG_USBOTG USBOTG_TNETV105 #define CONFIG_USBOTG USBOTG_TNETV105

View file

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

View file

@ -74,21 +74,7 @@ void power_off(void)
avr_hid_power_off(); 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 ide_power_enable(bool on)
{ {
(void)on; (void)on;
} }