Это довольно просто.Пример, основанный на RPI
, сначала необходимо:
mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
, а затем выделить память для карты.Например, для одного периферийного устройства BCM RPi мне будет 4K + 4K
Периферийная запись = malloc (8 * 1024 - 1);
, затем убедитесь, что он выровнен по 4k, а mmap
это:
gpio_map = (unsigned char *)mmap((caddr_t)poriph_mem, BLOCK_SIZE,PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, mem_fd, PERIPH_BASE );
где PERIPH_BASE - базовый адрес периферийного устройства (например, GPIO 0x20000000 (база периферийных устройств BCM) + 0x200000)
, тогда вы можете обращаться к ним как к обычным указателям (но помните, что они имеютvolatile
)
*(volatile uint32_t *)(periph_mem + OFFSET) = VALUE;