0% found this document useful (0 votes)
170 views

Devmem2 C

This C program allows reading from and writing to any location in memory. It was developed for the LART computing board and is open source under the GNU GPL license. The program maps physical memory into a virtual address space, then reads from or writes to the specified memory address based on the type (byte, halfword, word) and given data.

Uploaded by

fbsobreira
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
170 views

Devmem2 C

This C program allows reading from and writing to any location in memory. It was developed for the LART computing board and is open source under the GNU GPL license. The program maps physical memory into a virtual address space, then reads from or writes to the specified memory address based on the type (byte, halfword, word) and given data.

Uploaded by

fbsobreira
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 5

/*

* devmem2.c: Simple program to read/write from/to any location in


memory.
*
*

Copyright (C) 2000, Jan-Derk Bakker ([email protected])

*
*
* This software has been developed for the LART computing board
* (http://www.lart.tudelft.nl/). The development has been sponsored by
* the Mobile MultiMedia Communications (http://www.mmc.tudelft.nl/)
* and Ubiquitous Communications (http://www.ubicom.tudelft.nl/)
* projects.
*
* The author can be reached at:
*
*

Jan-Derk Bakker

Information and Communication Theory Group

Faculty of Information Technology and Systems

Delft University of Technology

P.O. Box 5031

2600 GA Delft

The Netherlands

*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

See the

* GNU General Public License for more details.


*
* You should have received a copy of the GNU General Public License

* along with this program; if not, write to the Free Software


* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307

USA

*
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include <ctype.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/mman.h>
#define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n",
\
__LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)
#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)
int main(int argc, char **argv) {
int fd;
void *map_base, *virt_addr;
unsigned long 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,

"\tdata

: data to be written\n\n",

[h]alfword, [w]ord\n"
argv[0]);
exit(1);
}
target = strtoul(argv[1], 0, 0);
if(argc > 2)
access_type = tolower(argv[2][0]);

if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;


printf("/dev/mem opened.\n");
fflush(stdout);
virt_addr = map_base + (target & MAP_MASK);
switch(access_type) {
case 'b':
read_result = *((unsigned char *) virt_addr);
break;
case 'h':
read_result = *((unsigned short *) virt_addr);
break;
case 'w':
read_result = *((unsigned long *) virt_addr);
break;
default:
fprintf(stderr, "Illegal data type '%c'.\n",
access_type);
exit(2);
}
printf("Value at address 0x%X (%p): 0x%X\n", target, virt_addr,
read_result);

fflush(stdout);
if(argc > 3) {
writeval = strtoul(argv[3], 0, 0);
switch(access_type) {
case 'b':
*((unsigned char *) virt_addr) =
writeval;
read_result = *((unsigned char *)
virt_addr);
break;
case 'h':
*((unsigned short *) virt_addr) =
writeval;
read_result = *((unsigned short *)
virt_addr);
break;
case 'w':
*((unsigned long *) virt_addr) =
writeval;
read_result = *((unsigned long *)
virt_addr);
break;
}
printf("Written 0x%X; readback 0x%X\n", writeval,
read_result);
fflush(stdout);
}
if(munmap(map_base, MAP_SIZE) == -1) FATAL;
close(fd);
return 0;
}

You might also like