diff options
author | Vincent Palatin <vpalatin@chromium.org> | 2011-12-07 18:58:43 +0000 |
---|---|---|
committer | Vincent Palatin <vpalatin@chromium.org> | 2011-12-07 19:10:02 +0000 |
commit | e24fa592d2a215d8ae67917c1d89e68cdf847a03 (patch) | |
tree | 47fbe4c55e7f4089cad7d619eded337da3bae999 /include | |
parent | 6396911897e4cd40f52636d710cee2865acf15e3 (diff) | |
download | chrome-ec-e24fa592d2a215d8ae67917c1d89e68cdf847a03.tar.gz |
Initial sources import 3/3
source files mainly done by Vincent.
Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
Change-Id: Ic2d1becd400c9b4b4a14d4a243af1bdf77d9c1e2
Diffstat (limited to 'include')
-rw-r--r-- | include/clock.h | 14 | ||||
-rw-r--r-- | include/task.h | 95 | ||||
-rw-r--r-- | include/task_id.h | 41 | ||||
-rw-r--r-- | include/timer.h | 60 | ||||
-rw-r--r-- | include/util.h | 54 |
5 files changed, 264 insertions, 0 deletions
diff --git a/include/clock.h b/include/clock.h new file mode 100644 index 0000000000..c4008672ef --- /dev/null +++ b/include/clock.h @@ -0,0 +1,14 @@ +/* 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. + */ + +/* Clocks and power management settings */ + +#ifndef __CLOCK_H +#define __CLOCK_H + +/* set the CPU clocks and PLLs */ +int clock_init(void); + +#endif /* __CLOCK_H */ diff --git a/include/task.h b/include/task.h new file mode 100644 index 0000000000..35bbc46943 --- /dev/null +++ b/include/task.h @@ -0,0 +1,95 @@ +/* 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. + */ + +/* Task scheduling / events module for Chrome EC operating system */ + +#ifndef __EC_TASK_H +#define __EC_TASK_H + +#include "common.h" +#include "task_id.h" + +/** + * Return true if we are in interrupt context + */ +inline int in_interrupt_context(void); + +/** + * Send a message to a task and wake it up if it is higher priority than us + * + * tskid : identifier of the receiver task + * from : identifier of the sender of the message + * wait : after sending, de-schedule the calling task to wait for the answer + * + * returns the bitmap of events which have occured. + * + * Can be called both in interrupt context and task context. + */ +uint32_t task_send_msg(task_id_t tskid, task_id_t from, int wait); + +/** + * Return the identifier of the task currently running + * + * when called in interrupt context, returns TASK_ID_INVALID + */ +task_id_t task_get_current(void); + +/** + * Return a pointer to the bitmap of received events of the task. + */ +uint32_t *task_get_event_bitmap(task_id_t tsk); + +/** + * Wait for the incoming next message. + * + * if an event is already pending, it returns it immediatly, else it + * de-schedules the calling task and wake up the next one in the priority order + * + * if timeout_us > 0, it also sets a timer to produce an event after the + * specified micro-second duration. + * + * returns the bitmap of received events (and clear it atomically). + */ +uint32_t task_wait_msg(int timeout_us); + +/** + * Change the task scheduled after returning from the exception. + * + * If task_send_msg has been called and has set need_resched flag, + * we re-compute which task is running and eventually swap the context + * saved on the process stack to restore the new one at exception exit. + * + * it must be called from interrupt context ! + * and it is designed to be the last call of the interrupt handler. + */ +void task_resched_if_needed(void *excep_return); + +/* Initialize tasks and interrupt controller */ +int task_init(void); + +/* Start the task scheduling */ +int task_start(void); + +struct irq_priority { + uint8_t irq; + uint8_t priority; +}; + +/** + * Connect the interrupt handler "routine" to the irq number "irq" and + * ensure it is enabled in the interrupt controller with the right priority + */ +#define DECLARE_IRQ(irq, routine, priority) \ + void irq_##irq##_handler(void) \ + { \ + void *ret = __builtin_return_address(0); \ + routine(); \ + task_resched_if_needed(ret); \ + } \ + const struct irq_priority prio_##irq \ + __attribute__((section(".rodata.irqprio"))) \ + = {irq, priority} + +#endif /* __EC_TASK_H */ diff --git a/include/task_id.h b/include/task_id.h new file mode 100644 index 0000000000..8b6e14721f --- /dev/null +++ b/include/task_id.h @@ -0,0 +1,41 @@ +/* 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. + */ + +/* define the task identifier of all compiled tasks */ + +#ifndef __TASK_ID_H +#define __TASK_ID_H + +/* define the name of the header containing the list of tasks */ +#define STRINGIFY0(name) #name +#define STRINGIFY(name) STRINGIFY0(name) +#define TASK_LIST STRINGIFY(TASKFILE) + +/* Task identifier (8 bits) */ +typedef uint8_t task_id_t; + +/** + * enumerate all tasks in the priority order + * + * the identifier of a task can be retrieved using the following constant: + * TASK_ID_<taskname> where <taskname> is the first parameter passed to the + * TASK macro in the TASK_LIST file. + */ +#define TASK(n, r, d) TASK_ID_##n, +#include TASK_LIST +enum { + TASK_ID_IDLE, + /* CONFIG_TASK_LIST is a macro coming from the TASK_LIST file */ + CONFIG_TASK_LIST + /* Number of tasks */ + TASK_ID_COUNT, + /* Special task identifiers */ + TASK_ID_TIMER = 0x1f, /* message from an expired timer */ + TASK_ID_CURRENT = 0xfe, /* the currently running task */ + TASK_ID_INVALID = 0xff /* unable to find the task */ +}; +#undef TASK + +#endif /* __TASK_ID_H */ diff --git a/include/timer.h b/include/timer.h new file mode 100644 index 0000000000..b73ac292bb --- /dev/null +++ b/include/timer.h @@ -0,0 +1,60 @@ +/* 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. + */ + +/* Timer module for Chrome EC operating system */ + +#ifndef __EC_TIMER_H +#define __EC_TIMER_H + +#include "common.h" +#include "task_id.h" + +/* Micro-second timestamp. */ +typedef union { + uint64_t val; + struct { + uint32_t lo; + uint32_t hi; + } le /* little endian words */; +} timestamp_t; + +/* Initializes the Timer module. */ +int timer_init(void); + +/** + * Launches a one-shot timer. + * + * tstamp : timestamp in micro-seconds when the timer expires + * tskid : identifier of the task owning the timer + */ +int timer_arm(timestamp_t tstamp, task_id_t tskid); + +/** + * Cancels a running timer. + * + * tskid : identifier of the task owning the timer + */ +int timer_cancel(task_id_t tskid); + +/** + * Busy wait the selected number of micro-seconds + */ +void udelay(unsigned us); + +/** + * Sleep during the selected number of micro-seconds + * + * The current task will be de-scheduled until the delay expired + * + * Note: if an event happens before the end of sleep, the function will return. + */ +void usleep(unsigned us); + +/** + * Get the current timestamp from the system timer + */ +timestamp_t get_time(void); + +#endif /* __EC_TIMER_H */ diff --git a/include/util.h b/include/util.h new file mode 100644 index 0000000000..5930ff79aa --- /dev/null +++ b/include/util.h @@ -0,0 +1,54 @@ +/* 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. + */ + +/* Various utility functions and macros */ + +#ifndef __UTIL_H +#define __UTIL_H + +#include <stdint.h> + +#include "config.h" + +/** + * Trigger a compilation failure if the condition + * is not verified at build time. + */ +#define BUILD_ASSERT(cond) ((void)sizeof(char[1 - 2*!(cond)])) + +/** + * Trigger a debug exception if the condition + * is not verified at runtime. + */ +#ifdef CONFIG_DEBUG +#define ASSERT(cond) do { \ + if (!(cond)) \ + __asm("bkpt"); \ + } while (0); +#else +#define ASSERT(cond) +#endif + + +/* Standard macros / definitions */ +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define NULL ((void *)0) + + +/* Standard library functions */ +int atoi(const char *nptr); +int isdigit(int c); +int isspace(int c); +void *memcpy(void *dest, const void *src, int len); +void *memset(void *dest, int c, int len); +int strcasecmp(const char *s1, const char *s2); +int strlen(const char *s); +int strtoi(const char *nptr, char **endptr, int base); +char *strzcpy(char *dest, const char *src, int len); +int tolower(int c); + +#endif /* __UTIL_H */ |