4 UI_TimerControl *timerctrl;
\r
6 UI_TimerControl *Initialize_ProgrammableIntervalTimer(void)
\r
8 timerctrl = (UI_TimerControl *)System_Memory_Allocate(sizeof(UI_TimerControl));
\r
10 timerctrl->tick_10ms = 0;
\r
11 timerctrl->TaskSwitch = &Timer_TaskSwitch_Invalid;
\r
14 timerctrl->timer_root = Timer_Initialize();
\r
15 Timer_Config(timerctrl->timer_root, 0xfffffff, Null, 0, True);
\r
16 timerctrl->timer_root->timeout = 0xffffffff;
\r
17 timerctrl->timer_root->flags.bit.running = True;
\r
20 IO_Out8(PIT_CTRL, 0x34);
\r
21 IO_Out8(PIT_CNT0, 0x9c);
\r
22 IO_Out8(PIT_CNT0, 0x2e);
\r
23 System_GateDescriptor_Set(0x20, (uint)asm_InterruptHandler20, 0x02, AR_INTGATE32);
\r
24 ProgrammableInterruptController_InterruptMask_Clear(0x00);
\r
29 void InterruptHandler20(uint *esp)
\r
31 ProgrammableInterruptController_InterruptRequest_Complete(0x00);
\r
32 timerctrl->tick_10ms++;
\r
34 if(timerctrl->timer_root->timeout <= timerctrl->tick_10ms){
\r
38 if((timerctrl->tick_10ms & 0x00000003) == 0){
\r
39 timerctrl->TaskSwitch();
\r
45 void Timer_Set_TaskSwitch(void (*TaskSwitchFunction)(void))
\r
47 if(TaskSwitchFunction != Null){
\r
48 timerctrl->TaskSwitch = TaskSwitchFunction;
\r
50 timerctrl->TaskSwitch = Timer_TaskSwitch_Invalid;
\r
55 void Timer_TaskSwitch_Invalid(void)
\r
60 UI_Timer *Timer_Initialize(void)
\r
64 timer = System_Memory_Allocate(sizeof(UI_Timer));
\r
66 timer->flags.bit.initialized = True;
\r
68 #ifdef CHNOSPROJECT_DEBUG_TIMER
\r
69 debug("Timer_Initialize:[0x%08X]\n", timer);
\r
75 uint Timer_Config(UI_Timer *timer, uint tick_ms, DATA_FIFO32 *fifo, uint fifo_putdata, bool interval)
\r
81 if(!timer->flags.bit.initialized){
\r
85 timer->tick = tick_ms / 10;
\r
87 timer->fifo_putdata = fifo_putdata;
\r
88 timer->flags.bit.interval = interval;
\r
90 timer->flags.bit.configured = True;
\r
95 uint Timer_Run(UI_Timer *timer)
\r
104 if(!timer->flags.bit.configured){
\r
108 if(timer->flags.bit.running){
\r
112 timer->timeout = timer->tick + timerctrl->tick_10ms;
\r
113 search = &timerctrl->timer_root;
\r
115 eflags = IO_Load_EFlags();
\r
118 if((*search) == Null){
\r
119 #ifdef CHNOSPROJECT_DEBUG_TIMER
\r
120 debug("Timer_Run:Invalid link. Abort.\n");
\r
124 if((*search)->timeout > timer->timeout){
\r
126 timer->root_next = *search;
\r
128 timer->tree_next = Null;
\r
129 timer->flags.bit.running = True;
\r
132 if((*search)->timeout == timer->timeout){
\r
134 search = &(*search)->tree_next;
\r
136 if(*search == Null){
\r
139 search = &(*search)->tree_next;
\r
141 timer->root_next = Null;
\r
143 timer->tree_next = Null;
\r
144 timer->flags.bit.running = True;
\r
147 search = &(*search)->root_next;
\r
150 IO_Store_EFlags(eflags);
\r
155 uint Timer_TimeOut(void)
\r
157 UI_Timer *search, *old;
\r
159 search = timerctrl->timer_root;
\r
160 timerctrl->timer_root = timerctrl->timer_root->root_next;
\r
163 if(search->fifo != Null){
\r
164 FIFO32_Put(search->fifo, search->fifo_putdata);
\r
167 search = old->tree_next;
\r
168 old->tree_next = 0;
\r
169 old->flags.bit.running = False;
\r
170 if(old->flags.bit.interval){
\r
173 if(search == Null){
\r
180 uint Timer_GetTick(void)
\r
182 return timerctrl->tick_10ms;
\r