CMSIS-DSP: Updated SDF pack.

Removed unused variables in some tests.
pull/19/head
Christophe Favergeon 4 years ago
parent 06e66cefca
commit 2cd6c30118

@ -8,6 +8,9 @@
<url>http://www.keil.com/pack/</url>
<releases>
<release version="0.3.0" date="2021-11-08">
Refactor of the pack
</release>
<release version="0.2.0" date="2021-10-20">
Adding support for VHT platform
</release>
@ -27,56 +30,90 @@
<require condition="CMSIS-DSP"/>
</condition>
<condition id="Ring Buffer">
<require Cclass="Data Processing" Cgroup="Synchronous Data Flow" Csub="Ring Buffer"/>
<condition id="RTOS2">
<require Cclass="CMSIS" Cgroup="RTOS2" Capiversion="2.1.3"/>
</condition>
<condition id="EventRecorder">
<require Cclass="Compiler" Cgroup="EventRecorder"/>
</condition>
<condition id="SDFRTOS2">
<require condition="SDF"/>
<require condition="RTOS2"/>
<require condition="EventRecorder"/>
</condition>
<condition id="StreamingVHT">
<require Cclass="Data Processing" Cgroup="Synchronous Data Flow" Csub="Streaming Nodes"/>
<require condition="SDF"/>
<require condition="RTOS2"/>
</condition>
</conditions>
<components>
<component Cclass="Data Processing" Cgroup="Synchronous Data Flow" Csub="Core" Cvariant="Source" Cversion="0.2.0-dev" isDefaultVariant="true" condition="CMSIS-DSP">
<description>SDFTools for CMSIS-DSP</description>
<component Cclass="Data Processing" Cgroup="Synchronous Data Flow" Csub="Core" Cvariant="Source" Cversion="0.3.0-dev" isDefaultVariant="true" condition="CMSIS-DSP">
<description>SDF core files for CMSIS-DSP</description>
<files>
<file category="header" name="sdf/src/GenericNodes.h"/>
<file category="include" name="sdf/nodes/cpp/"/>
<file category="include" name="sdf/nodes/cpp/RingBuffer/"/>
<file category="include" name="sdf/src/"/>
</files>
</component>
<component Cclass="Data Processing" Cgroup="Synchronous Data Flow" Csub="AudioSource" Cvariant="VHT" Cversion="0.2.0-dev" isDefaultVariant="true" condition="Ring Buffer">
<description>AudioSource for VHT</description>
<component Cclass="Data Processing" Cgroup="Synchronous Data Flow" Csub="Streaming Nodes" Cversion="0.3.0-dev" Cvariant="CMSIS-RTOS"
isDefaultVariant="true" condition="SDFRTOS2">
<description>Streaming nodes for SDF</description>
<files>
<file category="include" name="sdf/nodes/cpp/StreamingNodes/RingBuffer/"/>
<file category="header" name="sdf/nodes/cpp/StreamingNodes/RingBuffer/RingInit.h"/>
<file category="header" name="sdf/nodes/cpp/StreamingNodes/RingBuffer/RingBuffer.h"/>
<file category="sourceCpp" name="sdf/nodes/cpp/StreamingNodes/RingBuffer/RingBuffer.cpp"/>
<file category="sourceCpp" name="sdf/nodes/cpp/StreamingNodes/RingBuffer/RingInit.cpp"/>
<file category="include" name="sdf/nodes/cpp/StreamingNodes/CMSIS_RTOS/"/>
<file category="other" name="sdf/nodes/cpp/StreamingNodes/CMSIS_RTOS/ring.scvd" />
<file category="header" name="sdf/nodes/cpp/StreamingNodes/Config/RingConfig.h" attr="config" version="1.0.0"/>
</files>
</component>
<component Cclass="Data Processing" Cgroup="Synchronous Data Flow" Csub="AudioNodes" Cvariant="VHT" Cversion="0.3.0-dev" isDefaultVariant="true" condition="StreamingVHT">
<description>Audio Source and Sink for VHT</description>
<files>
<file category="header" name="sdf/nodes/cpp/RingBuffer/VHT/Config/RingConfig.h" attr="config" version="1.0.0"/>
<file category="header" name="sdf/nodes/cpp/StreamingNodes/Config/AudioConfig.h" attr="config" version="1.0.0"/>
<file category="sourceCpp" name="sdf/nodes/cpp/RingBuffer/VHT/AudioInterrupt.cpp"/>
<file category="sourceCpp" name="sdf/nodes/cpp/StreamingNodes/VHT/audio/AudioInterrupt.cpp"/>
<file category="source" name="sdf/nodes/cpp/StreamingNodes/VHT/audio/audio_drv.c"/>
<file category="include" name="sdf/nodes/cpp/RingBuffer/VHT/"/>
<file category="header" name="sdf/nodes/cpp/StreamingNodes/VHT/audio/audio_drv.h"/>
<file category="other" name="sdf/nodes/cpp/RingBuffer/VHT/ring.scvd" />
</files>
</component>
<component Cclass="Data Processing" Cgroup="Synchronous Data Flow" Csub="Ring Buffer" Cvariant="Source" Cversion="0.2.0-dev" isDefaultVariant="true" condition="CMSIS-DSP">
<description>RingBuffer</description>
<component Cclass="Data Processing" Cgroup="Synchronous Data Flow" Csub="VideoNodes" Cvariant="VHT" Cversion="0.3.0-dev" isDefaultVariant="true" condition="StreamingVHT">
<description>Video Source for VHT</description>
<files>
<file category="header" name="sdf/nodes/cpp/RingBuffer/RingBuffer/RingBuffer.h"/>
<file category="header" name="sdf/nodes/cpp/RingBuffer/RingBuffer/RingInit.h"/>
<file category="include" name="sdf/nodes/cpp/RingBuffer/RingBuffer/"/>
<file category="header" name="sdf/nodes/cpp/StreamingNodes/Config/VideoConfig.h" attr="config" version="1.0.0"/>
<file category="sourceCpp" name="sdf/nodes/cpp/StreamingNodes/VHT/video/VideoInterrupt.cpp"/>
<file category="source" name="sdf/nodes/cpp/StreamingNodes/VHT/video/video_drv.c"/>
<file category="header" name="sdf/nodes/cpp/StreamingNodes/VHT/video/video_drv.h"/>
<file category="sourceCpp" name="sdf/nodes/cpp/RingBuffer/RingBuffer/RingBuffer.cpp"/>
<file category="sourceCpp" name="sdf/nodes/cpp/RingBuffer/RingBuffer/RingInit.cpp"/>
</files>
</component>
</components>
</package>

@ -1,51 +0,0 @@
#ifndef _RINGCONFIG_H_
#define _RINGCONFIG_H_
// <<< Use Configuration Wizard in Context Menu >>>
// <h>Audio Configuration
// <o>Sampling Frequency <8000=> 8000 kHz <16000=> 16000 kHz
// <44100=> 44100 kHz <48000=> 48000 kHz
#ifndef AUDIO_SAMPLINGFREQUENCY
#define AUDIO_SAMPLINGFREQUENCY 16000
#endif
// <o>Number of samples <256=> 256 <512=> 512 <1024=> 1024 <2048=> 2048
// <i> Must be consistent with the settings of the Audio source
#ifndef AUDIO_NBSAMPLES
#define AUDIO_NBSAMPLES 2048
#endif
// <o>Number of channels <1=> Mono <2=> Stereo
#ifndef AUDIO_NBCHANNELS
#define AUDIO_NBCHANNELS 1U
#endif
// <o>Channel encoding <2=> 16 Bits
#ifndef AUDIO_CHANNEL_ENCODING
#define AUDIO_CHANNEL_ENCODING 2U
#endif
// <q> RX_ENABLED: Enable RX
#define RX_ENABLED 1
// <q> TX_ENABLED: Enable TX
#define TX_ENABLED 1
// <q> SDF_VHT_TX_RX_ORDERING: Force TX RX ordering
#define SDF_VHT_TX_RX_ORDERING 0
// </h>
// <h>Ring Buffer Configuration
// <o>Number of buffers <2=> 2 <4=> 4 <8=> 8 <16=> 16 <32=> 32
#ifndef RING_NBBUFS
#define RING_NBBUFS 4
#endif
// </h>
// <<< end of configuration section >>>
#define RING_BUFSIZE (AUDIO_NBSAMPLES * AUDIO_NBCHANNELS * AUDIO_CHANNEL_ENCODING)
#endif

