1 ///////////////////////////////////////////////////////////////////////////
2 // Workfile: devmem2.c (Implementation)
3 // Author: Jan-Derk Bakker, Daniel Giritzer
5 // Description: Simple module to read/write from/to any location in memory.
8 // Copyright (C) 2000, Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl)
9 // Copyright (C) 2017, Daniel Giritzer (giri@nwrk.biz)
10 ///////////////////////////////////////////////////////////////////////////
21 #include <sys/types.h>
24 #define MAP_SIZE 4096UL
25 #define MAP_MASK (MAP_SIZE - 1)
27 static void ERROR(char* custom)
29 fprintf(stderr, "Error: %s \n", custom);
30 fprintf(stderr, "Error Nr: %d, %s\n",
31 errno, strerror(errno));
34 int writemem(char* address, char* value, int access_type)
39 unsigned long writeval = 0;
41 off_t target = strtoul(address, 0, 0);
44 if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
46 ERROR("Opening /dev/mem/ failed!");
51 map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
53 if(map_base == (void *) -1)
55 ERROR("Mapping Memory Page Failed!");
60 writeval = strtoul(value, 0, 0);
64 *((unsigned char *) virt_addr) = writeval;
67 *((unsigned short *) virt_addr) = writeval;
70 *((unsigned long *) virt_addr) = writeval;
73 ERROR("Wrong access_type set!");
78 if(munmap(map_base, MAP_SIZE) == -1)
80 ERROR("Unmapping Memory Page Failed!");
88 int readmem(char* address, int access_type, unsigned long *result)
91 void *map_base, *virt_addr;
93 unsigned long read_result = 0;
95 target = strtoul(address, 0, 0);
99 //Print error on failure
100 ERROR("Result Parameter is a nullpointer!");
105 // Try to open /dev/mem
106 if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
108 //Print error on failure
109 ERROR("Opening /dev/mem/ failed!");
114 map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
116 // Check if mapping was successful
117 if(map_base == (void *) -1)
119 ERROR("Mapping Memory Page Failed!");
123 virt_addr = map_base + (target & MAP_MASK);
127 read_result = *((unsigned char *) virt_addr);
130 read_result = *((unsigned short *) virt_addr);
133 read_result = *((unsigned long *) virt_addr);
136 ERROR("Wrong access_type set!");
140 if(munmap(map_base, MAP_SIZE) == -1)
142 ERROR("Unmapping Memory Page Failed!");
146 *result = read_result;