use core::convert::Infallible;
use culvert_async::{ClearableUpdateFlags, FfeLevels, FrlConfig, FrlRate, Scdc, TmdsConfig};
use hdmi_hal_async::scdc::ScdcTransport;
struct SimulatedScdc {
regs: [u8; 256],
}
impl SimulatedScdc {
fn new() -> Self {
Self { regs: [0u8; 256] }
}
fn set(&mut self, addr: u8, val: u8) {
self.regs[addr as usize] = val;
}
}
impl ScdcTransport for SimulatedScdc {
type Error = Infallible;
async fn read(&self, reg: u8) -> Result<u8, Infallible> {
Ok(self.regs[reg as usize])
}
async fn write(&mut self, reg: u8, value: u8) -> Result<(), Infallible> {
self.regs[reg as usize] = value;
Ok(())
}
}
fn main() {
pollster::block_on(run());
}
async fn run() {
let mut transport = SimulatedScdc::new();
transport.set(0x01, 0x01);
transport.set(0x21, 0x01);
transport.set(0x40, 0x4F);
transport.set(0x41, 0x77);
transport.set(0x42, 0x07);
transport.set(0x10, 0x20);
transport.set(0x50, 0x02); transport.set(0x51, 0x80);
transport.set(0x52, 0x4F); transport.set(0x53, 0x81);
transport.set(0x54, 0x00); transport.set(0x55, 0x00); transport.set(0x57, 0x00); transport.set(0x58, 0x00);
let mut scdc = Scdc::new(transport);
let sink_version = scdc.read_sink_version().await.unwrap();
println!("Sink_Version: 0x{sink_version:02X}");
let scrambler = scdc.read_scrambler_status().await.unwrap();
println!("Scrambling active: {}", scrambler.scrambling_active);
let flags = scdc.read_status_flags().await.unwrap();
println!("Clock detected: {}", flags.clock_detected);
println!(
"Lane lock: ch0={} ch1={} ch2={} ln3={}",
flags.ch0_locked, flags.ch1_locked, flags.ch2_locked, flags.ln3_locked
);
println!("FLT_Ready: {}", flags.flt_ready);
let requests = scdc.read_ltp_requests().await.unwrap();
println!(
"LTP requests: {:?} {:?} {:?} {:?}",
requests.lane0, requests.lane1, requests.lane2, requests.lane3
);
let updates = scdc.read_update_flags().await.unwrap();
println!(
"Update flags: status={} ced={} frl_start={} flt_update={}",
updates.status_update, updates.ced_update, updates.frl_start, updates.flt_update
);
let ced = scdc.read_ced().await.unwrap();
println!("CED lane 0: {:?}", ced.lane0.map(|c| c.value()));
println!("CED lane 1: {:?}", ced.lane1.map(|c| c.value()));
println!("CED lane 2: {:?}", ced.lane2);
println!("CED lane 3: {:?}", ced.lane3);
scdc.write_source_version(0x01).await.unwrap();
println!("\nWrote Source_Version = 0x01");
scdc.write_tmds_config(TmdsConfig {
scrambling_enable: true,
high_tmds_clock_ratio: true,
})
.await
.unwrap();
println!("Wrote TMDS_Config: scrambling_enable=true, high_tmds_clock_ratio=true");
scdc.write_frl_config(FrlConfig::new(
FrlRate::Rate6Gbps3Lanes,
FfeLevels::new(2).unwrap(),
))
.await
.unwrap();
println!("Wrote Config_1: frl_rate=6G/3L, ffe_levels=2");
scdc.clear_update_flags(ClearableUpdateFlags::new(
false, false, false, false, true, false,
))
.await
.unwrap();
println!("Cleared flt_update flag");
}