tof_control/rb_control/
rb_clk.rs

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use crate::constant::*;

use crate::device::{pca9548a, si5345b};
use crate::helper::rb_type::RBError;

pub fn configure_clk_synth() -> Result<(), RBError> {
    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
    i2c_mux.select(RB_SI5345B_CHANNEL)?;

    let si5345b = si5345b::SI5345B::new(I2C_BUS, RB_SI5345B_ADDRESS);
    si5345b.configure_si5345b()?;
    
    i2c_mux.reset()?;

    Ok(())
}

pub fn program_nvm_clk_synth(verbose: bool) -> Result<(), RBError> {
    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
    i2c_mux.select(RB_SI5345B_CHANNEL)?;

    let si5345b = si5345b::SI5345B::new(I2C_BUS, RB_SI5345B_ADDRESS);

    // Check how many user banks available
    let available_nvm_bank = si5345b.read_available_nvm_bank()?;
    match available_nvm_bank {
        2 => {
            if verbose {
                println!("Number of User Banks Available to Burn: 2");
            }
        },
        1 => {
            if verbose {
                println!("Number of User Banks Available to Burn: 1");
            }
        }
        0 => {
            println!("Number of User Banks Available to Burn: 0");
            println!("Exiting the program...");
            std::process::exit(1);
        }
        _ => {
            println!("ACTIVE_NVM_BANK Error");
            println!("Exiting the program...");
            std::process::exit(1);
        }
    }

    // Program SI5345B NVM
    if verbose {
        println!("Programming SI5345B NVM...");
    }
    si5345b.configure_nvm_si5345b()?;
    if verbose {
        println!("Done programming SI5345B NVM");
    }
    
    i2c_mux.reset()?;

    if verbose {
        println!("Complete programming SI5345B NVM!");
    }

    Ok(())
}


pub fn reset_clk_synth(rst_type: u8) -> Result<(), RBError> {
    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
    i2c_mux.select(RB_SI5345B_CHANNEL)?;

    let si5345b = si5345b::SI5345B::new(I2C_BUS, RB_SI5345B_ADDRESS);

    match rst_type {
        0 => {
            si5345b.soft_reset_si5345b()?;
            si5345b.configure_si5345b()?;
        }
        1 => {
            si5345b.hard_reset_si5345b()?;
        }
        _ => {},
    }

    i2c_mux.reset()?;

    Ok(())
}