mirror of
https://github.com/google/pebble.git
synced 2025-05-12 04:13:17 -04:00
114 lines
4.1 KiB
C
114 lines
4.1 KiB
C
/*
|
|
* Copyright 2024 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "drivers/rtc.h"
|
|
#include "system/logging.h"
|
|
|
|
#include <inttypes.h>
|
|
|
|
/** Power Profiling
|
|
* ===============
|
|
* There are two main types of power consumers on the Pebble Smartwatch:
|
|
* - Discrete systems (one or more independent power states).
|
|
* - Continuous systems (a continuum of power draw eg. the PWM-ed backlight).
|
|
*
|
|
* The discrete systems will have their power profiled in a time-binned manner
|
|
* where the on-time of each state is integrated over a pre-determined period.
|
|
* General rule of thumb is that non-quiescent states should be tracked.
|
|
* eg. don't track BT sniff mode, but do track Active mode because it is more
|
|
* of an unusual condition...
|
|
*
|
|
* The continuous systems will just dump their current state whenever it
|
|
* is changed.
|
|
*/
|
|
|
|
// enum that most discrete consumers can fall into.
|
|
|
|
// TODO: implement tracking on these in decreasing priority order:
|
|
// Spi1, BtShutdown, BtDeepSleep
|
|
// Tim1, Tim3, Tim4, I2C1, I2C2
|
|
// AccelLowPower, AccelNormal, Mag,
|
|
// probably will not implement(either very low power, or constantly on):
|
|
// 5vReg, Pwr, Adc1, Adc2, Ambient, Usart3
|
|
typedef enum {
|
|
PowerSystem2v5Reg = 0,
|
|
PowerSystem5vReg,
|
|
PowerSystemMcuCoreSleep,
|
|
PowerSystemMcuCoreRun,
|
|
PowerSystemMcuGpioA,
|
|
PowerSystemMcuGpioB,
|
|
PowerSystemMcuGpioC,
|
|
PowerSystemMcuGpioD,
|
|
PowerSystemMcuGpioH,
|
|
PowerSystemMcuCrc, // Flash
|
|
PowerSystemMcuPwr, // Everything
|
|
PowerSystemMcuDma1, // Display
|
|
PowerSystemMcuDma2, // BT
|
|
PowerSystemMcuTim1, // Future use for the vibe PWM
|
|
PowerSystemMcuTim3, // Used for the backlight PWM
|
|
PowerSystemMcuTim4, // Used for the button debouncer
|
|
PowerSystemMcuUsart1, // Used for BT
|
|
PowerSystemMcuUsart3, // dbgserial
|
|
PowerSystemMcuI2C1, // Main I2C
|
|
PowerSystemMcuI2C2, // 2V5 I2C
|
|
PowerSystemMcuSpi1, // FLASH
|
|
#if PLATFORM_TINTIN || PLATFORM_SILK
|
|
PowerSystemMcuSpi2, // LCD
|
|
#else
|
|
PowerSystemMcuSpi6, // LCD
|
|
#endif
|
|
PowerSystemMcuAdc1, // Voltage monitoring & ambient light sensing
|
|
PowerSystemMcuAdc2, // Voltage monitoring & ambient light sensing
|
|
PowerSystemFlashRead,
|
|
PowerSystemFlashWrite,
|
|
PowerSystemFlashErase,
|
|
PowerSystemAccelLowPower,
|
|
PowerSystemAccelNormal,
|
|
PowerSystemMfi,
|
|
PowerSystemMag,
|
|
PowerSystemBtShutdown,
|
|
PowerSystemBtDeepSleep,
|
|
PowerSystemBtActive,
|
|
PowerSystemAmbient,
|
|
PowerSystemProfiling, // So that we can diminish the effects that dumping the profile logs has
|
|
|
|
num_power_systems,
|
|
} PowerSystem;
|
|
|
|
void power_tracking_init(void);
|
|
void power_tracking_start(PowerSystem system);
|
|
void power_tracking_stop(PowerSystem system);
|
|
|
|
#if defined(SW_POWER_TRACKING)
|
|
#define PWR_TRACK(system, state_fmt, args...) \
|
|
{ \
|
|
power_tracking_start(PowerSystemProfiling); \
|
|
char buffer[64]; \
|
|
dbgserial_putstr_fmt(buffer, sizeof(buffer), ">>>PWR:%"PRIu64",%s,"state_fmt"<", rtc_get_ticks(), system, ## args); \
|
|
power_tracking_stop(PowerSystemProfiling); \
|
|
}
|
|
#else
|
|
#define PWR_TRACK(system, state_fmt, args...)
|
|
#endif
|
|
|
|
|
|
#define PWR_TRACK_BATT(chg_state, voltage) PWR_TRACK("Battery", "%s,%u", chg_state, voltage)
|
|
#define PWR_TRACK_ACCEL(state, frequency) PWR_TRACK("Accel", "%s,%u", state, frequency)
|
|
#define PWR_TRACK_MAG(state, adc_rate) PWR_TRACK("Mag", "%s,%u", state, adc_rate)
|
|
#define PWR_TRACK_VIBE(state, freq, duty) PWR_TRACK("Vibe", "%s,%u,%u", state, freq, duty)
|
|
#define PWR_TRACK_BACKLIGHT(state, freq, duty) PWR_TRACK("Backlight", "%s,%"PRIu32",%u", state, freq, duty)
|