KM3NeT CLB  2.0
KM3NeT CLB v2 Embedded Software
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
xadc.c
1 /*
2  * KM3NeT CLB v2 Firmware
3  * ----------------------
4  *
5  * Copyright 2014 KM3NeT Collaboration
6  *
7  * All Rights Reserved.
8  *
9  *
10  * File : xadc.c
11  * Created : 15 apr 2014
12  * Author : Riccardo Travaglini
13  */
14 
15 
16 #include "drv/wb/xadc.h"
17 #include <kernel/err.h>
18 #include <errorcode.h>
19 #include <stdio.h>
20 
21 #define UNJ(X) ((X>>4)&0xFFF)
22 
23 static const uint8_t chTyLut[] = {
24  0x00, // ch_temp
25  0x01, // ch_temp_max
26  0x02, // ch_temp_min
27  0x00, // unused
28  0x10, // ch_vcc_int
29 };
30 
31 static uint16_t _xadcGetMeas(XadcChan ch, XadcType ty)
32 {
33  unsigned int lu = (ch << 2) | ty;
34  switch(ch){
35  case xadcChanTemp:
36  switch(ty){
37  case xadcTypeMax:
38  return (XADC->MAXTEMP);
39  case xadcTypeMin:
40  return (XADC->MINTEMP);
41  default:
42  return (XADC->TEMP);
43  }
44  /* no break */
45 
46  case xadcChanVccInt:
47  switch(ty){
48  case xadcTypeMax:
49  return (XADC->MAXVCCINT);
50  case xadcTypeMin:
51  return (XADC->MINVCCINT);
52  default:
53  return (XADC->VCCINT);
54  }
55  /* no break */
56 
57  case xadcChanVccAux:
58  switch(ty){
59  case xadcTypeMax:
60  return (XADC->MAXVCCAUX);
61  case xadcTypeMin:
62  return (XADC->MINVCCAUX);
63  default:
64  return (XADC->VCCAUX);
65  }
66  /* no break */
67 
68  case xadcChanVccBRAM:
69  switch(ty){
70  case xadcTypeMax:
71  return (XADC->MAXVCCBRAM);
72  case xadcTypeMin:
73  return (XADC->MINVCCBRAM);
74  default:
75  return (XADC->VCCBRAM);
76  }
77  /* no break */
78  default:
79  return 0;
80  }
81 }
82 
83 uint16_t xadcGetMeas(XadcChan ch, XadcType ty)
84 {
85  return UNJ(_xadcGetMeas(ch, ty));
86 }
87 
88 bool xadcGetAlarm(XadcChan ch)
89 {
90  int bitshift;
91  switch(ch){
92  case xadcChanTemp:
93  bitshift = XADC_CMD_ALM_TEMP_BIT;
94  break;
95  case xadcChanVccInt:
96  bitshift = XADC_CMD_ALM_VCCINT_BIT;
97  break;
98  case xadcChanVccAux:
99  bitshift = XADC_CMD_ALM_VCCAUX_BIT;
100  break;
101  case xadcChanVccBRAM:
102  bitshift = XADC_CMD_ALM_VCCBRAM_BIT;
103  break;
104  default:
105  bitshift = XADC_CMD_ALM_OT_BIT;
106  break;
107  }
108  return ( (XADC->FLAG & (0x1<<bitshift))== 0x0 ? false : true);
109 
110 }
111 
112 void xadcSetAveraging(XadcAvg av)
113 {
114  unsigned short int _avg;
115 
116  switch(av){
117  case xadcAvgOff:
118  _avg = XADC_CMD_AVERAGE_MODE_NO;
119  break;
120  case xadcAvg16:
121  _avg = XADC_CMD_AVERAGE_MODE_16;
122  break;
123  case xadcAvg64:
124  _avg = XADC_CMD_AVERAGE_MODE_64;
125  break;
126  case xadcAvg256:
127  _avg = XADC_CMD_AVERAGE_MODE_256;
128  break;
129  default:
130  return;
131  }
132  XADC->CONFREG[0] = (XADC->CONFREG[0] & ~XADC_CMD_AVERAGE_MASK) | (_avg << XADC_CMD_AVERAGE_SHIFT);
133 }
134 
135 XadcAvg xadcGetAveraging()
136 {
137  unsigned short int _avg;
138  _avg = (XADC->CONFREG[0] & XADC_CMD_AVERAGE_MASK) >> XADC_CMD_AVERAGE_SHIFT;
139 
140  switch(_avg){
141  case XADC_CMD_AVERAGE_MODE_NO:
142  return xadcAvgOff;
143  case XADC_CMD_AVERAGE_MODE_16:
144  return xadcAvg16;
145  case XADC_CMD_AVERAGE_MODE_64:
146  return xadcAvg64;
147  case XADC_CMD_AVERAGE_MODE_256:
148  return xadcAvg256;
149  }
150  return 0;
151 }
152 
153 void xadcEnaAlarm(XadcChan ch, bool enable)
154 {
155  int bitshift;
156  switch(ch){
157  case xadcChanTemp:
158  bitshift = XADC_CMD_ALM_ENA_TEMP_BIT;
159  break;
160  case xadcChanVccInt:
161  bitshift = XADC_CMD_ALM_ENA_VCCINT_BIT;
162  break;
163  case xadcChanVccAux:
164  bitshift = XADC_CMD_ALM_ENA_VCCAUX_BIT;
165  break;
166  case xadcChanVccBRAM:
167  bitshift = XADC_CMD_ALM_ENA_VCCBRAM_BIT;
168  break;
169  default:
170  bitshift = XADC_CMD_ALM_ENA_OT_BIT;
171  break;
172  }
173 
174  if(enable){
175  XADC->CONFREG[1] &= ~(0x1 << bitshift);
176  }
177  else{
178  XADC->CONFREG[1] |= (0x1 << bitshift);
179  }
180 }
181 
182 void xadcPowerDown(XadcPowerState ps){
183 
184  unsigned short pwd;
185  switch(ps){
186  case xadcPowerStateUp:
187  pwd = 0x0;
188  break;
189  case xadcPowerStateDown:
190  pwd = 0x3;
191  break;
192  case xadcPowerStateBDown:
193  pwd = 0x2;
194  break;
195  default:
196  return;
197  break;
198  }
199 
200 
201  XADC->CONFREG[2] = (((XADC->CONFREG[2]) & (~XADC_CMD_PWD_MASK)) | (pwd<<XADC_CMD_PWD_SHIFT));
202 
203 
204 
205 }
206 
207 
208 bool xadcSetAlarmValue(XadcChan ch, XadcType ty, uint16_t val){
209 
210  if(ty == xadcTypeCur)return false;
211 
212  val = ((val << 4) & 0xFFF0);
213 
214 
215  switch(ch){
216  case xadcChanTemp:
217  switch(ty){
218  case xadcTypeMax:
219  XADC->ALARMREG[0] = val;
220  break;
221  case xadcTypeMin:
222  XADC->ALARMREG[4] = val;
223  break;
224  default:
225  return false;
226  break;
227 
228  }
229  break;
230 
231  case xadcChanVccInt:
232  switch(ty){
233  case xadcTypeMax:
234  XADC->ALARMREG[1] = val;
235  break;
236  case xadcTypeMin:
237  XADC->ALARMREG[5] = val;
238  break;
239  default:
240  return false;
241  break;
242 
243  }
244  break;
245 
246  case xadcChanVccAux:
247  switch(ty){
248  case xadcTypeMax:
249  XADC->ALARMREG[2] = val;
250  break;
251  case xadcTypeMin:
252  XADC->ALARMREG[6] = val;
253  break;
254  default:
255  return false;
256  break;
257 
258  }
259  break;
260 
261  case xadcChanVccBRAM:
262  switch(ty){
263  case xadcTypeMax:
264  XADC->ALARMREG[8] = val;
265  break;
266  case xadcTypeMin:
267  XADC->ALARMREG[12] = val;
268  break;
269  default:
270  return false;
271  break;
272 
273  }
274  break;
275 
276  case xadcChanOT:
277  switch(ty){
278  case xadcTypeMax:
279  XADC->ALARMREG[3] = val;
280  break;
281  case xadcTypeMin:
282  XADC->ALARMREG[7] = val;
283  break;
284  default:
285  return false;
286  break;
287 
288  }
289  break;
290 
291  default:
292  return false;
293  break;
294  }
295  return true;
296 
297 
298 }
299 
300 /* bool XadcGetAlarmFlag(enum CHAN ch,bool resetFlag)
301 {
302  int bitshift;
303  bool ret;
304  switch(ch){
305  case TEMP:
306  bitshift = XADC_CMD_ALM_FLAG_TEMP_BIT;
307  break;
308  case VCCINT:
309  bitshift = XADC_CMD_ALM_FLAG_VCCINT_BIT;
310  break;
311  case VCCAUX:
312  bitshift = XADC_CMD_ALM_FLAG_VCCAUX_BIT;
313  break;
314  case VCCBRAM:
315  bitshift = XADC_CMD_ALM_FLAG_VCCBRAM_BIT;
316  break;
317  default:
318  bitshift = XADC_CMD_ALM_FLAG_OT_BIT;
319  break;
320  }
321  ret = ( (XADC->extFLAG & (0x1<<bitshift))== 0x0 ? false : true);
322 
323  if(resetFlag){
324  XADC->extFLAGRESET |= (0x1<<bitshift);
325  XADC->extFLAGRESET &= ~(0x1<<bitshift);
326  }
327  return ret;
328 }*/
329 void xadcSetMode(XadcMode mo)
330 {
331  if(mo == xadcModeDefault){
332  XADC->CONFREG[1] = (XADC->CONFREG[1] & ~XADC_CMD_SEQ_MASK) | (XADC_CMD_SEQ_DEFAULT << XADC_CMD_SEQ_SHIFT);
333  XADC->SEQUENCEREG[0] = 0;
334  }
335  else if(mo == xadcModeAutoSequence){
336  XADC->CONFREG[1] = (XADC->CONFREG[1] & ~XADC_CMD_SEQ_MASK) | (XADC_CMD_SEQ_CONT << XADC_CMD_SEQ_SHIFT);
337  XADC->SEQUENCEREG[0] = XADC_CMD_ONCHIP_CHAN_SEL;
338  }
339 }
340 
XADC Driver.
Manages the global system error.
#define XADC
XADC device.
Definition: dev_soc.h:74
This module is responsible for distributing error codes.