/* * Simple test program for UIO event devices * Copyright (c) 2006 Hans J. Koch * * License: GPL v2 * * Usage: uio_events * */ #include #include #include #include #include #include #include #include #define UIO_DEV "/dev/uio0" #define UIO_SIZE "/sys/class/uio/uio0/maps/map0/size" #define UIO_ADDR "/sys/class/uio/uio0/maps/map0/addr" void err_exit(char *msg) { perror(msg); exit(2); } int get_mem_size(void) { int result,ret; FILE* file = fopen(UIO_SIZE,"r"); if (!file) err_exit("get_mem_size"); ret = fscanf(file,"0x%lx",&result); if (ret<0) err_exit("get_mem_size/fscanf"); fclose(file); return result; } unsigned long get_mem_addr(void) { unsigned long result; int ret; FILE* file = fopen(UIO_ADDR,"r"); if (!file) err_exit("get_mem_addr"); ret = fscanf(file,"0x%lx",&result); if (ret<0) err_exit("get_mem_addr/fscanf"); fclose(file); return result; } int main(int argc, char *argv[]) { int uiofd = open(UIO_DEV,O_RDONLY); if (uiofd < 0) err_exit("open (uio dev)"); printf("Opened %s\n",UIO_DEV); int mem_size = get_mem_size(); printf ("Memory size: %d bytes.\n", mem_size); unsigned long mem_addr = get_mem_addr(); printf ("Memory addr: 0x%lx\n", mem_addr); unsigned long* map_addr = mmap(NULL, mem_size, PROT_READ, MAP_SHARED, uiofd, 0); if (map_addr == ((unsigned long*) -1)) err_exit("mmap"); printf("Memory mapped to 0x%lx\n", (unsigned long)map_addr); fd_set rd_fds, tmp_fds; FD_ZERO(&rd_fds); FD_SET(uiofd,&rd_fds); struct timeval timeout; unsigned long irq_count = 0; unsigned long tim_count = 0; double dt=0.0, cur_tim, last_tim=-1.0; struct timeval cur_tv; while (1) { printf("\033[1G"); printf("Total: %d Timeouts: %d dt: %.5f sec. Mem: %d", irq_count, tim_count, dt, *map_addr); fflush(stdout); tmp_fds = rd_fds; timeout.tv_sec = 2; timeout.tv_usec = 0; int ret = select(uiofd+1, &tmp_fds, NULL, NULL, &timeout); if (ret > 0){ irq_count++; gettimeofday(&cur_tv,NULL); cur_tim = cur_tv.tv_sec + (double)cur_tv.tv_usec/1000000.0; if (last_tim > 0.0) dt = (cur_tim - last_tim); last_tim = cur_tim; unsigned long dummy; if (read(uiofd,&dummy,sizeof(dummy)) != sizeof(dummy)) err_exit("read"); } else if (ret == 0) tim_count++; else if (ret < 0) err_exit("select"); } }