@ -35,7 +35,6 @@ Implementation for RTX + Keil MDK Event logger
*/
#include <stddef.h>
#include "audio_drv.h"
#include "arm_vsi.h"
#ifdef _RTE_
#include "RTE_Components.h"

@ -0,0 +1,69 @@
#ifndef _AUDIOCONFIG_H_
#define _AUDIOCONFIG_H_
// <<< Use Configuration Wizard in Context Menu >>>
// <e>Audio Configuration for RX
#ifndef AUDIO_DRV_RX_ENABLED
#define AUDIO_DRV_RX_ENABLED 1
#endif
// <o>Sampling Frequency <8000=> 8000 kHz <16000=> 16000 kHz
// <44100=> 44100 kHz <48000=> 48000 kHz
#ifndef AUDIO_DRV_SAMPLINGFREQUENCY_RX
#define AUDIO_DRV_SAMPLINGFREQUENCY_RX 16000
#endif
// <o>Number of samples <256=> 256 <512=> 512 <1024=> 1024 <2048=> 2048
// <i> Must be consistent with the settings of the Audio source
#ifndef AUDIO_DRV_NBSAMPLES_RX
#define AUDIO_DRV_NBSAMPLES_RX 2048
#endif
// <o>Number of channels <1=> Mono <2=> Stereo
#ifndef AUDIO_DRV_NBCHANNELS_RX
#define AUDIO_DRV_NBCHANNELS_RX 1U
#endif
// <o>Channel encoding <2=> 16 Bits
#ifndef AUDIO_DRV_CHANNEL_ENCODING_RX
#define AUDIO_DRV_CHANNEL_ENCODING_RX 2U
#endif
// </e>
// <e>Audio Configuration for TX
#ifndef AUDIO_DRV_TX_ENABLED
#define AUDIO_DRV_TX_ENABLED 1
#endif
// <o>Sampling Frequency <8000=> 8000 kHz <16000=> 16000 kHz
// <44100=> 44100 kHz <48000=> 48000 kHz
#ifndef AUDIO_DRV_SAMPLINGFREQUENCY_TX
#define AUDIO_DRV_SAMPLINGFREQUENCY_TX 16000
#endif
// <o>Number of samples <256=> 256 <512=> 512 <1024=> 1024 <2048=> 2048
// <i> Must be consistent with the settings of the Audio source
#ifndef AUDIO_DRV_NBSAMPLES_TX
#define AUDIO_DRV_NBSAMPLES_TX 2048
#endif
// <o>Number of channels <1=> Mono <2=> Stereo
#ifndef AUDIO_DRV_NBCHANNELS_TX
#define AUDIO_DRV_NBCHANNELS_TX 1U
#endif
// <o>Channel encoding <2=> 16 Bits
#ifndef AUDIO_DRV_CHANNEL_ENCODING_TX
#define AUDIO_DRV_CHANNEL_ENCODING_TX 2U
#endif
// </e>
// <q> SDF_VHT_TX_RX_ORDERING: Force TX RX ordering
#define SDF_VHT_TX_RX_ORDERING 0
// <<< end of configuration section >>>
#define SDF_AUDIO_CONFIG
#endif

@ -0,0 +1,26 @@
#ifndef _RINGCONFIG_H_
#define _RINGCONFIG_H_
// <<< Use Configuration Wizard in Context Menu >>>
// <h>Ring Buffer Configuration
// <o>Number of buffers <2=> 2 <4=> 4 <8=> 8 <16=> 16 <32=> 32
#ifndef RING_NBBUFS
#define RING_NBBUFS 4
#endif
// </h>
// <<< end of configuration section >>>
#if defined(SDF_AUDIO_CONFIG)
#define RING_BUFSIZE_RX (AUDIO_DRV_NBSAMPLES_RX * AUDIO_DRV_NBCHANNELS_RX * AUDIO_DRV_CHANNEL_ENCODING_RX)
#define RING_BUFSIZE_TX (AUDIO_DRV_NBSAMPLES_TX * AUDIO_DRV_NBCHANNELS_TX * AUDIO_DRV_CHANNEL_ENCODING_TX)
#endif
#if defined(SDF_VIDEO_CONFIG)
#define RING_BUFSIZE_RX (VIDEO_DRV_WIDTH * VIDEO_DRV_HEIGHT * VIDEO_DRV_PIXEL_SIZE)
#define RING_BUFSIZE_TX 0
#endif
#endif

@ -0,0 +1,35 @@
#ifndef _VIDEOCONFIG_H_
#define _VIDEOCONFIG_H_
// <<< Use Configuration Wizard in Context Menu >>>
// <h>Video Configuration
// <o>Width in pixels <16-640>
#ifndef VIDEO_DRV_WIDTH
#define VIDEO_DRV_WIDTH 32
#endif
// <o>Height in pixels <16-640>
#ifndef VIDEO_DRV_HEIGHT
#define VIDEO_DRV_HEIGHT 32
#endif
// <o>Pixel size in bytes <1=> 1 <2=> 2
#ifndef VIDEO_DRV_PIXEL_SIZE
#define VIDEO_DRV_PIXEL_SIZE 1
#endif
// <o>Frame rate <10=> 10 <25=> 25 <30=> 30 <60=> 60
#ifndef VIDEO_DRV_FRAME_RATE
#define VIDEO_DRV_FRAME_RATE 10
#endif
// </h>
// <<< end of configuration section >>>
#define SDF_VIDEO_CONFIG
#endif

