int rp2040_common_bringup()

in boards/arm/rp2040/common/src/rp2040_common_bringup.c [138:760]


int rp2040_common_bringup(void)
{
  int ret = 0;

#ifdef CONFIG_RP2040_FLASH_FILE_SYSTEM
  struct mtd_dev_s *mtd_dev;
#endif

#ifdef CONFIG_RP2040_I2C_DRIVER
  #ifdef CONFIG_RP2040_I2C0
  ret = board_i2cdev_initialize(0);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize I2C0.\n");
    }
  #endif

  #ifdef CONFIG_RP2040_I2C1
  ret = board_i2cdev_initialize(1);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize I2C1.\n");
    }
  #endif
#endif

#ifdef CONFIG_RP2040_SPI_DRIVER
  #ifdef CONFIG_RP2040_SPI0
  ret = board_spidev_initialize(0);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize SPI0.\n");
    }
  #endif

  #ifdef CONFIG_RP2040_SPI1
  ret = board_spidev_initialize(1);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize SPI1.\n");
    }
  #endif
#endif

#ifdef CONFIG_RP2040_PWM
#  ifdef CONFIG_RP2040_PWM0
#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
  ret = rp2040_pwmdev_initialize(0,
                                 CONFIG_RP2040_PWM0A_GPIO,
                                 CONFIG_RP2040_PWM0B_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM0A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM0B_INVERT
                                  | RP2040_PWM_CSR_B_INV
#      endif
#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    else
  ret = rp2040_pwmdev_initialize(0,
                                 CONFIG_RP2040_PWM0A_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM0A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    endif
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize PWM0.\n");
    }
#  endif

#  ifdef CONFIG_RP2040_PWM1
#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
  ret = rp2040_pwmdev_initialize(1,
                                 CONFIG_RP2040_PWM1A_GPIO,
                                 CONFIG_RP2040_PWM1B_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM1A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM1B_INVERT
                                  | RP2040_PWM_CSR_B_INV
#      endif
#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    else
  ret = rp2040_pwmdev_initialize(1,
                                 CONFIG_RP2040_PWM1A_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM1A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    endif
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize PWM1.\n");
    }
#  endif

#  ifdef CONFIG_RP2040_PWM2
#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
  ret = rp2040_pwmdev_initialize(2,
                                 CONFIG_RP2040_PWM2A_GPIO,
                                 CONFIG_RP2040_PWM2B_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM2A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM2B_INVERT
                                  | RP2040_PWM_CSR_B_INV
#      endif
#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    else
  ret = rp2040_pwmdev_initialize(2,
                                 CONFIG_RP2040_PWM2A_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM2A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    endif
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize PWM2.\n");
    }
#  endif

#  ifdef CONFIG_RP2040_PWM3
#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
  ret = rp2040_pwmdev_initialize(3,
                                 CONFIG_RP2040_PWM3A_GPIO,
                                 CONFIG_RP2040_PWM3B_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM3A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM3B_INVERT
                                  | RP2040_PWM_CSR_B_INV
#      endif
#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    else
  ret = rp2040_pwmdev_initialize(3,
                                 CONFIG_RP2040_PWM3A_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM3A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    endif
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize PWM3.\n");
    }
#  endif

#  ifdef CONFIG_RP2040_PWM4
#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
  ret = rp2040_pwmdev_initialize(4,
                                 CONFIG_RP2040_PWM4A_GPIO,
                                 CONFIG_RP2040_PWM4B_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM4A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM4B_INVERT
                                  | RP2040_PWM_CSR_B_INV
#      endif
#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    else
  ret = rp2040_pwmdev_initialize(4,
                                 CONFIG_RP2040_PWM4A_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM4A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    endif
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize PWM4.\n");
    }
#  endif

#  ifdef CONFIG_RP2040_PWM5
#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
  ret = rp2040_pwmdev_initialize(5,
                                 CONFIG_RP2040_PWM5A_GPIO,
                                 CONFIG_RP2040_PWM5B_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM5A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM5B_INVERT
                                  | RP2040_PWM_CSR_B_INV
#      endif
#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#  else
  ret = rp2040_pwmdev_initialize(5,
                                 CONFIG_RP2040_PWM5A_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM5A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#  endif
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize PWM5.\n");
    }
#  endif

#  ifdef CONFIG_RP2040_PWM6
#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
  ret = rp2040_pwmdev_initialize(6,
                                 CONFIG_RP2040_PWM6A_GPIO,
                                 CONFIG_RP2040_PWM6B_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM6A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM6B_INVERT
                                  | RP2040_PWM_CSR_B_INV
#      endif
#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    else
  ret = rp2040_pwmdev_initialize(6,
                                 CONFIG_RP2040_PWM6A_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM6A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    endif
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize PWM6.\n");
    }
#  endif

#  ifdef CONFIG_RP2040_PWM7
#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
  ret = rp2040_pwmdev_initialize(7,
                                 CONFIG_RP2040_PWM7A_GPIO,
                                 CONFIG_RP2040_PWM7B_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM7A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM7B_INVERT
                                  | RP2040_PWM_CSR_B_INV
#      endif
#      ifdef CONFIG_RP2040_PWM7_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    else
  ret = rp2040_pwmdev_initialize(7,
                                 CONFIG_RP2040_PWM7A_GPIO,
                                 (0
#      ifdef CONFIG_RP2040_PWM7A_INVERT
                                  | RP2040_PWM_CSR_A_INV
#      endif
#      ifdef CONFIG_RP2040_PWM7_PHASE_CORRECT
                                  | RP2040_PWM_CSR_PH_CORRECT
#      endif
                                 ));
#    endif
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize PWM7.\n");
    }
#  endif
#endif

#ifdef CONFIG_RP2040_SPISD
  /* Mount the SPI-based MMC/SD block driver */

  ret = board_spisd_initialize(0, CONFIG_RP2040_SPISD_SPI_CH);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize SPI device to MMC/SD: %d\n",
           ret);
    }
#endif

#ifdef CONFIG_ADC_MCP3008
  /* Register MCP3008 ADC. */

  struct spi_dev_s *spi = rp2040_spibus_initialize(0);
  if (spi == NULL)
    {
      syslog(LOG_ERR, "Failed to initialize SPI bus 0\n");
    }

  struct adc_dev_s *mcp3008 = mcp3008_initialize(spi);
  if (mcp3008 == NULL)
    {
      syslog(LOG_ERR, "Failed to initialize MCP3008\n");
    }

  ret = adc_register("/dev/adc1", mcp3008);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to register MCP3008 device driver: %d\n", ret);
    }
#endif

#ifdef CONFIG_FS_PROCFS
  /* Mount the procfs file system */

  ret = nx_mount(NULL, "/proc", "procfs", 0, NULL);
  if (ret < 0)
    {
      serr("ERROR: Failed to mount procfs at %s: %d\n", "/proc", ret);
    }
#endif

#ifdef CONFIG_SENSORS_BMP180
  /* Try to register BMP180 device in I2C0 */

  ret = board_bmp180_initialize(0);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize BMP180 driver: %d\n", ret);
    }
#endif

#ifdef CONFIG_SENSORS_BMP280
  /* Try to register BMP280 device in I2C0 */

  ret = board_bmp280_initialize(0);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize BMP280 driver: %d\n", ret);
    }
#endif

#ifdef CONFIG_SENSORS_MAX6675
  /* Try to register MAX6675 device as /dev/temp0 at SPI0 */

  ret = board_max6675_initialize(0, 0);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize MAX6675 driver: %d\n", ret);
    }
#endif

#ifdef CONFIG_SENSORS_INA219
  /* Configure and initialize the INA219 sensor in I2C0 */

  ret = board_ina219_initialize(0);
  if (ret < 0)
    {
      syslog(LOG_ERR, "ERROR: rp2040_ina219_initialize() failed: %d\n", ret);
    }
#endif

#ifdef CONFIG_SENSORS_SHT4X

  /* Try to register SHT4X device on I2C0 */

  ret = sht4x_register(rp2040_i2cbus_initialize(0), 0,
                       CONFIG_SHT4X_I2C_ADDR);
  if (ret < 0)
    {
      syslog(LOG_ERR, "ERROR: couldn't initialize SHT4x: %d\n", ret);
    }
#endif

#ifdef CONFIG_SENSORS_MCP9600
  /* Try to register MCP9600 device as /dev/therm0 at I2C0. */

  ret = mcp9600_register(rp2040_i2cbus_initialize(0), 0x60, 1, 2, 3);
  if (ret < 0)
    {
      syslog(LOG_ERR, "ERROR: couldn't initialize MCP9600: %d\n", ret);
    }
#endif

#ifdef CONFIG_SENSORS_MS56XX
  /* Try to register MS56xx device at I2C0 */

  ret = ms56xx_register(rp2040_i2cbus_initialize(0), 0, MS56XX_ADDR0,
                        MS56XX_MODEL_MS5611);
  if (ret < 0)
    {
        syslog(LOG_ERR, "ERROR: couldn't register MS5611: %d\n", ret);
    }
#endif

#ifdef CONFIG_VIDEO_FB
  ret = fb_register(0, 0);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize Frame Buffer Driver.\n");
    }
