Skip to content

Commit 1154158

Browse files
ShakenCodesnewAM
andauthored
Add support for setting full whitening seed. (#366)
* Add support for setting full whitening seed. * Address formatting issue * Update hal/src/subghz/mod.rs Co-authored-by: Alex Martens <[email protected]> * Update hal/src/subghz/mod.rs Co-authored-by: Alex Martens <[email protected]> * Complete renaming to eliminate get_ prefixes * Minor formatting fix --------- Co-authored-by: Alex Martens <[email protected]>
1 parent 39cf7d4 commit 1154158

File tree

2 files changed

+72
-4
lines changed

2 files changed

+72
-4
lines changed

hal/src/subghz/mod.rs

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,34 @@ where
703703
Ok(())
704704
}
705705

706+
// register read with fixed (one) length data
707+
fn read_register(&mut self, register: Register) -> Result<u8, Error> {
708+
let addr: [u8; 2] = register.address().to_be_bytes();
709+
let mut result = [0_u8];
710+
711+
self.poll_not_busy();
712+
{
713+
let _nss: Nss = Nss::new();
714+
self.spi
715+
.write(&[OpCode::ReadRegister as u8, addr[0], addr[1], 0x00])?;
716+
self.spi.transfer(&mut result)?;
717+
}
718+
self.poll_not_busy();
719+
720+
Ok(result[0])
721+
}
722+
723+
/// Reads the PktCtrl register (GPKTCTL1A)
724+
pub fn pkt_ctrl(&mut self) -> Result<PktCtrl, Error> {
725+
let raw_pkt_ctrl = self.read_register(Register::GPKTCTL1A)?;
726+
Ok(PktCtrl::from_raw(raw_pkt_ctrl))
727+
}
728+
729+
/// Reads the Init Whitening register (GWHITEINIRL)
730+
pub fn init_whitening(&mut self) -> Result<u8, Error> {
731+
self.read_register(Register::GWHITEINIRL)
732+
}
733+
706734
/// Set the LoRa bit synchronization.
707735
pub fn set_bit_sync(&mut self, bs: BitSync) -> Result<(), Error> {
708736
self.write(wr_reg![GBSYNC, bs.as_bits()])
@@ -721,6 +749,15 @@ where
721749
self.write(wr_reg![GWHITEINIRL, init])
722750
}
723751

752+
/// Set the seed value for generic packet whitening.
753+
pub fn set_whitening_seed(&mut self, seed: u16) -> Result<(), Error> {
754+
let seed_as_array = u16::to_be_bytes(seed);
755+
let pkt_ctrl_value = self.read_register(Register::GPKTCTL1A)?;
756+
let new_pkt_ctrl = (pkt_ctrl_value & 0xFE) | (seed_as_array[0] & 0x01);
757+
self.set_pkt_ctrl(PktCtrl::from_raw(new_pkt_ctrl))?;
758+
self.set_init_whitening(seed_as_array[1])
759+
}
760+
724761
/// Set the initial value for generic packet CRC polynomial.
725762
pub fn set_crc_polynomial(&mut self, polynomial: u16) -> Result<(), Error> {
726763
let bytes: [u8; 2] = polynomial.to_be_bytes();
@@ -1312,7 +1349,7 @@ pub(crate) enum OpCode {
13121349
GetStats = 0x10,
13131350
GetStatus = 0xC0,
13141351
ReadBuffer = 0x1E,
1315-
RegRegister = 0x1D,
1352+
ReadRegister = 0x1D,
13161353
ResetStats = 0x00,
13171354
SetBufferBaseAddress = 0x8F,
13181355
SetCad = 0xC5,

testsuite/src/subghz.rs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ use bsp::{
2121
rfbusys, wakeup, AddrComp, CalibrateImage, CfgIrq, CmdStatus, CodingRate, CrcType,
2222
FallbackMode, FskBandwidth, FskBitrate, FskFdev, FskModParams, FskPulseShape,
2323
GenericPacketParams, HeaderType, Irq, LoRaBandwidth, LoRaModParams, LoRaPacketParams,
24-
LoRaSyncWord, Ocp, PaConfig, PacketType, PreambleDetection, RampTime, RegMode, RfFreq,
25-
SleepCfg, SpreadingFactor, StandbyClk, Startup, Status, StatusMode, SubGhz, TcxoMode,
26-
TcxoTrim, Timeout, TxParams,
24+
LoRaSyncWord, Ocp, PaConfig, PacketType, PktCtrl, PreambleDetection, RampTime, RegMode,
25+
RfFreq, SleepCfg, SpreadingFactor, StandbyClk, Startup, Status, StatusMode, SubGhz,
26+
TcxoMode, TcxoTrim, Timeout, TxParams,
2727
},
2828
util::new_delay,
2929
},
@@ -380,6 +380,37 @@ mod tests {
380380
defmt::assert_eq!(status.mode(), Ok(StatusMode::StandbyRc));
381381
}
382382

383+
#[test]
384+
fn read_write_register(ta: &mut TestArgs) {
385+
let original_value = unwrap!(ta.sg.init_whitening());
386+
let test_value = !original_value;
387+
unwrap!(ta.sg.set_init_whitening(test_value));
388+
let new_value = unwrap!(ta.sg.init_whitening());
389+
defmt::assert_eq!(test_value, new_value);
390+
391+
unwrap!(ta.sg.set_init_whitening(original_value));
392+
}
393+
394+
#[test]
395+
fn set_whitening_seed_operations(ta: &mut TestArgs) {
396+
let original_raw_pkt_ctrl = (unwrap!(ta.sg.pkt_ctrl())).as_bits();
397+
let original_init_whitening = unwrap!(ta.sg.init_whitening());
398+
let original_whitening_seed: u16 =
399+
(((original_raw_pkt_ctrl & 0x01) as u16) << 8) | original_init_whitening as u16;
400+
let test_value = !original_whitening_seed & 0x01FF;
401+
let expected_raw_pkt_ctrl =
402+
(original_raw_pkt_ctrl & 0xFE) | ((test_value >> 8) & 0x01) as u8;
403+
let expected_init_whitening = (test_value & 0x00FF) as u8;
404+
405+
unwrap!(ta.sg.set_whitening_seed(test_value));
406+
407+
defmt::assert_eq!(expected_raw_pkt_ctrl, (unwrap!(ta.sg.pkt_ctrl())).as_bits());
408+
defmt::assert_eq!(expected_init_whitening, unwrap!(ta.sg.init_whitening()));
409+
410+
unwrap!(ta.sg.set_init_whitening(original_init_whitening));
411+
unwrap!(ta.sg.set_pkt_ctrl(PktCtrl::from_raw(original_raw_pkt_ctrl)));
412+
}
413+
383414
#[test]
384415
fn fsk_ping_pong(ta: &mut TestArgs) {
385416
let sg: &mut MySubghz = &mut ta.sg;

0 commit comments

Comments
 (0)