@ -33,28 +33,25 @@
int initRingAndAudio(ring_config_t *ringConfigRX,
void initRing(ring_config_t *ringConfigRX,
uint8_t *rxBuffer,
uint32_t bufSizeRX,
int rxInterruptID,
ring_config_t *ringConfigTX,
uint8_t *txBuffer,
uint32_t bufSizeTX,
int txInterruptID,
int timeOut)
{
/* Initialization of the ring buffer data structure */
if (ringConfigRX != NULL)
{
ringInit(ringConfigRX,RING_NBBUFS,RING_BUFSIZE,rxBuffer,rxInterruptID,timeOut);
ringInit(ringConfigRX,RING_NBBUFS,bufSizeRX,rxBuffer,rxInterruptID,timeOut);
}
if (ringConfigTX != NULL)
{
ringInit(ringConfigTX,RING_NBBUFS,RING_BUFSIZE,txBuffer,txInterruptID,timeOut);
ringInit(ringConfigTX,RING_NBBUFS,bufSizeTX,txBuffer,txInterruptID,timeOut);
}
/* Initialization of the audio HW and reservation of first buffer from the
ring buffer
*/
int err=AudioDrv_Setup();
return(err);
}

@ -37,18 +37,16 @@ extern "C"
{
#endif
extern int32_t AudioDrv_Setup(void);
extern ring_config_t ringConfigRX;
extern ring_config_t ringConfigTX;
extern uint8_t* AudioRXBuffer();
extern uint8_t* AudioTXBuffer();
int initRingAndAudio(ring_config_t *ringConfigRX,
void initRing(ring_config_t *ringConfigRX,
uint8_t *rxBuffer,
uint32_t bufSizeRX,
int rxInterruptID,
ring_config_t *ringConfigTX,
uint8_t *txBuffer,
uint32_t bufSizeTX,
int txInterruptID,
int timeOut);

@ -15,87 +15,96 @@
#include "arm_math.h"
#include "SchedEvents.h"
#include "AudioConfig.h"
#include "RingConfig.h"
#include "RingInit.h"
extern osThreadId_t gAudioThreadID;
extern osThreadId_t gStreamingThreadID;
// Number of bytes read by DMA
#define AUDIO_BLOCK_SIZE RING_BUFSIZE
#define AUDIO_BLOCK_SIZE_RX RING_BUFSIZE_RX
#define AUDIO_BLOCK_SIZE_TX RING_BUFSIZE_TX
// Number of DMA blocks
#define AUDIO_DMA_NB_BLOCKS RING_NBBUFS
extern int32_t AudioDrv_Setup(void);
#if RX_ENABLED
#if AUDIO_DRV_RX_ENABLED
extern ring_config_t ringConfigRX;
#ifdef __FVP_PY
__attribute__((section(".ARM.__at_0x90000000")))
#endif
#if SDF_VHT_TX_RX_ORDERING
__ALIGNED(16) static uint8_t dmaRX[AUDIO_BLOCK_SIZE];
__ALIGNED(16) static uint8_t dmaRX[AUDIO_BLOCK_SIZE_RX];
int rxCount=0;
#endif
__ALIGNED(16) static uint8_t audio_bufferRX[AUDIO_DMA_NB_BLOCKS*AUDIO_BLOCK_SIZE];
__ALIGNED(16) static uint8_t audio_bufferRX[AUDIO_DMA_NB_BLOCKS*AUDIO_BLOCK_SIZE_RX];
static uint8_t *reservedBufRX=NULL;
#endif
#if TX_ENABLED
#if AUDIO_DRV_TX_ENABLED
extern ring_config_t ringConfigTX;
#ifdef __FVP_PY
__attribute__((section(".ARM.__at_0x9FFF0000")))
#endif
#if SDF_VHT_TX_RX_ORDERING
__ALIGNED(16) static uint8_t dmaTX[AUDIO_BLOCK_SIZE];
__ALIGNED(16) static uint8_t dmaTX[AUDIO_BLOCK_SIZE_TX];
int txCount=0;
#endif
__ALIGNED(16) static uint8_t audio_bufferTX[AUDIO_DMA_NB_BLOCKS*AUDIO_BLOCK_SIZE];
__ALIGNED(16) static uint8_t audio_bufferTX[AUDIO_DMA_NB_BLOCKS*AUDIO_BLOCK_SIZE_TX];
static uint8_t *reservedBufTX=NULL;
#endif
uint8_t* AudioRXBuffer()
{
#if AUDIO_DRV_RX_ENABLED
return(audio_bufferRX);
#else
return(NULL);
#endif
}
uint8_t* AudioTXBuffer()
{
return(audio_bufferTX);
#if AUDIO_DRV_TX_ENABLED
return(audio_bufferTX);
#else
return(NULL);
#endif
}
static void AudioEvent (uint32_t event) {
#if RX_ENABLED
#if AUDIO_DRV_RX_ENABLED
if (event & AUDIO_DRV_EVENT_RX_DATA)
{
#if SDF_VHT_TX_RX_ORDERING
memcpy(reservedBufRX,dmaRX,RING_BUFSIZE);
memcpy(reservedBufRX,dmaRX,RING_BUFSIZE_RX);
(void)AudioDrv_Control(AUDIO_DRV_CONTROL_RX_DISABLE);
(void)AudioDrv_Control(AUDIO_DRV_CONTROL_TX_ENABLE);
#endif
ringInterruptReleaseBuffer(&ringConfigRX,(void *)gAudioThreadID);
ringInterruptReleaseBuffer(&ringConfigRX,(void *)gStreamingThreadID);
int reservedRX=ringInterruptReserveBuffer(&ringConfigRX);
reservedBufRX=ringGetBufferAddress(&ringConfigRX,reservedRX);
}
#endif
#if TX_ENABLED
#if AUDIO_DRV_TX_ENABLED
if (event & AUDIO_DRV_EVENT_TX_DATA)
{
#if SDF_VHT_TX_RX_ORDERING
memcpy(dmaTX,reservedBufTX,RING_BUFSIZE);
memcpy(dmaTX,reservedBufTX,RING_BUFSIZE_TX);
(void)AudioDrv_Control(AUDIO_DRV_CONTROL_TX_DISABLE);
(void)AudioDrv_Control(AUDIO_DRV_CONTROL_RX_ENABLE);
#endif
ringInterruptReleaseBuffer(&ringConfigTX,(void *)gAudioThreadID);
ringInterruptReleaseBuffer(&ringConfigTX,(void *)gStreamingThreadID);
int reservedTX=ringInterruptReserveBuffer(&ringConfigTX);
reservedBufTX=ringGetBufferAddress(&ringConfigTX,reservedTX);
}
@ -110,12 +119,12 @@ int32_t AudioDrv_Setup(void) {
return ret;
}
#if RX_ENABLED
#if AUDIO_DRV_RX_ENABLED
ret = AudioDrv_Configure(AUDIO_DRV_INTERFACE_RX,
AUDIO_NBCHANNELS, /* single channel */
8U * AUDIO_CHANNEL_ENCODING, /* 16 sample bits */
static_cast<uint32_t>(AUDIO_SAMPLINGFREQUENCY));
AUDIO_DRV_NBCHANNELS_RX, /* single channel */
8U * AUDIO_DRV_CHANNEL_ENCODING_RX, /* 16 sample bits */
static_cast<uint32_t>(AUDIO_DRV_SAMPLINGFREQUENCY_RX));
if (ret != 0) {
return ret;
}
@ -128,10 +137,10 @@ int32_t AudioDrv_Setup(void) {
#if SDF_VHT_TX_RX_ORDERING
ret = AudioDrv_SetBuf(AUDIO_DRV_INTERFACE_RX,
dmaRX, 1,AUDIO_BLOCK_SIZE);
dmaRX, 1,AUDIO_BLOCK_SIZE_RX);
#else
ret = AudioDrv_SetBuf(AUDIO_DRV_INTERFACE_RX,
audio_bufferRX, AUDIO_DMA_NB_BLOCKS,AUDIO_BLOCK_SIZE);
audio_bufferRX, AUDIO_DMA_NB_BLOCKS,AUDIO_BLOCK_SIZE_RX);
#endif
if (ret != 0) {
return ret;
@ -144,13 +153,13 @@ int32_t AudioDrv_Setup(void) {
}
#endif
#endif /* RX_ENABLED */
#endif /* AUDIO_DRV_RX_ENABLED */
#if TX_ENABLED
#if AUDIO_DRV_TX_ENABLED
ret = AudioDrv_Configure(AUDIO_DRV_INTERFACE_TX,
AUDIO_NBCHANNELS, /* single channel */
8U * AUDIO_CHANNEL_ENCODING, /* 16 sample bits */
static_cast<uint32_t>(AUDIO_SAMPLINGFREQUENCY));
AUDIO_DRV_NBCHANNELS_TX, /* single channel */
8U * AUDIO_DRV_CHANNEL_ENCODING_TX, /* 16 sample bits */
static_cast<uint32_t>(AUDIO_DRV_SAMPLINGFREQUENCY_TX));
if (ret != 0) {
return ret;
}
@ -170,10 +179,10 @@ int32_t AudioDrv_Setup(void) {
#if SDF_VHT_TX_RX_ORDERING
ret = AudioDrv_SetBuf(AUDIO_DRV_INTERFACE_TX,
dmaTX, 1 ,AUDIO_BLOCK_SIZE);
dmaTX, 1 ,AUDIO_BLOCK_SIZE_TX);
#else
ret = AudioDrv_SetBuf(AUDIO_DRV_INTERFACE_TX,
audio_bufferTX, AUDIO_DMA_NB_BLOCKS,AUDIO_BLOCK_SIZE);
audio_bufferTX, AUDIO_DMA_NB_BLOCKS,AUDIO_BLOCK_SIZE_TX);
#endif
if (ret != 0) {
@ -185,7 +194,7 @@ int32_t AudioDrv_Setup(void) {
return ret;
}
#endif /* TX_ENABLED */
#endif /* AUDIO_DRV_TX_ENABLED */
return 0;

@ -0,0 +1,292 @@
/*
* Copyright (c) 2021 Arm Limited. All rights reserved.
*/
#include <stddef.h>
#include "audio_drv.h"
#include "arm_vsi.h"
#ifdef _RTE_
#include "RTE_Components.h"
#endif
#include CMSIS_device_header
/* Audio Peripheral definitions */
#define AudioO ARM_VSI1 /* Audio Output access struct */
#define AudioO_IRQn ARM_VSI1_IRQn /* Audio Output Interrupt number */
#define AudioO_Handler ARM_VSI1_Handler /* Audio Output Interrupt handler */
#define AudioI ARM_VSI0 /* Audio Input access struct */
#define AudioI_IRQn ARM_VSI0_IRQn /* Audio Input Interrupt number */
#define AudioI_Handler ARM_VSI0_Handler /* Audio Input Interrupt handler */
/* Audio Peripheral registers */
#define CONTROL Regs[0] /* Control receiver */
#define CHANNELS Regs[1] /* Number of channels */
#define SAMPLE_BITS Regs[2] /* Sample number of bits (8..32) */
#define SAMPLE_RATE Regs[3] /* Sample rate (samples per second) */
#define STOP_SIMULATION Regs[4] /* Stop audio simulation */
/* Audio Control register definitions */
#define CONTROL_ENABLE_Pos 0U /* CONTROL: ENABLE Position */
#define CONTROL_ENABLE_Msk (1UL << CONTROL_ENABLE_Pos) /* CONTROL: ENABLE Mask */
/* Driver State */
static uint8_t Initialized = 0U;
/* Event Callback */
static AudioDrv_Event_t CB_Event = NULL;
/* Audio Output Interrupt Handler */
void AudioO_Handler (void) {
AudioO->IRQ.Clear = 0x00000001U;
__DSB();
__ISB();
if (CB_Event != NULL) {
CB_Event(AUDIO_DRV_EVENT_TX_DATA);
}
}
/* Audio Input Interrupt Handler */
void AudioI_Handler (void) {
AudioI->IRQ.Clear = 0x00000001U;
__DSB();
__ISB();
if (CB_Event != NULL) {
CB_Event(AUDIO_DRV_EVENT_RX_DATA);
}
}
/* Initialize Audio Interface */
int32_t AudioDrv_Initialize (AudioDrv_Event_t cb_event) {
CB_Event = cb_event;
/* Initialize Audio Output peripheral */
AudioO->Timer.Control = 0U;
AudioO->DMA.Control = 0U;
AudioO->IRQ.Clear = 0x00000001U;
AudioO->IRQ.Enable = 0x00000001U;
AudioO->CONTROL = 0U;
/* Initialize Audio Input peripheral */
AudioI->Timer.Control = 0U;
AudioI->DMA.Control = 0U;
AudioI->IRQ.Clear = 0x00000001U;
AudioI->IRQ.Enable = 0x00000001U;
AudioI->CONTROL = 0U;
/* Enable peripheral interrupts */
//NVIC_EnableIRQ(AudioO_IRQn);
NVIC->ISER[(((uint32_t)AudioO_IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)AudioO_IRQn) & 0x1FUL));
//NVIC_EnableIRQ(AudioI_IRQn);
NVIC->ISER[(((uint32_t)AudioI_IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)AudioI_IRQn) & 0x1FUL));
__DSB();
__ISB();
Initialized = 1U;
return AUDIO_DRV_OK;
}
/* De-initialize Audio Interface */
int32_t AudioDrv_Uninitialize (void) {
/* Disable peripheral interrupts */
//NVIC_DisableIRQ(AudioO_IRQn);
NVIC->ICER[(((uint32_t)AudioO_IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)AudioO_IRQn) & 0x1FUL));
//NVIC_DisableIRQ(AudioI_IRQn);
NVIC->ICER[(((uint32_t)AudioI_IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)AudioI_IRQn) & 0x1FUL));
__DSB();
__ISB();
/* De-initialize Audio Output peripheral */
AudioO->Timer.Control = 0U;
AudioO->DMA.Control = 0U;
AudioO->IRQ.Clear = 0x00000001U;
AudioO->IRQ.Enable = 0x00000000U;
AudioO->CONTROL = 0U;
/* De-initialize Audio Input peripheral */
AudioI->Timer.Control = 0U;
AudioI->DMA.Control = 0U;
AudioI->IRQ.Clear = 0x00000001U;
AudioI->IRQ.Enable = 0x00000000U;
AudioI->CONTROL = 0U;
Initialized = 0U;
return AUDIO_DRV_OK;
}
/* Configure Audio Interface */
int32_t AudioDrv_Configure (uint32_t interface, uint32_t channels, uint32_t sample_bits, uint32_t sample_rate) {
uint32_t format;
if (Initialized == 0U) {
return AUDIO_DRV_ERROR;
}
if ((channels < 1U) ||
(channels > 32U) ||
(sample_bits < 8U) ||
(sample_bits > 32U) ||
(sample_rate == 0U)) {
return AUDIO_DRV_ERROR_PARAMETER;
}
switch (interface) {
case AUDIO_DRV_INTERFACE_TX:
if ((AudioO->CONTROL & CONTROL_ENABLE_Msk) != 0U) {
return AUDIO_DRV_ERROR;
}
AudioO->CHANNELS = channels;
AudioO->SAMPLE_BITS = sample_bits;
AudioO->SAMPLE_RATE = sample_rate;
break;
case AUDIO_DRV_INTERFACE_RX:
if ((AudioI->CONTROL & CONTROL_ENABLE_Msk) != 0U) {
return AUDIO_DRV_ERROR;
}
AudioI->CHANNELS = channels;
AudioI->SAMPLE_BITS = sample_bits;
AudioI->SAMPLE_RATE = sample_rate;
break;
default:
return AUDIO_DRV_ERROR_PARAMETER;
}
return AUDIO_DRV_OK;
}
/* Set Audio Interface buffer */
int32_t AudioDrv_SetBuf (uint32_t interface, void *buf, uint32_t block_num, uint32_t block_size) {
if (Initialized == 0U) {
return AUDIO_DRV_ERROR;
}
switch (interface) {
case AUDIO_DRV_INTERFACE_TX:
if ((AudioO->DMA.Control & ARM_VSI_DMA_Enable_Msk) != 0U) {
return AUDIO_DRV_ERROR;
}
AudioO->DMA.Address = (uint32_t)buf;
AudioO->DMA.BlockNum = block_num;
AudioO->DMA.BlockSize = block_size;
break;
case AUDIO_DRV_INTERFACE_RX:
if ((AudioI->DMA.Control & ARM_VSI_DMA_Enable_Msk) != 0U) {
return AUDIO_DRV_ERROR;
}
AudioI->DMA.Address = (uint32_t)buf;
AudioI->DMA.BlockNum = block_num;
AudioI->DMA.BlockSize = block_size;
break;
default:
return AUDIO_DRV_ERROR_PARAMETER;
}
return AUDIO_DRV_OK;
}
/* Control Audio Interface */
int32_t AudioDrv_Control (uint32_t control) {
uint32_t sample_size;
uint32_t sample_rate;
uint32_t block_size;
if (Initialized == 0U) {
return AUDIO_DRV_ERROR;
}
if ((control & AUDIO_DRV_CONTROL_TX_DISABLE) != 0U) {
AudioO->Timer.Control = 0U;
AudioO->DMA.Control = 0U;
AudioO->CONTROL = 0U;
} else if ((control & AUDIO_DRV_CONTROL_TX_ENABLE) != 0U) {
AudioO->CONTROL = CONTROL_ENABLE_Msk;
AudioO->DMA.Control = ARM_VSI_DMA_Direction_M2P |
ARM_VSI_DMA_Enable_Msk;
sample_size = AudioO->CHANNELS * ((AudioO->SAMPLE_BITS + 7U) / 8U);
sample_rate = AudioO->SAMPLE_RATE;
if ((sample_size == 0U) || (sample_rate == 0U)) {
AudioO->Timer.Interval = 0xFFFFFFFFU;
} else {
block_size = AudioO->DMA.BlockSize;
AudioO->Timer.Interval = (1000000U * (block_size / sample_size)) / sample_rate;
}
AudioO->Timer.Control = ARM_VSI_Timer_Trig_DMA_Msk |
ARM_VSI_Timer_Trig_IRQ_Msk |
ARM_VSI_Timer_Periodic_Msk |
ARM_VSI_Timer_Run_Msk;
}
if ((control & AUDIO_DRV_CONTROL_RX_DISABLE) != 0U) {
AudioI->Timer.Control = 0U;
AudioI->DMA.Control = 0U;
AudioI->CONTROL = 0U;
} else if ((control & AUDIO_DRV_CONTROL_RX_ENABLE) != 0U) {
AudioI->CONTROL = CONTROL_ENABLE_Msk;
AudioI->DMA.Control = ARM_VSI_DMA_Direction_P2M |
ARM_VSI_DMA_Enable_Msk;
sample_size = AudioI->CHANNELS * ((AudioI->SAMPLE_BITS + 7U) / 8U);
sample_rate = AudioI->SAMPLE_RATE;
if ((sample_size == 0U) || (sample_rate == 0U)) {
AudioI->Timer.Interval = 0xFFFFFFFFU;
} else {
block_size = AudioI->DMA.BlockSize;
AudioI->Timer.Interval = (1000000U * (block_size / sample_size)) / sample_rate;
}
AudioI->Timer.Control = ARM_VSI_Timer_Trig_DMA_Msk |
ARM_VSI_Timer_Trig_IRQ_Msk |
ARM_VSI_Timer_Periodic_Msk |
ARM_VSI_Timer_Run_Msk;
}
return AUDIO_DRV_OK;
}
/* Get transmitted block count */
uint32_t AudioDrv_GetTxCount (void) {
return (AudioO->Timer.Count);
}
/* Get received block count */
uint32_t AudioDrv_GetRxCount (void) {
return (AudioI->Timer.Count);
}
/* Get Audio Interface status */
AudioDrv_Status_t AudioDrv_GetStatus (void) {
AudioDrv_Status_t status;
uint32_t sr;
if ((AudioO->CONTROL & CONTROL_ENABLE_Msk) != 0U) {
status.tx_active = 1U;
} else {
status.tx_active = 0U;
}
if ((AudioI->CONTROL & CONTROL_ENABLE_Msk) != 0U) {
status.rx_active = 1U;
} else {
status.rx_active = 0U;
}
return (status);
}
void AudioDrv_Stop (void)
{
int32_t ret;
ret = AudioDrv_Control(AUDIO_DRV_CONTROL_TX_DISABLE);
ret = AudioDrv_Control(AUDIO_DRV_CONTROL_RX_DISABLE);
AudioO->STOP_SIMULATION=1;
AudioI->STOP_SIMULATION=1;
}

