gr55xx_pwr.h
Go to the documentation of this file.
1 /**
2  *****************************************************************************************
3  *
4  * @file gr55xx_pwr.h
5  *
6  * @brief GR55XX Platform Power Manager Module API
7  *
8  *****************************************************************************************
9  * @attention
10  #####Copyright (c) 2019 GOODIX
11  All rights reserved.
12 
13  Redistribution and use in source and binary forms, with or without
14  modification, are permitted provided that the following conditions are met:
15  * Redistributions of source code must retain the above copyright
16  notice, this list of conditions and the following disclaimer.
17  * Redistributions in binary form must reproduce the above copyright
18  notice, this list of conditions and the following disclaimer in the
19  documentation and/or other materials provided with the distribution.
20  * Neither the name of GOODIX nor the names of its contributors may be used
21  to endorse or promote products derived from this software without
22  specific prior written permission.
23 
24  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
28  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  POSSIBILITY OF SUCH DAMAGE.
35  *****************************************************************************************
36  */
37 
38 /**
39  * @addtogroup SYSTEM
40  * @{
41  */
42 
43 /**
44  * @addtogroup PWR Power Manager
45  * @{
46  * @brief Definitions and prototypes for the Power Manager interface.
47  */
48 
49 
50 #ifndef __GR55XX_PWR_H_
51 #define __GR55XX_PWR_H_
52 
53 #include <stdint.h>
54 #include <stdbool.h>
55 #include <stdio.h>
56 
57 #include "system_gr55xx.h"
58 
59 /**
60  * @defgroup GR55XX_PWR_TYPEDEF Typedefs
61  * @{
62  */
63 
64 /**@brief PMU error code. */
65 #define PMR_MGMT_SUCCESS 0x0
66 #define PMR_MGMT_FAIL 0xFF
67 #define PWR_MGMT_BB_CHECK_FAIL 0xFE
68 #define PWR_MGMT_MODE_CHECK_FAIL 0xFD
69 
70 
71 /**@brief power manager setting parameter.
72  * Use pwr_mgmt_var_set to transfer the parameters in the structure to PMU,
73  * and then the pwr_mgmt_mode_set function will use the new parameters for
74  * power management.
75  * Note that this is an advanced API, the wrong setting of parameters may
76  * lead to abnormal power management, so please use it carefully.
77  */
78 typedef struct
79 {
80  uint32_t pwr_mgmt_app_timer_thrd; /**< App timer threshold. */
81  uint32_t pwr_mgmt_ble_core_thrd; /**< BLE timer threshold. */
82  uint32_t pwr_mgmt_rtc_timer_thrd; /**< RTC timer threshold. */
83  uint32_t pwr_mgmt_wdt_timer_thrd; /**< AON WDT threshold. */
85 
86 /**@brief power manager boot type. */
87 typedef enum
88 {
89  COLD_BOOT = 0, /**< Cold boot state. */
90  WARM_BOOT, /**< Warm boot state. */
91 } boot_mode_t;
92 
93 /**@brief power manager model. */
94 typedef enum
95 {
96  PMR_MGMT_ACTIVE_MODE = 0x0, /**< Full speed state. */
97  PMR_MGMT_IDLE_MODE, /**< Idle state. */
98  PMR_MGMT_SLEEP_MODE, /**< Deep sleep state. */
100 
101 /**@brief power manager device work state. */
102 typedef enum
103 {
104  DEVICE_BUSY = 0x0, /**< Device busy state. */
105  DEVICE_IDLE, /**< Device idle state. */
107 
108 /**@brief power manager app timer work state. */
109 typedef enum
110 {
111  EVENT_APP_TIMER_START = 0, /**< App-timer start state. */
112  EVENT_APP_TIMER_STOP, /**< App-timer stop state. */
114 
115 /**@brief PMU Tracking*/
116 enum
117 {
118  TRC_PWR_WFE_MODE = 0, /**< WFE mode. */
119  TRC_PWR_DSLEEP_MODE, /**< Deep sleep mode. */
120  TRC_PWR_ACTIVE_MODE, /**< Active mode. */
121  TRC_PWR_BLE_RET_DSLEEP, /**< BLE return deep sleep. */
122  TRC_PWR_APP_TIMER_REFUSE, /**< App timer refuse. */
123  TRC_PWR_APP_TIMER_PASS, /**< App timer pass. */
124  TRC_PWR_BLE_TIMER_REFUSE, /**< BLE timer refuse. */
125  TRC_PWR_BLE_TIMER_PASS, /**< BLE timer pass. */
126  TRC_PWR_RTC_TIMER_REFUSE, /**< RTC timer refuse. */
127  TRC_PWR_RTC_TIMER_PASS, /**< RTC timer pass. */
128  TRC_PWR_RTC1_TIMER_REFUSE, /**< RTC timer refuse. */
129  TRC_PWR_RTC1_TIMER_PASS, /**< RTC timer pass. */
130  TRC_PWR_WDT_TIMER_REFUSE, /**< AON WDT timer refuse. */
131  TRC_PWR_WDT_TIMER_PASS, /**< AON WDT timer pass. */
132 };
133 
134 /**@brief parameter configuration table. */
135 typedef struct
136 {
137  uint16_t pwr_dur; /**< Duration. */
138  uint16_t pwr_ext; /**< External wake-up. */
139  uint16_t pwr_osc; /**< OSC. */
140  uint8_t pwr_delay_hslot; /**< Delay half slot. */
141  uint16_t pwr_delay_hus; /**< Delay half us. */
142  uint16_t pwr_push_hus; /**< Push half us. */
143  uint32_t pwr_timer_ths; /**< APP timer threshold. */
144  uint32_t pwr_ble_ths; /**< BLE timer threshold. */
145 } pwr_table_t;
146 
147 /**@brief Trace function type. */
148 typedef void (*trace_func_t)(uint8_t);
149 
150 /**@brief Peripheral function type. */
151 typedef void (*periph_func_t)(void);
152 
153 /**@brief Before sleep function type. */
154 typedef void (*pwr_before_sleep_func_t)(void);
155 
156 /**@brief Device check function type. */
158 
159 /**@brief mem check process type. */
160 typedef void (*mem_check_proc_t)(void);
161 
162 /**@brief SRPG before function type. */
163 typedef uint8_t (*srpg_before_func_t)(void);
164 
165 /**@brief pwr table. */
166 extern pwr_table_t pwr_table[];
167 
168 /** @} */
169 
170 /** @addtogroup GR55XX_PWR_FUNCTIONS Functions
171  * @{ */
172 /**
173  *****************************************************************************************
174  * @brief This function allows ARM to enter deep sleep mode, but users should not use this
175  * function directly.
176  * Note that this function is only available in environments where non-RTOS is used,
177  * and that users can only execute it while in main.c.
178  * @retval : pwr_mgmt_mode_t
179  *****************************************************************************************
180  */
182 
183 /**
184  ****************************************************************************************
185  * @brief Get the current boot mode.
186  * @retval : cold boot or warm boot.
187  ****************************************************************************************
188  */
190 
191 /**
192  ****************************************************************************************
193  * @brief Mark the mode of next boot, cold boot or warm boot.
194  * @param[in] boot_mode : cold boot or warm boot.
195  * @retval : void
196  ****************************************************************************************
197  */
199 
200 /**
201  ****************************************************************************************
202  * @brief Set the specified sleep mode. When the setting is completed, the system will
203  * automatically enter the specified sleep mode through the strategy.
204  * @param[in] pm_mode : sleep level
205  * @retval : void
206  ****************************************************************************************
207  */
209 
210 /**
211  ****************************************************************************************
212  * @brief Get the specified sleep mode.
213  * @retval : pwr_mgmt_mode_t
214  ****************************************************************************************
215  */
217 
218 /**
219  ****************************************************************************************
220  * @brief Get the power state of baseband.
221  * @retval : pwr_mgmt_mode_t
222  ****************************************************************************************
223  */
225 
226 /**
227  ****************************************************************************************
228  * @brief Get the state of extenal timer.
229  * @retval : pwr_mgmt_mode_t
230  ****************************************************************************************
231  */
233 
234 
235 
236 /**
237  ****************************************************************************************
238  * @brief Sleep Policy Scheduling Function.
239  * Note that this function is only available in environments where non-RTOS is used,
240  and that users can only execute it while in main.c.
241  * @retval : void
242  ****************************************************************************************
243  */
244 void pwr_mgmt_schedule(void);
245 
246 /**
247  ****************************************************************************************
248  * @brief Wake the BLE core via an external request.
249  * @retval : void
250  ****************************************************************************************
251  */
253 
254 
255 /**
256  ****************************************************************************************
257  * @brief Check whether there are ble events in the queue, and if so, handle them immediately.
258  * @retval : void
259  ****************************************************************************************
260  */
262 
263 
264 /**
265  ****************************************************************************************
266  * @brief This function is used to push startup information in app timer.
267  * This information will optimize power management strategy.
268  * Note that this function is an advanced API and users should not use it directly.
269  * @param[in] timer_event : EVENT_APP_TIMER_START or EVENT_APP_TIMER_STOP
270  * @retval : void
271  ****************************************************************************************
272  */
274 
275 /**
276  ****************************************************************************************
277  * @brief Execution of this function allows ARM to enter the WFE state and exit the WFE
278  * state when an event or interrupt occurs.
279  * @retval : void
280  ****************************************************************************************
281  */
283 
284 /**
285  ****************************************************************************************
286  * @brief Execution of this function allows ARM to enter the ultra sleep state and wakeup
287  * the chip when an event occurs.
288  * @param time_ms : Specifies the wake-up time during ultra sleep. If time_ms is equal to 0,
289  then sleep timer will not be enabled.
290  This parameter must be a number between min_value = 0 and max_value = 131071
291  * @retval : void
292  ****************************************************************************************
293  */
294 void pwr_mgmt_ultra_sleep(uint32_t time_ms);
295 
296 /**
297  ****************************************************************************************
298  * @brief PMU Initialization Function.
299  * @param p_pwr_table : PMU parameter configuration table.
300  * @param sys_clk : the clock of system
301  * @return void
302  ****************************************************************************************
303  */
304 void pwr_mgmt_init( pwr_table_t *p_pwr_table, mcu_clock_type_t sys_clk);
305 
306 /**
307  ****************************************************************************************
308  * @brief Peripheral Controller Initialization Register interface.
309  * @param p_periph_init : the pointer of device init function.
310  * @return void
311  ****************************************************************************************
312  */
313 void pwr_mgmt_dev_init(periph_func_t p_periph_init);
314 
315 /**
316  ****************************************************************************************
317  * @brief Device config resume interface.
318  * @return void
319  ****************************************************************************************
320  */
322 
323 /**
324  ****************************************************************************************
325  * @brief Device config suspend interface.
326  * @return void
327  ****************************************************************************************
328  */
330 
331 /**
332  ****************************************************************************************
333  * @brief Mem state control under deep sleep & work state.
334  * @param mem_sleep_state : control in deep sleep.
335  * @param mem_work_state : control in work state.
336  * @return void
337  ****************************************************************************************
338  */
339 void pwr_mgmt_mem_ctl_set(uint32_t mem_sleep_state, uint32_t mem_work_state);
340 
341 /**
342  ****************************************************************************************
343  * @brief Set PMU callback function.
344  * @param dev_check_fun : Device check callback function.
345  * @param before_sleep_fun : Pre-execution callback function for deep sleep.
346  * @return void
347  ****************************************************************************************
348  */
350 
351  /**
352  ****************************************************************************************
353  * @brief Save context function.
354  * @retval : void
355  ****************************************************************************************
356  */
358 
359  /**
360  ****************************************************************************************
361  * @brief Load context function.
362  * @retval : void
363  ****************************************************************************************
364  */
366 
367  /**
368  ****************************************************************************************
369  * @brief Disable nvic irq.
370  * @retval : void
371  ****************************************************************************************
372  */
374 
375 /**
376  ****************************************************************************************
377  * @brief Enable nvic irq.
378  * @retval : void
379  ****************************************************************************************
380  */
382 
383 /**
384  ****************************************************************************************
385  * @brief Check nvic irq.
386  * @retval : void
387  ****************************************************************************************
388  */
390 
391 /**
392  ****************************************************************************************
393  * @brief shutdown power in rtos mode
394  * @retval ::PMR_MGMT_SUCCESS: wakeup from shutdown mode.
395  * @retval ::PMR_MGMT_FAIL: some condition refuse system enter shutdown mode.
396  ****************************************************************************************
397  */
398 uint8_t pwr_mgmt_sleep(void);
399 
400 /**
401  ****************************************************************************************
402  * @brief Trace function register.
403  * @param[in] status_trace_func: Trace function.
404  * @param[in] sched_trace_func: Trace function.
405  * @retval : void
406  ****************************************************************************************
407  */
408 void pwr_mgmt_register_trace_func(trace_func_t status_trace_func, trace_func_t sched_trace_func);
409 
410  /**
411  ****************************************************************************************
412  * @brief Register callback function before srpg sleep
413  * @param srpg_before_fun : Callback function before srpg sleep
414  * @return void
415  ****************************************************************************************
416  */
418 
419 /** @} */
420 
421 #endif
422 /** @} */
423 /** @} */
TRC_PWR_RTC1_TIMER_PASS
@ TRC_PWR_RTC1_TIMER_PASS
Definition: gr55xx_pwr.h:129
pwr_table_t::pwr_osc
uint16_t pwr_osc
Definition: gr55xx_pwr.h:139
TRC_PWR_BLE_RET_DSLEEP
@ TRC_PWR_BLE_RET_DSLEEP
Definition: gr55xx_pwr.h:121
pwr_table_t::pwr_ble_ths
uint32_t pwr_ble_ths
Definition: gr55xx_pwr.h:144
pwr_mgmt_init
void pwr_mgmt_init(pwr_table_t *p_pwr_table, mcu_clock_type_t sys_clk)
PMU Initialization Function.
pwr_mgmt_baseband_state_get
pwr_mgmt_mode_t pwr_mgmt_baseband_state_get(void)
Get the power state of baseband.
pwr_mgmt_mode_t
pwr_mgmt_mode_t
power manager model.
Definition: gr55xx_pwr.h:95
pwr_mgmt_mode_set
void pwr_mgmt_mode_set(pwr_mgmt_mode_t pm_mode)
Set the specified sleep mode. When the setting is completed, the system will automatically enter the ...
pwr_mgmt_ultra_sleep
void pwr_mgmt_ultra_sleep(uint32_t time_ms)
Execution of this function allows ARM to enter the ultra sleep state and wakeup the chip when an even...
pwr_table
pwr_table_t pwr_table[]
pwr table.
pwr_dev_check_func_t
pwr_mgmt_dev_state_t(* pwr_dev_check_func_t)(void)
Device check function type.
Definition: gr55xx_pwr.h:157
pwr_mgmt_dev_init
void pwr_mgmt_dev_init(periph_func_t p_periph_init)
Peripheral Controller Initialization Register interface.
pwr_table_t::pwr_ext
uint16_t pwr_ext
Definition: gr55xx_pwr.h:138
periph_func_t
void(* periph_func_t)(void)
Peripheral function type.
Definition: gr55xx_pwr.h:151
pwr_mgmt_load_context
void pwr_mgmt_load_context(void)
Load context function.
pwr_mgmt_var_box_t
power manager setting parameter. Use pwr_mgmt_var_set to transfer the parameters in the structure to ...
Definition: gr55xx_pwr.h:79
pwr_table_t
parameter configuration table.
Definition: gr55xx_pwr.h:136
pwr_mgmt_mem_ctl_set
void pwr_mgmt_mem_ctl_set(uint32_t mem_sleep_state, uint32_t mem_work_state)
Mem state control under deep sleep & work state.
pwr_table_t::pwr_delay_hus
uint16_t pwr_delay_hus
Definition: gr55xx_pwr.h:141
DEVICE_BUSY
@ DEVICE_BUSY
Definition: gr55xx_pwr.h:104
boot_mode_t
boot_mode_t
power manager boot type.
Definition: gr55xx_pwr.h:88
TRC_PWR_DSLEEP_MODE
@ TRC_PWR_DSLEEP_MODE
Definition: gr55xx_pwr.h:119
pwr_table_t::pwr_delay_hslot
uint8_t pwr_delay_hslot
Definition: gr55xx_pwr.h:140
pwr_mgmt_check_ble_event
void pwr_mgmt_check_ble_event(void)
Check whether there are ble events in the queue, and if so, handle them immediately.
TRC_PWR_RTC_TIMER_REFUSE
@ TRC_PWR_RTC_TIMER_REFUSE
Definition: gr55xx_pwr.h:126
TRC_PWR_WDT_TIMER_REFUSE
@ TRC_PWR_WDT_TIMER_REFUSE
Definition: gr55xx_pwr.h:130
pwr_mgmt_mode_get
pwr_mgmt_mode_t pwr_mgmt_mode_get(void)
Get the specified sleep mode.
pwr_mgmt_notify_timer_event
void pwr_mgmt_notify_timer_event(notify_timer_event_t timer_event)
This function is used to push startup information in app timer. This information will optimize power ...
TRC_PWR_WFE_MODE
@ TRC_PWR_WFE_MODE
Definition: gr55xx_pwr.h:118
TRC_PWR_APP_TIMER_REFUSE
@ TRC_PWR_APP_TIMER_REFUSE
Definition: gr55xx_pwr.h:122
pwr_mgmt_check_ext_timer
pwr_mgmt_mode_t pwr_mgmt_check_ext_timer(void)
Get the state of extenal timer.
pwr_mgmt_sleep
uint8_t pwr_mgmt_sleep(void)
shutdown power in rtos mode
notify_timer_event_t
notify_timer_event_t
power manager app timer work state.
Definition: gr55xx_pwr.h:110
srpg_before_func_t
uint8_t(* srpg_before_func_t)(void)
SRPG before function type.
Definition: gr55xx_pwr.h:163
TRC_PWR_WDT_TIMER_PASS
@ TRC_PWR_WDT_TIMER_PASS
Definition: gr55xx_pwr.h:131
pwr_mgmt_var_box_t::pwr_mgmt_wdt_timer_thrd
uint32_t pwr_mgmt_wdt_timer_thrd
Definition: gr55xx_pwr.h:83
pwr_mgmt_var_box_t::pwr_mgmt_rtc_timer_thrd
uint32_t pwr_mgmt_rtc_timer_thrd
Definition: gr55xx_pwr.h:82
WARM_BOOT
@ WARM_BOOT
Definition: gr55xx_pwr.h:90
pwr_mgmt_dev_resume
void pwr_mgmt_dev_resume(void)
Device config resume interface.
pwr_mgmt_ble_wakeup
void pwr_mgmt_ble_wakeup(void)
Wake the BLE core via an external request.
pwr_mgmt_register_trace_func
void pwr_mgmt_register_trace_func(trace_func_t status_trace_func, trace_func_t sched_trace_func)
Trace function register.
EVENT_APP_TIMER_START
@ EVENT_APP_TIMER_START
Definition: gr55xx_pwr.h:111
pwr_before_sleep_func_t
void(* pwr_before_sleep_func_t)(void)
Before sleep function type.
Definition: gr55xx_pwr.h:154
pwr_mgmt_disable_nvic_irq
void pwr_mgmt_disable_nvic_irq(void)
Disable nvic irq.
pwr_table_t::pwr_timer_ths
uint32_t pwr_timer_ths
Definition: gr55xx_pwr.h:143
TRC_PWR_RTC_TIMER_PASS
@ TRC_PWR_RTC_TIMER_PASS
Definition: gr55xx_pwr.h:127
pwr_mgmt_check_pend_irq
bool pwr_mgmt_check_pend_irq(void)
Check nvic irq.
TRC_PWR_RTC1_TIMER_REFUSE
@ TRC_PWR_RTC1_TIMER_REFUSE
Definition: gr55xx_pwr.h:128
pwr_mgmt_schedule
void pwr_mgmt_schedule(void)
Sleep Policy Scheduling Function. Note that this function is only available in environments where non...
TRC_PWR_BLE_TIMER_REFUSE
@ TRC_PWR_BLE_TIMER_REFUSE
Definition: gr55xx_pwr.h:124
pwr_mgmt_var_box_t::pwr_mgmt_ble_core_thrd
uint32_t pwr_mgmt_ble_core_thrd
Definition: gr55xx_pwr.h:81
pwr_table_t::pwr_push_hus
uint16_t pwr_push_hus
Definition: gr55xx_pwr.h:142
mem_check_proc_t
void(* mem_check_proc_t)(void)
mem check process type.
Definition: gr55xx_pwr.h:160
pwr_mgmt_save_context
void pwr_mgmt_save_context(void)
Save context function.
DEVICE_IDLE
@ DEVICE_IDLE
Definition: gr55xx_pwr.h:105
pwr_mgmt_var_box_t::pwr_mgmt_app_timer_thrd
uint32_t pwr_mgmt_app_timer_thrd
Definition: gr55xx_pwr.h:80
PMR_MGMT_ACTIVE_MODE
@ PMR_MGMT_ACTIVE_MODE
Definition: gr55xx_pwr.h:96
COLD_BOOT
@ COLD_BOOT
Definition: gr55xx_pwr.h:89
TRC_PWR_BLE_TIMER_PASS
@ TRC_PWR_BLE_TIMER_PASS
Definition: gr55xx_pwr.h:125
pwr_mgmt_wfe_sleep
void pwr_mgmt_wfe_sleep(void)
Execution of this function allows ARM to enter the WFE state and exit the WFE state when an event or ...
pwr_mgmt_dev_state_t
pwr_mgmt_dev_state_t
power manager device work state.
Definition: gr55xx_pwr.h:103
trace_func_t
void(* trace_func_t)(uint8_t)
Trace function type.
Definition: gr55xx_pwr.h:148
TRC_PWR_ACTIVE_MODE
@ TRC_PWR_ACTIVE_MODE
Definition: gr55xx_pwr.h:120
pwr_mgmt_get_wakeup_flag
boot_mode_t pwr_mgmt_get_wakeup_flag(void)
Get the current boot mode.
pwr_mgmt_enable_nvic_irq
void pwr_mgmt_enable_nvic_irq(void)
Enable nvic irq.
pwr_table_t::pwr_dur
uint16_t pwr_dur
Definition: gr55xx_pwr.h:137
PMR_MGMT_SLEEP_MODE
@ PMR_MGMT_SLEEP_MODE
Definition: gr55xx_pwr.h:98
pwr_mgmt_shutdown
pwr_mgmt_mode_t pwr_mgmt_shutdown(void)
This function allows ARM to enter deep sleep mode, but users should not use this function directly....
pwr_mgmt_set_callback
void pwr_mgmt_set_callback(pwr_dev_check_func_t dev_check_fun, pwr_before_sleep_func_t before_sleep_fun)
Set PMU callback function.
pwr_mgmt_register_srpg_before_func
void pwr_mgmt_register_srpg_before_func(srpg_before_func_t srpg_before_fun)
Register callback function before srpg sleep.
EVENT_APP_TIMER_STOP
@ EVENT_APP_TIMER_STOP
Definition: gr55xx_pwr.h:112
pwr_mgmt_set_wakeup_flag
void pwr_mgmt_set_wakeup_flag(boot_mode_t boot_mode)
Mark the mode of next boot, cold boot or warm boot.
TRC_PWR_APP_TIMER_PASS
@ TRC_PWR_APP_TIMER_PASS
Definition: gr55xx_pwr.h:123
pwr_mgmt_dev_suspend
pwr_mgmt_dev_state_t pwr_mgmt_dev_suspend(void)
Device config suspend interface.
PMR_MGMT_IDLE_MODE
@ PMR_MGMT_IDLE_MODE
Definition: gr55xx_pwr.h:97