summaryrefslogtreecommitdiff
path: root/include/system.h
blob: 46cb5bf730bbe7aa9d610df273f7a170f830577f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/* Copyright (c) 2011 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.
 */

/* System module for Chrome EC */

#ifndef __CROS_EC_SYSTEM_H
#define __CROS_EC_SYSTEM_H

#include "common.h"

/* Reset causes */
enum system_reset_cause_t {
	/* Unknown reset cause */
	SYSTEM_RESET_UNKNOWN = 0,
	/* System reset cause is known, but not one of the causes
	 * listed below */
	SYSTEM_RESET_OTHER,
	/* Brownout */
	SYSTEM_RESET_BROWNOUT,
	/* Power-on reset */
	SYSTEM_RESET_POWER_ON,
	/* Reset caused by asserting reset (RST#) pin */
	SYSTEM_RESET_RESET_PIN,
	/* Software requested cold reset */
	SYSTEM_RESET_SOFT_COLD,
	/* Software requested warm reset */
	SYSTEM_RESET_SOFT_WARM,
	/* Watchdog timer reset */
	SYSTEM_RESET_WATCHDOG,
	/* the RTC alarm triggered power on */
	SYSTEM_RESET_RTC_ALARM,
	/* the Wake pin triggered power on */
	SYSTEM_RESET_WAKE_PIN,
	/* the low battery detection triggered power on */
	SYSTEM_RESET_LOW_BATTERY,
};

/* System images */
enum system_image_copy_t {
	SYSTEM_IMAGE_UNKNOWN = 0,
	SYSTEM_IMAGE_RO,
	SYSTEM_IMAGE_RW_A,
	SYSTEM_IMAGE_RW_B
};

/* Pre-initializes the module.  This occurs before clocks or tasks are
 * set up. */
int system_pre_init(void);

/* Initializes the system module. */
int system_init(void);

/* Returns the cause of the last reset, or SYSTEM_RESET_UNKNOWN if
 * the cause is not known. */
enum system_reset_cause_t system_get_reset_cause(void);

/* Returns a text description of the last reset cause. */
const char *system_get_reset_cause_string(void);

/* Returns the image copy which is currently running. */
enum system_image_copy_t system_get_image_copy(void);

/* Returns a text description of the image copy which is currently running. */
const char *system_get_image_copy_string(void);

/* Jumps to the specified image copy.  Only works from RO firmware. */
int system_run_image_copy(enum system_image_copy_t copy);

/* Returns the version string for an image copy, or an empty string if
 * error.  If copy==SYSTEM_IMAGE_UNKNOWN, returns the version for the
 * currently-running image. */
const char *system_get_version(enum system_image_copy_t copy);

/* Resets the system.  If is_cold!=0, performs a cold reset (which
 * resets on-chip peripherals); else performs a warm reset (which does
 * not reset on-chip peripherals).  If successful, does not return.
 * Returns error if the reboot type cannot be requested (e.g. brownout
 * or reset pin). */
int system_reset(int is_cold);

/* Sets a scratchpad register to the specified value.  The scratchpad
 * register must maintain its contents across a software-requested
 * warm reset. */
int system_set_scratchpad(uint32_t value);

/* Returns the current scratchpad register value. */
uint32_t system_get_scratchpad(void);

/* TODO: request sleep.  How do we want to handle transitioning
 * to/from low-power states? */

/* put the system in hibernation for the specified duration */
void system_hibernate(uint32_t seconds, uint32_t microseconds);

/* minimum duration to get proper hibernation */
#define SYSTEM_HIB_MINIMUM_DURATION 0, 1000

#endif  /* __CROS_EC_SYSTEM_H */