blob: 5a82e20c43325b7c75db9b3c61206a6b712ff911 [file] [log] [blame]
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08001#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}