cxd56/alt1250: Change power on sequence
Change the power on sequence according to ALT1250 modem spec.
This commit is contained in:
parent
a4708d217a
commit
4eb6da33c2
@ -74,11 +74,15 @@
|
|||||||
# error "Select LTE SPI 4 or 5"
|
# error "Select LTE SPI 4 or 5"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define POWER_ON_WAIT_TIME (2) /* ms */
|
||||||
|
#define ACTIVE_SHUTDOWN_TIME (100) /* ms */
|
||||||
|
#define TIME_TO_STABLE_VDDIO (10) /* ms */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static struct spi_dev_s *alt1250_poweron(void);
|
static struct spi_dev_s *alt1250_poweron(bool keep_on);
|
||||||
static void alt1250_poweroff(void);
|
static void alt1250_poweroff(void);
|
||||||
static bool alt1250_powerstatus(void);
|
static bool alt1250_powerstatus(void);
|
||||||
static int alt1250_hibernation_mode(bool enable);
|
static int alt1250_hibernation_mode(bool enable);
|
||||||
@ -196,7 +200,7 @@ static void set_spiparam(struct spi_dev_s *spidev)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static struct spi_dev_s *alt1250_poweron(void)
|
static struct spi_dev_s *alt1250_poweron(bool keep_on)
|
||||||
{
|
{
|
||||||
struct spi_dev_s *spi;
|
struct spi_dev_s *spi;
|
||||||
#if defined(CONFIG_CXD56_LTE_SPI4_DMAC) || defined(CONFIG_CXD56_LTE_SPI5_DMAC)
|
#if defined(CONFIG_CXD56_LTE_SPI4_DMAC) || defined(CONFIG_CXD56_LTE_SPI5_DMAC)
|
||||||
@ -204,6 +208,38 @@ static struct spi_dev_s *alt1250_poweron(void)
|
|||||||
dma_config_t conf;
|
dma_config_t conf;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Hi-Z SHUTDOWN and PowerBTN signals before power-on */
|
||||||
|
|
||||||
|
cxd56_gpio_config(ALT1250_SHUTDOWN, false);
|
||||||
|
|
||||||
|
/* power on alt1250 modem device and wait until the power is distributed */
|
||||||
|
|
||||||
|
board_alt1250_poweron();
|
||||||
|
up_mdelay(POWER_ON_WAIT_TIME);
|
||||||
|
|
||||||
|
/* If keep_on is enabled, skip setting the SHUTDOWN signal to low
|
||||||
|
* because the ALT1250 is already in the power-on state.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!keep_on)
|
||||||
|
{
|
||||||
|
/* Drive SHUTDOWN signal low */
|
||||||
|
|
||||||
|
cxd56_gpio_write(ALT1250_SHUTDOWN, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Keep the SHUTDOWN signal low for reset period */
|
||||||
|
|
||||||
|
up_mdelay(ACTIVE_SHUTDOWN_TIME);
|
||||||
|
|
||||||
|
/* Undrive SHUTDOWN signal to rise up to high by pull-up */
|
||||||
|
|
||||||
|
cxd56_gpio_write_hiz(ALT1250_SHUTDOWN);
|
||||||
|
|
||||||
|
/* Wait VDDIO on Alt1250 stable */
|
||||||
|
|
||||||
|
up_mdelay(TIME_TO_STABLE_VDDIO);
|
||||||
|
|
||||||
/* Initialize spi deivce */
|
/* Initialize spi deivce */
|
||||||
|
|
||||||
spi = cxd56_spibus_initialize(SPI_CH);
|
spi = cxd56_spibus_initialize(SPI_CH);
|
||||||
@ -233,10 +269,6 @@ static struct spi_dev_s *alt1250_poweron(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* power on altair modem device */
|
|
||||||
|
|
||||||
board_alt1250_poweron();
|
|
||||||
|
|
||||||
/* Input enable */
|
/* Input enable */
|
||||||
|
|
||||||
cxd56_gpio_config(ALT1250_SLAVE_REQ, true);
|
cxd56_gpio_config(ALT1250_SLAVE_REQ, true);
|
||||||
@ -263,7 +295,6 @@ static struct spi_dev_s *alt1250_poweron(void)
|
|||||||
/* enable the SPI pin */
|
/* enable the SPI pin */
|
||||||
|
|
||||||
spi_pincontrol(SPI_CH, true);
|
spi_pincontrol(SPI_CH, true);
|
||||||
|
|
||||||
set_spiparam(spi);
|
set_spiparam(spi);
|
||||||
|
|
||||||
return spi;
|
return spi;
|
||||||
|
@ -488,7 +488,7 @@ static altmdm_state_t process_state_poweroff(uint32_t event,
|
|||||||
altmdm_event_clear(&g_altmdm_dev.event, EVENT_POWERON);
|
altmdm_event_clear(&g_altmdm_dev.event, EVENT_POWERON);
|
||||||
usec2timespec(RESET_INTERVAL, &interval);
|
usec2timespec(RESET_INTERVAL, &interval);
|
||||||
nxsig_nanosleep(&interval, NULL);
|
nxsig_nanosleep(&interval, NULL);
|
||||||
g_altmdm_dev.spidev = g_altmdm_dev.lower->poweron();
|
g_altmdm_dev.spidev = g_altmdm_dev.lower->poweron(false);
|
||||||
g_altmdm_dev.lower->set_mready(false);
|
g_altmdm_dev.lower->set_mready(false);
|
||||||
g_altmdm_dev.lower->set_wakeup(false);
|
g_altmdm_dev.lower->set_wakeup(false);
|
||||||
g_altmdm_dev.lower->irqenable(true);
|
g_altmdm_dev.lower->irqenable(true);
|
||||||
@ -1534,7 +1534,7 @@ int altmdm_init(FAR struct spi_dev_s *spidev,
|
|||||||
|
|
||||||
g_altmdm_dev.current_state = ALTMDM_STATE_SLEEP;
|
g_altmdm_dev.current_state = ALTMDM_STATE_SLEEP;
|
||||||
g_altmdm_dev.vp = VP_V4;
|
g_altmdm_dev.vp = VP_V4;
|
||||||
g_altmdm_dev.spidev = g_altmdm_dev.lower->poweron();
|
g_altmdm_dev.spidev = g_altmdm_dev.lower->poweron(true);
|
||||||
g_altmdm_dev.lower->set_mready(false);
|
g_altmdm_dev.lower->set_mready(false);
|
||||||
g_altmdm_dev.lower->set_wakeup(false);
|
g_altmdm_dev.lower->set_wakeup(false);
|
||||||
g_altmdm_dev.lower->irqenable(true);
|
g_altmdm_dev.lower->irqenable(true);
|
||||||
|
@ -307,7 +307,7 @@ struct alt_readdata_s
|
|||||||
|
|
||||||
struct alt1250_lower_s
|
struct alt1250_lower_s
|
||||||
{
|
{
|
||||||
FAR struct spi_dev_s * (*poweron)(void);
|
FAR struct spi_dev_s * (*poweron)(bool keep_on);
|
||||||
void (*poweroff)(void);
|
void (*poweroff)(void);
|
||||||
bool (*powerstatus)(void);
|
bool (*powerstatus)(void);
|
||||||
int (*hiber_mode)(bool);
|
int (*hiber_mode)(bool);
|
||||||
|
Loading…
Reference in New Issue
Block a user