hw21/26: adapt power sequencing for NEO-M9
NEO-M9 modems sometimes boot into Safe Boot mode because of the 3.3 V power sequencing defined by the PMIC. Change SPL/U-Boot to - insert LDO feeding GNSS modem in automatic power sequencing - reset GNSS module at power on reset. id:420663
This commit is contained in:
parent
4bbdb87d6b
commit
4e67fc3997
|
|
@ -57,6 +57,7 @@
|
||||||
#define PMIC_LDOx_CONF_MASK 0x80
|
#define PMIC_LDOx_CONF_MASK 0x80
|
||||||
|
|
||||||
#define PMIC_REG_ID_4_3 0x84
|
#define PMIC_REG_ID_4_3 0x84
|
||||||
|
#define PMIC_REG_ID_6_5 0x85
|
||||||
|
|
||||||
#define PMIC_REG_BUCK_ILIM_A 0x9A
|
#define PMIC_REG_BUCK_ILIM_A 0x9A
|
||||||
#define PMIC_REG_BUCK_ILIM_B 0x9B
|
#define PMIC_REG_BUCK_ILIM_B 0x9B
|
||||||
|
|
|
||||||
|
|
@ -454,6 +454,26 @@ static void pmic_disable_auto_mode(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pmic_gnss_pwr_sequence(void)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
uint8_t val;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GNSS 3.3V needs to start at same time as board 3.3V.
|
||||||
|
* Modify LDO6 configuration accordingly if not already done.
|
||||||
|
*/
|
||||||
|
rc = da9063_get_reg(PMIC_REG_ID_6_5, &val);
|
||||||
|
if (!rc && (val != 0x20)) {
|
||||||
|
(void)da9063_set_reg(PMIC_REG_ID_6_5, 0x20); /* Add LDO6 to sequencer, slot 2 */
|
||||||
|
(void)da9063_set_reg(PMIC_REG_CONFIG_G, 0x64); /* LDO6 automatic enable control by sequencer */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable +3V3_GNSS (LDO6) */
|
||||||
|
(void)da9063_set_reg(PMIC_REG_LDO6_CONT, PMIC_LDOx_EN_MASK);
|
||||||
|
mdelay(2);
|
||||||
|
}
|
||||||
|
|
||||||
static void init_pmic_spl(void)
|
static void init_pmic_spl(void)
|
||||||
{
|
{
|
||||||
int bus;
|
int bus;
|
||||||
|
|
@ -471,9 +491,7 @@ static void init_pmic_spl(void)
|
||||||
pmic_disable_auto_mode();
|
pmic_disable_auto_mode();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable +3V3_GNSS (LDO6) */
|
pmic_gnss_pwr_sequence();
|
||||||
(void)da9063_set_reg(PMIC_REG_LDO6_CONT, PMIC_LDOx_EN_MASK);
|
|
||||||
mdelay(2);
|
|
||||||
|
|
||||||
/* Enable +5V_CAN (LDO11 Switch) */
|
/* Enable +5V_CAN (LDO11 Switch) */
|
||||||
(void)da9063_set_reg(PMIC_REG_LDO11_CONT, PMIC_LDOx_EN_MASK);
|
(void)da9063_set_reg(PMIC_REG_LDO11_CONT, PMIC_LDOx_EN_MASK);
|
||||||
|
|
@ -1148,12 +1166,33 @@ static void init_gsm(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_gnss(void)
|
static void init_gnss(uint32_t reset_reason_shm_location)
|
||||||
{
|
{
|
||||||
|
volatile struct reset_registers* reset_regs = (struct reset_registers*)reset_reason_shm_location;
|
||||||
|
bool do_reset = false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Release GNSS reset line, so that module starts up early
|
* Release GNSS reset line, so that module starts up early.
|
||||||
|
* Excpetion: If this is an initial power up, we reset the module to ensure defined operation.
|
||||||
|
* Reasoning: Some NEO-M9 modems start in Safe Boot mode, due to power sequencing.
|
||||||
*/
|
*/
|
||||||
REQUEST_AND_SET_GPIO(GPIO_RST_GNSS);
|
puts("GNSS: ");
|
||||||
|
|
||||||
|
if (rr_is_start_reason_valid(reset_regs)) {
|
||||||
|
if ((reset_regs->sr_events & SR_POR) == SR_POR) {
|
||||||
|
do_reset = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (do_reset) {
|
||||||
|
puts("reset\n");
|
||||||
|
REQUEST_AND_CLEAR_GPIO(GPIO_RST_GNSS);
|
||||||
|
mdelay(110);
|
||||||
|
gpio_set_value(GPIO_RST_GNSS, 1);
|
||||||
|
} else {
|
||||||
|
puts("init\n");
|
||||||
|
REQUEST_AND_SET_GPIO(GPIO_RST_GNSS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_timepulse(void)
|
static void init_timepulse(void)
|
||||||
|
|
@ -1909,7 +1948,7 @@ int board_late_init(void)
|
||||||
#endif
|
#endif
|
||||||
init_sim_mux();
|
init_sim_mux();
|
||||||
init_gsm();
|
init_gsm();
|
||||||
init_gnss();
|
init_gnss(RESET_REASON_SHM_LOCATION);
|
||||||
init_timepulse();
|
init_timepulse();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue