#include #include #include #include #include #include #include #include #include __attribute__((noreturn)) void die(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n\n"); exit(EXIT_FAILURE); } int main (int argc, char **argv) { uint32_t *an; void *ptr; int fd; fd = open("/dev/mem", O_RDWR); if (fd < 0) die("Cannot open /dev/mem: %m"); ptr = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0xf1036000); if (ptr == MAP_FAILED) die("Cannot mmap /dev/mem: %m"); an = ptr + 0xc0c; printf("Port Auto-Negotiation Configuration Register = %#010x\n", *an); if (argc > 1) { unsigned long new_an; char *end; new_an = strtoul(argv[1], &end, 16); if (*end != '\0' || (new_an == ULONG_MAX && errno == ERANGE)) die("Invalid value %s", argv[1]); printf("Setting value = %#010lx\n", new_an); *an = new_an; } munmap(ptr, 0x1000); close(fd); return 0; }