1 /**
2  * @file
3  *
4  * @brief Public APIs to get device Information.
5  */
6 
7 /*
8  * Copyright (c) 2018 Alexander Wachter
9  *
10  * SPDX-License-Identifier: Apache-2.0
11  */
12 
13 #ifndef ZEPHYR_INCLUDE_DRIVERS_HWINFO_H_
14 #define ZEPHYR_INCLUDE_DRIVERS_HWINFO_H_
15 
16 /**
17  * @brief Hardware Information Interface
18  * @defgroup hwinfo_interface Hardware Info Interface
19  * @since 1.14
20  * @version 1.0.0
21  * @ingroup io_interfaces
22  * @{
23  */
24 
25 #include <zephyr/types.h>
26 #include <sys/types.h>
27 #include <stddef.h>
28 #include <errno.h>
29 #include <zephyr/kernel.h>
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 /**
36  * @name Reset cause flags
37  * @anchor reset_cause
38  * @{
39  */
40 /** External pin */
41 #define RESET_PIN				BIT(0)
42 /** Software reset */
43 #define RESET_SOFTWARE				BIT(1)
44 /** Brownout (drop in voltage) */
45 #define RESET_BROWNOUT				BIT(2)
46 /** Power-on reset (POR) */
47 #define RESET_POR				BIT(3)
48 /** Watchdog timer expiration */
49 #define RESET_WATCHDOG				BIT(4)
50 /** Debug event */
51 #define RESET_DEBUG				BIT(5)
52 /** Security violation */
53 #define RESET_SECURITY				BIT(6)
54 /** Waking up from low power mode */
55 #define RESET_LOW_POWER_WAKE			BIT(7)
56 /** CPU lock-up detected */
57 #define RESET_CPU_LOCKUP			BIT(8)
58 /** Parity error */
59 #define RESET_PARITY				BIT(9)
60 /** PLL error */
61 #define RESET_PLL				BIT(10)
62 /** Clock error */
63 #define RESET_CLOCK				BIT(11)
64 /** Hardware reset */
65 #define RESET_HARDWARE				BIT(12)
66 /** User reset */
67 #define RESET_USER				BIT(13)
68 /** Temperature reset */
69 #define RESET_TEMPERATURE			BIT(14)
70 /**
71  * @}
72  */
73 
74 /**
75  * @brief Copy the device id to a buffer
76  *
77  * This routine copies "length" number of bytes of the device ID to the buffer.
78  * If the device ID is smaller than length, the rest of the buffer is left unchanged.
79  * The ID depends on the hardware and is not guaranteed unique.
80  *
81  * Drivers are responsible for ensuring that the ID data structure is a
82  * sequence of bytes.  The returned ID value is not supposed to be interpreted
83  * based on vendor-specific assumptions of byte order. It should express the
84  * identifier as a raw byte sequence, doing any endian conversion necessary so
85  * that a hex representation of the bytes produces the intended serial number.
86  *
87  * @param buffer  Buffer to write the ID to.
88  * @param length  Max length of the buffer.
89  *
90  * @retval size of the device ID copied.
91  * @retval -ENOSYS if there is no implementation for the particular device.
92  * @retval any negative value on driver specific errors.
93  */
94 __syscall ssize_t hwinfo_get_device_id(uint8_t *buffer, size_t length);
95 
96 ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length);
97 
98 /**
99  * @brief Copy the device EUI64 to a buffer
100  *
101  * This routine copies the device EUI64 (8 bytes) to the buffer.
102  * The EUI64 depends on the hardware and is guaranteed unique.
103  *
104  * @param buffer  Buffer of 8 bytes to write the ID to.
105  *
106  * @retval zero if successful.
107  * @retval -ENOSYS if there is no implementation for the particular device.
108  * @retval any negative value on driver specific errors.
109  */
110 __syscall int hwinfo_get_device_eui64(uint8_t *buffer);
111 
112 int z_impl_hwinfo_get_device_eui64(uint8_t *buffer);
113 
114 /**
115  * @brief      Retrieve cause of device reset.
116  *
117  * @param      cause  OR'd @ref reset_cause "reset cause" flags
118  *
119  * This routine retrieves the flags that indicate why the device was reset.
120  *
121  * On some platforms the reset cause flags accumulate between successive resets
122  * and this routine may return multiple flags indicating all reset causes
123  * since the device was powered on. If you need to retrieve the cause only for
124  * the most recent reset call `hwinfo_clear_reset_cause` after calling this
125  * routine to clear the hardware flags before the next reset event.
126  *
127  * Successive calls to this routine will return the same value, unless
128  * `hwinfo_clear_reset_cause` has been called.
129  *
130  * @retval zero if successful.
131  * @retval -ENOSYS if there is no implementation for the particular device.
132  * @retval any negative value on driver specific errors.
133  */
134 __syscall int hwinfo_get_reset_cause(uint32_t *cause);
135 
136 int z_impl_hwinfo_get_reset_cause(uint32_t *cause);
137 
138 /**
139  * @brief      Clear cause of device reset.
140  *
141  * Clears reset cause flags.
142  *
143  * @retval zero if successful.
144  * @retval -ENOSYS if there is no implementation for the particular device.
145  * @retval any negative value on driver specific errors.
146  */
147 __syscall int hwinfo_clear_reset_cause(void);
148 
149 int z_impl_hwinfo_clear_reset_cause(void);
150 
151 /**
152  * @brief      Get supported reset cause flags
153  *
154  * @param      supported  OR'd @ref reset_cause "reset cause" flags that are supported
155  *
156  * Retrieves all `reset_cause` flags that are supported by this device.
157  *
158  * @retval zero if successful.
159  * @retval -ENOSYS if there is no implementation for the particular device.
160  * @retval any negative value on driver specific errors.
161  */
162 __syscall int hwinfo_get_supported_reset_cause(uint32_t *supported);
163 
164 int z_impl_hwinfo_get_supported_reset_cause(uint32_t *supported);
165 
166 /**
167  * @}
168  */
169 
170 #ifdef __cplusplus
171 }
172 #endif
173 
174 #include <zephyr/syscalls/hwinfo.h>
175 
176 #endif /* ZEPHYR_INCLUDE_DRIVERS_HWINFO_H_ */
177