kopia lustrzana https://github.com/OpenRTX/OpenRTX
ttwrplus: fix unstable baseband startup
A proper baseband reset is now issued at each startup. Now OpenRTX check for SA868 responsiveness before proceeding with radio initialization, eliminating unstable behaviour at boot. TG-553pull/193/head
rodzic
dc84908fbc
commit
eeb05bcc0f
|
@ -29,6 +29,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <pmu.h>
|
||||||
#include "AT1846S.h"
|
#include "AT1846S.h"
|
||||||
#include "radioUtils.h"
|
#include "radioUtils.h"
|
||||||
|
|
||||||
|
@ -118,14 +119,14 @@ void radio_uartPrint(const char *fmt, ...)
|
||||||
|
|
||||||
void radio_uartScan(char *buf)
|
void radio_uartScan(char *buf)
|
||||||
{
|
{
|
||||||
k_msgq_get(&uart_msgq, buf, K_FOREVER);
|
k_msgq_get(&uart_msgq, buf, K_MSEC(100));
|
||||||
}
|
}
|
||||||
|
|
||||||
char *radio_getFwVersion()
|
char *radio_getFwVersion()
|
||||||
{
|
{
|
||||||
char *tx_buf = (char *) malloc(sizeof(char) * SA8X8_MSG_SIZE);
|
char *tx_buf = (char *) malloc(sizeof(char) * SA8X8_MSG_SIZE);
|
||||||
radio_uartPrint("AT+VERSION\r\n");
|
radio_uartPrint("AT+VERSION\r\n");
|
||||||
k_msgq_get(&uart_msgq, tx_buf, K_FOREVER);
|
k_msgq_get(&uart_msgq, tx_buf, K_MSEC(100));
|
||||||
return tx_buf;
|
return tx_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,10 +134,35 @@ char *radio_getModel()
|
||||||
{
|
{
|
||||||
char *tx_buf = (char *) malloc(sizeof(char) * SA8X8_MSG_SIZE);
|
char *tx_buf = (char *) malloc(sizeof(char) * SA8X8_MSG_SIZE);
|
||||||
radio_uartPrint("AT+MODEL\r\n");
|
radio_uartPrint("AT+MODEL\r\n");
|
||||||
k_msgq_get(&uart_msgq, tx_buf, K_FOREVER);
|
k_msgq_get(&uart_msgq, tx_buf, K_MSEC(100));
|
||||||
return tx_buf;
|
return tx_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Band radio_getBand()
|
||||||
|
{
|
||||||
|
enum Band band = BND_NONE;
|
||||||
|
char *tx_buf = radio_getModel();
|
||||||
|
if (!strncmp(tx_buf, "SA868S-VHF\r", SA8X8_MSG_SIZE))
|
||||||
|
band = BND_VHF;
|
||||||
|
else if (!strncmp(tx_buf, "SA868S-UHF\r", SA8X8_MSG_SIZE))
|
||||||
|
band = BND_UHF;
|
||||||
|
free(tx_buf);
|
||||||
|
return band;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Band radio_waitUntilReady()
|
||||||
|
{
|
||||||
|
bool ready = false;
|
||||||
|
enum Band band = BND_NONE;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
band = radio_getBand();
|
||||||
|
if (band != BND_NONE)
|
||||||
|
ready = true;
|
||||||
|
} while(!ready);
|
||||||
|
return band;
|
||||||
|
}
|
||||||
|
|
||||||
void radio_enableTurbo()
|
void radio_enableTurbo()
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -151,7 +177,7 @@ void radio_enableTurbo()
|
||||||
radio_uartPrint("AT+TURBO\r\n");
|
radio_uartPrint("AT+TURBO\r\n");
|
||||||
|
|
||||||
char *tx_buf = (char *) malloc(sizeof(char) * SA8X8_MSG_SIZE);
|
char *tx_buf = (char *) malloc(sizeof(char) * SA8X8_MSG_SIZE);
|
||||||
ret = k_msgq_get(&uart_msgq, tx_buf, K_FOREVER);
|
ret = k_msgq_get(&uart_msgq, tx_buf, K_MSEC(100));
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printk("Error: in retrieving turbo response!\n");
|
printk("Error: in retrieving turbo response!\n");
|
||||||
return;
|
return;
|
||||||
|
@ -172,6 +198,9 @@ void radio_init(const rtxStatus_t *rtxState)
|
||||||
radioStatus = OFF;
|
radioStatus = OFF;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
// Turn on baseband
|
||||||
|
pmu_setBasebandPower(true);
|
||||||
|
|
||||||
// Initialize GPIO for SA868S power down
|
// Initialize GPIO for SA868S power down
|
||||||
if (!gpio_is_ready_dt(&radio_pdn)) {
|
if (!gpio_is_ready_dt(&radio_pdn)) {
|
||||||
printk("Error: radio device %s is not ready\n",
|
printk("Error: radio device %s is not ready\n",
|
||||||
|
@ -204,20 +233,21 @@ void radio_init(const rtxStatus_t *rtxState)
|
||||||
|
|
||||||
uart_irq_rx_enable(radio_dev);
|
uart_irq_rx_enable(radio_dev);
|
||||||
|
|
||||||
ret = gpio_pin_toggle_dt(&radio_pdn);
|
// Reset the SA868S baseband
|
||||||
|
ret = gpio_pin_set_dt(&radio_pdn, 1);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
printk("Failed to reset baseband");
|
printk("Failed to reset baseband");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
delayMs(200);
|
delayMs(10);
|
||||||
ret = gpio_pin_set_dt(&radio_pdn, 0);
|
ret = gpio_pin_set_dt(&radio_pdn, 0);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
printk("Failed to reset baseband");
|
printk("Failed to reset baseband");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// A small delay is needed to have SA8x8 ready to serve commands
|
// Wait until SA868 is responsive
|
||||||
delayMs(100);
|
radio_waitUntilReady();
|
||||||
|
|
||||||
// Check for minimum supported firmware version.
|
// Check for minimum supported firmware version.
|
||||||
char *fwVersionStr = radio_getFwVersion();
|
char *fwVersionStr = radio_getFwVersion();
|
||||||
|
|
|
@ -152,7 +152,7 @@ void pmu_init()
|
||||||
PMU.enableBLDO1();
|
PMU.enableBLDO1();
|
||||||
|
|
||||||
//! DC3 Radio & Pixels VDD
|
//! DC3 Radio & Pixels VDD
|
||||||
PMU.enableDC3();
|
PMU.disableDC3();
|
||||||
|
|
||||||
// power off when not in use
|
// power off when not in use
|
||||||
PMU.disableDC2();
|
PMU.disableDC2();
|
||||||
|
@ -235,7 +235,7 @@ void pmu_init()
|
||||||
- XPOWERS_CHG_LED_ON,
|
- XPOWERS_CHG_LED_ON,
|
||||||
- XPOWERS_CHG_LED_CTRL_CHG,
|
- XPOWERS_CHG_LED_CTRL_CHG,
|
||||||
* */
|
* */
|
||||||
PMU.setChargingLedMode(XPOWERS_CHG_LED_BLINK_1HZ);
|
PMU.setChargingLedMode(XPOWERS_CHG_LED_CTRL_CHG);
|
||||||
|
|
||||||
// TODO: Implement IRQ
|
// TODO: Implement IRQ
|
||||||
// pinMode(PMU_IRQ, INPUT_PULLUP);
|
// pinMode(PMU_IRQ, INPUT_PULLUP);
|
||||||
|
@ -297,3 +297,11 @@ uint16_t pmu_getVbat()
|
||||||
{
|
{
|
||||||
return PMU.isBatteryConnect() ? PMU.getBattVoltage() : 0;
|
return PMU.isBatteryConnect() ? PMU.getBattVoltage() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pmu_setBasebandPower(bool enable)
|
||||||
|
{
|
||||||
|
if (enable)
|
||||||
|
PMU.enableDC3();
|
||||||
|
else
|
||||||
|
PMU.disableDC3();
|
||||||
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ extern "C" {
|
||||||
|
|
||||||
void pmu_init();
|
void pmu_init();
|
||||||
uint16_t pmu_getVbat();
|
uint16_t pmu_getVbat();
|
||||||
|
void pmu_setBasebandPower(bool enable);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue