summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--devmem2.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/devmem2.c b/devmem2.c
index 7732ecb..5460088 100644
--- a/devmem2.c
+++ b/devmem2.c
@@ -48,7 +48,8 @@
#include <termios.h>
#include <sys/types.h>
#include <sys/mman.h>
-
+#include <stdint.h>
+
#define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \
__LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)
@@ -58,19 +59,19 @@
int main(int argc, char **argv) {
int fd;
void *map_base, *virt_addr;
- unsigned long read_result, writeval;
+ uint64_t read_result, writeval;
off_t target;
int access_type = 'w';
if(argc < 2) {
fprintf(stderr, "\nUsage:\t%s { address } [ type [ data ] ]\n"
"\taddress : memory address to act upon\n"
- "\ttype : access operation type : [b]yte, [h]alfword, [w]ord\n"
+ "\ttype : access operation type : [b]yte, [h]alfword, [w]ord, [d]oubleword\n"
"\tdata : data to be written\n\n",
argv[0]);
exit(1);
}
- target = strtoul(argv[1], 0, 0);
+ target = strtoull(argv[1], 0, 0);
if(argc > 2)
access_type = tolower(argv[2][0]);
@@ -89,14 +90,18 @@ int main(int argc, char **argv) {
virt_addr = map_base + (target & MAP_MASK);
switch(access_type) {
case 'b':
- read_result = *((unsigned char *) virt_addr);
+ read_result = *((uint8_t *) virt_addr);
break;
case 'h':
- read_result = *((unsigned short *) virt_addr);
+ read_result = *((uint16_t *) virt_addr);
break;
case 'w':
- read_result = *((unsigned long *) virt_addr);
+ read_result = *((uint32_t *) virt_addr);
break;
+ case 'd':
+ read_result = *((uint64_t *) virt_addr);
+ break;
+
default:
fprintf(stderr, "Illegal data type '%c'.\n", access_type);
exit(2);
@@ -108,16 +113,20 @@ int main(int argc, char **argv) {
writeval = strtoul(argv[3], 0, 0);
switch(access_type) {
case 'b':
- *((unsigned char *) virt_addr) = writeval;
- read_result = *((unsigned char *) virt_addr);
+ *((uint8_t *) virt_addr) = writeval;
+ read_result = *((uint8_t *) virt_addr);
break;
case 'h':
- *((unsigned short *) virt_addr) = writeval;
- read_result = *((unsigned short *) virt_addr);
+ *((uint16_t *) virt_addr) = writeval;
+ read_result = *((uint16_t *) virt_addr);
break;
case 'w':
- *((unsigned long *) virt_addr) = writeval;
- read_result = *((unsigned long *) virt_addr);
+ *((uint32_t *) virt_addr) = writeval;
+ read_result = *((uint32_t *) virt_addr);
+ break;
+ case 'd':
+ *((uint64_t *) virt_addr) = writeval;
+ read_result = *((uint64_t *) virt_addr);
break;
}
printf("Written 0x%X; readback 0x%X\n", writeval, read_result);
@@ -128,4 +137,3 @@ int main(int argc, char **argv) {
close(fd);
return 0;
}
-