-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathadcLib.c
149 lines (105 loc) · 3.79 KB
/
adcLib.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "adcLib.h"
void *virt_addr;
int fd;
void *map_base;
int swTrigger = 0;
int initADC(int channel){
if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1){
return 0;
}
system("i2cset -y 1 0x5b 0x54 0x39");
system("i2cset -y 1 0x5b 0x55 0xc1");
map_base = mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, ADC_REG_BASE & ~MAP_MASK);
virt_addr = map_base + (ADC_REG_BASE & MAP_MASK);
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + DISABLE_PROTECTION;
*((unsigned long *) (virt_addr + ADC_MODE_OFFSET)) = ADC_DEFAULT_SPEED;
*((unsigned long *) (virt_addr + ADC_GAIN_OFFSET)) = 0x0;
*((unsigned long *) (virt_addr + ADC_OFFSET_OFFSET)) = 0x0;
*((unsigned long *) (virt_addr + ADC_ENABLE_OFFSET)) = 1 << channel;
*((unsigned long *) (virt_addr + ADC_TRGR_OFFSET)) = ADC_CONTINUOUS;
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + ENABLE_PROTECTION;
return 1;
/*else if(opt == 1){
if(munmap(map_base, MAP_SIZE) == -1){
return 0;
}
close(fd);
}
return 1;*/
}
void closeADC(int channel){
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + DISABLE_PROTECTION;
*((unsigned long *) (virt_addr + ADC_DISABLE_OFFSET)) = 1 << channel;
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + ENABLE_PROTECTION;
}
int shutdownADC(void){
if(munmap(map_base, MAP_SIZE) == -1){
return 0;
}
close(fd);
return 1;
}
unsigned long readADC(int channel){
if(swTrigger = 0){
unsigned long read;
read = *((unsigned long *) (virt_addr + ADC_DATA_OFFSET+ (4*channel)));
return read;
}
else{
unsigned long read;
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + DISABLE_PROTECTION;
*((unsigned long *) (virt_addr + ADC_CONTROL_OFFSET)) = 0x2;
read = *((unsigned long *) (virt_addr + ADC_DATA_OFFSET + (4*channel)));
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + ENABLE_PROTECTION;
return read;
}
}
void setGain(int channel, int gain){
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + DISABLE_PROTECTION;
*((unsigned long *) (virt_addr + ADC_GAIN_OFFSET)) = gain << (channel*2);
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + ENABLE_PROTECTION;
}
void setADCModeReg(unsigned long speed){
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + DISABLE_PROTECTION;
*((unsigned long *) (virt_addr + ADC_MODE_OFFSET)) = speed;
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + ENABLE_PROTECTION;
}
int getGain(int channel){
unsigned long gain;
gain = *((unsigned long *) (virt_addr + ADC_GAIN_OFFSET));
gain = gain >> (2*channel);
int re;
re = (int)gain;
return re;
}
unsigned long getADCModeReg(void){
unsigned long adc;
adc = *((unsigned long *) (virt_addr + ADC_MODE_OFFSET));
return adc;
}
int isEnabled(int channel){
unsigned long adc;
adc = *((unsigned long *) (virt_addr + ADC_STATUS_OFFSET));
adc = (adc >> channel) & 0x1;
return adc;
}
//use ADC_CONTINUOUS or ADC_SOFT_TRGR
void setMode(int option){
if(option == ADC_CONTINUOUS){
swTrigger=0;
}
if(option == ADC_SOFT_TRGR){
swTrigger = 1;
}
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + DISABLE_PROTECTION;
*((unsigned long *) (virt_addr + ADC_TRGR_OFFSET)) = option;
*((unsigned long *) (virt_addr + WRITE_PROTECTION_OFFSET)) = (WRITE_PROTECTION_KEY << 2) + ENABLE_PROTECTION;
}