Как вы читаете или записываете на выводы GPIO на Raspberry Pi 4 без использования библиотеки высокого уровня? - PullRequest
2 голосов
/ 01 апреля 2020

Я пытаюсь использовать этот 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.

Я использую этот код на Raspian на Raspberry Pi SB C. Я пытаюсь обобщить код, чтобы облегчить портирование на true, встроенный позже, поэтому я избегаю библиотек.

Я просмотрел rppal и embedded-hal, но был удивлен, что не нашел решения. Я просмотрел каждый файл в коде gpio модуля . mem.rs и ioctl.rs выглядят ближе всего, но я не смог их найти.

1 Ответ

1 голос
/ 02 апреля 2020

Вы пишете прямо в адресное пространство процесса. Я думаю, что вы могли бы иметь больший успех при записи непосредственно в физическую память. Вот как как 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.

...