mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-28 10:45:22 +00:00
Add per-second hook
PWM and temp sensor monitoring want to happen every second, vs. several times a second for watchdog and LPC. This is still considerably simpler than having tick functions declare an interval at which they want to be called, which would require a RAM-based array of pending tick functions and alarm times. If you need that level of complexity, you still need a task. BUG=chrome-os-partner:15714 BRANCH=none TEST=temporarily add HOOK_TICK and HOOK_SECOND hooks and see that on LM4, HOOK_TICK is called 4x a second and HOOK_SECOND is called every second. Change-Id: I5c09842fd356d3254021486949b2799142068b4f Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/36938 Commit-Ready: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -31,6 +31,7 @@ static const struct hook_ptrs hook_list[] = {
|
||||
{__hooks_ac_change, __hooks_ac_change_end},
|
||||
{__hooks_lid_change, __hooks_lid_change_end},
|
||||
{__hooks_tick, __hooks_tick_end},
|
||||
{__hooks_second, __hooks_second_end},
|
||||
};
|
||||
|
||||
void hook_notify(enum hook_type type)
|
||||
@@ -64,11 +65,19 @@ void hook_notify(enum hook_type type)
|
||||
|
||||
void hook_task(void)
|
||||
{
|
||||
/* Per-second hook will be called first time through the loop */
|
||||
static uint64_t last_second = -SECOND;
|
||||
|
||||
while (1) {
|
||||
uint64_t t = get_time().val;
|
||||
|
||||
hook_notify(HOOK_TICK);
|
||||
|
||||
if (t - last_second >= SECOND) {
|
||||
hook_notify(HOOK_SECOND);
|
||||
last_second = t;
|
||||
}
|
||||
|
||||
/* Use up the rest of our hook tick interval */
|
||||
t = get_time().val - t;
|
||||
if (t < HOOK_TICK_INTERVAL)
|
||||
|
||||
@@ -100,6 +100,10 @@ SECTIONS
|
||||
*(.rodata.HOOK_TICK)
|
||||
__hooks_tick_end = .;
|
||||
|
||||
__hooks_second = .;
|
||||
*(.rodata.HOOK_SECOND)
|
||||
__hooks_second_end = .;
|
||||
|
||||
. = ALIGN(4);
|
||||
*(.rodata*)
|
||||
|
||||
|
||||
@@ -40,6 +40,8 @@ extern const struct hook_data __hooks_lid_change[];
|
||||
extern const struct hook_data __hooks_lid_change_end[];
|
||||
extern const struct hook_data __hooks_tick[];
|
||||
extern const struct hook_data __hooks_tick_end[];
|
||||
extern const struct hook_data __hooks_second[];
|
||||
extern const struct hook_data __hooks_second_end[];
|
||||
|
||||
/* Host commands */
|
||||
extern const struct host_command __hcmds[];
|
||||
|
||||
@@ -48,6 +48,7 @@ enum hook_type {
|
||||
HOOK_LID_CHANGE, /* Lid opened or closed. Based on debounced lid
|
||||
* state, not raw lid GPIO input. */
|
||||
HOOK_TICK, /* Periodic tick, every HOOK_TICK_INTERVAL */
|
||||
HOOK_SECOND, /* Periodic tick, every second */
|
||||
};
|
||||
|
||||
struct hook_data {
|
||||
|
||||
Reference in New Issue
Block a user