root / lab3 / timer.c @ 10
History | View | Annotate | Download (3.18 KB)
1 | 4 | up20180614 | #include <lcom/lcf.h> |
---|---|---|---|
2 | #include <lcom/timer.h> |
||
3 | |||
4 | #include <stdint.h> |
||
5 | |||
6 | #include "i8254.h" |
||
7 | |||
8 | uint32_t cont=0;
|
||
9 | int hook_id;
|
||
10 | |||
11 | |||
12 | int (timer_set_frequency)(uint8_t timer, uint32_t freq) {
|
||
13 | /* To be implemented by the students */
|
||
14 | uint8_t conf; |
||
15 | timer_get_conf(timer,&conf); |
||
16 | uint32_t tudo; |
||
17 | uint8_t msb,lsb; |
||
18 | tudo=(TIMER_FREQ/freq); |
||
19 | util_get_MSB(tudo,&msb); |
||
20 | util_get_LSB(tudo,&lsb); |
||
21 | |||
22 | //printf("%x\n%x\n%x\n%d\n",tudo,msb,lsb,timer);
|
||
23 | |||
24 | |||
25 | if(timer==0) |
||
26 | { |
||
27 | conf=(conf&0xF);
|
||
28 | conf = (conf | TIMER_SEL0 | TIMER_LSB_MSB); |
||
29 | if(sys_outb(TIMER_CTRL, conf)!=0) return 1; |
||
30 | if(sys_outb(TIMER_0, lsb)!=0) return 1; |
||
31 | if(sys_outb(TIMER_0, msb)!=0) return 1; |
||
32 | } |
||
33 | |||
34 | if(timer==1) |
||
35 | { |
||
36 | conf=(conf&0xF);
|
||
37 | conf = (conf | TIMER_SEL1 | TIMER_LSB_MSB); |
||
38 | if(sys_outb(TIMER_CTRL, conf)!=0) return 1; |
||
39 | if(sys_outb(TIMER_1, lsb)!=0) return 1; |
||
40 | if(sys_outb(TIMER_1, msb)!=0) return 1; |
||
41 | } |
||
42 | |||
43 | if(timer==2) |
||
44 | { |
||
45 | conf=(conf&0xF);
|
||
46 | conf = (conf | TIMER_SEL2 | TIMER_LSB_MSB); |
||
47 | if(sys_outb(TIMER_CTRL, conf)!=0) return 1; |
||
48 | if(sys_outb(TIMER_2, lsb)!=0) return 1; |
||
49 | if(sys_outb(TIMER_2, msb)!=0) return 1; |
||
50 | } |
||
51 | return 0; |
||
52 | |||
53 | } |
||
54 | |||
55 | int (timer_subscribe_int)(uint8_t *bit_no) {
|
||
56 | /* To be implemented by the students */
|
||
57 | //printf("%s is not yet implemented!\n", __func__);
|
||
58 | /* int policy;
|
||
59 | sys_irqrmpolicy(&policy); */
|
||
60 | hook_id=*bit_no; |
||
61 | 8 | up20180614 | sys_irqsetpolicy(IRQ_TIMER,IRQ_REENABLE,&hook_id); |
62 | 4 | up20180614 | |
63 | 8 | up20180614 | return 1; |
64 | 4 | up20180614 | } |
65 | |||
66 | int (timer_unsubscribe_int)() {
|
||
67 | /* To be implemented by the students */
|
||
68 | // printf("%s is not yet implemented!\n", __func__);
|
||
69 | |||
70 | 8 | up20180614 | sys_irqrmpolicy(&hook_id); |
71 | 4 | up20180614 | |
72 | 8 | up20180614 | return 1; |
73 | 4 | up20180614 | } |
74 | |||
75 | void (timer_int_handler)() {
|
||
76 | /* To be implemented by the students */
|
||
77 | //printf("%s is not yet implemented!\n", __func__);
|
||
78 | cont=cont+1;
|
||
79 | } |
||
80 | |||
81 | int (timer_get_conf)(uint8_t timer, uint8_t *st) {
|
||
82 | /* To be implemented by the students */
|
||
83 | |||
84 | uint8_t rbc = (TIMER_RB_CMD|TIMER_RB_SEL(4)|TIMER_RB_SEL(timer));
|
||
85 | if(sys_outb(TIMER_CTRL,rbc)!=0) return 1; |
||
86 | |||
87 | |||
88 | if(timer==0) |
||
89 | return (util_sys_inb(TIMER_0,st));
|
||
90 | if(timer==1) |
||
91 | return (util_sys_inb(TIMER_1,st));
|
||
92 | if(timer==2) |
||
93 | return (util_sys_inb(TIMER_2,st));
|
||
94 | |||
95 | return 1; |
||
96 | |||
97 | //printf("%s is not yet implemented!\n", __func__);
|
||
98 | |||
99 | |||
100 | } |
||
101 | |||
102 | int (timer_display_conf)(uint8_t timer, uint8_t st,
|
||
103 | enum timer_status_field field) {
|
||
104 | /* To be implemented by the students */
|
||
105 | union timer_status_field_val val;
|
||
106 | |||
107 | |||
108 | if(field==tsf_all)
|
||
109 | { |
||
110 | val.byte=st; |
||
111 | |||
112 | } |
||
113 | if(field==tsf_initial)
|
||
114 | { |
||
115 | //printf("%d\n",tsf_initial);
|
||
116 | |||
117 | if(((st&0x30)>>4)==0) |
||
118 | val.in_mode=INVAL_val; |
||
119 | |||
120 | if(((st&0x30)>>4)==1) |
||
121 | val.in_mode=LSB_only; |
||
122 | |||
123 | if(((st&0x30)>>4)==2) |
||
124 | val.in_mode=MSB_only; |
||
125 | |||
126 | if(((st&0x30)>>4)==3) |
||
127 | val.in_mode=MSB_after_LSB; |
||
128 | } |
||
129 | |||
130 | |||
131 | if(field==tsf_mode)
|
||
132 | { |
||
133 | //printf("%x\n",st);
|
||
134 | val.count_mode=((st&0xE)>>1); |
||
135 | |||
136 | /* printf("%x\n",val.count_mode);
|
||
137 | val.count_mode=(val.count_mode>>1);
|
||
138 | printf("%x\n",val.count_mode); */
|
||
139 | //val.count_mode=(st&0x1C)/4;
|
||
140 | |||
141 | if (val.count_mode==6) |
||
142 | val.count_mode=2;
|
||
143 | |||
144 | if (val.count_mode==7) |
||
145 | val.count_mode=3;
|
||
146 | |||
147 | |||
148 | } |
||
149 | |||
150 | if(field==tsf_base ) //BCD |
||
151 | { |
||
152 | //printf("%d\n",tsf_base);
|
||
153 | if((st&BIT(0))==1) |
||
154 | val.bcd=true;
|
||
155 | |||
156 | else val.bcd=false; |
||
157 | } |
||
158 | |||
159 | |||
160 | return( timer_print_config(timer, field, val));
|
||
161 | //printf("%s is not yet implemented!\n", __func__);
|
||
162 | |||
163 | //return 0;
|
||
164 | } |