How to reduce the power consumption of the 9160‘s modem?

I am using 9160 to develop a customer's product, which needs to reduce power consumption as much as possible to prolong the battery life of the product. I know that 9160 communicates with the modem through the default UART0. My product design uses UART2 to communicate with a peripheral.  Setting UART2 to DEVICE_PM_LOW_POWER_STATE alone reduces the current by only about 30uA, whereas setting Uart0 to DEVICE_PM_LOW_POWER_STATE reduces the current by almost 500uA. What I can't understand is,  In fact, the GPIO pin mapped to UART0 is not connected to any line, why do you need to set the low power state to reduce power consumption?  

#define MODEM_DEV		"UART_0"
#define BLE_DEV			"UART_2"

	uart_ble = device_get_binding(BLE_DEV);
	if(!uart_ble)
	{
	#ifdef UART_DEBUG
		LOGD("Could not get %s device", BLE_DEV);
	#endif
		return;
	}

	uart_modem = device_get_binding(MODEM_DEV);
	if(!uart_modem)
	{
	#ifdef UART_DEBUG
		LOGD("Could not get %s device", uart_modem);
	#endif
		return;
	}
	
void uart_sleep_out(void)
{
#ifdef CONFIG_DEVICE_POWER_MANAGEMENT
	if(k_timer_remaining_get(&uart_sleep_in_timer) > 0)
		k_timer_stop(&uart_sleep_in_timer);
	k_timer_start(&uart_sleep_in_timer, K_SECONDS(UART_WAKE_HOLD_TIME_SEC), NULL);

	if(uart_is_waked)
		return;

#if 1	
	device_set_power_state(uart_ble, DEVICE_PM_ACTIVE_STATE, NULL, NULL);
	uart_irq_rx_enable(uart_ble);
	uart_irq_tx_enable(uart_ble);
	k_sleep(K_MSEC(10));
#else
	device_set_power_state(uart_modem, DEVICE_PM_ACTIVE_STATE, NULL, NULL);
	uart_irq_rx_enable(uart_modem);
	uart_irq_tx_enable(uart_modem);
	k_sleep(K_MSEC(10));
#endif	
	
	uart_is_waked = true;

#ifdef UART_DEBUG
	LOGD("uart set active success!");
#endif
#endif
}

void uart_sleep_in(void)
{
#ifdef CONFIG_DEVICE_POWER_MANAGEMENT
	if(!uart_is_waked)
		return;

#if 1	
	uart_irq_rx_disable(uart_ble);
	uart_irq_tx_disable(uart_ble);
	device_set_power_state(uart_ble, DEVICE_PM_LOW_POWER_STATE, NULL, NULL);
	k_sleep(K_MSEC(10));
#else
	uart_irq_rx_disable(uart_modem);
	uart_irq_tx_disable(uart_modem);
	device_set_power_state(uart_modem, DEVICE_PM_LOW_POWER_STATE, NULL, NULL);
	k_sleep(K_MSEC(10));
#endif
	
	uart_is_waked = false;

#ifdef UART_DEBUG
	LOGD("uart set low power success!");
#endif
#endif
}

Parents
  • duxinglang said:
    If no AT instructions are used, do these corresponding interface functions explain how to use them?  

    The communication between the modem and application is always based on AT commands. You can find a full overview and documentation of all the commands available here.

    duxinglang said:
    I checked the specifications and found that many modem operations are realized by sending AT instructions, such as the modem networking function w_lte_lc_init().

    The above mentioned function is part of the LTE link controller library, which is one of many that we are offering to improve user experience. They are basically a wrapper for AT commands, but in the end, those libraries use AT commands as well for direct communication with the modem. One example could be the system mode settings, which is called within the lte_lc_init() function.

    Regards,

    Markus

  • Thank you for your reply. Actually, what I want to know is how to use the modem without borrowing the UART to transmit commands or data. As I have described before, in order to save power consumption, I need to put the UART into low-power mode, so that every time there is a change in the modem, the system will crash.  Now that I've found a way to turn off CONFIG_AT_HOST_LIBRARY and CONFIG_UART_INTERRUPT_DRIVEN in prj.conf, it looks like I can eliminate the use of UART when transferring data between the application and modem.  The result of the test was that after setting the UART to low power, there was no system crash.  

Reply
  • Thank you for your reply. Actually, what I want to know is how to use the modem without borrowing the UART to transmit commands or data. As I have described before, in order to save power consumption, I need to put the UART into low-power mode, so that every time there is a change in the modem, the system will crash.  Now that I've found a way to turn off CONFIG_AT_HOST_LIBRARY and CONFIG_UART_INTERRUPT_DRIVEN in prj.conf, it looks like I can eliminate the use of UART when transferring data between the application and modem.  The result of the test was that after setting the UART to low power, there was no system crash.  

Children
No Data
Related