Commit 70d8e20c authored by Paulo Miguel Almeida's avatar Paulo Miguel Almeida Committed by Greg Kroah-Hartman
Browse files

staging: pi433: fix frequency deviation check



rf69 datasheet states that frequency deviation must exceed 600 Hz but
also that frequency deviation + (bitrate / 2) should be less than equal
to 500 kHz to ensure proper modulation.

This patch validates that both conditions are met so RF intersymbol
interference is less likely to happen due to misconfiguration of the uC

Signed-off-by: default avatarPaulo Miguel Almeida <paulo.miguel.almeida.rodenas@gmail.com>
Link: https://lore.kernel.org/r/20220103222334.GA6814@mail.google.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b33721ba
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -255,13 +255,25 @@ int rf69_set_deviation(struct spi_device *spi, u32 deviation)
	int retval;
	u64 f_reg;
	u64 f_step;
	u32 bit_rate_reg;
	u32 bit_rate;
	u8 msb;
	u8 lsb;
	u64 factor = 1000000; // to improve precision of calculation

	// TODO: Dependency to bitrate
	if (deviation < 600 || deviation > 500000) {
		dev_dbg(&spi->dev, "set_deviation: illegal input param");
	// calculate bit rate
	bit_rate_reg = rf69_read_reg(spi, REG_BITRATE_MSB) << 8;
	bit_rate_reg |= rf69_read_reg(spi, REG_BITRATE_LSB);
	bit_rate = F_OSC / bit_rate_reg;

	/*
	 * frequency deviation must exceed 600 Hz but not exceed
	 * 500kHz when taking bitrate dependency into consideration
	 * to ensure proper modulation
	 */
	if (deviation < 600 || (deviation + (bit_rate / 2)) > 500000) {
		dev_dbg(&spi->dev,
			"set_deviation: illegal input param: %u", deviation);
		return -EINVAL;
	}