From 8c1387ef1ace4831731f5d3b866e682d79eff336 Mon Sep 17 00:00:00 2001 From: Ryan Erickson Date: Tue, 8 Feb 2022 10:38:41 -0600 Subject: [PATCH] modem: hl7800: Make RSSI rate configurable Improve ability to sleep. Signed-off-by: Ryan Erickson --- drivers/modem/Kconfig.hl7800 | 5 +++++ drivers/modem/hl7800.c | 22 ++++++++++++++++++---- include/drivers/modem/hl7800.h | 6 +++++- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/drivers/modem/Kconfig.hl7800 b/drivers/modem/Kconfig.hl7800 index 0f7488db45b..89542b50bf4 100644 --- a/drivers/modem/Kconfig.hl7800 +++ b/drivers/modem/Kconfig.hl7800 @@ -357,4 +357,9 @@ config MODEM_HL7800_ALLOW_SLEEP_DELAY_MS int "Milliseconds to delay before allowing modem to sleep" default 5000 +config MODEM_HL7800_RSSI_RATE_SECONDS + int "Rate to automatically query RSSI" + default 0 if MODEM_HL7800_LOW_POWER_MODE + default 30 + endif # MODEM_HL7800 diff --git a/drivers/modem/hl7800.c b/drivers/modem/hl7800.c index 8ea29347cf5..b16600639e6 100644 --- a/drivers/modem/hl7800.c +++ b/drivers/modem/hl7800.c @@ -294,7 +294,6 @@ static const struct mdm_control_pinconfig pinconfig[] = { #define MDM_RESET_HIGH_TIME K_MSEC(10) #define MDM_WAIT_FOR_DATA_RETRIES 3 -#define RSSI_TIMEOUT_SECS 30 #define RSSI_UNKNOWN -999 #define DNS_WORK_DELAY_SECS 1 @@ -596,6 +595,7 @@ static int write_apn(char *access_point_name); static void mark_sockets_for_reconfig(void); #endif static void hl7800_build_mac(struct hl7800_iface_ctx *ictx); +static void rssi_query(void); #ifdef CONFIG_MODEM_HL7800_LOW_POWER_MODE static void initialize_sleep_level(void); @@ -965,6 +965,10 @@ static void event_handler(enum mdm_hl7800_event event, void *event_data) void mdm_hl7800_get_signal_quality(int *rsrp, int *sinr) { + if (CONFIG_MODEM_HL7800_RSSI_RATE_SECONDS == 0) { + rssi_query(); + } + *rsrp = ictx.mdm_rssi; *sinr = ictx.mdm_sinr; } @@ -2716,6 +2720,9 @@ static int hl7800_query_rssi(void) static void hl7800_start_rssi_work(void) { + /* Rate is not checked here to allow one reading + * when going from network down->up + */ k_work_reschedule_for_queue(&hl7800_workq, &ictx.rssi_query_work, K_NO_WAIT); } @@ -2730,17 +2737,24 @@ static void hl7800_stop_rssi_work(void) } } -static void hl7800_rssi_query_work(struct k_work *work) +static void rssi_query(void) { hl7800_lock(); wakeup_hl7800(); hl7800_query_rssi(); allow_sleep(true); hl7800_unlock(); +} + +static void hl7800_rssi_query_work(struct k_work *work) +{ + rssi_query(); /* re-start RSSI query work */ - k_work_reschedule_for_queue(&hl7800_workq, &ictx.rssi_query_work, - K_SECONDS(RSSI_TIMEOUT_SECS)); + if (CONFIG_MODEM_HL7800_RSSI_RATE_SECONDS > 0) { + k_work_reschedule_for_queue(&hl7800_workq, &ictx.rssi_query_work, + K_SECONDS(CONFIG_MODEM_HL7800_RSSI_RATE_SECONDS)); + } } #ifdef CONFIG_MODEM_HL7800_GPS diff --git a/include/drivers/modem/hl7800.h b/include/drivers/modem/hl7800.h index 13e01d66ef7..c9ce25b2b74 100644 --- a/include/drivers/modem/hl7800.h +++ b/include/drivers/modem/hl7800.h @@ -282,7 +282,11 @@ void mdm_hl7800_wakeup(bool awake); int32_t mdm_hl7800_send_at_cmd(const uint8_t *data); /** - * @brief Get the signal quality of the HL7800 + * @brief Get the signal quality of the HL7800. + * If CONFIG_MODEM_HL7800_RSSI_RATE_SECONDS is non-zero, then + * this function returns the value from the last periodic read. + * If CONFIG_MODEM_HL7800_RSSI_RATE_SECONDS is 0, then this + * may cause the modem to be woken so that the values can be queried. * * @param rsrp Reference Signals Received Power (dBm) * Range = -140 dBm to -44 dBm