stm32_uart_loader/
linux.rs1use 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 pub fn linux<P: AsRef<Path>>(
26 port: P,
27 baud: usize,
28 options: Options,
29 ) -> Result<Self, anyhow::Error> {
30 let mut port = Serial::open(port.as_ref())?;
32
33 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 let s = Self::new(port, Delay {}, options)?;
46
47 Ok(s)
48 }
49}