1 #ifndef SCHEDULE_H
2 #define SCHEDULE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include <stdint.h>
9 #include <stdbool.h>
10 #include <stdio.h>
11 
12 enum clock_id { CLOCK_CPU, CLOCK_RUN, CLOCK_48M, CLOCK_24M, CLOCK_12M, CLOCK_6M, CLOCK_32K,
13                 CLOCK_1, CLOCK_NUM_ITEMS };
14 
15 enum sched_item_id {
16     SCHED_SECOND,
17 
18     SCHED_RUN,
19     SCHED_WATCHDOG,
20     SCHED_TIMER_DELAY, /* Must be before TIMER# */
21     SCHED_TIMER1,
22     SCHED_TIMER2,
23     SCHED_TIMER3,
24     SCHED_OSTIMER,
25     SCHED_KEYPAD,
26     SCHED_LCD,
27     SCHED_RTC,
28     SCHED_USB,
29 
30     SCHED_FIRST_EVENT = SCHED_RUN,
31     SCHED_LAST_EVENT = SCHED_USB,
32 
33     SCHED_PREV_MA,
34 
35     SCHED_LCD_DMA,
36     SCHED_USB_DMA,
37 
38     SCHED_FIRST_DMA = SCHED_LCD_DMA,
39     SCHED_LAST_DMA = SCHED_USB_DMA,
40 
41     SCHED_NUM_ITEMS
42 };
43 
44 struct sched_item {
45     enum clock_id clock;
46     int32_t second; /* <0 if disabled */
47     uint32_t tick;
48     uint32_t cycle;
49     union sched_callback {
50         void (*event)(enum sched_item_id id);
51         uint32_t (*dma)(enum sched_item_id id);
52     } callback;
53 };
54 
55 typedef struct sched_state {
56     struct sched_item items[SCHED_NUM_ITEMS];
57     uint32_t clockRates[CLOCK_NUM_ITEMS];
58     struct sched_event {
59         enum sched_item_id next;
60         uint32_t cycle;
61     } event;
62     struct sched_dma {
63         enum sched_item_id next;
64     } dma;
65     bool run_event_triggered;
66 } sched_state_t;
67 
68 extern sched_state_t sched;
69 
70 void sched_reset(void);
71 void sched_run_event(enum sched_item_id id);
72 uint32_t sched_event_next_cycle(void);
73 uint32_t sched_dma_next_cycle(void);
74 void sched_process_pending_events(void);
75 void sched_process_pending_dma(uint8_t duration);
76 void sched_clear(enum sched_item_id id);
77 void sched_set(enum sched_item_id id, uint64_t ticks);
78 void sched_repeat(enum sched_item_id id, uint64_t ticks);
79 void sched_repeat_relative(enum sched_item_id id, enum sched_item_id base, uint32_t offset, uint64_t ticks);
80 bool sched_active(enum sched_item_id id);
81 uint64_t sched_cycle(enum sched_item_id id);
82 uint64_t sched_cycles_remaining(enum sched_item_id id);
83 uint64_t sched_tick(enum sched_item_id id);
84 uint64_t sched_ticks_remaining(enum sched_item_id id);
85 void sched_set_clock(enum clock_id clock, uint32_t new_rate);
86 uint32_t sched_get_clock_rate(enum clock_id clock);
87 uint64_t sched_total_cycles(void);
88 uint64_t sched_total_time(enum clock_id clock);
89 uint64_t event_next_cycle(enum sched_item_id id);
90 bool sched_restore(FILE *image);
91 bool sched_save(FILE *image);
92 
93 #ifdef __cplusplus
94 }
95 #endif
96 
97 #endif
98