/**************************************************************************** * boards/arm/stm32/stm3240g-eval/src/stm32_bringup.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include #include #include #include #ifdef CONFIG_STM32_SPI1 # include # include #endif #ifdef CONFIG_STM32_SDIO # include # include #endif #ifdef CONFIG_STM32_OTGFS # include "stm32_usbhost.h" #endif #ifdef CONFIG_RTC_DRIVER # include # include "stm32_rtc.h" #endif #ifdef CONFIG_VIDEO_FB # include #endif #ifdef CONFIG_INPUT_STMPE811 # include #endif #include "stm32.h" #include "stm32_i2c.h" #include "stm3240g-eval.h" /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ /* Configuration ************************************************************/ /* For now, don't build in any SPI1 support -- NSH is not using it */ #undef CONFIG_STM32_SPI1 /* Assume that we support everything until convinced otherwise */ #define HAVE_MMCSD 1 #define HAVE_USBDEV 1 #define HAVE_USBHOST 1 #define HAVE_RTC_DRIVER 1 /* Can't support MMC/SD features if mountpoints are disabled or if SDIO * support is not enabled. */ #if defined(CONFIG_DISABLE_MOUNTPOINT) || !defined(CONFIG_STM32_SDIO) # undef HAVE_MMCSD #endif /* Default MMC/SD minor number */ #ifdef HAVE_MMCSD # ifndef CONFIG_NSH_MMCSDMINOR # define CONFIG_NSH_MMCSDMINOR 0 # endif /* Default MMC/SD SLOT number */ # if defined(CONFIG_NSH_MMCSDSLOTNO) && CONFIG_NSH_MMCSDSLOTNO != 0 # error "Only one MMC/SD slot" # undef CONFIG_NSH_MMCSDSLOTNO # endif # ifndef CONFIG_NSH_MMCSDSLOTNO # define CONFIG_NSH_MMCSDSLOTNO 0 # endif #endif /* Can't support USB host or device features if USB OTG FS is not enabled */ #ifndef CONFIG_STM32_OTGFS # undef HAVE_USBDEV # undef HAVE_USBHOST #endif /* Can't support USB device is USB device is not enabled */ #ifndef CONFIG_USBDEV # undef HAVE_USBDEV #endif /* Can't support USB host is USB host is not enabled */ #ifndef CONFIG_USBHOST # undef HAVE_USBHOST #endif /* Check if we can support the RTC driver */ #if !defined(CONFIG_RTC) || !defined(CONFIG_RTC_DRIVER) # undef HAVE_RTC_DRIVER #endif /**************************************************************************** * Private Functions ****************************************************************************/ /**************************************************************************** * Name: stm32_i2c_register * * Description: * Register one I2C drivers for the I2C tool. * ****************************************************************************/ #ifdef HAVE_I2CTOOL static void stm32_i2c_register(int bus) { struct i2c_master_s *i2c; int ret; i2c = stm32_i2cbus_initialize(bus); if (i2c == NULL) { _err("ERROR: Failed to get I2C%d interface\n", bus); } else { ret = i2c_register(i2c, bus); if (ret < 0) { _err("ERROR: Failed to register I2C%d driver: %d\n", bus, ret); stm32_i2cbus_uninitialize(i2c); } } } #endif /**************************************************************************** * Name: stm32_i2ctool * * Description: * Register I2C drivers for the I2C tool. * ****************************************************************************/ #ifdef HAVE_I2CTOOL static void stm32_i2ctool(void) { #ifdef CONFIG_STM32_I2C1 stm32_i2c_register(1); #endif #ifdef CONFIG_STM32_I2C2 stm32_i2c_register(2); #endif #ifdef CONFIG_STM32_I2C3 stm32_i2c_register(3); #endif } #else # define stm32_i2ctool() #endif /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * Name: stm32_bringup * * Description: * Perform architecture-specific initialization * * CONFIG_BOARD_LATE_INITIALIZE=y : * Called from board_late_initialize(). * * CONFIG_BOARD_LATE_INITIALIZE=y && CONFIG_BOARDCTL=y : * Called from the NSH library * ****************************************************************************/ int stm32_bringup(void) { #ifdef HAVE_RTC_DRIVER struct rtc_lowerhalf_s *lower; #endif #ifdef CONFIG_STM32_SPI1 struct spi_dev_s *spi; struct mtd_dev_s *mtd; #endif #ifdef HAVE_MMCSD struct sdio_dev_s *sdio; #endif int ret; /* Register I2C drivers on behalf of the I2C tool */ stm32_i2ctool(); #ifdef HAVE_RTC_DRIVER /* Instantiate the STM32 lower-half RTC driver */ lower = stm32_rtc_lowerhalf(); if (!lower) { syslog(LOG_ERR, "ERROR: Failed to instantiate the RTC lower-half driver\n"); } else { /* Bind the lower half driver and register the combined RTC driver * as /dev/rtc0 */ ret = rtc_initialize(0, lower); if (ret < 0) { syslog(LOG_ERR, "ERROR: Failed to bind/register the RTC driver: %d\n", ret); } } #endif /* Configure SPI-based devices */ #ifdef CONFIG_STM32_SPI1 /* Get the SPI port */ spi = stm32_spibus_initialize(1); if (!spi) { syslog(LOG_ERR, "ERROR: Failed to initialize SPI port 0\n"); } else { /* Now bind the SPI interface to the M25P64/128 SPI FLASH driver */ mtd = m25p_initialize(spi); if (!mtd) { syslog(LOG_ERR, "ERROR: Failed to bind SPI port 0 to SPI FLASH driver\n"); } } #warning "Now what are we going to do with this SPI FLASH driver?" #endif #ifdef HAVE_MMCSD /* Mount the SDIO-based MMC/SD block driver */ /* First, get an instance of the SDIO interface */ sdio = sdio_initialize(CONFIG_NSH_MMCSDSLOTNO); if (!sdio) { syslog(LOG_ERR, "ERROR: Failed to initialize SDIO slot %d\n", CONFIG_NSH_MMCSDSLOTNO); } else { /* Now bind the SDIO interface to the MMC/SD driver */ ret = mmcsd_slotinitialize(CONFIG_NSH_MMCSDMINOR, sdio); if (ret != OK) { syslog(LOG_ERR, "ERROR: Failed to bind SDIO to the MMC/SD driver: %d\n", ret); } /* Then let's guess and say that there is a card in the slot. I need * to check to see if the STM3240G-EVAL board supports a GPIO to * detect if there is a card in the slot. */ sdio_mediachange(sdio, true); } #endif #ifdef CONFIG_FS_PROCFS /* Mount the procfs file system */ ret = nx_mount(NULL, "/proc", "procfs", 0, NULL); if (ret < 0) { syslog(LOG_ERR, "ERROR: Failed to mount procfs at /proc: %d\n", ret); } #endif #ifdef HAVE_USBHOST /* Initialize USB host operation. stm32_usbhost_initialize() starts a * thread that will monitor for USB connection and disconnection events. */ ret = stm32_usbhost_initialize(); if (ret != OK) { syslog(LOG_ERR, "ERROR: Failed to initialize USB host: %d\n", ret); } #endif #ifdef CONFIG_VIDEO_FB /* Initialize and register the simulated framebuffer driver */ ret = fb_register(0, 0); if (ret < 0) { syslog(LOG_ERR, "ERROR: fb_register() failed: %d\n", ret); } #endif #ifdef CONFIG_INPUT_STMPE811 /* Initialize the touchscreen. * WARNING: stm32_tsc_setup() cannot be called from the IDLE thread. */ ret = stm32_tsc_setup(0); if (ret < 0) { syslog(LOG_ERR, "ERROR: stm32_tsc_setup failed: %d\n", ret); } #endif #ifdef CONFIG_PWM /* Initialize PWM and register the PWM device. */ ret = stm32_pwm_setup(); if (ret < 0) { syslog(LOG_ERR, "ERROR: stm32_pwm_setup() failed: %d\n", ret); } #endif #ifdef CONFIG_ADC /* Initialize ADC and register the ADC driver. */ ret = stm32_adc_setup(); if (ret < 0) { syslog(LOG_ERR, "ERROR: stm32_adc_setup failed: %d\n", ret); } #endif #ifdef CONFIG_STM32_CAN_CHARDRIVER /* Initialize CAN and register the CAN driver. */ ret = stm32_can_setup(); if (ret < 0) { syslog(LOG_ERR, "ERROR: stm32_can_setup failed: %d\n", ret); } #endif UNUSED(ret); return OK; }