stm32_uart_loader/
linux.rs

1use std::io::ErrorKind as IoErrorKind;
2use std::path::Path;
3
4use linux_embedded_hal::serial_core::{
5    BaudRate, CharSize, FlowControl, Parity, SerialDevice as _,
6    SerialPortSettings as _, StopBits,
7};
8use linux_embedded_hal::{Delay, Serial};
9
10use crate::{Options, Programmer, SerialPort};
11
12impl SerialPort<IoErrorKind> for Serial {
13    fn set_rts(&mut self, level: bool) -> Result<(), IoErrorKind> {
14        self.0.set_rts(level).unwrap();
15        Ok(())
16    }
17    fn set_dtr(&mut self, level: bool) -> Result<(), IoErrorKind> {
18        self.0.set_dtr(level).unwrap();
19        Ok(())
20    }
21}
22
23impl Programmer<Serial, Delay, IoErrorKind> {
24    /// Create a new linux serial port programmer instance
25    pub fn linux<P: AsRef<Path>>(
26        port: P,
27        baud: usize,
28        options: Options,
29    ) -> Result<Self, anyhow::Error> {
30        // Open port
31        let mut port = Serial::open(port.as_ref())?;
32
33        // Apply settings
34        let mut settings = port.0.read_settings()?;
35
36        settings.set_char_size(CharSize::Bits8);
37        settings.set_stop_bits(StopBits::Stop1);
38        settings.set_baud_rate(BaudRate::from_speed(baud))?;
39        settings.set_flow_control(FlowControl::FlowNone);
40        settings.set_parity(Parity::ParityEven);
41
42        port.0.write_settings(&settings)?;
43
44        // Return instance
45        let s = Self::new(port, Delay {}, options)?;
46
47        Ok(s)
48    }
49}