// memwrite.c
// 2018/01/07 : by marsee
// I referred to http://independence-sys.net/main/?p=2209
//
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#define BLOCK_SIZE 4096
volatile uint32_t *reg;
int main(int argc, char **argv){
int fd;
void *memp;
uint32_t phy_addr;
uint32_t phy_addr_base;
int addr, wd;
uint32_t write_data;
if (argc != 3){
fprintf(stderr, "Usage : ./memwrite <address(hex)> <write data(hex)>\n");
exit(-1);
}
fd = open("/dev/mem", O_RDWR | O_SYNC);
if (fd == -1){
fprintf(stderr, "/dev/mem open error\n");
exit(-1);
}
sscanf(argv[1], "%x", &addr);
phy_addr = (uint32_t)addr;
phy_addr_base = phy_addr & 0xfffff000; // 4k byte boundary
memp = mmap(NULL, BLOCK_SIZE,
PROT_READ | PROT_WRITE, MAP_SHARED,
fd, phy_addr_base );
if ((int64_t)memp == -1){
fprintf(stderr,"/dev/mem map error\n");
exit(-1);
}
close(fd);
reg = (uint32_t *)memp;
int index = (phy_addr & 0xfff)/sizeof(uint32_t);
sscanf(argv[2], "%x", &wd);
write_data = (uint32_t)wd;
reg[index] = write_data;
munmap((void *)memp, BLOCK_SIZE);
return(0);
}
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |