source of highlighter
plain | download
    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 }