如何在不使用高级库的情况下读取或写入 Raspberry Pi 4 上的 GPIO 引脚?

How do you read or write to GPIO pins on a Raspberry Pi 4 without using a high-level library?

我正在尝试这个 Rust,但代码出现段错误:

unsafe {
    const PERIPH_BASE: u32 = 0xFE000000;
    const GPIO_BASE: u32 = PERIPH_BASE + 0x00200000;

    // Turn on pin GPIO 24
    ptr::write_volatile(GPIO_BASE as *mut u32, 1 << 24);
}

我怀疑这是因为使用了错误的地址。我找到的关于该主题的唯一信息是 RP 论坛 post。我无法在 RP4 数据表中找到信息,也找不到 Broadcom 芯片组的手册。

我 运行 在 Raspberry Pi SBC 上使用 Raspian 编写此代码。我试图概括代码,以便以后更容易移植到真正的嵌入式,因此我避免使用库。

我查看了 rppal 和 embedded-hal,但很惊讶没有找到解决方案。我查看了 the gpio module 代码中的每个文件。 mem.rs 和 ioctl.rs 看起来最近,但我一直找不到。

您正在直接写入进程地址 space。我认为您可能会更成功地直接写入物理内存。这里是 how RPPAL does it:

let mem_file = OpenOptions::new()
    .read(true)
    .write(true)
    .custom_flags(O_SYNC)
    .open(PATH_DEV_MEM)?;

// Memory-map /dev/mem at the appropriate offset for our SoC
let mem_ptr = unsafe {
    libc::mmap(
        ptr::null_mut(),
        GPIO_MEM_SIZE,
        PROT_READ | PROT_WRITE,
        MAP_SHARED,
        mem_file.as_raw_fd(),
        (device_info.peripheral_base() + device_info.gpio_offset()) as off_t,
    )
};

您可以在 Raspbian 中访问 /dev/mem 的物理内存,但您可能需要 root。