2 * devmem2.c: Simple program to read/write from/to any location in memory.
4 * Copyright (C) 2000, Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl)
18 #include <sys/types.h>
21 #define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \
22 __LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)
24 #define MAP_SIZE 4096UL
25 #define MAP_MASK (MAP_SIZE - 1)
27 void writemem(address, value, int accesstype) {
29 void *map_base, *virt_addr;
30 unsigned long read_result, writeval;
32 int access_type = 'w';
35 fprintf(stderr, "\nUsage:\t%s { address } [ type [ data ] ]\n"
36 "\taddress : memory address to act upon\n"
37 "\ttype : access operation type : [b]yte, [h]alfword, [w]ord\n"
38 "\tdata : data to be written\n\n",
42 target = strtoul(argv[1], 0, 0);
45 access_type = tolower(argv[2][0]);
48 if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
49 printf("/dev/mem opened.\n");
53 map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
54 if(map_base == (void *) -1) FATAL;
55 printf("Memory mapped at address %p.\n", map_base);
58 virt_addr = map_base + (target & MAP_MASK);
61 read_result = *((unsigned char *) virt_addr);
64 read_result = *((unsigned short *) virt_addr);
67 read_result = *((unsigned long *) virt_addr);
70 fprintf(stderr, "Illegal data type '%c'.\n", access_type);
75 writeval = strtoul(argv[3], 0, 0);
78 *((unsigned char *) virt_addr) = writeval;
79 read_result = *((unsigned char *) virt_addr);
82 *((unsigned short *) virt_addr) = writeval;
83 read_result = *((unsigned short *) virt_addr);
86 *((unsigned long *) virt_addr) = writeval;
87 read_result = *((unsigned long *) virt_addr);
90 printf("Written 0x%X; readback 0x%X\n", writeval, read_result);
94 if(munmap(map_base, MAP_SIZE) == -1) FATAL;
99 void readmem(address, int accesstype)
102 void *map_base, *virt_addr;
103 unsigned long read_result, writeval;
105 int access_type = accesstype;
107 target = strtoul(argv[1], 0, 0);
110 if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
111 printf("/dev/mem opened.\n");
115 map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
116 if(map_base == (void *) -1) FATAL;
117 printf("Memory mapped at address %p.\n", map_base);
120 virt_addr = map_base + (target & MAP_MASK);
121 switch(access_type) {
123 read_result = *((unsigned char *) virt_addr);
126 read_result = *((unsigned short *) virt_addr);
129 read_result = *((unsigned long *) virt_addr);
132 fprintf(stderr, "Illegal data type '%c'.\n", access_type);