multi-sample-rate support, evk fixes
This commit is contained in:
@@ -130,7 +130,7 @@ where
|
||||
fn cr1_for_rate(&self, rate: u32) -> u16 {
|
||||
let fs_ratio = self.mclk / rate;
|
||||
if !self.mclk.is_multiple_of(rate) {
|
||||
defmt::warn!("sample rate should be a multiple of mclk");
|
||||
defmt::warn!("[wm8904] sample rate should be a multiple of mclk");
|
||||
}
|
||||
let clk_sys_rate: u16 = match fs_ratio {
|
||||
64 => 0,
|
||||
@@ -144,7 +144,7 @@ where
|
||||
1408 => 8,
|
||||
1536 => 9,
|
||||
_ => {
|
||||
defmt::warn!("unsupport ratio {}", fs_ratio);
|
||||
defmt::warn!("[wm8904] unsupport ratio {}", fs_ratio);
|
||||
0
|
||||
}
|
||||
};
|
||||
@@ -181,26 +181,30 @@ where
|
||||
match self.i2c.write_read(WM8904_I2C_ADDRESS, &[0], &mut buf) {
|
||||
Ok(_) => {
|
||||
let chip_id = ((buf[0] as u16) << 8) | buf[1] as u16;
|
||||
defmt::info!("Read chip ID: {:x}", chip_id)
|
||||
defmt::info!("[wm8904] Read chip ID: {:x}", chip_id)
|
||||
}
|
||||
Err(_) => defmt::error!("Error reading I2C"),
|
||||
Err(_) => defmt::error!("[wm8904] Error reading I2C"),
|
||||
}
|
||||
|
||||
self.write_reg(RegisterAddress::ClockRates2, 0x000f); // OPCLK_ENA | CLK_SYS_ENA | CLK_DSP_ENA | TOCLK_ENA
|
||||
self.write_reg(RegisterAddress::WriteSeq0, 0x0100); // write sequencer 0 ENA
|
||||
self.write_reg(RegisterAddress::WriteSeq3, 0x0100); // write sequencer 3 START, INDEX=0
|
||||
// wait on write sequencer
|
||||
defmt::info!("[codec] waiting on write seq");
|
||||
defmt::info!("[wm8904] waiting on write seq");
|
||||
loop {
|
||||
let mut buf = [0; 2];
|
||||
self.i2c
|
||||
.write_read(WM8904_I2C_ADDRESS, &[0x70], &mut buf)
|
||||
.write_read(
|
||||
WM8904_I2C_ADDRESS,
|
||||
&[RegisterAddress::WriteSeq4 as u8],
|
||||
&mut buf,
|
||||
)
|
||||
.ok();
|
||||
if buf[1] & 1 == 0 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
defmt::debug!("[codec] write seq done");
|
||||
defmt::debug!("[wm8904] write seq done");
|
||||
self.write_reg(RegisterAddress::ClockRates0, 0);
|
||||
self.write_reg(RegisterAddress::PowerMgmt0, 0); // IN PGAs disabled
|
||||
self.write_reg(RegisterAddress::PowerMgmt2, 0x0003); // HPL_PGA_ENA | HPR_PGA_ENA
|
||||
@@ -236,7 +240,7 @@ where
|
||||
}
|
||||
fn change_rate(&mut self, new_rate: u32) {
|
||||
// TODO: mute, stop clocks etc.
|
||||
defmt::info!("dac rate -> {}", new_rate);
|
||||
defmt::info!("[wm8904] dac rate -> {}", new_rate);
|
||||
self.write_reg(RegisterAddress::ClockRates1, self.cr1_for_rate(new_rate));
|
||||
self.write_reg(
|
||||
RegisterAddress::AudioInterface2,
|
||||
|
||||
Reference in New Issue
Block a user