|
|
|
@ -58,6 +58,7 @@
@@ -58,6 +58,7 @@
|
|
|
|
|
#include <nuttx/sdio.h> |
|
|
|
|
#include <nuttx/mmcsd.h> |
|
|
|
|
#include <nuttx/analog/adc.h> |
|
|
|
|
#include <nuttx/gran.h> |
|
|
|
|
|
|
|
|
|
#include <stm32.h> |
|
|
|
|
#include "board_config.h" |
|
|
|
@ -69,6 +70,7 @@
@@ -69,6 +70,7 @@
|
|
|
|
|
#include <drivers/drv_led.h> |
|
|
|
|
|
|
|
|
|
#include <systemlib/cpuload.h> |
|
|
|
|
#include <systemlib/perf_counter.h> |
|
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
|
* Pre-Processor Definitions |
|
|
|
@ -76,6 +78,10 @@
@@ -76,6 +78,10 @@
|
|
|
|
|
|
|
|
|
|
/* Configuration ************************************************************/ |
|
|
|
|
|
|
|
|
|
#if !defined(CONFIG_GRAN) || !defined(CONFIG_FAT_DMAMEMORY) |
|
|
|
|
# error microSD DMA support requires CONFIG_GRAN and CONFIG_FAT_DMAMEMORY |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* Debug ********************************************************************/ |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_CPP_HAVE_VARARGS |
|
|
|
@ -96,10 +102,59 @@
@@ -96,10 +102,59 @@
|
|
|
|
|
* Protected Functions |
|
|
|
|
****************************************************************************/ |
|
|
|
|
|
|
|
|
|
static GRAN_HANDLE dma_allocator; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* The DMA heap size constrains the total number of things that can be
|
|
|
|
|
* ready to do DMA at a time. |
|
|
|
|
* |
|
|
|
|
* For example, FAT DMA depends on one sector-sized buffer per filesystem plus |
|
|
|
|
* one sector-sized buffer per file.
|
|
|
|
|
* |
|
|
|
|
* We use a fundamental alignment / granule size of 64B; this is sufficient |
|
|
|
|
* to guarantee alignment for the largest STM32 DMA burst (16 beats x 32bits). |
|
|
|
|
*/ |
|
|
|
|
static uint8_t g_dma_heap[8192] __attribute__((aligned(64))); |
|
|
|
|
static perf_counter_t g_dma_perf; |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
dma_alloc_init(void) |
|
|
|
|
{ |
|
|
|
|
dma_allocator = gran_initialize(g_dma_heap, |
|
|
|
|
sizeof(g_dma_heap), |
|
|
|
|
7, /* 128B granule - must be > alignment (XXX bug?) */ |
|
|
|
|
6); /* 64B alignment */ |
|
|
|
|
if (dma_allocator == NULL) { |
|
|
|
|
message("[boot] DMA allocator setup FAILED"); |
|
|
|
|
} else { |
|
|
|
|
g_dma_perf = perf_alloc(PC_COUNT, "DMA allocations"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
|
* Public Functions |
|
|
|
|
****************************************************************************/ |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* DMA-aware allocator stubs for the FAT filesystem. |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
__EXPORT void *fat_dma_alloc(size_t size); |
|
|
|
|
__EXPORT void fat_dma_free(FAR void *memory, size_t size); |
|
|
|
|
|
|
|
|
|
void * |
|
|
|
|
fat_dma_alloc(size_t size) |
|
|
|
|
{ |
|
|
|
|
perf_count(g_dma_perf); |
|
|
|
|
return gran_alloc(dma_allocator, size); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
fat_dma_free(FAR void *memory, size_t size) |
|
|
|
|
{ |
|
|
|
|
gran_free(dma_allocator, memory, size); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/************************************************************************************
|
|
|
|
|
* Name: stm32_boardinitialize |
|
|
|
|
* |
|
|
|
@ -110,7 +165,8 @@
@@ -110,7 +165,8 @@
|
|
|
|
|
* |
|
|
|
|
************************************************************************************/ |
|
|
|
|
|
|
|
|
|
__EXPORT void stm32_boardinitialize(void) |
|
|
|
|
__EXPORT void |
|
|
|
|
stm32_boardinitialize(void) |
|
|
|
|
{ |
|
|
|
|
/* configure SPI interfaces */ |
|
|
|
|
stm32_spiinitialize(); |
|
|
|
@ -170,6 +226,9 @@ __EXPORT int nsh_archinitialize(void)
@@ -170,6 +226,9 @@ __EXPORT int nsh_archinitialize(void)
|
|
|
|
|
/* configure the high-resolution time/callout interface */ |
|
|
|
|
hrt_init(); |
|
|
|
|
|
|
|
|
|
/* configure the DMA allocator */ |
|
|
|
|
dma_alloc_init(); |
|
|
|
|
|
|
|
|
|
/* configure CPU load estimation */ |
|
|
|
|
#ifdef CONFIG_SCHED_INSTRUMENTATION |
|
|
|
|
cpuload_initialize_once(); |
|
|
|
|