@ -0,0 +1,135 @@
/*
* Copyright (c) 2021 Arm Limited. All rights reserved.
*/
#ifndef __AUDIO_DRV_H
#define __AUDIO_DRV_H
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdint.h>
/* Audio Interface */
#define AUDIO_DRV_INTERFACE_TX (1U) ///< Transmitter
#define AUDIO_DRV_INTERFACE_RX (2U) ///< Receiver
/* Audio Control */
#define AUDIO_DRV_CONTROL_TX_ENABLE (1UL << 0) ///< Enable Transmitter
#define AUDIO_DRV_CONTROL_RX_ENABLE (1UL << 1) ///< Enable Receiver
#define AUDIO_DRV_CONTROL_TX_DISABLE (1UL << 2) ///< Disable Transmitter
#define AUDIO_DRV_CONTROL_RX_DISABLE (1UL << 3) ///< Disable Receiver
/* Audio Event */
#define AUDIO_DRV_EVENT_TX_DATA (1UL << 0) ///< Data block transmitted
#define AUDIO_DRV_EVENT_RX_DATA (1UL << 1) ///< Data block received
/* Return code */
#define AUDIO_DRV_OK (0) ///< Operation succeeded
#define AUDIO_DRV_ERROR (-1) ///< Unspecified error
#define AUDIO_DRV_ERROR_BUSY (-2) ///< Driver is busy
#define AUDIO_DRV_ERROR_TIMEOUT (-3) ///< Timeout occurred
#define AUDIO_DRV_ERROR_UNSUPPORTED (-4) ///< Operation not supported
#define AUDIO_DRV_ERROR_PARAMETER (-5) ///< Parameter error
/**
\brief Audio Status
*/
typedef struct {
uint32_t tx_active : 1; ///< Transmitter active
uint32_t rx_active : 1; ///< Receiver active
uint32_t reserved : 30;
} AudioDrv_Status_t;
/**
\fn AudioDrv_Event_t
\brief Audio Events callback function type: void (*AudioDrv_Event_t) (uint32_t event
\param[in] event events notification mask
\return none
*/
typedef void (*AudioDrv_Event_t) (uint32_t event);
uint8_t* AudioRXBuffer();
uint8_t* AudioTXBuffer();
extern int32_t AudioDrv_Setup(void);
/**
\fn int32_t AudioDrv_Initialize (AudioDrv_Event_t cb_event)
\brief Initialize Audio Interface.
\param[in] cb_event pointer to \ref AudioDrv_Event_t
\return return code
*/
int32_t AudioDrv_Initialize (AudioDrv_Event_t cb_event);
/**
\fn void AudioDrv_Stop (void);
\brief Stop audio simulation.
\return return code
*/
void AudioDrv_Stop (void);
/**
\fn int32_t AudioDrv_Uninitialize (void)
\brief De-initialize Audio Interface.
\return return code
*/
int32_t AudioDrv_Uninitialize (void);
/**
\fn int32_t AudioDrv_Configure (uint32_t interface, uint32_t channels, uint32_t sample_bits, uint32_t sample_rate)
\brief Configure Audio Interface.
\param[in] interface audio interface
\param[in] channels number of channels
\param[in] sample_bits sample number of bits (8..32)
\param[in] sample_rate sample rate (samples per second)
\return return code
*/
int32_t AudioDrv_Configure (uint32_t interface, uint32_t channels, uint32_t sample_bits, uint32_t sample_rate);
/**
\fn int32_t AudioDrv_SetBuf (uint32_t interface, void *buf, uint32_t block_num, uint32_t block_size)
\brief Set Audio Interface buffer.
\param[in] interface audio interface
\param[in] buf pointer to buffer for audio data
\param[in] block_num number of blocks in buffer (must be 2^n)
\param[in] block_size block size in number of samples
\return return code
*/
int32_t AudioDrv_SetBuf (uint32_t interface, void *buf, uint32_t block_num, uint32_t block_size);
/**
\fn int32_t AudioDrv_Control (uint32_t control)
\brief Control Audio Interface.
\param[in] control operation
\return return code
*/
int32_t AudioDrv_Control (uint32_t control);
/**
\fn uint32_t AudioDrv_GetTxCount (void)
\brief Get transmitted block count.
\return number of transmitted blocks
*/
uint32_t AudioDrv_GetTxCount (void);
/**
\fn uint32_t AudioDrv_GetRxCount (void)
\brief Get received block count.
\return number of received blocks
*/
uint32_t AudioDrv_GetRxCount (void);
/**
\fn AudioDrv_Status_t AudioDrv_GetStatus (void)
\brief Get Audio Interface status.
\return \ref AudioDrv_Status_t
*/
AudioDrv_Status_t AudioDrv_GetStatus (void);
#ifdef __cplusplus
}
#endif
#endif /* __AUDIO_DRV_H */

