Normally all hardware access is done by a kernel driver. There are, however cases where you just need to change a value in some register without worrying buffering, interrupts etc. For example if you just need to access some GPIO ports to change a value of a led.
GPIO ports and physical memory need to be mapped into the user-space before they can be accessed. Following document discusses this and provides an example program devmem2
other examples:
Here is an example how to read the on-board DIP switch value on HiCO.SH7760
/* Example how to access the value of the on-board DIP switches on * HiCO.SH7760. You can compile the program with command: * * sh4-linux-gcc -Wall dip_switch.c -o dip_switch */#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <unistd.h>#include <errno.h>#include <fcntl.h>#include <sys/mman.h> #define MAP_SIZE 4096UL#define MAP_MASK (MAP_SIZE - 1) int main(void) { int fd; void *map_base, *virt_addr; /* Physical address of the DIP switch GPIO register on HiCO.SH7760 (See * the HiCO.SH7760 hardware manual * * _NOTE_: the dipswitches also define how the system boots (i.e. the value * is used by the bootloader at startup), so oafter testting, leave the * switches in the same position as they were */ off_t target = 0xA40000A0; if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) { printf("/dev/mem could not be opened.\n"); perror("open"); exit(1); } else { printf("/dev/mem opened.\n"); } /* Map one page */ map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK); if(map_base == (void *) -1) { printf("Memory map failed.\n"); perror("mmap"); } else { printf("Memory mapped at address %p.\n", map_base); } virt_addr = map_base + (target & MAP_MASK); /* acess remapped region here */ printf("Now try to change the value of the on-board DIP switche\n"); while(1){ printf("value is 0x%02x\n",*(unsigned char *)virt_addr); sleep(1); } /* we'll never get here in this example, but here's how the region is * unmapped. */ if(munmap(map_base, MAP_SIZE) == -1) { printf("Memory unmap failed.\n"); } close(fd);}
联系客服