1 #include <errno.h> 2 #include <stdarg.h> 3 #include <stdint.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <limits.h> 7 #include <fcntl.h> 8 #include <unistd.h> 9 #include <sys/mman.h> 10 11 __attribute__((noreturn)) void die(const char *fmt, ...) 12 { 13 va_list ap; 14 15 va_start(ap, fmt); 16 vfprintf(stderr, fmt, ap); 17 va_end(ap); 18 19 fprintf(stderr, "\n\n"); 20 21 exit(EXIT_FAILURE); 22 } 23 24 25 int main (int argc, char **argv) { 26 uint32_t *an; 27 void *ptr; 28 int fd; 29 30 fd = open("/dev/mem", O_RDWR); 31 if (fd < 0) 32 die("Cannot open /dev/mem: %m"); 33 34 ptr = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0xf1036000); 35 if (ptr == MAP_FAILED) 36 die("Cannot mmap /dev/mem: %m"); 37 38 an = ptr + 0xc0c; 39 printf("Port Auto-Negotiation Configuration Register = %#010x\n", *an); 40 if (argc > 1) { 41 unsigned long new_an; 42 char *end; 43 44 new_an = strtoul(argv[1], &end, 16); 45 if (*end != '\0' || (new_an == ULONG_MAX && errno == ERANGE)) 46 die("Invalid value %s", argv[1]); 47 48 printf("Setting value = %#010lx\n", new_an); 49 *an = new_an; 50 } 51 52 munmap(ptr, 0x1000); 53 close(fd); 54 55 return 0; 56 }