OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / timer.c
1 \r
2 #include "core.h"\r
3 \r
4 void inthandler20(int *esp)\r
5 {\r
6         UI_Timer *timer;\r
7         char ts = 0;\r
8 \r
9         system.ui.timer.ctrl.count++;\r
10         io_out8(PIC0_OCW2, 0x60);       /* IRQ-00\8eó\95t\8a®\97¹\82ðPIC\82É\92Ê\92\81B0x60+\94Ô\8d\86\81B*/\r
11         if(system.ui.timer.ctrl.next_count > system.ui.timer.ctrl.count) return;\r
12         timer = system.ui.timer.ctrl.timers;\r
13         for(;;){\r
14                 if(timer->timeout > system.ui.timer.ctrl.count) break;\r
15                 timer->flags = allocated;\r
16                 if(timer != system.ui.timer.taskswitch){\r
17                         fifo32_put(timer->fifo, timer->data);\r
18                 } else {\r
19                         ts = 1;\r
20                 }\r
21                 timer = timer->next_timer;\r
22         }\r
23         system.ui.timer.ctrl.timers = timer;\r
24         system.ui.timer.ctrl.next_count = timer->timeout;\r
25         if(ts != 0) task_switch();\r
26         return;\r
27 }\r
28 \r
29 void init_pit(void)\r
30 {\r
31         int i;\r
32         UI_Timer *watch;\r
33         for(i = 0; i < MAX_TIMER; i++) {\r
34                 system.ui.timer.ctrl.timer[i].flags = initialized;\r
35         }\r
36         watch = timer_alloc();\r
37         watch->timeout = 0xffffffff;\r
38         watch->flags = inuse;\r
39         watch->next_timer = 0;\r
40         system.ui.timer.ctrl.timers = watch;\r
41         system.ui.timer.ctrl.next_count = 0xffffffff;\r
42         io_out8(PIT_CTRL, 0x34);\r
43         io_out8(PIT_CNT0, 0x9c);\r
44         io_out8(PIT_CNT0, 0x2e);\r
45         set_gatedesc(system.io.interrupt.idt + 0x20, (int) asm_inthandler20, 2 * 8, AR_INTGATE32);\r
46         io_out8(PIC0_IMR, io_in8(PIC0_IMR) & 0xfe);\r
47         system.ui.timer.ctrl.count = 0;\r
48         return;\r
49 }\r
50 \r
51 UI_Timer *timer_alloc(void)\r
52 {\r
53         int i;\r
54         for(i = 0; i < MAX_TIMER; i++){\r
55                 if(system.ui.timer.ctrl.timer[i].flags == initialized){\r
56                         system.ui.timer.ctrl.timer[i].flags = allocated;\r
57                         return &system.ui.timer.ctrl.timer[i];\r
58                 }\r
59         }\r
60         return 0;\r
61 }\r
62 \r
63 void timer_free(UI_Timer *timer)\r
64 {\r
65         timer->flags = initialized;\r
66         return;\r
67 }\r
68 \r
69 void timer_init(UI_Timer *timer, DATA_FIFO *fifo, uint data)\r
70 {\r
71         timer->fifo = fifo;\r
72         timer->data = data;\r
73         return;\r
74 }\r
75 \r
76 void timer_settime(UI_Timer *timer, uint timeout)\r
77 {\r
78         int ef;\r
79         UI_Timer *t, *s;\r
80 \r
81         timer->timeout = timeout + system.ui.timer.ctrl.count;\r
82         timer->flags = inuse;\r
83         ef = io_load_eflags();\r
84         io_cli();\r
85         t = system.ui.timer.ctrl.timers;\r
86         if(timer->timeout <= t->timeout){\r
87                 system.ui.timer.ctrl.timers = timer;\r
88                 timer->next_timer = t;\r
89                 system.ui.timer.ctrl.next_count = timer->timeout;\r
90                 io_store_eflags(ef);\r
91                 return;\r
92         }\r
93         for(;;){\r
94                 s = t;\r
95                 t = t->next_timer;\r
96                 if(timer->timeout <= t->timeout){\r
97                         s->next_timer = timer;\r
98                         timer->next_timer = t;\r
99                         io_store_eflags(ef);\r
100                         return;                         \r
101                 }\r
102         }\r
103 }\r
104 \r
105 void timer_settime_millisec(UI_Timer *timer, uint timeout_ms)\r
106 {\r
107         timer_settime(timer, timeout_ms / 10);\r
108         return;\r
109 }\r
110 \r
111 \r
112 \r
113 \r
114 \r
115 \r
116 \r