10 #include <stdint.h> // uintX_t
13 /* Hardware specific */
21 #define min(a, b) ((a) > (b) ? (b) : (a))
25 void* mf614_mem = NULL;
29 for (int i = 0; i < 65000; i++) {}
32 void mf614_adc_init(int channel)
34 *(((uint8_t *) mf614_mem) + AD_CTRL) = 1 << 6 | 0 << 5 | 0 << 4 /* RNG */| 0 << 3 /*BIP*/| channel;
37 int open_device(char* path) {
38 status = open(path, O_RDWR);
47 void wait_for_interrupts(int device_fd)
49 read(device_fd, NULL, 1);
52 int disable_interrupts(int device_fd)
54 char buff[4]; // we have to write 32 bit number
55 strncpy(buff, "0", 4);
57 status = write(device_fd, buff, 4);
66 int enable_interrupts(int device_fd)
68 char buff[4]; // we have to write 32 bit number
69 strncpy(buff, "1", 4);
71 status = write(device_fd, buff, 4);
80 void list_available_mem_regions(char* device)
82 char path[] = "/sys/class/uio/";
83 char subdir[] = "/maps/";
84 char directory[BUFF_MID];
85 memset(directory, '\0', BUFF_MID);
90 strncat(directory, path, strlen(path));
91 strncat(directory, device, min(strlen(device), 8));
92 strncat(directory, subdir, strlen(subdir));
94 dip = opendir(directory);
100 while ((dit = readdir(dip)) != NULL) {
101 if (strcmp(dit->d_name, ".") && strcmp(dit->d_name, "..")) {
102 printf(" %s\n", dit->d_name);
106 status = closedir(dip);
108 perror("closedir()");
115 void list_available_io_ports(char *device)
117 char path[] = "/sys/class/uio/";
118 char subdir[] = "/portio/";
119 char directory[BUFF_MID];
120 memset(directory, '\0', BUFF_MID);
125 strncat(directory, path, strlen(path));
126 strncat(directory, device, min(strlen(device), 8));
127 strncat(directory, subdir, strlen(subdir));
129 status = access(directory, F_OK);
131 printf(" There are no IO port available\n");
135 dip = opendir(directory);
141 while ((dit = readdir(dip)) != NULL) {
142 if (strcmp(dit->d_name, ".") && strcmp(dit->d_name, "..")) {
143 printf(" %s\n", dit->d_name);
147 status = closedir(dip);
149 perror("closedir()");
156 void run_simple_tests(char* dev_name)
159 char buff[BUFF_SMALL];
160 memset(buff, '\0', BUFF_SMALL);
162 strncat(buff, "/dev/", 5);
163 strncat(buff, dev_name, min(strlen(dev_name), 8));
165 printf("Opening %s\n", buff);
167 device_fd = open_device(buff);
168 if (device_fd != -1) {
169 printf("Tring to enable interrupts\n");
170 status = enable_interrupts(device_fd);
172 printf(" Probably OK\n");
175 printf("Tring to disable interrupts\n");
176 status = disable_interrupts(device_fd);
178 printf(" Probably OK\n");
183 printf("Checking for available memory regions exported by the UIO driver\n");
184 list_available_mem_regions(dev_name);
186 printf("Checking for available IO ports exported by the UIO driver\n");
187 list_available_io_ports(dev_name);
191 int main(int argc, char* argv[])
194 int mem_size = 1; //TODO
196 char buff[BUFF_SMALL];
197 char read_buff[BUFF_SMALL];
198 memset(buff, '\0', BUFF_SMALL);
202 printf("Usage: %s UIO_DEVICE\n UIO_DEVICE\tname of uio device in /dev\n", argv[0]);
207 strncat(buff, "/dev/", 5);
208 strncat(buff, argv[1], min(strlen(argv[1]), 8));
210 device_fd = open_device(buff);
211 if (device_fd != -1) {
212 mf614_mem = mmap(0, mem_size * sysconf(_SC_PAGESIZE), PROT_READ | PROT_WRITE, MAP_SHARED, device_fd, 0);
213 if (mf614_mem == MAP_FAILED) {
221 for (int i = 0; i <= 7; i++) {
223 //enable_interrupts(device_fd);
224 //read(device_fd, read_buff, 1); // should block until interrupt erceived
226 // ... got interrupt -- handle it
227 //disable_interrupts(device_fd);
230 adc_value = *(((uint8_t *) mf614_mem) + AD_LO) | (*(((uint8_t *) mf614_mem) + AD_HI) << 8);
231 printf("[CH %d] ADC = %f V\n", i, adc_value/819);