ove/
bsp.rs

1// Copyright (C) 2026 Kamil Lulko <kamil.lulko@gmail.com>
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4//
5// This file is part of oveRTOS.
6
7//! Backward-compatible BSP module — delegates to board, gpio, led modules.
8
9use crate::bindings;
10use crate::error::{Error, Result};
11
12/// Initialize the board support package.
13///
14/// # Errors
15/// Returns an error if any hardware peripheral fails to initialize.
16pub fn board_init() -> Result<()> {
17    let rc = unsafe { bindings::ove_board_init() };
18    Error::from_code(rc)
19}
20
21/// Toggle the state of an LED.
22pub fn led_toggle(led: u32) {
23    unsafe { bindings::ove_led_toggle(led) }
24}
25
26/// Set the state of an LED.
27pub fn led_set(led: u32, on: bool) {
28    unsafe { bindings::ove_led_set(led, on as i32) }
29}
30
31/// Set a GPIO pin's output level (`value`: 0 = low, non-zero = high).
32///
33/// # Errors
34/// Returns [`Error::InvalidParam`] if `port` or `pin` is out of range.
35pub fn gpio_set(port: u32, pin: u32, value: i32) -> Result<()> {
36    let rc = unsafe { bindings::ove_gpio_set(port, pin, value) };
37    Error::from_code(rc)
38}
39
40/// Read a GPIO pin input value. Returns 0 (low) or 1 (high) on success.
41///
42/// # Errors
43/// Returns [`Error::InvalidParam`] if `port` or `pin` is out of range.
44pub fn gpio_get(port: u32, pin: u32) -> Result<i32> {
45    let rc = unsafe { bindings::ove_gpio_get(port, pin) };
46    if rc < 0 {
47        Error::from_code(rc)?;
48    }
49    Ok(rc)
50}
51
52/// GPIO interrupt trigger mode (BSP re-export of [`gpio::GpioIrqMode`](crate::gpio::GpioIrqMode)).
53#[repr(u32)]
54#[derive(Debug, Copy, Clone, PartialEq, Eq)]
55pub enum GpioIrqMode {
56    /// Trigger on rising edge.
57    Rising = 0x01,
58    /// Trigger on falling edge.
59    Falling = 0x02,
60    /// Trigger on both edges.
61    Both = 0x03,
62}
63
64/// Register a GPIO interrupt callback.
65///
66/// # Safety
67/// The callback and user_data must remain valid for the lifetime of the
68/// registration.
69pub unsafe fn gpio_irq_register(
70    port: u32,
71    pin: u32,
72    mode: GpioIrqMode,
73    callback: bindings::ove_gpio_irq_cb,
74    user_data: *mut core::ffi::c_void,
75) -> Result<()> {
76    let rc = unsafe {
77        bindings::ove_gpio_irq_register(port, pin, mode as bindings::ove_gpio_irq_mode_t, callback, user_data)
78    };
79    Error::from_code(rc)
80}
81
82/// Enable a previously registered GPIO interrupt.
83///
84/// # Errors
85/// Returns an error if the interrupt has not been registered or the pin is invalid.
86pub fn gpio_irq_enable(port: u32, pin: u32) -> Result<()> {
87    let rc = unsafe { bindings::ove_gpio_irq_enable(port, pin) };
88    Error::from_code(rc)
89}
90
91/// Disable a registered GPIO interrupt without removing the registration.
92///
93/// # Errors
94/// Returns an error if the interrupt has not been registered or the pin is invalid.
95pub fn gpio_irq_disable(port: u32, pin: u32) -> Result<()> {
96    let rc = unsafe { bindings::ove_gpio_irq_disable(port, pin) };
97    Error::from_code(rc)
98}