#elif defined(CONFIG_LCD)
  ret = board_lcd_initialize();
  if (ret < 0)
    {
      syslog(LOG_ERR, "ERROR: Failed to initialize LCD.\n");
    }
#endif

#ifdef CONFIG_LCD_DEV
  ret = lcddev_register(0);
  if (ret < 0)
    {
      syslog(LOG_ERR, "ERROR: lcddev_register() failed: %d\n", ret);
    }
#endif

#ifdef CONFIG_LCD_BACKPACK
  /* slcd:0, i2c:0, rows=2, cols=16 */

  ret = board_lcd_backpack_init(0, 0, 2, 16);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize PCF8574 LCD, error %d\n", ret);
    }
#endif

#ifdef CONFIG_RP2040_I2S
  ret = board_i2sdev_initialize(0);
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize I2S.\n");
    }
#endif

#ifdef CONFIG_DEV_GPIO
  ret = rp2040_dev_gpio_init();
  if (ret < 0)
    {
      syslog(LOG_ERR, "Failed to initialize GPIO Driver: %d\n", ret);
    }
#endif

  /* Initialize ADC */

#if defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC)

#  ifdef CONFIG_RPC2040_ADC_CHANNEL0
#    define ADC_0 true
#  else
#    define ADC_0 false
#  endif

