fix(llcc68): apply full radio profile before tx and rx

Reapply packet type, sync word, RF frequency, modulation, packet, CRC, and whitening settings on async TX/RX entry points.

This lets callers switch between preconfigured profiles immediately before a send or listen operation instead of relying on modem-init state.
This commit is contained in:
2026-06-10 14:25:17 +08:00
parent efc6e17ed0
commit d382bdfd1e
+61
View File
@@ -1369,6 +1369,11 @@ LLCC68::hal_async_flush(lora_parameters_t params) {
return ue(Errc::InvalidState);
}
APP_RADIO_RETURN_ERR_CTX(set_standby(), "tx::standby");
APP_RADIO_RETURN_ERR_CTX(set_packet_type_lora(), "tx::set_packet_type");
APP_RADIO_RETURN_ERR_CTX(set_lora_sync_word(params.sync_word),
"tx::set_lora_sync_word");
APP_RADIO_RETURN_ERR_CTX(set_rf_frequency(params.frequency_mhz),
"tx::set_rf_frequency");
APP_RADIO_RETURN_ERR_CTX(
set_modulation_params(params.mod_params.sf, params.mod_params.bw,
params.mod_params.cr,
@@ -1430,10 +1435,35 @@ LLCC68::hal_gfsk_async_flush(gfsk_parameters_t params) {
if (data().tx_xfer_size == 0 || data().tx_xfer_size > MAX_BUFFER_PAYLOAD) {
return ue(-EINVAL);
}
if (params.sync_word_length > params.sync_word.size() ||
params.packet_params.sync_length_bits > params.sync_word.size() * 8) {
return ue(-EINVAL);
}
APP_RADIO_RETURN_ERR_CTX(set_standby(), "gfsk_tx::standby");
APP_RADIO_RETURN_ERR_CTX(set_packet_type_gfsk(),
"gfsk_tx::set_packet_type");
APP_RADIO_RETURN_ERR_CTX(set_rf_frequency(params.frequency_mhz),
"gfsk_tx::set_rf_frequency");
APP_RADIO_RETURN_ERR_CTX(set_gfsk_modulation_params(params.mod_params),
"gfsk_tx::set_modulation_params");
APP_RADIO_RETURN_ERR_CTX(
set_gfsk_sync_word(std::span<const uint8_t>{params.sync_word.data(),
params.sync_word_length}),
"gfsk_tx::set_sync_word");
APP_RADIO_RETURN_ERR_CTX(set_gfsk_crc_seed(params.crc_seed),
"gfsk_tx::set_crc_seed");
APP_RADIO_RETURN_ERR_CTX(set_gfsk_crc_polynomial(params.crc_polynomial),
"gfsk_tx::set_crc_polynomial");
APP_RADIO_RETURN_ERR_CTX(set_gfsk_whitening_seed(params.whitening_seed),
"gfsk_tx::set_whitening_seed");
if (params.packet_params.address_filtering !=
GfskAddressFiltering::Disabled) {
APP_RADIO_RETURN_ERR_CTX(
set_gfsk_address_filtering(params.node_address.value_or(0),
params.broadcast_address.value_or(0)),
"gfsk_tx::set_address_filtering");
}
auto packet_params = params.packet_params;
packet_params.payload_length = static_cast<uint8_t>(data().tx_xfer_size);
APP_RADIO_RETURN_ERR_CTX(set_gfsk_packet_params(packet_params),
@@ -1477,6 +1507,11 @@ LLCC68::hal_gfsk_async_transmit(std::span<const uint8_t> data,
expected<unit, error_code> LLCC68::hal_async_rx(lora_parameters_t params) {
APP_RADIO_RETURN_ERR_CTX(set_standby(), "rx::standby");
APP_RADIO_RETURN_ERR_CTX(set_packet_type_lora(), "rx::set_packet_type");
APP_RADIO_RETURN_ERR_CTX(set_lora_sync_word(params.sync_word),
"rx::set_lora_sync_word");
APP_RADIO_RETURN_ERR_CTX(set_rf_frequency(params.frequency_mhz),
"rx::set_rf_frequency");
APP_RADIO_RETURN_ERR_CTX(set_buffer_base_address(),
"rx::set_buffer_base_address");
@@ -1511,11 +1546,37 @@ expected<unit, error_code> LLCC68::hal_async_rx(lora_parameters_t params) {
}
expected<unit, error_code> LLCC68::hal_gfsk_async_rx(gfsk_parameters_t params) {
if (params.sync_word_length > params.sync_word.size() ||
params.packet_params.sync_length_bits > params.sync_word.size() * 8) {
return ue(-EINVAL);
}
APP_RADIO_RETURN_ERR_CTX(set_standby(), "gfsk_rx::standby");
APP_RADIO_RETURN_ERR_CTX(set_packet_type_gfsk(),
"gfsk_rx::set_packet_type");
APP_RADIO_RETURN_ERR_CTX(set_rf_frequency(params.frequency_mhz),
"gfsk_rx::set_rf_frequency");
APP_RADIO_RETURN_ERR_CTX(set_buffer_base_address(),
"gfsk_rx::set_buffer_base_address");
APP_RADIO_RETURN_ERR_CTX(set_gfsk_modulation_params(params.mod_params),
"gfsk_rx::set_modulation_params");
APP_RADIO_RETURN_ERR_CTX(
set_gfsk_sync_word(std::span<const uint8_t>{params.sync_word.data(),
params.sync_word_length}),
"gfsk_rx::set_sync_word");
APP_RADIO_RETURN_ERR_CTX(set_gfsk_crc_seed(params.crc_seed),
"gfsk_rx::set_crc_seed");
APP_RADIO_RETURN_ERR_CTX(set_gfsk_crc_polynomial(params.crc_polynomial),
"gfsk_rx::set_crc_polynomial");
APP_RADIO_RETURN_ERR_CTX(set_gfsk_whitening_seed(params.whitening_seed),
"gfsk_rx::set_whitening_seed");
if (params.packet_params.address_filtering !=
GfskAddressFiltering::Disabled) {
APP_RADIO_RETURN_ERR_CTX(
set_gfsk_address_filtering(params.node_address.value_or(0),
params.broadcast_address.value_or(0)),
"gfsk_rx::set_address_filtering");
}
APP_RADIO_RETURN_ERR_CTX(set_gfsk_packet_params(params.packet_params),
"gfsk_rx::set_packet_params");