| /* Copyright 2016 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. |
| */ |
| |
| #include "console.h" |
| #include "device_state.h" |
| #include "hooks.h" |
| |
| #define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ## args) |
| |
| /** |
| * Return text description for a state |
| * |
| * @param state State |
| * @return String describing that state |
| */ |
| static const char *state_desc(enum device_state state) |
| { |
| return state == DEVICE_STATE_ON ? "on" : |
| state == DEVICE_STATE_OFF ? "off" : "unknown"; |
| } |
| |
| enum device_state device_get_state(enum device_type device) |
| { |
| return device_states[device].state; |
| } |
| |
| int device_set_state(enum device_type device, enum device_state state) |
| { |
| struct device_config *dc = device_states + device; |
| |
| /* |
| * It'd be handy for debugging if we could print to the console when |
| * device_set_state() is called. But unfortunately, it'll be called a |
| * LOT when debouncing UART activity on DETECT_EC or DETECT_AP. So |
| * only print when the last known state changes below. |
| */ |
| |
| dc->state = state; |
| |
| if (state != DEVICE_STATE_UNKNOWN && dc->last_known_state != state) { |
| dc->last_known_state = state; |
| CPRINTS("DEV %s -> %s", dc->name, state_desc(state)); |
| return 1; |
| } |
| |
| return 0; |
| } |
| |
| /** |
| * Periodic check of device states. |
| * |
| * The board does all the work. |
| * |
| * Note that device states can change outside of this context as well, for |
| * example, from a GPIO interrupt handler. |
| */ |
| static void check_device_state(void) |
| { |
| int i; |
| |
| for (i = 0; i < DEVICE_COUNT; i++) |
| board_update_device_state(i); |
| } |
| DECLARE_HOOK(HOOK_SECOND, check_device_state, HOOK_PRIO_DEFAULT); |
| |
| static int command_devices(int argc, char **argv) |
| { |
| const struct device_config *dc = device_states; |
| int i; |
| |
| ccprintf("Device State LastKnown\n"); |
| |
| for (i = 0; i < DEVICE_COUNT; i++, dc++) |
| ccprintf("%-9s %-7s %s\n", dc->name, state_desc(dc->state), |
| state_desc(dc->last_known_state)); |
| |
| return EC_SUCCESS; |
| } |
| DECLARE_SAFE_CONSOLE_COMMAND(devices, command_devices, |
| "", |
| "Get the device states"); |