You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
4.4 KiB
133 lines
4.4 KiB
/*******************************************************************************
|
|
* Copyright (C) 2018 Cadence Design Systems, Inc.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files (the
|
|
* "Software"), to use this Software with Cadence processor cores only and
|
|
* not with any other processors and platforms, subject to
|
|
* the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included
|
|
* in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
******************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
* xf-timebase.h
|
|
*
|
|
* Common timebase for deadline-driven scheduler
|
|
*
|
|
*******************************************************************************/
|
|
|
|
#ifndef __XF_H
|
|
#error "xf-timebase.h mustn't be included directly"
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
* Timebase for deadline-driven scheduler
|
|
******************************************************************************/
|
|
#ifdef XAF_ENABLE_NON_HIKEY
|
|
/* ...set internal scheduler frequency as a LCM of all supported sample rates;
|
|
* it is in general not a problem to have large number here, however it should
|
|
* be noted that maximal-size audio-buffer that we handle, when expressed in
|
|
* ticks of this virtual frequency, must not exceed 2**31 (for otherwise
|
|
* scheduler timestamp comparison function will misbehave).
|
|
*/
|
|
#define XF_TIMEBASE_FREQ (4 * 3 * 56448000U)
|
|
/* ...add paranoic check considering maximal audio-buffer duration as 0.1 sec */
|
|
C_BUG((u32)(XF_TIMEBASE_FREQ / 10) >= (1 << 31));
|
|
#else
|
|
/* ...set internal scheduler frequency as a LCM of all supported sample rates */
|
|
#define XF_TIMEBASE_FREQ 56448000U
|
|
#endif
|
|
/* ...supported sampling rates */
|
|
C_BUG(XF_TIMEBASE_FREQ % 4000);
|
|
C_BUG(XF_TIMEBASE_FREQ % 8000);
|
|
C_BUG(XF_TIMEBASE_FREQ % 11025);
|
|
C_BUG(XF_TIMEBASE_FREQ % 12000);
|
|
C_BUG(XF_TIMEBASE_FREQ % 16000);
|
|
C_BUG(XF_TIMEBASE_FREQ % 22050);
|
|
C_BUG(XF_TIMEBASE_FREQ % 24000);
|
|
C_BUG(XF_TIMEBASE_FREQ % 32000);
|
|
C_BUG(XF_TIMEBASE_FREQ % 44100);
|
|
C_BUG(XF_TIMEBASE_FREQ % 48000);
|
|
C_BUG(XF_TIMEBASE_FREQ % 64000);
|
|
C_BUG(XF_TIMEBASE_FREQ % 88200);
|
|
C_BUG(XF_TIMEBASE_FREQ % 96000);
|
|
C_BUG(XF_TIMEBASE_FREQ % 128000);
|
|
C_BUG(XF_TIMEBASE_FREQ % 176400);
|
|
C_BUG(XF_TIMEBASE_FREQ % 192000);
|
|
|
|
/* ...calculate upsampling factor for given sample rate */
|
|
static inline u32 xf_timebase_factor(u32 sample_rate)
|
|
{
|
|
/* ...probably we can tolerate single division */
|
|
switch(sample_rate)
|
|
{
|
|
case 4000:
|
|
return XF_TIMEBASE_FREQ / 4000;
|
|
case 8000:
|
|
return XF_TIMEBASE_FREQ / 8000;
|
|
case 11025:
|
|
return XF_TIMEBASE_FREQ / 11025;
|
|
case 12000:
|
|
return XF_TIMEBASE_FREQ / 11025;
|
|
case 16000:
|
|
return XF_TIMEBASE_FREQ / 16000;
|
|
case 22050:
|
|
return XF_TIMEBASE_FREQ / 22050;
|
|
case 24000:
|
|
return XF_TIMEBASE_FREQ / 24000;
|
|
case 32000:
|
|
return XF_TIMEBASE_FREQ / 32000;
|
|
case 44100:
|
|
return XF_TIMEBASE_FREQ / 44100;
|
|
case 48000:
|
|
return XF_TIMEBASE_FREQ / 48000;
|
|
case 64000:
|
|
return XF_TIMEBASE_FREQ / 64000;
|
|
case 88200:
|
|
return XF_TIMEBASE_FREQ / 88200;
|
|
case 96000:
|
|
return XF_TIMEBASE_FREQ / 96000;
|
|
case 128000:
|
|
return XF_TIMEBASE_FREQ / 128000;
|
|
case 176400:
|
|
return XF_TIMEBASE_FREQ / 176400;
|
|
case 192000:
|
|
return XF_TIMEBASE_FREQ / 192000;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/* ...core timebase */
|
|
static inline u32 xf_core_timebase(u32 core)
|
|
{
|
|
xf_core_data_t *cd = XF_CORE_DATA(core);
|
|
|
|
/* ...get local scheduler timebase */
|
|
return xf_sched_timestamp(&cd->sched);
|
|
}
|
|
|
|
/* ...compare timestamps */
|
|
static inline int xf_time_after(u32 a, u32 b)
|
|
{
|
|
return ((s32)(a - b) > 0);
|
|
}
|
|
|
|
/* ...compare timstamps */
|
|
static inline int xf_time_before(u32 a, u32 b)
|
|
{
|
|
return ((s32)(a - b) < 0);
|
|
}
|
|
|