forked from Archive/PX4-Autopilot
Add DMA buffer allocation pool.
This commit is contained in:
parent
3a326cb467
commit
bbac1445b0
|
@ -58,6 +58,7 @@
|
||||||
#include <nuttx/sdio.h>
|
#include <nuttx/sdio.h>
|
||||||
#include <nuttx/mmcsd.h>
|
#include <nuttx/mmcsd.h>
|
||||||
#include <nuttx/analog/adc.h>
|
#include <nuttx/analog/adc.h>
|
||||||
|
#include <nuttx/gran.h>
|
||||||
|
|
||||||
#include <stm32.h>
|
#include <stm32.h>
|
||||||
#include "board_config.h"
|
#include "board_config.h"
|
||||||
|
@ -69,6 +70,7 @@
|
||||||
#include <drivers/drv_led.h>
|
#include <drivers/drv_led.h>
|
||||||
|
|
||||||
#include <systemlib/cpuload.h>
|
#include <systemlib/cpuload.h>
|
||||||
|
#include <systemlib/perf_counter.h>
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Pre-Processor Definitions
|
* Pre-Processor Definitions
|
||||||
|
@ -76,6 +78,10 @@
|
||||||
|
|
||||||
/* Configuration ************************************************************/
|
/* Configuration ************************************************************/
|
||||||
|
|
||||||
|
#if !defined(CONFIG_GRAN) || !defined(CONFIG_FAT_DMAMEMORY)
|
||||||
|
# error microSD DMA support requires CONFIG_GRAN and CONFIG_FAT_DMAMEMORY
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Debug ********************************************************************/
|
/* Debug ********************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_CPP_HAVE_VARARGS
|
#ifdef CONFIG_CPP_HAVE_VARARGS
|
||||||
|
@ -96,10 +102,59 @@
|
||||||
* Protected Functions
|
* 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
|
* 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
|
* Name: stm32_boardinitialize
|
||||||
*
|
*
|
||||||
|
@ -110,7 +165,8 @@
|
||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
__EXPORT void stm32_boardinitialize(void)
|
__EXPORT void
|
||||||
|
stm32_boardinitialize(void)
|
||||||
{
|
{
|
||||||
/* configure SPI interfaces */
|
/* configure SPI interfaces */
|
||||||
stm32_spiinitialize();
|
stm32_spiinitialize();
|
||||||
|
@ -170,6 +226,9 @@ __EXPORT int nsh_archinitialize(void)
|
||||||
/* configure the high-resolution time/callout interface */
|
/* configure the high-resolution time/callout interface */
|
||||||
hrt_init();
|
hrt_init();
|
||||||
|
|
||||||
|
/* configure the DMA allocator */
|
||||||
|
dma_alloc_init();
|
||||||
|
|
||||||
/* configure CPU load estimation */
|
/* configure CPU load estimation */
|
||||||
#ifdef CONFIG_SCHED_INSTRUMENTATION
|
#ifdef CONFIG_SCHED_INSTRUMENTATION
|
||||||
cpuload_initialize_once();
|
cpuload_initialize_once();
|
||||||
|
|
Loading…
Reference in New Issue