int sam_at24config(void) { struct i2c_master_s *i2c; struct mtd_dev_s *at24; int ret; /* Get an instance of the TWI0 interface */ i2c = sam_i2cbus_initialize(0); if (!i2c) { ferr("ERROR: Failed to initialize TWI0\n"); return -ENODEV; } /* Initialize the AT24 driver */ at24 = at24c_initialize(i2c); if (!at24) { ferr("ERROR: Failed to initialize the AT24 driver\n"); (void)sam_i2cbus_uninitialize(i2c); return -ENODEV; } /* Make sure that the AT24 is in normal memory access mode */ ret = at24->ioctl(at24, MTDIOC_EXTENDED, 0); if (ret < 0) { ferr("ERROR: AT24 ioctl(MTDIOC_EXTENDED) failed: %d\n", ret); } /* Bind the instance of an MTD device to the /dev/config device. */ ret = mtdconfig_register(at24); if (ret < 0) { ferr("ERROR: Failed to bind AT24 driver to the MTD config device\n"); (void)sam_i2cbus_uninitialize(i2c); } return ret; }
int nsh_archinitialize(void) { #if defined(HAVE_USBHOST) || defined(HAVE_USBMONITOR) int ret; #endif #ifdef CONFIG_STM32_SPI3 FAR struct spi_dev_s *spi; FAR struct mtd_dev_s *mtd; #endif int ret; /* Configure SPI-based devices */ #ifdef CONFIG_STM32_SPI3 /* Get the SPI port */ message("nsh_archinitialize: Initializing SPI port 3\n"); spi = up_spiinitialize(3); if (!spi) { message("nsh_archinitialize: Failed to initialize SPI port 3\n"); return -ENODEV; } message("nsh_archinitialize: Successfully initialized SPI port 3\n"); /* Now bind the SPI interface to the M25P8 SPI FLASH driver */ #if defined(CONFIG_MTD) && defined(CONFIG_MIKROE_FLASH) message("nsh_archinitialize: Bind SPI to the SPI flash driver\n"); mtd = m25p_initialize(spi); if (!mtd) { message("nsh_archinitialize: Failed to bind SPI port 3 to the SPI FLASH driver\n"); } else { message("nsh_archinitialize: Successfully bound SPI port 3 to the SPI FLASH driver\n"); #ifdef CONFIG_MIKROE_FLASH_PART { int partno; int partsize; int partoffset; const char *partstring = CONFIG_MIKROE_FLASH_PART_LIST; const char *ptr; FAR struct mtd_dev_s *mtd_part; char partname[4]; /* Now create a partition on the FLASH device */ partno = 0; ptr = partstring; partoffset = 0; while (*ptr != '\0') { /* Get the partition size */ partsize = atoi(ptr); mtd_part = mtd_partition(mtd, partoffset, (partsize>>2)*16); partoffset += (partsize >> 2) * 16; #ifdef CONFIG_MIKROE_FLASH_CONFIG_PART /* Test if this is the config partition */ if (CONFIG_MIKROE_FLASH_CONFIG_PART_NUMBER == partno) { /* Register the partition as the config device */ mtdconfig_register(mtd_part); } else #endif { /* Now initialize a SMART Flash block device and bind it * to the MTD device. */ #if defined(CONFIG_MTD_SMART) && defined(CONFIG_FS_SMARTFS) sprintf(partname, "p%d", partno); smart_initialize(CONFIG_MIKROE_FLASH_MINOR, mtd_part, partname); #endif } /* Update the pointer to point to the next size in the list */ while ((*ptr >= '0') && (*ptr <= '9')) { ptr++; } if (*ptr == ',') { ptr++; } /* Increment the part number */ partno++; } #else /* CONFIG_MIKROE_FLASH_PART */ /* Configure the device with no partition support */ smart_initialize(CONFIG_MIKROE_FLASH_MINOR, mtd, NULL); #endif /* CONFIG_MIKROE_FLASH_PART */ } } /* Create a RAM MTD device if configured */ #if defined(CONFIG_RAMMTD) && defined(CONFIG_MIKROE_RAMMTD) { uint8_t *start = (uint8_t *) kmalloc(CONFIG_MIKROE_RAMMTD_SIZE * 1024); mtd = rammtd_initialize(start, CONFIG_MIKROE_RAMMTD_SIZE * 1024); mtd->ioctl(mtd, MTDIOC_BULKERASE, 0); /* Now initialize a SMART Flash block device and bind it to the MTD device */ #if defined(CONFIG_MTD_SMART) && defined(CONFIG_FS_SMARTFS) smart_initialize(CONFIG_MIKROE_RAMMTD_MINOR, mtd, NULL); #endif } #endif /* CONFIG_RAMMTD && CONFIG_MIKROE_RAMMTD */ #endif /* CONFIG_MTD */ #endif /* CONFIG_STM32_SPI3 */ /* Create the SPI FLASH MTD instance */ /* The M25Pxx is not a good media to implement a file system.. * its block sizes are too large */ /* Mount the SDIO-based MMC/SD block driver */ #ifdef NSH_HAVEMMCSD /* Bind the spi interface to the MMC/SD driver */ message("nsh_archinitialize: Bind SDIO to the MMC/SD driver, minor=%d\n", CONFIG_NSH_MMCSDMINOR); ret = mmcsd_spislotinitialize(CONFIG_NSH_MMCSDMINOR, CONFIG_NSH_MMCSDSLOTNO, spi); if (ret != OK) { message("nsh_archinitialize: Failed to bind SPI to the MMC/SD driver: %d\n", ret); } else { message("nsh_archinitialize: Successfully bound SPI to the MMC/SD driver\n"); } #endif #ifdef HAVE_USBHOST /* Initialize USB host operation. stm32_usbhost_initialize() starts a thread * will monitor for USB connection and disconnection events. */ ret = stm32_usbhost_initialize(); if (ret != OK) { message("nsh_archinitialize: Failed to initialize USB host: %d\n", ret); return ret; } #endif #ifdef HAVE_USBMONITOR /* Start the USB Monitor */ ret = usbmonitor_start(0, NULL); if (ret != OK) { message("nsh_archinitialize: Start USB monitor: %d\n", ret); } #endif #ifdef CONFIG_LCD_MIO283QT2 /* Configure the TFT LCD module */ message("nsh_archinitialize: Initializing TFT LCD module\n"); ret = up_lcdinitialize(); if (ret != OK) { message("nsh_archinitialize: Failed to initialize TFT LCD module\n"); } #endif /* Configure the Audio sub-system if enabled and bind it to SPI 3 */ #ifdef CONFIG_AUDIO up_vs1053initialize(spi); #endif return OK; }
int board_app_initialize(void) { #if defined(CONFIG_STM32_SPI4) FAR struct spi_dev_s *spi; FAR struct mtd_dev_s *mtd; FAR struct mtd_geometry_s geo; #endif #if defined(CONFIG_MTD_PARTITION_NAMES) FAR const char *partname = CONFIG_STM32F429I_DISCO_FLASH_PART_NAMES; #endif #if defined(CONFIG_MTD) && defined(CONFIG_MTD_SST25XX) int ret; #elif defined(HAVE_USBHOST) || defined(HAVE_USBMONITOR) int ret; #endif /* Configure SPI-based devices */ #ifdef CONFIG_STM32_SPI4 /* Get the SPI port */ syslog(LOG_INFO, "Initializing SPI port 4\n"); spi = stm32_spibus_initialize(4); if (!spi) { syslog(LOG_ERR, "ERROR: Failed to initialize SPI port 4\n"); return -ENODEV; } syslog(LOG_INFO, "Successfully initialized SPI port 4\n"); /* Now bind the SPI interface to the SST25F064 SPI FLASH driver. This * is a FLASH device that has been added external to the board (i.e. * the board does not ship from STM with any on-board FLASH. */ #if defined(CONFIG_MTD) && defined(CONFIG_MTD_SST25XX) syslog(LOG_INFO, "Bind SPI to the SPI flash driver\n"); mtd = sst25xx_initialize(spi); if (!mtd) { syslog(LOG_ERR, "ERROR: Failed to bind SPI port 4 to the SPI FLASH driver\n"); } else { syslog(LOG_INFO, "Successfully bound SPI port 4 to the SPI FLASH driver\n"); /* Get the geometry of the FLASH device */ ret = mtd->ioctl(mtd, MTDIOC_GEOMETRY, (unsigned long)((uintptr_t)&geo)); if (ret < 0) { fdbg("ERROR: mtd->ioctl failed: %d\n", ret); return ret; } #ifdef CONFIG_STM32F429I_DISCO_FLASH_PART { int partno; int partsize; int partoffset; int partszbytes; int erasesize; const char *partstring = CONFIG_STM32F429I_DISCO_FLASH_PART_LIST; const char *ptr; FAR struct mtd_dev_s *mtd_part; char partref[4]; /* Now create a partition on the FLASH device */ partno = 0; ptr = partstring; partoffset = 0; /* Get the Flash erase size */ erasesize = geo.erasesize; while (*ptr != '\0') { /* Get the partition size */ partsize = atoi(ptr); partszbytes = (partsize << 10); /* partsize is defined in KB */ /* Check if partition size is bigger then erase block */ if (partszbytes < erasesize) { fdbg("ERROR: Partition size is lesser than erasesize!\n"); return -1; } /* Check if partition size is multiple of erase block */ if ((partszbytes % erasesize) != 0) { fdbg("ERROR: Partition size is not multiple of erasesize!\n"); return -1; } mtd_part = mtd_partition(mtd, partoffset, partszbytes / erasesize); partoffset += partszbytes / erasesize; #ifdef CONFIG_STM32F429I_DISCO_FLASH_CONFIG_PART /* Test if this is the config partition */ if (CONFIG_STM32F429I_DISCO_FLASH_CONFIG_PART_NUMBER == partno) { /* Register the partition as the config device */ mtdconfig_register(mtd_part); } else #endif { /* Now initialize a SMART Flash block device and bind it * to the MTD device. */ #if defined(CONFIG_MTD_SMART) && defined(CONFIG_FS_SMARTFS) sprintf(partref, "p%d", partno); smart_initialize(CONFIG_STM32F429I_DISCO_FLASH_MINOR, mtd_part, partref); #endif } #if defined(CONFIG_MTD_PARTITION_NAMES) /* Set the partition name */ if (mtd_part == NULL) { dbg("Error: failed to create partition %s\n", partname); return -1; } mtd_setpartitionname(mtd_part, partname); /* Now skip to next name. We don't need to split the string here * because the MTD partition logic will only display names up to * the comma, thus allowing us to use a single static name * in the code. */ while (*partname != ',' && *partname != '\0') { /* Skip to next ',' */ partname++; } if (*partname == ',') { partname++; } #endif /* Update the pointer to point to the next size in the list */ while ((*ptr >= '0') && (*ptr <= '9')) { ptr++; } if (*ptr == ',') { ptr++; } /* Increment the part number */ partno++; } } #else /* CONFIG_STM32F429I_DISCO_FLASH_PART */ /* Configure the device with no partition support */ smart_initialize(CONFIG_STM32F429I_DISCO_FLASH_MINOR, mtd, NULL); #endif /* CONFIG_STM32F429I_DISCO_FLASH_PART */ } #endif /* CONFIG_MTD */ #endif /* CONFIG_STM32_SPI4 */ /* Create a RAM MTD device if configured */ #if defined(CONFIG_RAMMTD) && defined(CONFIG_STM32F429I_DISCO_RAMMTD) { uint8_t *start = (uint8_t *) kmm_malloc(CONFIG_STM32F429I_DISCO_RAMMTD_SIZE * 1024); mtd = rammtd_initialize(start, CONFIG_STM32F429I_DISCO_RAMMTD_SIZE * 1024); mtd->ioctl(mtd, MTDIOC_BULKERASE, 0); /* Now initialize a SMART Flash block device and bind it to the MTD device */ #if defined(CONFIG_MTD_SMART) && defined(CONFIG_FS_SMARTFS) smart_initialize(CONFIG_STM32F429I_DISCO_RAMMTD_MINOR, mtd, NULL); #endif } #endif /* CONFIG_RAMMTD && CONFIG_STM32F429I_DISCO_RAMMTD */ #ifdef HAVE_USBHOST /* Initialize USB host operation. stm32_usbhost_initialize() starts a thread * 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); return ret; } #endif #ifdef HAVE_USBMONITOR /* Start the USB Monitor */ ret = usbmonitor_start(0, NULL); if (ret != OK) { syslog(LOG_ERR, "ERROR: Failed to start USB monitor: %d\n", ret); } #endif return OK; }
int configdata_main(int argc, char *argv[]) { unsigned int i; int ret; FAR struct mtd_dev_s *mtd; /* Seed the random number generated */ srand(0x93846); /* Create and initialize a RAM MTD device instance */ #ifdef CONFIG_EXAMPLES_CONFIGDATA_ARCHINIT mtd = configdata_archinitialize(); #else #if CONFIG_EXAMPLES_CONFIGDATA_VERBOSE != 0 message("Creating %d byte RAM drive\n", EXAMPLES_CONFIGDATA_BUFSIZE); #endif mtd = rammtd_initialize(g_simflash, EXAMPLES_CONFIGDATA_BUFSIZE); #endif if (!mtd) { message("ERROR: Failed to create RAM MTD instance\n"); msgflush(); exit(1); } /* Initialize to provide CONFIGDATA on an MTD interface */ #if CONFIG_EXAMPLES_CONFIGDATA_VERBOSE != 0 message("Registering /dev/config device\n"); #endif MTD_IOCTL(mtd, MTDIOC_BULKERASE, 0); ret = mtdconfig_register(mtd); if (ret < 0) { message("ERROR: /dev/config registration failed: %d\n", -ret); msgflush(); exit(2); } /* Zero out our entry array */ memset(g_entries, 0, sizeof(g_entries)); /* Open the /dev/config device */ g_fd = open("/dev/config", O_RDOK); if (g_fd == -1) { message("ERROR: Failed to open /dev/config %d\n", -errno); msgflush(); exit(2); } /* Initialize the before memory values */ #ifdef CONFIG_CAN_PASS_STRUCTS g_mmbefore = mallinfo(); #else (void)mallinfo(&g_mmbefore); #endif /* Loop seveal times ... create some config data items, delete them * randomly, verify them randomly, add new config items. */ g_ntests = g_nverified = 0; g_ntotaldelete = g_ntotalalloc = 0; #if CONFIG_EXAMPLES_CONFIGDATA_NLOOPS == 0 for (i = 0; ; i++) #else for (i = 1; i <= CONFIG_EXAMPLES_CONFIGDATA_NLOOPS; i++) #endif { /* Write config data to the /dev/config device until either (1) all of the * open file structures are utilized or until (2) CONFIGDATA reports an error * (hopefully that the /dev/config device is full) */ #ifndef CONFIG_EXAMPLES_CONFIGDATA_SILENT message("\n=== FILLING %d =============================\n", i); #endif ret = configdata_fillconfig(); #ifndef CONFIG_EXAMPLES_CONFIGDATA_SILENT message("Filled /dev/config\n"); message(" Number of entries: %d\n", g_nentries); #endif /* Verify all files entries to FLASH */ ret = configdata_verifyconfig(); if (ret < 0) { message("ERROR: Failed to verify partition\n"); message(" Number of entries: %d\n", g_nentries); } else { #ifndef CONFIG_EXAMPLES_CONFIGDATA_SILENT #if CONFIG_EXAMPLES_CONFIGDATA_VERBOSE != 0 message("Verified!\n"); message(" Number of entries: %d\n", g_nentries); #endif #endif } /* Delete some entries */ #ifndef CONFIG_EXAMPLES_CONFIGDATA_SILENT message("\n=== DELETING %d ============================\n", i); #endif ret = configdata_delentries(); if (ret < 0) { message("ERROR: Failed to delete enries\n"); message(" Number of entries: %d\n", g_nentries); message(" Number deleted: %d\n", g_ndeleted); } else { #ifndef CONFIG_EXAMPLES_CONFIGDATA_SILENT message("Deleted some enries\n"); message(" Number of entries: %d\n", g_nentries); message(" Number deleted: %d\n", g_ndeleted); #endif } /* Verify all files written to FLASH */ ret = configdata_verifyconfig(); if (ret < 0) { message("ERROR: Failed to verify partition\n"); message(" Number of entries: %d\n", g_nentries); message(" Number deleted: %d\n", g_ndeleted); } else { #ifndef CONFIG_EXAMPLES_CONFIGDATA_SILENT #if CONFIG_EXAMPLES_CONFIGDATA_VERBOSE != 0 message("Verified!\n"); message(" Number of entries: %d\n", g_nentries); message(" Number deleted: %d\n", g_ndeleted); #endif #endif } /* Clear deleted entries */ configdata_cleardeleted(); /* Show memory usage */ #ifndef CONFIG_EXAMPLES_CONFIGDATA_SILENT configdata_loopmemusage(); msgflush(); #else if ((i % EXAMPLES_CONFIGDATA_REPORT) == 0) { message("%d\n", i); msgflush(); } #endif } /* Delete all files then show memory usage again */ //configdata_delallfiles(); configdata_endmemusage(); msgflush(); return 0; }
int nsh_archinitialize(void) { #if defined(HAVE_USBHOST) || defined(HAVE_USBMONITOR) int ret; #endif #if defined(CONFIG_STM32_SPI5) || defined(CONFIG_STM32_SPI4) FAR struct spi_dev_s *spi; FAR struct mtd_dev_s *mtd; #endif #if defined(CONFIG_MTD_PARTITION_NAMES) FAR const char *partname = CONFIG_STM32F429I_DISCO_FLASH_PART_NAMES; #endif /* Configure SPI-based devices */ #ifdef CONFIG_STM32_SPI4 /* Get the SPI port */ message("nsh_archinitialize: Initializing SPI port 4\n"); spi = up_spiinitialize(4); if (!spi) { message("nsh_archinitialize: Failed to initialize SPI port 4\n"); return -ENODEV; } message("nsh_archinitialize: Successfully initialized SPI port 4\n"); /* Now bind the SPI interface to the SST25F064 SPI FLASH driver. This * is a FLASH device that has been added external to the board (i.e. * the board does not ship from STM with any on-board FLASH. */ #if defined(CONFIG_MTD) && defined(CONFIG_MTD_SST25XX) message("nsh_archinitialize: Bind SPI to the SPI flash driver\n"); mtd = sst25xx_initialize(spi); if (!mtd) { message("nsh_archinitialize: Failed to bind SPI port 4 to the SPI FLASH driver\n"); } else { message("nsh_archinitialize: Successfully bound SPI port 4 to the SPI FLASH driver\n"); #ifdef CONFIG_STM32F429I_DISCO_FLASH_PART { int partno; int partsize; int partoffset; const char *partstring = CONFIG_STM32F429I_DISCO_FLASH_PART_LIST; const char *ptr; FAR struct mtd_dev_s *mtd_part; char partref[4]; /* Now create a partition on the FLASH device */ partno = 0; ptr = partstring; partoffset = 0; while (*ptr != '\0') { /* Get the partition size */ partsize = atoi(ptr); mtd_part = mtd_partition(mtd, partoffset, (partsize>>2) * 16); partoffset += (partsize >> 2) * 16; #ifdef CONFIG_STM32F429I_DISCO_FLASH_CONFIG_PART /* Test if this is the config partition */ if (CONFIG_STM32F429I_DISCO_FLASH_CONFIG_PART_NUMBER == partno) { /* Register the partition as the config device */ mtdconfig_register(mtd_part); } else #endif { /* Now initialize a SMART Flash block device and bind it * to the MTD device. */ #if defined(CONFIG_MTD_SMART) && defined(CONFIG_FS_SMARTFS) sprintf(partref, "p%d", partno); smart_initialize(CONFIG_STM32F429I_DISCO_FLASH_MINOR, mtd_part, partref); #endif } /* Set the partition name */ #if defined(CONFIG_MTD_PARTITION_NAMES) mtd_setpartitionname(mtd_part, partname); /* Now skip to next name. We don't need to split the string here * because the MTD partition logic will only display names up to * the comma, thus allowing us to use a single static name * in the code. */ while (*partname != ',' && *partname != '\0') { /* Skip to next ',' */ partname++; } if (*partname == ',') { partname++; } #endif /* Update the pointer to point to the next size in the list */ while ((*ptr >= '0') && (*ptr <= '9')) { ptr++; } if (*ptr == ',') { ptr++; } /* Increment the part number */ partno++; } } #else /* CONFIG_STM32F429I_DISCO_FLASH_PART */ /* Configure the device with no partition support */ smart_initialize(CONFIG_STM32F429I_DISCO_FLASH_MINOR, mtd, NULL); #endif /* CONFIG_STM32F429I_DISCO_FLASH_PART */ } #endif /* CONFIG_MTD */ #endif /* CONFIG_STM32_SPI4 */ /* Create a RAM MTD device if configured */ #if defined(CONFIG_RAMMTD) && defined(CONFIG_STM32F429I_DISCO_RAMMTD) { uint8_t *start = (uint8_t *) kmalloc(CONFIG_STM32F429I_DISCO_RAMMTD_SIZE * 1024); mtd = rammtd_initialize(start, CONFIG_STM32F429I_DISCO_RAMMTD_SIZE * 1024); mtd->ioctl(mtd, MTDIOC_BULKERASE, 0); /* Now initialize a SMART Flash block device and bind it to the MTD device */ #if defined(CONFIG_MTD_SMART) && defined(CONFIG_FS_SMARTFS) smart_initialize(CONFIG_STM32F429I_DISCO_RAMMTD_MINOR, mtd, NULL); #endif } #endif /* CONFIG_RAMMTD && CONFIG_STM32F429I_DISCO_RAMMTD */ #ifdef HAVE_USBHOST /* Initialize USB host operation. stm32_usbhost_initialize() starts a thread * will monitor for USB connection and disconnection events. */ ret = stm32_usbhost_initialize(); if (ret != OK) { message("nsh_archinitialize: Failed to initialize USB host: %d\n", ret); return ret; } #ifdef CONFIG_USBHOST_MSC /* Initialize the USB storage class */ ret = usbhost_storageinit(); if (ret != OK) { message("nsh_archinitialize: Failed to initialize USB host storage: %d\n", ret); return ret; } #endif #endif #ifdef HAVE_USBMONITOR /* Start the USB Monitor */ ret = usbmonitor_start(0, NULL); if (ret != OK) { message("nsh_archinitialize: Start USB monitor: %d\n", ret); } #endif return OK; }