@ -0,0 +1,101 @@
#include <stddef.h>
#include "video_drv.h"
#include "arm_vsi.h"
#ifdef _RTE_
#include "RTE_Components.h"
#endif
#include CMSIS_device_header
#include "cmsis_os2.h"
#include "RingBuffer.h"
#include "arm_math.h"
#include "SchedEvents.h"
#include "VideoConfig.h"
#include "RingConfig.h"
#include "RingInit.h"
extern osThreadId_t gStreamingThreadID;
// Number of bytes read by DMA
#define VIDEO_BLOCK_SIZE RING_BUFSIZE_RX
// Number of DMA blocks
#define VIDEO_DMA_NB_BLOCKS RING_NBBUFS
extern int32_t VideoDrv_Setup(void);
extern ring_config_t ringConfigRX;
#ifdef __FVP_PY
__attribute__((section(".ARM.__at_0x90000000")))
#endif
__ALIGNED(16) static uint8_t video_bufferRX[VIDEO_DMA_NB_BLOCKS*VIDEO_BLOCK_SIZE];
static uint8_t *reservedBufRX=NULL;
uint8_t* VideoRXBuffer()
{
return(video_bufferRX);
}
static void VideoEvent (uint32_t event) {
if (event & VIDEO_DRV_EVENT_RX_DATA)
{
ringInterruptReleaseBuffer(&ringConfigRX,(void *)gStreamingThreadID);
int reservedRX=ringInterruptReserveBuffer(&ringConfigRX);
reservedBufRX=ringGetBufferAddress(&ringConfigRX,reservedRX);
}
}
int32_t VideoDrv_Setup(void) {
int32_t ret;
ret = VideoDrv_Initialize(VideoEvent);
if (ret != 0) {
return ret;
}
ret = VideoDrv_Configure(VIDEO_DRV_INTERFACE_RX,
8U * VIDEO_DRV_PIXEL_SIZE, /* 16 sample bits */
static_cast<uint32_t>(VIDEO_DRV_FRAME_RATE*VIDEO_DRV_WIDTH*VIDEO_DRV_HEIGHT));
if (ret != 0) {
return ret;
}
/* Work because user process not started yet
*/
int reservedRX=ringInterruptReserveBuffer(&ringConfigRX);
reservedBufRX=ringGetBufferAddress(&ringConfigRX,reservedRX);
ret = VideoDrv_SetBuf(VIDEO_DRV_INTERFACE_RX,
video_bufferRX, VIDEO_DMA_NB_BLOCKS,VIDEO_BLOCK_SIZE);
if (ret != 0) {
return ret;
}
ret = VideoDrv_Control(VIDEO_DRV_CONTROL_RX_ENABLE);
if (ret != 0) {
return ret;
}
return 0;
}

