tof_control/rb_control/
rb_gpioe.rs

1use std::thread;
2use std::time::Duration;
3
4use crate::constant::*;
5use crate::helper::rb_type::RBError;
6use crate::device::cy8c9560a::CY8C9560A;
7use crate::device::{cy8c9560a, pca9548a};
8
9/*
10Ports used for Readout Board V2.5.2
11cy8c9560A
12//////////////////////////////////////////
13//Output
14//////////////////////////////////////////
15
16GP0[7]
17GP0[7]: Si5345_FINC
18
19GP1[]
20
21GP2[1:0]
22GP2[1]: HMC849_EN3
23GP2[0]: HMC849_VCTL3
24
25GP3[5:4,2:0]
26GP3[5]: MARS_WDI_GE
27GP3[4]: ~VCAL_RST
28GP3[2]: Si5345_FDEC
29GP3[1]: ~Si5345_OE
30GP3[0]: ~Si5345_RST
31
32GP4[7:2]
33GP4[7]: HMC849_VCTL6
34GP4[6]: HMC849_EN6
35GP4[5]: HMC849_VCTL7
36GP4[4]: HMC849_EN7
37GP4[3]: HMC849_VCTL8
38GP4[2]: HMC849_EN8
39
40GP5[5:4,1:0]
41GP5[5]: HMC849_EN5
42GP5[4]: HMC849_VCTL5
43GP5[1]: HMC849_VCTL4
44GP5[0]: HMC849_EN4
45
46GP6[]
47
48GP7[7:0]
49GP7[7]: TCA_CLK_SC_EN
50GP7[6]: TCA_CLK_OUT_EN
51GP7[5]: HMC849_EN0
52GP7[4]: HMC849_VCTL0
53GP7[3]: HMC849_EN1
54GP7[2]: HMC849_VCTL1
55GP7[1]: HMC849_EN2
56GP7[0]: HMC849_VCTL2
57
58Initialization Value:
59GP0: 0x00
60GP1: 0xFF
61GP2: 0x03
62GP3: 0x13
63GP4: 0xFC
64GP5: 0x33
65GP6: 0xFF
66GP7: 0x3F
67
68*/
69
70pub fn initialize_gpioe() -> Result<(), RBError> {
71    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
72    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
73
74    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
75
76    // Port 0
77    cy8c9560a.select_port(0)?;
78    cy8c9560a.set_interrupt_mask_port(0x00)?;
79    cy8c9560a.set_pin_direction(0x00)?;
80    cy8c9560a.set_drive_mode(4)?;
81
82    // Port 1
83    cy8c9560a.select_port(1)?;
84    cy8c9560a.set_interrupt_mask_port(0x00)?;
85    cy8c9560a.set_pin_direction(0x00)?;
86    cy8c9560a.set_drive_mode(1)?;
87
88    // Port 2
89    cy8c9560a.select_port(2)?;
90    cy8c9560a.set_interrupt_mask_port(0x00)?;
91    cy8c9560a.set_pin_direction(0x00)?;
92    cy8c9560a.set_drive_mode(4)?;
93
94    // Port 3
95    cy8c9560a.select_port(3)?;
96    cy8c9560a.set_interrupt_mask_port(0x00)?;
97    cy8c9560a.set_pin_direction(0x00)?;
98    cy8c9560a.set_drive_mode(4)?;
99
100    // Port 4
101    cy8c9560a.select_port(4)?;
102    cy8c9560a.set_interrupt_mask_port(0x00)?;
103    cy8c9560a.set_pin_direction(0x00)?;
104    cy8c9560a.set_drive_mode(4)?;
105
106    // Port 5
107    cy8c9560a.select_port(5)?;
108    cy8c9560a.set_interrupt_mask_port(0x00)?;
109    cy8c9560a.set_pin_direction(0x00)?;
110    cy8c9560a.set_drive_mode(4)?;
111
112    // Port 6
113    cy8c9560a.select_port(6)?;
114    cy8c9560a.set_interrupt_mask_port(0x00)?;
115    cy8c9560a.set_pin_direction(0x00)?;
116    cy8c9560a.set_drive_mode(1)?;
117
118    // Port 7
119    cy8c9560a.select_port(7)?;
120    cy8c9560a.set_interrupt_mask_port(0x00)?;
121    cy8c9560a.set_pin_direction(0x00)?;
122    cy8c9560a.set_drive_mode(4)?;
123
124    // Set ouput ports
125    cy8c9560a.set_output_port(0, 0x00)?;
126    cy8c9560a.set_output_port(1, 0xFF)?;
127    cy8c9560a.set_output_port(2, 0x03)?;
128    cy8c9560a.set_output_port(3, 0x13)?;
129    cy8c9560a.set_output_port(4, 0xFC)?;
130    cy8c9560a.set_output_port(5, 0x33)?;
131    cy8c9560a.set_output_port(6, 0xFF)?;
132    cy8c9560a.set_output_port(7, 0x3F)?;
133
134    i2c_mux.reset()?;
135
136    Ok(())
137}
138
139pub fn reset_si5345b_gpioe() -> Result<(), RBError> {
140    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
141    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
142
143    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
144    let mut value = cy8c9560a.read_port_status(3)?;
145    value = value ^ 0x01;
146    cy8c9560a.set_output_port(3, value)?;
147    value = cy8c9560a.read_port_status(3)?;
148    value = value | 0x01;
149    cy8c9560a.set_output_port(3, value)?;
150
151    i2c_mux.reset()?;
152
153    thread::sleep(Duration::from_millis(2000));
154
155    Ok(())
156}
157
158pub fn enable_si5345b_gpioe() -> Result<(), RBError> {
159    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
160    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
161
162    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
163    let mut value = cy8c9560a.read_port_status(3)?;
164    value = (value & !0x02) | 0 << 1;
165    cy8c9560a.set_output_port(3, value)?;
166
167    i2c_mux.reset()?;
168
169    Ok(())
170}
171
172pub fn enable_ad5675_gpioe() -> Result<(), RBError> {
173    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
174    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
175
176    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
177    let mut value = cy8c9560a.read_port_status(3)?;
178    value = (value & !0x10) | 1 << 4;
179    cy8c9560a.set_output_port(3, value)?;
180
181    i2c_mux.reset()?;
182
183    Ok(())
184}
185
186// GP7[7]: TCA_CLK_SC_EN
187// GP7[6]: TCA_CLK_OUT_EN
188pub fn enable_nb3v9312c_gpioe() -> Result<(), RBError>  {
189    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
190    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
191
192    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
193    let mut value = cy8c9560a.read_port_status(7)?;
194    value = value | 0xC0;
195    cy8c9560a.set_output_port(7, value)?;
196
197    i2c_mux.reset()?;
198
199    Ok(())
200}
201pub fn disable_nb3v9312c_gpioe() -> Result<(), RBError>  {
202    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
203    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
204
205    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
206    let mut value = cy8c9560a.read_port_status(7)?;
207    value = value & 0x3F;
208    cy8c9560a.set_output_port(7, value)?;
209
210    i2c_mux.reset()?;
211
212    Ok(())
213}
214
215/*
216  HMC849 Truth Table:
217 |_VCTL__|__EN__|  |_RFC -> RF1_|_RFC -> RF2_|
218    0    |   0           OFF    |     ON
219    1    |   0           ON           OFF
220    0    |   1           OFF          OFF
221    1    |   1           OFF          OFF
222
223    hmcChannel: 0 - 8
224    mode: 0: RFC = OFF  (No Connection)
225          1: RFC -> RF1 (TCA Calibration Input)
226          2: RFC -> RF2 (SMA Input)
227
228*/
229pub fn rf_input_select_gpioe(mode: u8) -> Result<(), RBError> {
230    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
231    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
232
233    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
234    drs_ch1_input_select(cy8c9560a, mode)?;
235    drs_ch2_input_select(cy8c9560a, mode)?;
236    drs_ch3_input_select(cy8c9560a, mode)?;
237    drs_ch4_input_select(cy8c9560a, mode)?;
238    drs_ch5_input_select(cy8c9560a, mode)?;
239    drs_ch6_input_select(cy8c9560a, mode)?;
240    drs_ch7_input_select(cy8c9560a, mode)?;
241    drs_ch8_input_select(cy8c9560a, mode)?;
242    drs_ch9_input_select(cy8c9560a, mode)?;
243
244    Ok(())
245}
246
247// GP7[5] = EN
248// GP7[4] = VCTL
249fn drs_ch1_input_select(gpioe: CY8C9560A, mode: u8) -> Result<(), RBError> {
250    let port_status = gpioe.read_port_status(7)?;
251
252    match mode {
253        0 => {
254            let value = port_status | 0x30;
255            gpioe.set_output_port(7, value)?;
256        }
257        1 => {
258            let value = (port_status & !0x30) | 0x10;
259            gpioe.set_output_port(7, value)?;
260        }
261        2 => {
262            let value = (port_status & !0x30) | 0x00;
263            gpioe.set_output_port(7, value)?;
264        }
265        _ => {
266            gpioe.set_output_port(7, port_status)?;
267        }
268    }
269
270    Ok(())
271}
272
273// GP7[3] = EN
274// GP7[2] = VCTL
275fn drs_ch2_input_select(gpioe: CY8C9560A, mode: u8) -> Result<(), RBError> {
276    let port_status = gpioe.read_port_status(7)?;
277
278    match mode {
279        0 => {
280            let value = port_status | 0x0C;
281            gpioe.set_output_port(7, value)?;
282        }
283        1 => {
284            let value = (port_status & !0x0C) | 0x04;
285            gpioe.set_output_port(7, value)?;
286        }
287        2 => {
288            let value = (port_status & !0x0C) | 0x00;
289            gpioe.set_output_port(7, value)?;
290        }
291        _ => {
292            gpioe.set_output_port(7, port_status)?;
293        }
294    }
295
296    Ok(())
297}
298
299// GP7[1] = EN
300// GP7[0] = VCTL
301fn drs_ch3_input_select(gpioe: CY8C9560A, mode: u8) -> Result<(), RBError> {
302    let port_status = gpioe.read_port_status(7)?;
303
304    match mode {
305        0 => {
306            let value = port_status | 0x03;
307            gpioe.set_output_port(7, value)?;
308        }
309        1 => {
310            let value = (port_status & !0x03) | 0x01;
311            gpioe.set_output_port(7, value)?;
312        }
313        2 => {
314            let value = (port_status & !0x03) | 0x00;
315            gpioe.set_output_port(7, value)?;
316        }
317        _ => {
318            gpioe.set_output_port(7, port_status)?;
319        }
320    }
321
322    Ok(())
323}
324
325// GP2[1] = EN
326// GP2[0] = VCTL
327fn drs_ch4_input_select(gpioe: CY8C9560A, mode: u8) -> Result<(), RBError> {
328    let port_status = gpioe.read_port_status(2)?;
329
330    match mode {
331        0 => {
332            let value = port_status | 0x03;
333            gpioe.set_output_port(2, value)?;
334        }
335        1 => {
336            let value = (port_status & !0x03) | 0x01;
337            gpioe.set_output_port(2, value)?;
338        }
339        2 => {
340            let value = (port_status & !0x03) | 0x00;
341            gpioe.set_output_port(2, value)?;
342        }
343        _ => {
344            gpioe.set_output_port(2, port_status)?;
345        }
346    }
347
348    Ok(())
349}
350
351// GP5[1] = VCTL
352// GP5[0] = EN
353fn drs_ch5_input_select(gpioe: CY8C9560A, mode: u8) -> Result<(), RBError> {
354    let port_status = gpioe.read_port_status(5)?;
355
356    match mode {
357        0 => {
358            let value = port_status | 0x03;
359            gpioe.set_output_port(5, value)?;
360        }
361        1 => {
362            let value = (port_status & !0x03) | 0x02;
363            gpioe.set_output_port(5, value)?;
364        }
365        2 => {
366            let value = (port_status & !0x03) | 0x00;
367            gpioe.set_output_port(5, value)?;
368        }
369        _ => {
370            gpioe.set_output_port(5, port_status)?;
371        }
372    }
373
374    Ok(())
375}
376
377// GP5[5] = EN
378// GP5[4] = VCTL
379fn drs_ch6_input_select(gpioe: CY8C9560A, mode: u8) -> Result<(), RBError> {
380    let port_status = gpioe.read_port_status(5)?;
381
382    match mode {
383        0 => {
384            let value = port_status | 0x30;
385            gpioe.set_output_port(5, value)?;
386        }
387        1 => {
388            let value = (port_status & !0x30) | 0x10;
389            gpioe.set_output_port(5, value)?;
390        }
391        2 => {
392            let value = (port_status & !0x30) | 0x00;
393            gpioe.set_output_port(5, value)?;
394        }
395        _ => {
396            gpioe.set_output_port(5, port_status)?;
397        }
398    }
399
400    Ok(())
401}
402
403// GP4[7] = VCTL
404// GP4[6] = EN
405fn drs_ch7_input_select(gpioe: CY8C9560A, mode: u8) -> Result<(), RBError> {
406    let port_status = gpioe.read_port_status(4)?;
407
408    match mode {
409        0 => {
410            let value = port_status | 0xC0;
411            gpioe.set_output_port(4, value)?;
412        }
413        1 => {
414            let value = (port_status & !0xC0) | 0x80;
415            gpioe.set_output_port(4, value)?;
416        }
417        2 => {
418            let value = (port_status & !0xC0) | 0x00;
419            gpioe.set_output_port(4, value)?;
420        }
421        _ => {
422            gpioe.set_output_port(4, port_status)?;
423        }
424    }
425
426    Ok(())
427}
428
429// GP4[5] = VCTL
430// GP4[4] = EN
431fn drs_ch8_input_select(gpioe: CY8C9560A, mode: u8) -> Result<(), RBError> {
432    let port_status = gpioe.read_port_status(4)?;
433
434    match mode {
435        0 => {
436            let value = port_status | 0x30;
437            gpioe.set_output_port(4, value)?;
438        }
439        1 => {
440            let value = (port_status & !0x30) | 0x20;
441            gpioe.set_output_port(4, value)?;
442        }
443        2 => {
444            let value = (port_status & !0x30) | 0x00;
445            gpioe.set_output_port(4, value)?;
446        }
447        _ => {
448            gpioe.set_output_port(4, port_status)?;
449        }
450    }
451
452    Ok(())
453}
454
455// GP4[3] = VCTL
456// GP4[2] = EN
457fn drs_ch9_input_select(gpioe: CY8C9560A, mode: u8) -> Result<(), RBError> {
458    let port_status = gpioe.read_port_status(4)?;
459
460    match mode {
461        0 => {
462            let value = port_status | 0x0C;
463            gpioe.set_output_port(4, value)?;
464        }
465        1 => {
466            let value = (port_status & !0x0C) | 0x08;
467            gpioe.set_output_port(4, value)?;
468        }
469        2 => {
470            let value = (port_status & !0x0C) | 0x00;
471            gpioe.set_output_port(4, value)?;
472        }
473        _ => {
474            gpioe.set_output_port(4, port_status)?;
475        }
476    }
477
478    Ok(())
479}
480
481
482pub fn device_info_gpioe() -> Result<(u8, u8, Vec<u8>), RBError> {
483    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
484    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
485
486    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
487    let (device_family, device_setting) = cy8c9560a.read_device_info()?;
488    let mut port_status = Vec::new();
489    for i in 0..=7 {
490        port_status.push(cy8c9560a.read_port_status(i)?);
491    }
492
493    Ok((
494        device_family,
495        device_setting,
496        port_status,
497    ))
498}
499
500pub fn read_port_gpioe() -> Result<Vec<u8>, RBError> {
501    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
502    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
503
504    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
505    let mut gp = Vec::new();
506    for i in 0..=7 {
507        gp.push(cy8c9560a.read_port_status(i)?);
508    }
509
510    i2c_mux.reset()?;
511
512    Ok(gp)
513}
514
515pub fn set_rf_switch_gpioe(mode: u8) -> Result<(), RBError> {
516    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
517    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
518
519    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
520
521    for i in 0..=8 {
522        if i == 8 {
523            match mode {
524                0 => cy8c9560a.set_rf_switch(i, 0)?,
525                _ => cy8c9560a.set_rf_switch(i, 2)?,
526            }
527        } else {
528            cy8c9560a.set_rf_switch(i, mode)?
529        }
530    }
531
532    i2c_mux.reset()?;
533
534    Ok(())
535}
536
537pub fn enable_tcal_clock_gpioe(mode: u8) -> Result<(), RBError> {
538    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
539    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
540
541    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
542    if mode == 1 {
543        cy8c9560a.enable_tcal_clock()?;
544    }
545
546    i2c_mux.reset()?;
547
548    Ok(())
549}
550
551pub fn disable_tcal_clock_gpioe() -> Result<(), RBError> {
552    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
553    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
554
555    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
556    cy8c9560a.disable_tcal_clock()?;
557
558    i2c_mux.reset()?;
559
560    Ok(())
561}
562
563pub fn dac_reset_gpioe() -> Result<(), RBError> {
564    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
565    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
566
567    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
568    let mut value = cy8c9560a.read_port_status(3)?;
569    value = (value & !0x10) | 0x10;
570    cy8c9560a.set_output_port(3, value)?;
571
572    i2c_mux.reset()?;
573
574    Ok(())
575}
576
577pub fn program_eeprom_gpioe() -> Result<(), RBError> {
578    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
579    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
580
581    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
582    let enable_register = cy8c9560a.read_enable_register()?;
583    if (enable_register & 0x02) != 0x02 {
584        cy8c9560a.enable_eeprom()?;
585    }
586
587    cy8c9560a.store_config_eeprom_por()?;
588
589    i2c_mux.reset()?;
590    
591    Ok(())
592}
593
594pub fn reset_eeprom_gpioe() -> Result<(), RBError> {
595    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
596    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
597
598    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
599    let enable_register = cy8c9560a.read_enable_register()?;
600    if (enable_register & 0x02) != 0x02 {
601        cy8c9560a.enable_eeprom()?;
602    }
603
604    cy8c9560a.reset_config_eeprom_por()?;
605
606    i2c_mux.reset()?;
607    
608    Ok(())
609}
610
611pub fn reset_gpioe() -> Result<(), RBError> {
612    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
613    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
614
615    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
616    cy8c9560a.initialize_all_outputs()?;
617
618    i2c_mux.reset()?;
619    
620    Ok(())
621}
622
623pub fn read_rf_input_port(ch: u8) -> Result<u8, RBError> {
624    let i2c_mux = pca9548a::PCA9548A::new(I2C_BUS, RB_PCA9548A_ADDRESS_2);
625    i2c_mux.select(RB_CY8C9560A_CHANNEL)?;
626
627    let cy8c9560a = cy8c9560a::CY8C9560A::new(I2C_BUS, RB_CY8C9560A_ADDRESS);
628    let mut rf_input_port: u8 = Default::default();
629    match ch {
630
631        1 => {
632            rf_input_port = cy8c9560a.read_port_status(7)?;
633            rf_input_port = (rf_input_port & 0x30) >> 4;
634        }
635        2 => {
636            rf_input_port = cy8c9560a.read_port_status(7)?;
637            rf_input_port = (rf_input_port & 0x0C) >> 2;
638        }
639        3 => {
640            rf_input_port = cy8c9560a.read_port_status(7)?;
641            rf_input_port = rf_input_port & 0x03;
642        }
643        4 => {
644            rf_input_port = cy8c9560a.read_port_status(2)?;
645            rf_input_port = rf_input_port & 0x03;
646        }
647        5 => {
648            rf_input_port = cy8c9560a.read_port_status(5)?;
649            rf_input_port = rf_input_port & 0x03;
650            rf_input_port = ((rf_input_port & 0x02) >> 1) | ((rf_input_port & 0x01) << 1)
651        }
652        6 => {
653            rf_input_port = cy8c9560a.read_port_status(5)?;
654            rf_input_port = (rf_input_port & 0x30) >> 4;
655        }
656        7 => {
657            rf_input_port = cy8c9560a.read_port_status(4)?;
658            rf_input_port = (rf_input_port & 0xC0) >> 6;
659            rf_input_port = ((rf_input_port & 0x02) >> 1) | ((rf_input_port & 0x01) << 1)
660        }
661        8 => {
662            rf_input_port = cy8c9560a.read_port_status(4)?;
663            rf_input_port = (rf_input_port & 0x30) >> 4;
664            rf_input_port = ((rf_input_port & 0x02) >> 1) | ((rf_input_port & 0x01) << 1)
665        }
666        9 => {
667            rf_input_port = cy8c9560a.read_port_status(4)?;
668            rf_input_port = (rf_input_port & 0x0C) >> 2;
669            rf_input_port = ((rf_input_port & 0x02) >> 1) | ((rf_input_port & 0x01) << 1)
670        }
671        _ => {}
672    }
673
674    i2c_mux.reset()?;
675
676    Ok(rf_input_port)
677}