libbladerf_rs/
nios_client.rs1use crate::channel::Channel;
2use crate::error::Result;
3use crate::protocol::nios::packet_generic::NiosNum;
4use crate::protocol::nios::{
5 NiosPkt8x16AddrIqCorr, NiosPkt8x16Target, NiosPkt8x32Target, NiosPkt32x32Target,
6 nios_decode_read, nios_decode_write, nios_encode_read, nios_encode_write,
7};
8use crate::transport::Transport;
9use crate::transport::usb::UsbTransport;
10use crate::version::SemanticVersion;
11pub struct NiosCore<T: Transport> {
12 transport: T,
13}
14impl<T: Transport> NiosCore<T> {
15 pub fn new(transport: T) -> Self {
16 Self { transport }
17 }
18 pub fn transport(&self) -> &T {
19 &self.transport
20 }
21 pub fn transport_mut(&mut self) -> &mut T {
22 &mut self.transport
23 }
24 pub fn nios_read<A: NiosNum + Send, D: NiosNum + Send>(
25 &mut self,
26 id: impl Into<u8>,
27 addr: A,
28 ) -> Result<D> {
29 let out_buf = self.transport.out_buffer()?;
30 log::trace!("nios_read: DMA buffer len = {} bytes", out_buf.len());
31 nios_encode_read::<A, D>(out_buf, id.into(), addr);
32 let response = self.transport.submit(None)?;
33 log::trace!("nios_read: response len = {} bytes", response.len());
34 nios_decode_read::<A, D>(response)
35 }
36 pub fn nios_write<A: NiosNum + Send, D: NiosNum + Send>(
37 &mut self,
38 id: impl Into<u8>,
39 addr: A,
40 data: D,
41 ) -> Result<()> {
42 let out_buf = self.transport.out_buffer()?;
43 nios_encode_write::<A, D>(out_buf, id.into(), addr, data);
44 let response = self.transport.submit(None)?;
45 nios_decode_write(response)
46 }
47 pub fn nios_config_read(&mut self) -> Result<u32> {
48 self.nios_read::<u8, u32>(NiosPkt8x32Target::Control, 0)
49 }
50 pub fn nios_config_write(&mut self, value: u32) -> Result<()> {
51 self.nios_write::<u8, u32>(NiosPkt8x32Target::Control, 0, value)
52 }
53 pub fn nios_expansion_gpio_read(&mut self) -> Result<u32> {
54 self.nios_read::<u32, u32>(NiosPkt32x32Target::Exp, u32::MAX)
55 }
56 pub fn nios_expansion_gpio_write(&mut self, mask: u32, val: u32) -> Result<()> {
57 self.nios_write::<u32, u32>(NiosPkt32x32Target::Exp, mask, val)
58 }
59 pub fn nios_expansion_gpio_dir_read(&mut self) -> Result<u32> {
60 self.nios_read::<u32, u32>(NiosPkt32x32Target::ExpDir, u32::MAX)
61 }
62 pub fn nios_expansion_gpio_dir_write(&mut self, mask: u32, val: u32) -> Result<()> {
63 self.nios_write::<u32, u32>(NiosPkt32x32Target::ExpDir, mask, val)
64 }
65 pub fn nios_get_fpga_version(&mut self) -> Result<SemanticVersion> {
66 let regval = self.nios_read::<u8, u32>(NiosPkt8x32Target::Version, 0)?;
67 log::trace!("Read FPGA version word: {regval:#010x}");
68 let version = SemanticVersion {
69 major: ((regval >> 24) & 0xff) as u16,
70 minor: ((regval >> 16) & 0xff) as u16,
71 patch: ((regval & 0xffff) as u16).to_be(),
72 };
73 Ok(version)
74 }
75 pub fn nios_get_iq_gain_correction(&mut self, ch: Channel) -> Result<i16> {
76 let addr = match ch {
77 Channel::Rx => NiosPkt8x16AddrIqCorr::RxGain,
78 Channel::Tx => NiosPkt8x16AddrIqCorr::TxGain,
79 };
80 Ok(self.nios_read::<u8, u16>(NiosPkt8x16Target::IqCorr, addr.into())? as i16)
81 }
82 pub fn nios_get_iq_phase_correction(&mut self, ch: Channel) -> Result<i16> {
83 let addr = match ch {
84 Channel::Rx => NiosPkt8x16AddrIqCorr::RxPhase,
85 Channel::Tx => NiosPkt8x16AddrIqCorr::TxPhase,
86 };
87 Ok(self.nios_read::<u8, u16>(NiosPkt8x16Target::IqCorr, addr.into())? as i16)
88 }
89 pub fn nios_set_iq_gain_correction(&mut self, ch: Channel, value: i16) -> Result<()> {
90 let addr = match ch {
91 Channel::Rx => NiosPkt8x16AddrIqCorr::RxGain,
92 Channel::Tx => NiosPkt8x16AddrIqCorr::TxGain,
93 };
94 self.nios_write::<u8, u16>(NiosPkt8x16Target::IqCorr, addr.into(), value as u16)
95 }
96 pub fn nios_set_iq_phase_correction(&mut self, ch: Channel, value: i16) -> Result<()> {
97 let addr = match ch {
98 Channel::Rx => NiosPkt8x16AddrIqCorr::RxPhase,
99 Channel::Tx => NiosPkt8x16AddrIqCorr::TxPhase,
100 };
101 self.nios_write::<u8, u16>(NiosPkt8x16Target::IqCorr, addr.into(), value as u16)
102 }
103}
104impl NiosCore<UsbTransport> {
105 pub fn get_alt_setting(&self) -> u8 {
106 self.transport.interface().get_alt_setting()
107 }
108}