10 #include <stdint.h> // uintX_t
13 /* Hardware specific */
21 #define min(a, b) ((a) > (b) ? (b) : (a))
25 void* mf614_mem = NULL;
28 void mf614_adc_init(int channel)
30 *(((uint8_t *) mf614_mem) + AD_CTRL) = 1 << 6 | 0 << 5 | 0 << 4 /* RNG */| 0 << 3 /*BIP*/| channel;
33 int open_device(char* path) {
34 status = open(path, O_RDWR);
43 void wait_for_interrupts(int device_fd)
45 read(device_fd, NULL, 1);
48 int disable_interrupts(int device_fd)
50 uint32_t control_value = 0;
52 status = write(device_fd, &control_value, sizeof(uint32_t));
61 int enable_interrupts(int device_fd)
63 uint32_t control_value = 1;
65 status = write(device_fd, &control_value, sizeof(uint32_t));
74 void list_available_mem_regions(char* device)
76 char path[] = "/sys/class/uio/";
77 char subdir[] = "/maps/";
78 char directory[BUFF_MID];
79 memset(directory, '\0', BUFF_MID);
84 strncat(directory, path, strlen(path));
85 strncat(directory, device, min(strlen(device), 8));
86 strncat(directory, subdir, strlen(subdir));
88 dip = opendir(directory);
94 while ((dit = readdir(dip)) != NULL) {
95 if (strcmp(dit->d_name, ".") && strcmp(dit->d_name, "..")) {
96 printf(" %s\n", dit->d_name);
100 status = closedir(dip);
102 perror("closedir()");
109 void list_available_io_ports(char *device)
111 char path[] = "/sys/class/uio/";
112 char subdir[] = "/portio/";
113 char directory[BUFF_MID];
114 memset(directory, '\0', BUFF_MID);
119 strncat(directory, path, strlen(path));
120 strncat(directory, device, min(strlen(device), 8));
121 strncat(directory, subdir, strlen(subdir));
123 status = access(directory, F_OK);
125 printf(" There are no IO port available\n");
129 dip = opendir(directory);
135 while ((dit = readdir(dip)) != NULL) {
136 if (strcmp(dit->d_name, ".") && strcmp(dit->d_name, "..")) {
137 printf(" %s\n", dit->d_name);
141 status = closedir(dip);
143 perror("closedir()");
150 void run_simple_tests(char* dev_name)
153 char buff[BUFF_SMALL];
154 memset(buff, '\0', BUFF_SMALL);
156 strncat(buff, "/dev/", 5);
157 strncat(buff, dev_name, min(strlen(dev_name), 8));
159 printf("Opening %s\n", buff);
161 device_fd = open_device(buff);
162 if (device_fd != -1) {
163 printf("Tring to enable interrupts\n");
164 status = enable_interrupts(device_fd);
166 printf(" Probably OK\n");
169 printf("Tring to disable interrupts\n");
170 status = disable_interrupts(device_fd);
172 printf(" Probably OK\n");
177 printf("Checking for available memory regions exported by the UIO driver\n");
178 list_available_mem_regions(dev_name);
180 printf("Checking for available IO ports exported by the UIO driver\n");
181 list_available_io_ports(dev_name);
185 int main(int argc, char* argv[])
188 int mem_size = 1; //TODO
190 char buff[BUFF_SMALL];
191 char read_buff[BUFF_SMALL];
192 memset(buff, '\0', BUFF_SMALL);
196 printf("Usage: %s UIO_DEVICE\n UIO_DEVICE\tname of uio device in /dev\n", argv[0]);
201 strncat(buff, "/dev/", 5);
202 strncat(buff, argv[1], min(strlen(argv[1]), 8));
204 device_fd = open_device(buff);
205 if (device_fd != -1) {
206 mf614_mem = mmap(0, mem_size * sysconf(_SC_PAGESIZE), PROT_READ | PROT_WRITE, MAP_SHARED, device_fd, 0);
207 if (mf614_mem == MAP_FAILED) {
214 for (int i = 0; i <= 7; i++) {
215 enable_interrupts(device_fd);
217 status = read(device_fd, read_buff, sizeof(uint32_t)); // should block until interrupt received
219 // ... got interrupt -- handle it
220 adc_value = *(((uint8_t *) mf614_mem) + AD_LO) | (*(((uint8_t *) mf614_mem) + AD_HI) << 8);
221 printf("[CH %d] ADC = %f V\n", i, adc_value/819);