#  ifdef CONFIG_RPC2040_ADC_CHANNEL1
#    define ADC_1 true
#  else
#    define ADC_1 false
#  endif

#  ifdef CONFIG_RPC2040_ADC_CHANNEL2
#    define ADC_2 true
#  else
#    define ADC_2 false
#  endif

#  ifdef CONFIG_RPC2040_ADC_CHANNEL3
#    define ADC_3 true
#  else
#    define ADC_3 false
#  endif

#  ifdef CONFIG_RPC2040_ADC_TEMPERATURE
#    define ADC_TEMP true
#  else
#    define ADC_TEMP false
#  endif

  ret = rp2040_adc_setup("/dev/adc0", ADC_0, ADC_1, ADC_2, ADC_3, ADC_TEMP);
  if (ret != OK)
    {
      syslog(LOG_ERR, "Failed to initialize ADC Driver: %d\n", ret);
    }

#endif /* defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC) */

  /* Initialize board neo-pixel */

#if defined(CONFIG_RP2040_BOARD_HAS_WS2812) && defined(CONFIG_WS2812)

  if (rp2040_ws2812_setup("/dev/leds0",
                          CONFIG_RP2040_WS2812_GPIO_PIN,
                          CONFIG_RP2040_WS2812_PWR_GPIO,
                          CONFIG_WS2812_LED_COUNT,
                          HAS_WHITE) == NULL)
    {
      syslog(LOG_ERR, "Failed to initialize WS2812: %d\n", errno);
    }
#endif

#ifdef CONFIG_WATCHDOG
  /* Configure watchdog timer */

  ret = rp2040_wdt_init();
  if (ret < 0)
    {
      syslog(LOG_ERR,
             "ERROR: Failed to initialize watchdog drivers: %d\n",
             ret);
    }
#endif

#ifdef CONFIG_RP2040_FLASH_FILE_SYSTEM

  mtd_dev = rp2040_flash_mtd_initialize();

  if (mtd_dev == NULL)
    {
      syslog(LOG_ERR, "ERROR: flash_mtd_initialize failed: %d\n", errno);
    }
  else
    {
      ret = smart_initialize(0, mtd_dev, NULL);

      if (ret < 0)
        {
          syslog(LOG_ERR, "ERROR: smart_initialize failed: %d\n", -ret);
        }
      else if (sizeof(CONFIG_RP2040_FLASH_MOUNT_POINT) > 1)
        {
          mkdir(CONFIG_RP2040_FLASH_MOUNT_POINT, 0777);

          /* Mount the file system */

          ret = nx_mount("/dev/smart0",
                        CONFIG_RP2040_FLASH_MOUNT_POINT,
                        "smartfs",
                        0,
                        NULL);
          if (ret < 0)
            {
              syslog(LOG_ERR,
                    "ERROR: nx_mount(\"/dev/smart0\", \"%s\", \"smartfs\","
                    " 0, NULL) failed: %d\n",
                    CONFIG_RP2040_FLASH_MOUNT_POINT,
                    ret);
            }
        }
    }

#endif

#if defined(CONFIG_RP2040_ROMFS_ROMDISK_DEVNAME)
  /* Register the ROM disk */

  ret = romdisk_register(CONFIG_RP2040_ROMFS_ROMDISK_MINOR,
                         rp2040_romfs_img,
                         NSECTORS(rp2040_romfs_img_len),
                         CONFIG_RP2040_ROMFS_ROMDISK_SECTSIZE);
  if (ret < 0)
    {
      syslog(LOG_ERR, "ERROR: romdisk_register failed: %d\n", -ret);
    }
  else
    {
      /* Mount the file system */

      ret = nx_mount(CONFIG_RP2040_ROMFS_ROMDISK_DEVNAME,
                     CONFIG_RP2040_ROMFS_MOUNT_MOUNTPOINT,
                     "romfs",
                     MS_RDONLY,
                     NULL);
      if (ret < 0)
        {
          syslog(LOG_ERR,
                 "ERROR: nx_mount(%s,%s,romfs) failed: %d\n",
                 CONFIG_RP2040_ROMFS_ROMDISK_DEVNAME,
                 CONFIG_RP2040_ROMFS_MOUNT_MOUNTPOINT,
                 ret);
        }
    }

#endif
  return ret;
}