__EXPORT int nsh_archinitialize(void) { int result; /* configure the high-resolution time/callout interface */ hrt_init(); /* configure CPU load estimation */ #ifdef CONFIG_SCHED_INSTRUMENTATION cpuload_initialize_once(); #endif /* set up the serial DMA polling */ static struct hrt_call serial_dma_call; struct timespec ts; /* * Poll at 1ms intervals for received bytes that have not triggered * a DMA event. */ ts.tv_sec = 0; ts.tv_nsec = 1000000; hrt_call_every(&serial_dma_call, ts_to_abstime(&ts), ts_to_abstime(&ts), (hrt_callout)stm32_serial_dma_poll, NULL); board_pwr_init(1); /* initial LED state */ drv_led_start(); led_off(LED_AMBER); led_off(LED_BLUE); #if defined(FLASH_BASED_PARAMS) static sector_descriptor_t sector_map[] = { {1, 16 * 1024, 0x08004000}, {2, 16 * 1024, 0x08008000}, {0, 0, 0}, }; /* Initalizee the flashfs layer to use heap allocated memory */ result = parameter_flashfs_init(sector_map, NULL, 0); if (result != OK) { message("[boot] FAILED to init params in FLASH %d\n", result); up_ledon(LED_AMBER); return -ENODEV; } #endif return OK; }
__EXPORT void test(void) { uint16_t largest_block = (32 * 1024) + 32; uint8_t *buffer = malloc(largest_block); parameter_flashfs_init(test_sector_map, buffer, largest_block); for (int t = 0; t < sizeof(test_buf); t++) { test_buf[t] = (uint8_t) t; } int er = parameter_flashfs_erase(); uint8_t *fbuffer; size_t buf_size; int written = 0; int read = 0; int rv = 0; for (int a = 0; a <= 4; a++) { rv = parameter_flashfs_alloc(parameters_token, &fbuffer, &buf_size); memcpy(fbuffer, test_buf, a); buf_size = a; written = parameter_flashfs_write(parameters_token, fbuffer, buf_size); read = parameter_flashfs_read(parameters_token, &fbuffer, &buf_size); parameter_flashfs_free(); if (read != written) { static volatile int j; j++; } } int block = 2048; for (int a = 0; a <= 8; a++) { rv = parameter_flashfs_alloc(parameters_token, &fbuffer, &buf_size); memcpy(fbuffer, test_buf, block); buf_size = block; written = parameter_flashfs_write(parameters_token, fbuffer, buf_size); read = parameter_flashfs_read(parameters_token, &fbuffer, &buf_size); parameter_flashfs_free(); if (read != written) { static volatile int j; j++; } block += 2048; } rv++; er++; free(buffer); }
__EXPORT int board_app_initialize(uintptr_t arg) { int result; #if defined(CONFIG_HAVE_CXX) && defined(CONFIG_HAVE_CXXINITIALIZE) /* run C++ ctors before we go any further */ up_cxxinitialize(); # if defined(CONFIG_EXAMPLES_NSH_CXXINITIALIZE) # error CONFIG_EXAMPLES_NSH_CXXINITIALIZE Must not be defined! Use CONFIG_HAVE_CXX and CONFIG_HAVE_CXXINITIALIZE. # endif #else # error platform is dependent on c++ both CONFIG_HAVE_CXX and CONFIG_HAVE_CXXINITIALIZE must be defined. #endif /* configure the high-resolution time/callout interface */ hrt_init(); /* configure the DMA allocator */ if (board_dma_alloc_init() < 0) { message("DMA alloc FAILED"); } /* configure CPU load estimation */ #ifdef CONFIG_SCHED_INSTRUMENTATION cpuload_initialize_once(); #endif /* set up the serial DMA polling */ static struct hrt_call serial_dma_call; struct timespec ts; /* * Poll at 1ms intervals for received bytes that have not triggered * a DMA event. */ ts.tv_sec = 0; ts.tv_nsec = 1000000; hrt_call_every(&serial_dma_call, ts_to_abstime(&ts), ts_to_abstime(&ts), (hrt_callout)stm32_serial_dma_poll, NULL); #if defined(CONFIG_STM32_BBSRAM) /* NB. the use of the console requires the hrt running * to poll the DMA */ /* Using Battery Backed Up SRAM */ int filesizes[CONFIG_STM32_BBSRAM_FILES + 1] = BSRAM_FILE_SIZES; stm32_bbsraminitialize(BBSRAM_PATH, filesizes); #if defined(CONFIG_STM32_SAVE_CRASHDUMP) /* Panic Logging in Battery Backed Up Files */ /* * In an ideal world, if a fault happens in flight the * system save it to BBSRAM will then reboot. Upon * rebooting, the system will log the fault to disk, recover * the flight state and continue to fly. But if there is * a fault on the bench or in the air that prohibit the recovery * or committing the log to disk, the things are too broken to * fly. So the question is: * * Did we have a hard fault and not make it far enough * through the boot sequence to commit the fault data to * the SD card? */ /* Do we have an uncommitted hard fault in BBSRAM? * - this will be reset after a successful commit to SD */ int hadCrash = hardfault_check_status("boot"); if (hadCrash == OK) { message("[boot] There is a hard fault logged. Hold down the SPACE BAR," \ " while booting to halt the system!\n"); /* Yes. So add one to the boot count - this will be reset after a successful * commit to SD */ int reboots = hardfault_increment_reboot("boot", false); /* Also end the misery for a user that holds for a key down on the console */ int bytesWaiting; ioctl(fileno(stdin), FIONREAD, (unsigned long)((uintptr_t) &bytesWaiting)); if (reboots > 2 || bytesWaiting != 0) { /* Since we can not commit the fault dump to disk. Display it * to the console. */ hardfault_write("boot", fileno(stdout), HARDFAULT_DISPLAY_FORMAT, false); message("[boot] There were %d reboots with Hard fault that were not committed to disk - System halted %s\n", reboots, (bytesWaiting == 0 ? "" : " Due to Key Press\n")); /* For those of you with a debugger set a break point on up_assert and * then set dbgContinue = 1 and go. */ /* Clear any key press that got us here */ static volatile bool dbgContinue = false; int c = '>'; while (!dbgContinue) { switch (c) { case EOF: case '\n': case '\r': case ' ': continue; default: putchar(c); putchar('\n'); switch (c) { case 'D': case 'd': hardfault_write("boot", fileno(stdout), HARDFAULT_DISPLAY_FORMAT, false); break; case 'C': case 'c': hardfault_rearm("boot"); hardfault_increment_reboot("boot", true); break; case 'B': case 'b': dbgContinue = true; break; default: break; } // Inner Switch message("\nEnter B - Continue booting\n" \ "Enter C - Clear the fault log\n" \ "Enter D - Dump fault log\n\n?>"); fflush(stdout); if (!dbgContinue) { c = getchar(); } break; } // outer switch } // for } // inner if } // outer if #endif // CONFIG_STM32_SAVE_CRASHDUMP #endif // CONFIG_STM32_BBSRAM /* initial LED state */ drv_led_start(); led_off(LED_AMBER); led_off(LED_BLUE); #if defined(FLASH_BASED_PARAMS) /* * Bootloader(sector 0): * start: 0x08000000, len: 16K, end: 0x08003E80 * * FlashFS(sector 1 and 2): * start: 0x08004000, len: 32K, end: 0x0800C000 * * Firmware(sector 3 to 11): * start: 0x0800C000, len: 976K, end: 0x080FA480 * * First 1MB memory bank complete. * Second 1MB memory bank is reserved for future use. */ static sector_descriptor_t sector_map[] = { {1, 16 * 1024, 0x08004000}, {2, 16 * 1024, 0x08008000}, {0, 0, 0}, }; /* Initialize the flashfs layer to use heap allocated memory */ result = parameter_flashfs_init(sector_map, NULL, 0); if (result != OK) { message("[boot] FAILED to init params in FLASH %d\n", result); led_on(LED_AMBER); return -ENODEV; } #endif return OK; }