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