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
9pub 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 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 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 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 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 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 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 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 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 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
186pub 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
215pub 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
247fn 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
273fn 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
299fn 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
325fn 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
351fn 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
377fn 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
403fn 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
429fn 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
455fn 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}