#include void* MMIO_BASE; void mmio_init(int raspi) { switch (raspi) { case 2: case 3: MMIO_BASE = (void*)0x3F000000; break; // raspi2 & 3 case 4: MMIO_BASE = (void*)0xFE000000; break; // raspi4 default: MMIO_BASE = (void*)0x20000000; break; // raspi1, raspi zero, etc. } } #define REG_ADDR(reg) ((volatile uint32_t*)(MMIO_BASE + reg)) uint32_t mmio_read(uint32_t reg) { return *REG_ADDR(reg); } void mmio_write(uint32_t reg, uint32_t val) { *REG_ADDR(reg) = val; }