#include #include #include #include #include #include #define ERROR() do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \ __LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0) #define MAP_SIZE 4096UL #define MAP_MASK (~-MAP_SIZE) void sigint(int signo){ (void)signo; } int main(int argc, char **argv){ int fd; volatile unsigned long *map_base; off_t target; off_t mmconfig_base; int bus; int dev; int i; signal(SIGINT, sigint); mmconfig_base = 0xe0000000; bus = 4; dev = 9; target = mmconfig_base + 0x100000 * bus + 0x8000 * dev; if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) ERROR(); printf("/dev/mem opened.\n"); fflush(stdout); map_base = (unsigned long *)mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK); if (map_base == (void *) -1) ERROR(); printf("Memory mapped at address %p.\n", map_base); fflush(stdout); for(i=0;i<256;i++){ map_base[0] = i << 2; map_base[1] = i; map_base[2] = i >> 2; map_base[3] = i >> 4; usleep(100 * 1000); if(EINTR == errno){ printf("BREAK\n"); break; } } if(munmap((void *)map_base, MAP_SIZE) == -1) ERROR(); close(fd); return 0; }