diff options
Diffstat (limited to 'include/peripheral_charger.h')
-rw-r--r-- | include/peripheral_charger.h | 260 |
1 files changed, 0 insertions, 260 deletions
diff --git a/include/peripheral_charger.h b/include/peripheral_charger.h deleted file mode 100644 index b1f82bb1f3..0000000000 --- a/include/peripheral_charger.h +++ /dev/null @@ -1,260 +0,0 @@ -/* Copyright 2020 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#ifndef __CROS_EC_PERIPHERAL_CHARGER_H -#define __CROS_EC_PERIPHERAL_CHARGER_H - -#include "common.h" -#include "ec_commands.h" -#include "gpio.h" -#include "queue.h" -#include "stdbool.h" -#include "task.h" - -/* - * Peripheral charge manager - * - * Peripheral charge manager (PCHG) is a state machine (SM), which manages - * charge ports to charge peripheral devices. Events can be generated - * externally (by a charger chip) or internally (by a host command or the SM - * itself). Events are queued and handled first-come-first-serve basis. - * - * Peripheral charger drivers should implement struct pchg_drv. Each operation - * can be synchronous or asynchronous depending on the chip. If a function - * works synchronously, it should return EC_SUCCESS. That'll make the SM - * immediately queue the next event (if applicable) and transition to the next - * state. If a function works asynchronously, it should return - * EC_SUCCESS_IN_PROGRESS. That'll make the SM stay in the same state. The SM - * is expected to receive IRQ for further information about the operation, - * which may or may not make the SM transition to the next state. - * - * Roughly speaking the SM looks as follows: - * - * +---------------+ - * | RESET | - * +-------+-------+ - * | - * | INITIALIZED - * v - * +---------------+ - * | INITIALIZED |<--------------+ - * +------+--------+ | - * | ^ | - * ENABLED | | DISABLED | - * v | | - * +--------+------+ | - * +------------->| ENABLED | | - * | +-----+-+-------+ | - * | | | | - * | DEVICE_CONNECTED | | DEVICE_DOCKED | - * | | v | - * | DEVICE_LOST +---------------+ | - * +--------------+ DOCKED +---------------+ - * | +-------+-------+ | - * | | | | - * | | | DEVICE_CONNECTED | - * | v v | - * | +---------------+ | - * +--------------+ CONNECTED +---------------+ - * | DEVICE_LOST +------+--------+ ERROR | - * | | ^ | - * | CHARGE_STARTED | | CHARGE_ENDED | - * | | | CHARGE_STOPPED | - * | v | | - * | +--------+------+ | - * +--------------+ CHARGING +---------------+ - * DEVICE_LOST +---------------+ ERROR - * - * - * In download (update firmware) mode, the state machine transitions as follows: - * - * +---------------+ - * | DOWNLOAD | - * +------+--------+ - * | ^ - * UPDATE_OPEN | | - * | | UPDATE_CLOSE - * v | - * +--------+------+ - * +-->| DOWNLOADING | - * | +------+--------+ - * | | - * +----------+ - * UPDATE_WRITE - */ - -/* Size of event queue. Use it to initialize struct pchg.events. */ -#define PCHG_EVENT_QUEUE_SIZE 8 - -enum pchg_event { - /* No event */ - PCHG_EVENT_NONE = 0, - - /* IRQ is pending. */ - PCHG_EVENT_IRQ, - - /* External Events */ - PCHG_EVENT_RESET, - PCHG_EVENT_INITIALIZED, - PCHG_EVENT_ENABLED, - PCHG_EVENT_DISABLED, - PCHG_EVENT_DEVICE_DETECTED, - PCHG_EVENT_DEVICE_CONNECTED, - PCHG_EVENT_DEVICE_LOST, - PCHG_EVENT_CHARGE_STARTED, - PCHG_EVENT_CHARGE_UPDATE, - PCHG_EVENT_CHARGE_ENDED, - PCHG_EVENT_CHARGE_STOPPED, - PCHG_EVENT_UPDATE_OPENED, - PCHG_EVENT_UPDATE_CLOSED, - PCHG_EVENT_UPDATE_WRITTEN, - PCHG_EVENT_IN_NORMAL, - - /* Errors */ - PCHG_EVENT_CHARGE_ERROR, - PCHG_EVENT_UPDATE_ERROR, - PCHG_EVENT_OTHER_ERROR, - - /* Internal (a.k.a. Host) Events */ - PCHG_EVENT_ENABLE, - PCHG_EVENT_DISABLE, - PCHG_EVENT_UPDATE_OPEN, - PCHG_EVENT_UPDATE_WRITE, - PCHG_EVENT_UPDATE_CLOSE, - - /* Counter. Add new entry above. */ - PCHG_EVENT_COUNT, -}; - -enum pchg_error { - /* Errors reported by host. */ - PCHG_ERROR_HOST, - PCHG_ERROR_OVER_TEMPERATURE, - PCHG_ERROR_OVER_CURRENT, - PCHG_ERROR_FOREIGN_OBJECT, - /* Errors reported by chip. */ - PCHG_ERROR_FW_VERSION, - PCHG_ERROR_INVALID_FW, - PCHG_ERROR_WRITE_FLASH, - /* All other errors */ - PCHG_ERROR_OTHER, -}; - -#define PCHG_ERROR_MASK(e) BIT(e) - -enum pchg_mode { - PCHG_MODE_NORMAL = 0, - PCHG_MODE_DOWNLOAD, - /* Add no more entries below here. */ - PCHG_MODE_COUNT, -}; - -/** - * Data struct describing the configuration of a peripheral charging port. - */ -struct pchg_config { - /* Charger driver */ - const struct pchg_drv *drv; - /* I2C port number */ - const int i2c_port; - /* GPIO pin used for IRQ */ - const enum gpio_signal irq_pin; - /* Full battery percentage */ - const uint8_t full_percent; - /* Update block size */ - const uint32_t block_size; -}; - -struct pchg_update { - /* Version of new firmware. Usually used by EC_PCHG_UPDATE_CMD_OPEN. */ - uint32_t version; - /* CRC32 of new firmware. Usually used by EC_PCHG_UPDATE_CMD_CLOSE. */ - uint32_t crc32; - /* Address which <data> will be written to. */ - uint32_t addr; - /* Size of <data> */ - uint32_t size; - /* 0: No data. 1: Data is ready for write. */ - uint8_t data_ready; - /* Partial data of new firmware */ - uint8_t data[128]; -}; - -/** - * Data struct describing the status of a peripheral charging port. It provides - * the state machine and a charger driver with a context to work on. - */ -struct pchg { - /* Static configuration */ - const struct pchg_config * const cfg; - /* Current state of the port */ - enum pchg_state state; - /* Event queue */ - struct queue const events; - /* Event queue mutex */ - struct mutex mtx; - /* 1:Pending IRQ 0:No pending IRQ */ - uint32_t irq; - /* Event currently being handled */ - enum pchg_event event; - /* Error (enum pchg_error). Port is disabled until it's cleared. */ - uint32_t error; - /* Battery percentage (0% ~ 100%) of the connected peripheral device */ - uint8_t battery_percent; - /* Number of dropped events (due to queue overflow) */ - uint32_t dropped_event_count; - /* enum pchg_mode */ - uint8_t mode; - /* FW version */ - uint32_t fw_version; - /* Context related to FW update */ - struct pchg_update update; -}; - -/** - * Peripheral charger driver - */ -struct pchg_drv { - /* Reset charger chip. */ - int (*reset)(struct pchg *ctx); - /* Initialize the charger. */ - int (*init)(struct pchg *ctx); - /* Enable/disable the charger. */ - int (*enable)(struct pchg *ctx, bool enable); - /* Get event info. */ - int (*get_event)(struct pchg *ctx); - /* Get battery level. */ - int (*get_soc)(struct pchg *ctx); - /* open update session */ - int (*update_open)(struct pchg *ctx); - /* write update image */ - int (*update_write)(struct pchg *ctx); - /* close update session */ - int (*update_close)(struct pchg *ctx); -}; - -/** - * Array storing configs and states of all the peripheral charging ports. - * Should be defined in board.c. - */ -extern struct pchg pchgs[]; -extern const int pchg_count; - -/* Utility macro converting port config to port number. */ -#define PCHG_CTX_TO_PORT(ctx) ((ctx) - &pchgs[0]) - -/** - * Interrupt handler for a peripheral charger. - * - * @param signal - */ -void pchg_irq(enum gpio_signal signal); - -/** - * Task running a state machine for charging peripheral devices. - */ -void pchg_task(void *u); - -#endif /* __CROS_EC_PERIPHERAL_CHARGER_H */ |