@ -0,0 +1,232 @@
/*
* Copyright (c) 2021 Arm Limited. All rights reserved.
*/
#include <stddef.h>
#include "video_drv.h"
#include "arm_vsi.h"
#ifdef _RTE_
#include "RTE_Components.h"
#endif
#include CMSIS_device_header
/* Video Peripheral definitions */
#define VideoO ARM_VSI1 /* Video Output access struct */
#define VideoO_IRQn ARM_VSI1_IRQn /* Video Output Interrupt number */
#define VideoO_Handler ARM_VSI1_Handler /* Video Output Interrupt handler */
#define VideoI ARM_VSI0 /* Video Input access struct */
#define VideoI_IRQn ARM_VSI0_IRQn /* Video Input Interrupt number */
#define VideoI_Handler ARM_VSI0_Handler /* Video Input Interrupt handler */
/* Video Peripheral registers */
#define CONTROL Regs[0] /* Control receiver */
#define SAMPLE_BITS Regs[1] /* Sample number of bits (8..32) */
#define SAMPLE_RATE Regs[2] /* Sample rate (frame per second) */
#define STOP_SIMULATION Regs[4] /* Stop audio simulation */
/* Video Control register definitions */
#define CONTROL_ENABLE_Pos 0U /* CONTROL: ENABLE Position */
#define CONTROL_ENABLE_Msk (1UL << CONTROL_ENABLE_Pos) /* CONTROL: ENABLE Mask */
/* Driver State */
static uint8_t Initialized = 0U;
/* Event Callback */
static VideoDrv_Event_t CB_Event = NULL;
/* Video Input Interrupt Handler */
void VideoI_Handler (void) {
VideoI->IRQ.Clear = 0x00000001U;
__DSB();
__ISB();
if (CB_Event != NULL) {
CB_Event(VIDEO_DRV_EVENT_RX_DATA);
}
}
void VideoO_Handler (void) {
VideoO->IRQ.Clear = 0x00000001U;
__DSB();
__ISB();
}
/* Initialize Video Interface */
int32_t VideoDrv_Initialize (VideoDrv_Event_t cb_event) {
CB_Event = cb_event;
/* Initialize Video Output peripheral */
VideoO->Timer.Control = 0U;
VideoO->DMA.Control = 0U;
VideoO->IRQ.Clear = 0x00000001U;
VideoO->IRQ.Enable = 0x00000001U;
VideoO->CONTROL = 0U;
/* Initialize Video Input peripheral */
VideoI->Timer.Control = 0U;
VideoI->DMA.Control = 0U;
VideoI->IRQ.Clear = 0x00000001U;
VideoI->IRQ.Enable = 0x00000001U;
VideoI->CONTROL = 0U;
/* Enable peripheral interrupts */
NVIC->ISER[(((uint32_t)VideoI_IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)VideoI_IRQn) & 0x1FUL));
__DSB();
__ISB();
Initialized = 1U;
return VIDEO_DRV_OK;
}
/* De-initialize Video Interface */
int32_t VideoDrv_Uninitialize (void) {
/* Disable peripheral interrupts */
NVIC->ICER[(((uint32_t)VideoI_IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)VideoI_IRQn) & 0x1FUL));
__DSB();
__ISB();
/* De-initialize Video Output peripheral */
VideoO->Timer.Control = 0U;
VideoO->DMA.Control = 0U;
VideoO->IRQ.Clear = 0x00000001U;
VideoO->IRQ.Enable = 0x00000000U;
VideoO->CONTROL = 0U;
/* De-initialize Video Input peripheral */
VideoI->Timer.Control = 0U;
VideoI->DMA.Control = 0U;
VideoI->IRQ.Clear = 0x00000001U;
VideoI->IRQ.Enable = 0x00000000U;
VideoI->CONTROL = 0U;
Initialized = 0U;
return VIDEO_DRV_OK;
}
/* Configure Video Interface */
int32_t VideoDrv_Configure (uint32_t interface, uint32_t pixel_size, uint32_t samplerate) {
uint32_t format;
if (Initialized == 0U) {
return VIDEO_DRV_ERROR;
}
if ((pixel_size < 8*1U) ||
(pixel_size > 8*2U)) {
return VIDEO_DRV_ERROR_PARAMETER;
}
switch (interface) {
case VIDEO_DRV_INTERFACE_RX:
if ((VideoI->CONTROL & CONTROL_ENABLE_Msk) != 0U) {
return VIDEO_DRV_ERROR;
}
VideoI->SAMPLE_BITS = pixel_size;
VideoI->SAMPLE_RATE = samplerate;
break;
default:
return VIDEO_DRV_ERROR_PARAMETER;
}
return VIDEO_DRV_OK;
}
/* Set Video Interface buffer */
int32_t VideoDrv_SetBuf (uint32_t interface, void *buf, uint32_t block_num, uint32_t block_size) {
if (Initialized == 0U) {
return VIDEO_DRV_ERROR;
}
switch (interface) {
case VIDEO_DRV_INTERFACE_RX:
if ((VideoI->DMA.Control & ARM_VSI_DMA_Enable_Msk) != 0U) {
return VIDEO_DRV_ERROR;
}
VideoI->DMA.Address = (uint32_t)buf;
VideoI->DMA.BlockNum = block_num;
VideoI->DMA.BlockSize = block_size;
break;
default:
return VIDEO_DRV_ERROR_PARAMETER;
}
return VIDEO_DRV_OK;
}
/* Control Video Interface */
int32_t VideoDrv_Control (uint32_t control) {
uint32_t sample_size;
uint32_t sample_rate;
uint32_t block_size;
if (Initialized == 0U) {
return VIDEO_DRV_ERROR;
}
if ((control & VIDEO_DRV_CONTROL_RX_DISABLE) != 0U) {
VideoI->Timer.Control = 0U;
VideoI->DMA.Control = 0U;
VideoI->CONTROL = 0U;
} else if ((control & VIDEO_DRV_CONTROL_RX_ENABLE) != 0U) {
VideoI->CONTROL = CONTROL_ENABLE_Msk;
VideoI->DMA.Control = ARM_VSI_DMA_Direction_P2M |
ARM_VSI_DMA_Enable_Msk;
sample_size = ((VideoI->SAMPLE_BITS + 7U) / 8U);
sample_rate = VideoI->SAMPLE_RATE;
if ((sample_size == 0U) || (sample_rate == 0U)) {
VideoI->Timer.Interval = 0xFFFFFFFFU;
} else {
block_size = VideoI->DMA.BlockSize;
VideoI->Timer.Interval = (1000000U * (block_size / sample_size)) / sample_rate;
}
VideoI->Timer.Control = ARM_VSI_Timer_Trig_DMA_Msk |
ARM_VSI_Timer_Trig_IRQ_Msk |
ARM_VSI_Timer_Periodic_Msk |
ARM_VSI_Timer_Run_Msk;
}
return VIDEO_DRV_OK;
}
/* Get received block count */
uint32_t VideoDrv_GetRxCount (void) {
return (VideoI->Timer.Count);
}
/* Get Video Interface status */
VideoDrv_Status_t VideoDrv_GetStatus (void) {
VideoDrv_Status_t status;
uint32_t sr;
if ((VideoI->CONTROL & CONTROL_ENABLE_Msk) != 0U) {
status.rx_active = 1U;
} else {
status.rx_active = 0U;
}
return (status);
}
void VideoDrv_Stop (void)
{
int32_t ret;
ret = VideoDrv_Control(VIDEO_DRV_CONTROL_RX_DISABLE);
VideoI->STOP_SIMULATION=1;
}

