This is an automated email from the ASF dual-hosted git repository.

pkarashchenko pushed a commit to branch releases/12.2
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/releases/12.2 by this push:
     new 75d62344c2 cxd56/alt1250: Change power on sequence
75d62344c2 is described below

commit 75d62344c2950b7d2a5b48395c1ddb3a6dc3f179
Author: SPRESENSE <41312067+sprese...@users.noreply.github.com>
AuthorDate: Mon Jul 3 09:03:41 2023 +0900

    cxd56/alt1250: Change power on sequence
    
    Change the power on sequence according to ALT1250 modem spec.
---
 boards/arm/cxd56xx/common/src/cxd56_alt1250.c | 45 ++++++++++++++++++++++-----
 drivers/modem/alt1250/altmdm.c                |  4 +--
 include/nuttx/modem/alt1250.h                 |  2 +-
 3 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/boards/arm/cxd56xx/common/src/cxd56_alt1250.c 
b/boards/arm/cxd56xx/common/src/cxd56_alt1250.c
index df1460d18a..c277922369 100644
--- a/boards/arm/cxd56xx/common/src/cxd56_alt1250.c
+++ b/boards/arm/cxd56xx/common/src/cxd56_alt1250.c
@@ -74,11 +74,15 @@
 #  error "Select LTE SPI 4 or 5"
 #endif
 
+#define POWER_ON_WAIT_TIME   (2)   /* ms */
+#define ACTIVE_SHUTDOWN_TIME (100) /* ms */
+#define TIME_TO_STABLE_VDDIO (10)  /* ms */
+
 /****************************************************************************
  * 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 bool alt1250_powerstatus(void);
 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;
 #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;
 #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 */
 
   spi = cxd56_spibus_initialize(SPI_CH);
@@ -233,10 +269,6 @@ static struct spi_dev_s *alt1250_poweron(void)
     }
 #endif
 
-  /* power on altair modem device */
-
-  board_alt1250_poweron();
-
   /* Input enable */
 
   cxd56_gpio_config(ALT1250_SLAVE_REQ, true);
@@ -263,7 +295,6 @@ static struct spi_dev_s *alt1250_poweron(void)
   /* enable the SPI pin */
 
   spi_pincontrol(SPI_CH, true);
-
   set_spiparam(spi);
 
   return spi;
diff --git a/drivers/modem/alt1250/altmdm.c b/drivers/modem/alt1250/altmdm.c
index 9d42ac8304..589a93e12a 100644
--- a/drivers/modem/alt1250/altmdm.c
+++ b/drivers/modem/alt1250/altmdm.c
@@ -488,7 +488,7 @@ static altmdm_state_t process_state_poweroff(uint32_t event,
       altmdm_event_clear(&g_altmdm_dev.event, EVENT_POWERON);
       usec2timespec(RESET_INTERVAL, &interval);
       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_wakeup(false);
       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.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_wakeup(false);
       g_altmdm_dev.lower->irqenable(true);
diff --git a/include/nuttx/modem/alt1250.h b/include/nuttx/modem/alt1250.h
index 91fdd7c438..3c1e3cf528 100644
--- a/include/nuttx/modem/alt1250.h
+++ b/include/nuttx/modem/alt1250.h
@@ -307,7 +307,7 @@ struct alt_readdata_s
 
 struct alt1250_lower_s
 {
-  FAR struct spi_dev_s * (*poweron)(void);
+  FAR struct spi_dev_s * (*poweron)(bool keep_on);
   void (*poweroff)(void);
   bool (*powerstatus)(void);
   int  (*hiber_mode)(bool);

Reply via email to