1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//! UART peripheral patches.

use crate::copy_field;
use anyhow::Result;
use drone_svd::Device;

pub fn fix_usart1_1(dev: &mut Device) -> Result<()> {
    copy_field(dev, "USART3", "USART1", "CR3", "UCESM");
    Ok(())
}

pub fn fix_usart1_2(dev: &mut Device) -> Result<()> {
    dev.periph("USART1").reg("BRR").remove_field("DIV_Mantissa");
    dev.periph("USART1").reg("BRR").remove_field("DIV_Fraction");
    dev.periph("USART1").reg("BRR").new_field(|field| {
        field.name = "BRR".to_string();
        field.description = "BRR".to_string();
        field.bit_offset = Some(0);
        field.bit_width = Some(16);
    });
    Ok(())
}

pub fn fix_usart3(dev: &mut Device) -> Result<()> {
    dev.periph("RCC").reg("APB1ENR1").new_field(|field| {
        field.name = "USART3EN".to_string();
        field.description = "USART3 clock enable".to_string();
        field.bit_offset = Some(18);
        field.bit_width = Some(1);
    });
    dev.periph("RCC").reg("APB1RSTR1").new_field(|field| {
        field.name = "USART3RST".to_string();
        field.description = "USART3 reset".to_string();
        field.bit_offset = Some(18);
        field.bit_width = Some(1);
    });
    dev.periph("RCC").reg("APB1SMENR1").new_field(|field| {
        field.name = "USART3SMEN".to_string();
        field.description = "USART3 clocks enable during Sleep and Stop modes".to_string();
        field.bit_offset = Some(18);
        field.bit_width = Some(1);
    });
    Ok(())
}

pub fn fix_uart4(dev: &mut Device) -> Result<()> {
    dev.periph("RCC").reg("APB1RSTR1").new_field(|field| {
        field.name = "UART4RST".to_string();
        field.description = "UART4 reset".to_string();
        field.bit_offset = Some(19);
        field.bit_width = Some(1);
    });
    dev.periph("RCC").reg("APB1SMENR1").new_field(|field| {
        field.name = "UART4SMEN".to_string();
        field.description = "UART4 clocks enable during Sleep and Stop modes".to_string();
        field.bit_offset = Some(19);
        field.bit_width = Some(1);
    });
    dev.periph("RCC").reg("CCIPR").field("USART4SEL").name = "UART4SEL".to_string();
    Ok(())
}

pub fn fix_lpuart1(dev: &mut Device) -> Result<()> {
    copy_field(dev, "USART3", "LPUART1", "CR3", "UCESM");
    Ok(())
}