@ -0,0 +1,124 @@
/*
* Copyright (c) 2021 Arm Limited. All rights reserved.
*/
#ifndef __VIDEO_DRV_H
#define __VIDEO_DRV_H
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdint.h>
/* Video Interface */
#define VIDEO_DRV_INTERFACE_RX (2U) ///< Receiver
/* Video Control */
#define VIDEO_DRV_CONTROL_RX_ENABLE (1UL << 1) ///< Enable Receiver
#define VIDEO_DRV_CONTROL_RX_DISABLE (1UL << 3) ///< Disable Receiver
/* Video Event */
#define VIDEO_DRV_EVENT_RX_DATA (1UL << 1) ///< Data block received
/* Return code */
#define VIDEO_DRV_OK (0) ///< Operation succeeded
#define VIDEO_DRV_ERROR (-1) ///< Unspecified error
#define VIDEO_DRV_ERROR_BUSY (-2) ///< Driver is busy
#define VIDEO_DRV_ERROR_TIMEOUT (-3) ///< Timeout occurred
#define VIDEO_DRV_ERROR_UNSUPPORTED (-4) ///< Operation not supported
#define VIDEO_DRV_ERROR_PARAMETER (-5) ///< Parameter error
/**
\brief Video Status
*/
typedef struct {
uint32_t tx_active : 1; ///< Transmitter active
uint32_t rx_active : 1; ///< Receiver active
uint32_t reserved : 30;
} VideoDrv_Status_t;
uint8_t* VideoRXBuffer();
int32_t VideoDrv_Setup(void);
/**
\fn VideoDrv_Event_t
\brief Video Events callback function type: void (*VideoDrv_Event_t) (uint32_t event
\param[in] event events notification mask
\return none
*/
typedef void (*VideoDrv_Event_t) (uint32_t event);
/**
\fn int32_t VideoDrv_Initialize (VideoDrv_Event_t cb_event)
\brief Initialize Video Interface.
\param[in] cb_event pointer to \ref VideoDrv_Event_t
\return return code
*/
int32_t VideoDrv_Initialize (VideoDrv_Event_t cb_event);
/**
\fn void VideoDrv_Stop (void);
\brief Stop audio simulation.
\return return code
*/
void VideoDrv_Stop (void);
/**
\fn int32_t VideoDrv_Uninitialize (void)
\brief De-initialize Video Interface.
\return return code
*/
int32_t VideoDrv_Uninitialize (void);
/**
\fn int32_t VideoDrv_Configure (uint32_t interface, uint32_t channels, uint32_t sample_bits, uint32_t sample_rate)
\brief Configure Video Interface.
\param[in] interface audio interface
\param[in] pixel_size size in bytes
\param[in] samplerate samples per second
\return return code
*/
int32_t VideoDrv_Configure (uint32_t interface, uint32_t pixel_size,uint32_t samplerate);
/**
\fn int32_t VideoDrv_SetBuf (uint32_t interface, void *buf, uint32_t block_num, uint32_t block_size)
\brief Set Video Interface buffer.
\param[in] interface audio interface
\param[in] buf pointer to buffer for audio data
\param[in] block_num number of blocks in buffer (must be 2^n)
\param[in] block_size block size in number of samples
\return return code
*/
int32_t VideoDrv_SetBuf (uint32_t interface, void *buf, uint32_t block_num, uint32_t block_size);
/**
\fn int32_t VideoDrv_Control (uint32_t control)
\brief Control Video Interface.
\param[in] control operation
\return return code
*/
int32_t VideoDrv_Control (uint32_t control);
/**
\fn uint32_t VideoDrv_GetRxCount (void)
\brief Get received block count.
\return number of received blocks
*/
uint32_t VideoDrv_GetRxCount (void);
/**
\fn VideoDrv_Status_t VideoDrv_GetStatus (void)
\brief Get Video Interface status.
\return \ref VideoDrv_Status_t
*/
VideoDrv_Status_t VideoDrv_GetStatus (void);
#ifdef __cplusplus
}
#endif
#endif /* __VIDEO_DRV_H */

@ -1,7 +1,7 @@
/* ----------------------------------------------------------------------
* Project: CMSIS DSP Library
* Title: AudioSink.h
* Description: Audio Sink working with the RingBuffer
* Title: StreamingSink.h
* Description: Streaming Sink working with the RingBuffer
*
* $Date: 30 July 2021
* $Revision: V1.10.0
@ -25,17 +25,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _AUDIO_SINK_H_
#define _AUDIO_SINK_H_
#ifndef _STREAMING_SINK_H_
#define _STREAMING_SINK_H_
#include "RingBuffer.h"
template<typename IN, int inputSize>
class AudioSink: public GenericSink<IN, inputSize>
class StreamingSink: public GenericSink<IN, inputSize>
{
public:
AudioSink(FIFOBase<IN> &src,ring_config_t *config):
StreamingSink(FIFOBase<IN> &src,ring_config_t *config):
GenericSink<IN,inputSize>(src),mConfig(config){};
int run()
@ -66,4 +66,4 @@ protected:
ring_config_t *mConfig;
};
#endif
#endif /* _STREAMING_SINK_H_ */

@ -1,7 +1,7 @@
/* ----------------------------------------------------------------------
* Project: CMSIS DSP Library
* Title: AudioSource.h
* Description: Audio source working with the Ring buffer
* Title: StreamingSource.h
* Description: Streaming source working with the Ring buffer
*
* $Date: 30 July 2021
* $Revision: V1.10.0
@ -25,17 +25,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _AUDIO_SOURCE_H_
#define _AUDIO_SOURCE_H_
#ifndef _STREAMING_SOURCE_H_
#define _STREAMING_SOURCE_H_
#include "RingBuffer.h"
template<typename OUT,int outputSize>
class AudioSource: public GenericSource<OUT,outputSize>
class StreamingSource: public GenericSource<OUT,outputSize>
{
public:
AudioSource(FIFOBase<OUT> &dst,ring_config_t *config):
StreamingSource(FIFOBase<OUT> &dst,ring_config_t *config):
GenericSource<OUT,outputSize>(dst),mConfig(config){};
int run(){
@ -73,4 +73,4 @@ protected:
};
#endif
#endif /* _STREAMING_SOURCE_H_ */

