r.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1#include <stdio.h>
2#include <stdlib.h>
3#include <sys/mman.h>
4#include <fcntl.h>
5#include <string.h>
6
7static int usage()
8{
9    fprintf(stderr,"r [-b|-s] <address> [<value>]\n");
10    return -1;
11}
12
13int r_main(int argc, char *argv[])
14{
15    int width = 4, set = 0, fd;
16    unsigned addr, value;
17    void *page;
18
19    if(argc < 2) return usage();
20
21    if(!strcmp(argv[1], "-b")) {
22        width = 1;
23        argc--;
24        argv++;
25    } else if(!strcmp(argv[1], "-s")) {
26        width = 2;
27        argc--;
28        argv++;
29    }
30
31    if(argc < 2) return usage();
32    addr = strtoul(argv[1], 0, 16);
33
34    if(argc > 2) {
35        set = 1;
36        value = strtoul(argv[2], 0, 16);
37    }
38
39    fd = open("/dev/mem", O_RDWR | O_SYNC);
40    if(fd < 0) {
41        fprintf(stderr,"cannot open /dev/mem\n");
42        return -1;
43    }
44
45    page = mmap(0, 8192, PROT_READ | PROT_WRITE,
46                MAP_SHARED, fd, addr & (~4095));
47
48    if(page == MAP_FAILED){
49        fprintf(stderr,"cannot mmap region\n");
50        return -1;
51    }
52
53    switch(width){
54    case 4: {
55        unsigned *x = (unsigned*) (((unsigned) page) + (addr & 4095));
56        if(set) *x = value;
57        fprintf(stderr,"%08x: %08x\n", addr, *x);
58        break;
59    }
60    case 2: {
61        unsigned short *x = (unsigned short*) (((unsigned) page) + (addr & 4095));
62        if(set) *x = value;
63        fprintf(stderr,"%08x: %04x\n", addr, *x);
64        break;
65    }
66    case 1: {
67        unsigned char *x = (unsigned char*) (((unsigned) page) + (addr & 4095));
68        if(set) *x = value;
69        fprintf(stderr,"%08x: %02x\n", addr, *x);
70        break;
71    }
72    }
73    return 0;
74}
75