diff options
author | Randall Spangler <rspangler@chromium.org> | 2012-10-30 13:01:55 -0700 |
---|---|---|
committer | Gerrit <chrome-bot@google.com> | 2012-10-30 15:33:25 -0700 |
commit | 433f98c6b67e23641f9808e6ca6effc4285dd42e (patch) | |
tree | 2852e69a904cba0ffbe1ca541d721169a054f653 | |
parent | 8b3a242ff0b8398b37378c67fe2c63beec1fa827 (diff) | |
download | chrome-ec-433f98c6b67e23641f9808e6ca6effc4285dd42e.tar.gz |
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>
-rw-r--r-- | common/hooks.c | 9 | ||||
-rw-r--r-- | core/cortex-m/ec.lds.S | 4 | ||||
-rw-r--r-- | core/cortex-m/link_defs.h | 2 | ||||
-rw-r--r-- | include/hooks.h | 1 |
4 files changed, 16 insertions, 0 deletions
diff --git a/common/hooks.c b/common/hooks.c index 385f0e0478..a17cf1ade1 100644 --- a/common/hooks.c +++ b/common/hooks.c @@ -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) diff --git a/core/cortex-m/ec.lds.S b/core/cortex-m/ec.lds.S index 7097ced5a5..29e63bf4a6 100644 --- a/core/cortex-m/ec.lds.S +++ b/core/cortex-m/ec.lds.S @@ -100,6 +100,10 @@ SECTIONS *(.rodata.HOOK_TICK) __hooks_tick_end = .; + __hooks_second = .; + *(.rodata.HOOK_SECOND) + __hooks_second_end = .; + . = ALIGN(4); *(.rodata*) diff --git a/core/cortex-m/link_defs.h b/core/cortex-m/link_defs.h index 44332c74bc..2b5a4a4d77 100644 --- a/core/cortex-m/link_defs.h +++ b/core/cortex-m/link_defs.h @@ -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[]; diff --git a/include/hooks.h b/include/hooks.h index 2c691fb639..6e6c1c8e3c 100644 --- a/include/hooks.h +++ b/include/hooks.h @@ -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 { |