Better comments and renamed variable names for more clarity.

This commit is contained in:
Nic0w 2021-05-04 22:16:04 +02:00
parent be78a5c792
commit 8586f98c02

View file

@ -354,7 +354,9 @@ impl<D: UARTDevice> UARTPeripheral<Enabled, D> {
} }
} }
/// Baudrate dividers calculation. Code inspired from the C SDK. /// The PL011 (PrimeCell UART) supports a fractional baud rate divider
/// From the wanted baudrate, we calculate the divider's two parts: integer and fractional parts.
/// Code inspired from the C SDK.
fn calculate_baudrate_dividers( fn calculate_baudrate_dividers(
wanted_baudrate: &Baud, wanted_baudrate: &Baud,
frequency: &Hertz, frequency: &Hertz,
@ -368,9 +370,9 @@ fn calculate_baudrate_dividers(
Ok(match (baudrate_div >> 7, ((baudrate_div & 0x7F) + 1) / 2) { Ok(match (baudrate_div >> 7, ((baudrate_div & 0x7F) + 1) / 2) {
(0, _) => (1, 0), (0, _) => (1, 0),
(ibrd, _) if ibrd >= 65535 => (65535, 0), (int_part, _) if int_part >= 65535 => (65535, 0),
(ibrd, fbrd) => (ibrd as u16, fbrd as u16), (int_part, frac_part) => (int_part as u16, frac_part as u16),
}) })
} }
@ -380,15 +382,17 @@ fn configure_baudrate(
wanted_baudrate: &Baud, wanted_baudrate: &Baud,
frequency: &Hertz, frequency: &Hertz,
) -> Result<Baud, Error> { ) -> Result<Baud, Error> {
let (baud_ibrd, baud_fbrd) = calculate_baudrate_dividers(wanted_baudrate, frequency)?; let (baud_div_int, baud_div_frac) = calculate_baudrate_dividers(wanted_baudrate, frequency)?;
// Load PL011's baud divisor registers // First we load the integer part of the divider.
device.uartibrd.write(|w| unsafe { device.uartibrd.write(|w| unsafe {
w.baud_divint().bits(baud_ibrd as u16); w.baud_divint().bits(baud_div_int as u16);
w w
}); });
// Then we load the fractional part of the divider.
device.uartfbrd.write(|w| unsafe { device.uartfbrd.write(|w| unsafe {
w.baud_divfrac().bits(baud_fbrd as u8); w.baud_divfrac().bits(baud_div_frac as u8);
w w
}); });
@ -397,7 +401,7 @@ fn configure_baudrate(
device.uartlcr_h.modify(|_, w| w); device.uartlcr_h.modify(|_, w| w);
Ok(Baud( Ok(Baud(
(4 * *frequency.integer()) / (64 * baud_ibrd + baud_fbrd) as u32, (4 * *frequency.integer()) / (64 * baud_div_int + baud_div_frac) as u32,
)) ))
} }