@ -7,9 +7,8 @@
void BayesF16::test_gaussian_naive_bayes_predict_f16()
{
int16_t p;
p = arm_gaussian_naive_bayes_predict_f16(&bayes,
(void)arm_gaussian_naive_bayes_predict_f16(&bayes,
inp,
bufp,tempp);

@ -7,9 +7,8 @@
void BayesF32::test_gaussian_naive_bayes_predict_f32()
{
int16_t p;
p = arm_gaussian_naive_bayes_predict_f32(&bayes,
(void)arm_gaussian_naive_bayes_predict_f32(&bayes,
inp,
bufp,tempp);

@ -7,79 +7,70 @@
void DistanceF16::test_braycurtis_distance_f16()
{
float16_t outp;
outp = arm_braycurtis_distance_f16(inpA, inpB, this->vecDim);
(void)arm_braycurtis_distance_f16(inpA, inpB, this->vecDim);
}
void DistanceF16::test_canberra_distance_f16()
{
float16_t outp;
outp = arm_canberra_distance_f16(inpA, inpB, this->vecDim);
(void)arm_canberra_distance_f16(inpA, inpB, this->vecDim);
}
void DistanceF16::test_chebyshev_distance_f16()
{
float16_t outp;
outp = arm_chebyshev_distance_f16(inpA, inpB, this->vecDim);
(void)arm_chebyshev_distance_f16(inpA, inpB, this->vecDim);
}
void DistanceF16::test_cityblock_distance_f16()
{
float16_t outp;
outp = arm_cityblock_distance_f16(inpA, inpB, this->vecDim);
(void)arm_cityblock_distance_f16(inpA, inpB, this->vecDim);
}
void DistanceF16::test_correlation_distance_f16()
{
float16_t outp;
memcpy(tmpAp, inpA, sizeof(float16_t) * this->vecDim);
memcpy(tmpBp, inpB, sizeof(float16_t) * this->vecDim);
outp = arm_correlation_distance_f16(tmpAp, tmpBp, this->vecDim);
(void)arm_correlation_distance_f16(tmpAp, tmpBp, this->vecDim);
}
void DistanceF16::test_cosine_distance_f16()
{
float16_t outp;
outp = arm_cosine_distance_f16(inpA, inpB, this->vecDim);
(void)arm_cosine_distance_f16(inpA, inpB, this->vecDim);
}
void DistanceF16::test_euclidean_distance_f16()
{
float16_t outp;
outp = arm_euclidean_distance_f16(inpA, inpB, this->vecDim);
(void)arm_euclidean_distance_f16(inpA, inpB, this->vecDim);
}
void DistanceF16::test_jensenshannon_distance_f16()
{
float16_t outp;
outp = arm_jensenshannon_distance_f16(inpA, inpB, this->vecDim);
(void)arm_jensenshannon_distance_f16(inpA, inpB, this->vecDim);
}
void DistanceF16::test_minkowski_distance_f16()
{
float16_t outp;
outp = arm_minkowski_distance_f16(inpA, inpB, 2,this->vecDim);
(void)arm_minkowski_distance_f16(inpA, inpB, 2,this->vecDim);
}

@ -7,79 +7,70 @@
void DistanceF32::test_braycurtis_distance_f32()
{
float32_t outp;
outp = arm_braycurtis_distance_f32(inpA, inpB, this->vecDim);
(void)arm_braycurtis_distance_f32(inpA, inpB, this->vecDim);
}
void DistanceF32::test_canberra_distance_f32()
{
float32_t outp;
outp = arm_canberra_distance_f32(inpA, inpB, this->vecDim);
(void)arm_canberra_distance_f32(inpA, inpB, this->vecDim);
}
void DistanceF32::test_chebyshev_distance_f32()
{
float32_t outp;
outp = arm_chebyshev_distance_f32(inpA, inpB, this->vecDim);
(void)arm_chebyshev_distance_f32(inpA, inpB, this->vecDim);
}
void DistanceF32::test_cityblock_distance_f32()
{
float32_t outp;
outp = arm_cityblock_distance_f32(inpA, inpB, this->vecDim);
(void)arm_cityblock_distance_f32(inpA, inpB, this->vecDim);
}
void DistanceF32::test_correlation_distance_f32()
{
float32_t outp;
memcpy(tmpAp, inpA, sizeof(float32_t) * this->vecDim);
memcpy(tmpBp, inpB, sizeof(float32_t) * this->vecDim);
outp = arm_correlation_distance_f32(tmpAp, tmpBp, this->vecDim);
(void)arm_correlation_distance_f32(tmpAp, tmpBp, this->vecDim);
}
void DistanceF32::test_cosine_distance_f32()
{
float32_t outp;
outp = arm_cosine_distance_f32(inpA, inpB, this->vecDim);
(void)arm_cosine_distance_f32(inpA, inpB, this->vecDim);
}
void DistanceF32::test_euclidean_distance_f32()
{
float32_t outp;
outp = arm_euclidean_distance_f32(inpA, inpB, this->vecDim);
(void)arm_euclidean_distance_f32(inpA, inpB, this->vecDim);
}
void DistanceF32::test_jensenshannon_distance_f32()
{
float32_t outp;
outp = arm_jensenshannon_distance_f32(inpA, inpB, this->vecDim);
(void)arm_jensenshannon_distance_f32(inpA, inpB, this->vecDim);
}
void DistanceF32::test_minkowski_distance_f32()
{
float32_t outp;
outp = arm_minkowski_distance_f32(inpA, inpB, 2,this->vecDim);
(void)arm_minkowski_distance_f32(inpA, inpB, 2,this->vecDim);
}

@ -7,74 +7,64 @@
void DistanceU32::test_dice_distance_u32()
{
uint32_t outp;
outp = arm_dice_distance(inpA, inpB,this->vecDim);
(void)arm_dice_distance(inpA, inpB,this->vecDim);
}
void DistanceU32::test_hamming_distance_u32()
{
uint32_t outp;
outp = arm_hamming_distance(inpA, inpB,this->vecDim);
(void)arm_hamming_distance(inpA, inpB,this->vecDim);
}
void DistanceU32::test_jaccard_distance_u32()
{
uint32_t outp;
outp = arm_jaccard_distance(inpA, inpB,this->vecDim);
(void)arm_jaccard_distance(inpA, inpB,this->vecDim);
}
void DistanceU32::test_kulsinski_distance_u32()
{
uint32_t outp;
outp = arm_kulsinski_distance(inpA, inpB,this->vecDim);
(void)arm_kulsinski_distance(inpA, inpB,this->vecDim);
}
void DistanceU32::test_rogerstanimoto_distance_u32()
{
uint32_t outp;
outp = arm_rogerstanimoto_distance(inpA, inpB,this->vecDim);
{
(void)arm_rogerstanimoto_distance(inpA, inpB,this->vecDim);
}
void DistanceU32::test_russellrao_distance_u32()
{
uint32_t outp;
outp = arm_russellrao_distance(inpA, inpB,this->vecDim);
(void)arm_russellrao_distance(inpA, inpB,this->vecDim);
}
void DistanceU32::test_sokalmichener_distance_u32()
{
uint32_t outp;
outp = arm_sokalmichener_distance(inpA, inpB,this->vecDim);
(void)arm_sokalmichener_distance(inpA, inpB,this->vecDim);
}
void DistanceU32::test_sokalsneath_distance_u32()
{
uint32_t outp;
outp = arm_sokalsneath_distance(inpA, inpB,this->vecDim);
(void)arm_sokalsneath_distance(inpA, inpB,this->vecDim);
}
void DistanceU32::test_yule_distance_u32()
{
uint32_t outp;
outp = arm_yule_distance(inpA, inpB,this->vecDim);
(void)arm_yule_distance(inpA, inpB,this->vecDim);
}

@ -146,17 +146,15 @@
void StatsF16::test_entropy_f16()
{
float16_t out;
out = arm_entropy_f16(inap,this->nb);
(void)arm_entropy_f16(inap,this->nb);
}
void StatsF16::test_logsumexp_f16()
{
float16_t out;
out = arm_logsumexp_f16(inap,this->nb);
(void)arm_logsumexp_f16(inap,this->nb);
}
@ -164,17 +162,15 @@
void StatsF16::test_kullback_leibler_f16()
{
float16_t out;
out = arm_kullback_leibler_f16(inap,inbp,this->nb);
(void)arm_kullback_leibler_f16(inap,inbp,this->nb);
}
void StatsF16::test_logsumexp_dot_prod_f16()
{
float16_t out;
out = arm_logsumexp_dot_prod_f16(inap,inbp,this->nb,tmpp);
(void)arm_logsumexp_dot_prod_f16(inap,inbp,this->nb,tmpp);
}

@ -146,17 +146,15 @@
void StatsF32::test_entropy_f32()
{
float32_t out;
out = arm_entropy_f32(inap,this->nb);
(void)arm_entropy_f32(inap,this->nb);
}
void StatsF32::test_logsumexp_f32()
{
float32_t out;
out = arm_logsumexp_f32(inap,this->nb);
(void)arm_logsumexp_f32(inap,this->nb);
}
@ -164,17 +162,15 @@
void StatsF32::test_kullback_leibler_f32()
{
float32_t out;
out = arm_kullback_leibler_f32(inap,inbp,this->nb);
(void)arm_kullback_leibler_f32(inap,inbp,this->nb);
}
void StatsF32::test_logsumexp_dot_prod_f32()
{
float32_t out;
out = arm_logsumexp_dot_prod_f32(inap,inbp,this->nb,tmpp);
(void)arm_logsumexp_dot_prod_f32(inap,inbp,this->nb,tmpp);
}

@ -7,8 +7,7 @@
void StatsF64::test_entropy_f64()
{
float64_t out;
out = arm_entropy_f64(inap,this->nb);
(void)arm_entropy_f64(inap,this->nb);
}
@ -18,9 +17,8 @@
void StatsF64::test_kullback_leibler_f64()
{
float64_t out;
out = arm_kullback_leibler_f64(inap,inbp,this->nb);
(void)arm_kullback_leibler_f64(inap,inbp,this->nb);
}

Loading…
Cancel
Save