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}