Listing 2. writeport.c: a simple program that writes a 32-bit integer to a physical memory location. #include #include //needed for O_RDWR and O_SYNC #include //needed for PROT_READ etc. #define GRAB_SIZE 1024UL #define GRAB_MASK (GRAB_SIZE - 1) int main(int argc, char **argv) { void *grab_base, *virt_addr; unsigned int md, read_result, writeval; off_t phys_addr = strtoul(argv[1], 0, 0); /*open memory interface*/ if((md = open("/dev/mem", O_RDWR | O_SYNC)) == -1) { printf("ERR - /dev/mem open failed\n"); exit(1); } /* Map one page to the physical address given*/ if(grab_base = mmap(0, GRAB_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, md, phys_addr & ~GRAB_MASK), grab_base == (void *) -1) { printf("ERROR: failed to map\n"); exit(1); } /*write to virtual memory that is now mapped to the requested physical address*/ *((unsigned long *)grab_base + (phys_addr & GRAB_MASK)) = strtoul(argv[2], 0, 0); /*close memory interface*/ if(munmap(grab_base, GRAB_SIZE) == -1) { printf("ERR - unmap failed\n"); exit(1); } close(md); }