This commit is contained in:
2026-09-07 18:46:42 -05:00
parent 60e073a706
commit 9141629a58
3 changed files with 29 additions and 36 deletions
+27 -11
View File
@@ -1,23 +1,39 @@
use esp_hal::gpio::interconnect::PeripheralOutput; use esp_hal::gpio::interconnect::PeripheralOutput;
use esp_hal::gpio::DriveMode; use esp_hal::gpio::DriveMode;
use esp_hal::ledc::channel::{self, Channel, ChannelIFace}; use esp_hal::ledc::channel::{self, Channel, ChannelIFace};
use esp_hal::ledc::timer::TimerIFace; use esp_hal::ledc::timer::{self, Timer, TimerIFace};
use esp_hal::ledc::LowSpeed; use esp_hal::ledc::{LSGlobalClkSource, Ledc, LowSpeed};
use esp_hal::peripherals::LEDC;
use esp_hal::time::Rate;
/// PWM frequency for the backlight (Hz).
const BACKLIGHT_FREQ: Rate = Rate::from_khz(5);
/// Maximum duty cycle percentage. The board documentation warns against /// Maximum duty cycle percentage. The board documentation warns against
/// running the display above 50% brightness, so `level = 1.0` maps to this. /// running the display above 50% brightness, so `level = 1.0` maps to this.
const MAX_DUTY_PCT: u8 = 50; const MAX_DUTY_PCT: u8 = 50;
#[derive(Debug)] /// Create and configure the LEDC timer used by the backlight.
pub enum Error { ///
Channel(channel::Error), /// Returns the `Ledc` and `Timer` so the caller can build a [`LcdBacklight`]
/// that borrows the timer.
pub fn setup_timer(
ledc: LEDC<'static>,
) -> Result<(Ledc<'static>, Timer<'static, LowSpeed>), timer::Error> {
let mut ledc = Ledc::new(ledc);
ledc.set_global_slow_clock(LSGlobalClkSource::APBClk);
let mut timer = ledc.timer::<LowSpeed>(timer::Number::Timer0);
timer.configure(timer::config::Config {
duty: timer::config::Duty::Duty8Bit,
clock_source: timer::LSClockSource::APBClk,
frequency: BACKLIGHT_FREQ,
})?;
Ok((ledc, timer))
} }
impl From<channel::Error> for Error { pub type Error = channel::Error;
fn from(e: channel::Error) -> Self {
Error::Channel(e)
}
}
/// Backlight PWM driver. The channel holds a reference to the caller-owned /// Backlight PWM driver. The channel holds a reference to the caller-owned
/// timer, so this type's lifetime is bounded by the timer's lifetime. /// timer, so this type's lifetime is bounded by the timer's lifetime.
@@ -45,6 +61,6 @@ impl<'a> LcdBacklight<'a> {
/// documentation recommends. /// documentation recommends.
pub fn set_level(&mut self, level: f32) -> Result<(), Error> { pub fn set_level(&mut self, level: f32) -> Result<(), Error> {
let duty_pct = ((level.clamp(0.0, 1.0) * MAX_DUTY_PCT as f32) + 0.5) as u8; let duty_pct = ((level.clamp(0.0, 1.0) * MAX_DUTY_PCT as f32) + 0.5) as u8;
self.channel.set_duty(duty_pct).map_err(Error::Channel) self.channel.set_duty(duty_pct)
} }
} }
-13
View File
@@ -23,20 +23,7 @@ impl RgbLed {
}) })
} }
pub fn set_color(
&mut self,
r: u8,
g: u8,
b: u8,
) -> Result<(), esp_hal_smartled::AdapterError> {
self.led.write([RGB8 { r, g, b }])
}
pub fn set_rgb(&mut self, rgb: RGB8) -> Result<(), esp_hal_smartled::AdapterError> { pub fn set_rgb(&mut self, rgb: RGB8) -> Result<(), esp_hal_smartled::AdapterError> {
self.led.write([rgb]) self.led.write([rgb])
} }
pub fn off(&mut self) -> Result<(), esp_hal_smartled::AdapterError> {
self.set_color(0, 0, 0)
}
} }
+2 -12
View File
@@ -6,8 +6,6 @@ mod led;
use esp_backtrace as _; use esp_backtrace as _;
use esp_bootloader_esp_idf::esp_app_desc; use esp_bootloader_esp_idf::esp_app_desc;
use esp_hal::ledc::timer::{self, TimerIFace};
use esp_hal::ledc::{LSGlobalClkSource, Ledc, LowSpeed};
use esp_hal::{init, rmt::Rmt, time::Rate, Config}; use esp_hal::{init, rmt::Rmt, time::Rate, Config};
use esp_println::println; use esp_println::println;
use smart_leds::hsv::{hsv2rgb, Hsv}; use smart_leds::hsv::{hsv2rgb, Hsv};
@@ -24,16 +22,8 @@ fn main() -> ! {
led::RgbLed::new(rmt.channel0, peripherals.GPIO8).expect("Failed to init RGB LED") led::RgbLed::new(rmt.channel0, peripherals.GPIO8).expect("Failed to init RGB LED")
}; };
let mut ledc = Ledc::new(peripherals.LEDC); let (_ledc, timer) =
ledc.set_global_slow_clock(LSGlobalClkSource::APBClk); backlight::setup_timer(peripherals.LEDC).expect("Failed to init backlight timer");
let mut timer = ledc.timer::<LowSpeed>(timer::Number::Timer0);
timer
.configure(timer::config::Config {
duty: timer::config::Duty::Duty8Bit,
clock_source: timer::LSClockSource::APBClk,
frequency: Rate::from_khz(5),
})
.expect("Failed to configure backlight timer");
let mut backlight = let mut backlight =
backlight::LcdBacklight::new(&timer, peripherals.GPIO22).expect("Failed to init backlight"); backlight::LcdBacklight::new(&timer, peripherals.GPIO22).expect("Failed to init backlight");