tof_control/rb_control/
rb_clk.rs

1use crate::constant::*;
2
3use crate::device::{pca9548a, si5345b};
4use crate::helper::rb_type::RBError;
5
6pub fn configure_clk_synth() -> Result<(), RBError> {
7    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
8    i2c_mux.select(RB_SI5345B_CHANNEL)?;
9
10    let si5345b = si5345b::SI5345B::new(I2C_BUS, RB_SI5345B_ADDRESS);
11    si5345b.configure_si5345b()?;
12    
13    i2c_mux.reset()?;
14
15    Ok(())
16}
17
18pub fn program_nvm_clk_synth(verbose: bool) -> Result<(), RBError> {
19    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
20    i2c_mux.select(RB_SI5345B_CHANNEL)?;
21
22    let si5345b = si5345b::SI5345B::new(I2C_BUS, RB_SI5345B_ADDRESS);
23
24    // Check how many user banks available
25    let available_nvm_bank = si5345b.read_available_nvm_bank()?;
26    match available_nvm_bank {
27        2 => {
28            if verbose {
29                println!("Number of User Banks Available to Burn: 2");
30            }
31        },
32        1 => {
33            if verbose {
34                println!("Number of User Banks Available to Burn: 1");
35            }
36        }
37        0 => {
38            println!("Number of User Banks Available to Burn: 0");
39            println!("Exiting the program...");
40            std::process::exit(1);
41        }
42        _ => {
43            println!("ACTIVE_NVM_BANK Error");
44            println!("Exiting the program...");
45            std::process::exit(1);
46        }
47    }
48
49    // Program SI5345B NVM
50    if verbose {
51        println!("Programming SI5345B NVM...");
52    }
53    si5345b.configure_nvm_si5345b()?;
54    if verbose {
55        println!("Done programming SI5345B NVM");
56    }
57    
58    i2c_mux.reset()?;
59
60    if verbose {
61        println!("Complete programming SI5345B NVM!");
62    }
63
64    Ok(())
65}
66
67
68pub fn reset_clk_synth(rst_type: u8) -> Result<(), RBError> {
69    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
70    i2c_mux.select(RB_SI5345B_CHANNEL)?;
71
72    let si5345b = si5345b::SI5345B::new(I2C_BUS, RB_SI5345B_ADDRESS);
73
74    match rst_type {
75        0 => {
76            si5345b.soft_reset_si5345b()?;
77            si5345b.configure_si5345b()?;
78        }
79        1 => {
80            si5345b.hard_reset_si5345b()?;
81        }
82        _ => {},
83    }
84
85    i2c_mux.reset()?;
86
87    Ok(())
88}