2

我正在尝试这个 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 论坛帖子。我在 RP4 数据表中找不到信息,也找不到 Broadcom 芯片组的手册。

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

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

4

1 回答 1

1

您正在直接写入进程地址空间。我认为您可能会更成功地直接写入物理内存。以下是RPPAL 的做法

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,
    )
};

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

于 2020-04-02T00:22:35.340 回答