如何在不使用高级库的情况下读取或写入 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。
我正在尝试这个 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。