forked from PAWPAW-Mirror/lib_xua
Merge branch 'master' into DEV_IMP_FB
This commit is contained in:
@@ -129,10 +129,9 @@ void handle_audio_request(chanend c_mix_out)
|
||||
int space_left;
|
||||
|
||||
/* Input word that triggered interrupt and handshake back */
|
||||
(void) inuint(c_mix_out);
|
||||
unsigned underflowSample = inuint(c_mix_out);
|
||||
|
||||
/* Reply with underflow */
|
||||
outuint(c_mix_out, outUnderflow);
|
||||
outuint(c_mix_out, 0);
|
||||
|
||||
/* If in overflow condition then receive samples and throw away */
|
||||
if(inOverflow || sampsToWrite == 0)
|
||||
@@ -176,7 +175,7 @@ __builtin_unreachable();
|
||||
int mult;
|
||||
int h;
|
||||
unsigned l;
|
||||
asm("ldw %0, %1[%2]":"=r"(mult):"r"(p_multIn),"r"(i));
|
||||
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multIn),"r"(i));
|
||||
{h, l} = macs(mult, sample, 0, 0);
|
||||
sample = h << 3;
|
||||
|
||||
@@ -207,7 +206,7 @@ __builtin_unreachable();
|
||||
int mult;
|
||||
int h;
|
||||
unsigned l;
|
||||
asm("ldw %0, %1[%2]":"=r"(mult):"r"(p_multIn),"r"(i));
|
||||
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multIn),"r"(i));
|
||||
{h, l} = macs(mult, sample, 0, 0);
|
||||
sample = h << 3;
|
||||
#if (STREAM_FORMAT_INPUT_RESOLUTION_32BIT_USED == 1)
|
||||
@@ -240,7 +239,7 @@ __builtin_unreachable();
|
||||
int mult;
|
||||
int h;
|
||||
unsigned l;
|
||||
asm("ldw %0, %1[%2]":"=r"(mult):"r"(p_multIn),"r"(i));
|
||||
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multIn),"r"(i));
|
||||
{h, l} = macs(mult, sample, 0, 0);
|
||||
sample = h << 3;
|
||||
#endif
|
||||
@@ -290,21 +289,11 @@ __builtin_unreachable();
|
||||
if(outUnderflow)
|
||||
{
|
||||
#pragma xta endpoint "out_underflow"
|
||||
#if 0
|
||||
/* We're still pre-buffering, send out 0 samps */
|
||||
for(int i = 0; i < NUM_USB_CHAN_OUT; i++)
|
||||
{
|
||||
unsigned sample;
|
||||
unsigned mode;
|
||||
GET_SHARED_GLOBAL(sample, g_muteSample);
|
||||
GET_SHARED_GLOBAL(mode, dsdMode);
|
||||
|
||||
if(mode == DSD_MODE_DOP)
|
||||
outuint(c_mix_out, 0xFA969600);
|
||||
else
|
||||
outuint(c_mix_out, sample);
|
||||
outuint(c_mix_out, underflowSample);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Calc how many samples left in buffer */
|
||||
outSamps = g_aud_from_host_wrptr - g_aud_from_host_rdptr;
|
||||
@@ -343,7 +332,7 @@ __builtin_unreachable();
|
||||
sample <<= 16;
|
||||
|
||||
#if (OUTPUT_VOLUME_CONTROL == 1) && !defined(OUT_VOLUME_IN_MIXER)
|
||||
asm("ldw %0, %1[%2]":"=r"(mult):"r"(p_multOut),"r"(i));
|
||||
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multOut),"r"(i));
|
||||
{h, l} = macs(mult, sample, 0, 0);
|
||||
/* Note, in 2 byte subslot mode - ignore lower result of macs */
|
||||
h <<= 3;
|
||||
@@ -371,7 +360,7 @@ __builtin_unreachable();
|
||||
g_aud_from_host_rdptr+=4;
|
||||
|
||||
#if (OUTPUT_VOLUME_CONTROL == 1) && !defined(OUT_VOLUME_IN_MIXER)
|
||||
asm("ldw %0, %1[%2]":"=r"(mult):"r"(p_multOut),"r"(i));
|
||||
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multOut),"r"(i));
|
||||
{h, l} = macs(mult, sample, 0, 0);
|
||||
h <<= 3;
|
||||
#if (STREAM_FORMAT_OUTPUT_RESOLUTION_32BIT_USED == 1)
|
||||
@@ -426,7 +415,7 @@ __builtin_unreachable();
|
||||
unpackState++;
|
||||
|
||||
#if (OUTPUT_VOLUME_CONTROL == 1) && !defined(OUT_VOLUME_IN_MIXER)
|
||||
asm("ldw %0, %1[%2]":"=r"(mult):"r"(p_multOut),"r"(i));
|
||||
asm volatile("ldw %0, %1[%2]":"=r"(mult):"r"(p_multOut),"r"(i));
|
||||
{h, l} = macs(mult, sample, 0, 0);
|
||||
h <<= 3;
|
||||
outuint(c_mix_out, h);
|
||||
@@ -476,7 +465,7 @@ __builtin_unreachable();
|
||||
}
|
||||
|
||||
/* Get feedback val - ideally this would be syncronised */
|
||||
asm("ldw %0, dp[g_speed]" : "=r" (speed) :);
|
||||
asm volatile("ldw %0, dp[g_speed]" : "=r" (speed) :);
|
||||
|
||||
/* Calc packet size to send back based on our fb */
|
||||
speedRem += speed;
|
||||
@@ -587,10 +576,13 @@ static inline void SetupZerosSendBuffer(XUD_ep aud_to_host_usb_ep, unsigned samp
|
||||
|
||||
mid *= g_numUsbChan_In * slotSize;
|
||||
|
||||
asm("stw %0, %1[0]"::"r"(mid),"r"(g_aud_to_host_zeros));
|
||||
asm volatile("stw %0, %1[0]"::"r"(mid),"r"(g_aud_to_host_zeros));
|
||||
|
||||
/* Mark EP ready with the zero buffer. Note this will simply update the packet size
|
||||
* if it is already ready */
|
||||
|
||||
/* g_aud_to_host_buffer is already set to g_aud_to_host_zeros */
|
||||
|
||||
GET_SHARED_GLOBAL(p, g_aud_to_host_buffer);
|
||||
|
||||
XUD_SetReady_InPtr(aud_to_host_usb_ep, p+4, mid);
|
||||
@@ -648,18 +640,18 @@ void decouple(chanend c_mix_out
|
||||
#ifndef OUT_VOLUME_IN_MIXER
|
||||
for (int i = 0; i < NUM_USB_CHAN_OUT + 1; i++)
|
||||
{
|
||||
asm("stw %0, %1[%2]"::"r"(MAX_VOL),"r"(p_multOut),"r"(i));
|
||||
asm volatile("stw %0, %1[%2]"::"r"(MAX_VOL),"r"(p_multOut),"r"(i));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef IN_VOLUME_IN_MIXER
|
||||
for (int i = 0; i < NUM_USB_CHAN_IN + 1; i++)
|
||||
{
|
||||
asm("stw %0, %1[%2]"::"r"(MAX_VOL),"r"(p_multIn),"r"(i));
|
||||
asm volatile("stw %0, %1[%2]"::"r"(MAX_VOL),"r"(p_multIn),"r"(i));
|
||||
}
|
||||
#endif
|
||||
|
||||
set_interrupt_handler(handle_audio_request, 200, 1, c_mix_out, 0);
|
||||
set_interrupt_handler(handle_audio_request, 1, c_mix_out, 0);
|
||||
|
||||
/* Wait for usb_buffer() to set up globals for us to use
|
||||
* Note: assumed that buffer_aud_ctl_chan is also setup before these globals are !0 */
|
||||
@@ -729,7 +721,7 @@ void decouple(chanend c_mix_out
|
||||
SET_SHARED_GLOBAL(totalSampsToWrite, 0);
|
||||
|
||||
/* Set buffer to send back to zeros buffer */
|
||||
SET_SHARED_GLOBAL(g_aud_to_host_buffer,g_aud_to_host_zeros);
|
||||
SET_SHARED_GLOBAL(g_aud_to_host_buffer, g_aud_to_host_zeros);
|
||||
|
||||
/* Update size of zeros buffer */
|
||||
SetupZerosSendBuffer(aud_to_host_usb_ep, sampFreq, g_curSubSlot_In);
|
||||
@@ -751,7 +743,7 @@ void decouple(chanend c_mix_out
|
||||
chkct(c_mix_out, XS1_CT_END);
|
||||
|
||||
SET_SHARED_GLOBAL(g_freqChange, 0);
|
||||
asm("outct res[%0],%1"::"r"(buffer_aud_ctl_chan),"r"(XS1_CT_END));
|
||||
asm volatile("outct res[%0],%1"::"r"(buffer_aud_ctl_chan),"r"(XS1_CT_END));
|
||||
|
||||
ENABLE_INTERRUPTS();
|
||||
|
||||
@@ -795,7 +787,7 @@ void decouple(chanend c_mix_out
|
||||
}
|
||||
|
||||
SET_SHARED_GLOBAL(g_freqChange, 0);
|
||||
asm("outct res[%0],%1"::"r"(buffer_aud_ctl_chan),"r"(XS1_CT_END));
|
||||
asm volatile("outct res[%0],%1"::"r"(buffer_aud_ctl_chan),"r"(XS1_CT_END));
|
||||
|
||||
ENABLE_INTERRUPTS();
|
||||
}
|
||||
@@ -840,7 +832,7 @@ void decouple(chanend c_mix_out
|
||||
|
||||
/* Wait for handshake back */
|
||||
chkct(c_mix_out, XS1_CT_END);
|
||||
asm("outct res[%0],%1"::"r"(buffer_aud_ctl_chan),"r"(XS1_CT_END));
|
||||
asm volatile("outct res[%0],%1"::"r"(buffer_aud_ctl_chan),"r"(XS1_CT_END));
|
||||
|
||||
SET_SHARED_GLOBAL(g_freqChange, 0);
|
||||
ENABLE_INTERRUPTS();
|
||||
@@ -1000,7 +992,7 @@ void decouple(chanend c_mix_out
|
||||
{
|
||||
int p, len;
|
||||
GET_SHARED_GLOBAL(p, g_aud_to_host_buffer);
|
||||
asm("ldw %0, %1[0]":"=r"(len):"r"(p));
|
||||
asm volatile("ldw %0, %1[0]":"=r"(len):"r"(p));
|
||||
XUD_SetReady_InPtr(aud_to_host_usb_ep, p+4, len);
|
||||
}
|
||||
continue;
|
||||
|
||||
3
module_usb_audio/usb_buffer/decouple_interrupt.c
Normal file
3
module_usb_audio/usb_buffer/decouple_interrupt.c
Normal file
@@ -0,0 +1,3 @@
|
||||
#include <interrupt.h>
|
||||
|
||||
register_interrupt_handler(handle_audio_request, 1, 200)
|
||||
@@ -143,9 +143,19 @@
|
||||
|
||||
//int ksp_enter, ksp_exit, r11_store;
|
||||
|
||||
#ifdef __XS2A__
|
||||
#define ISSUE_MODE_SINGLE ".issue_mode single\n"
|
||||
#define ISSUE_MODE_DUAL ".issue_mode dual\n"
|
||||
#else
|
||||
#define ISSUE_MODE_SINGLE
|
||||
#define ISSUE_MODE_DUAL
|
||||
#endif
|
||||
|
||||
#define do_interrupt_handler(f,args) \
|
||||
asm("bu .L__" #f "_handler_skip;\n" \
|
||||
asm(ISSUE_MODE_SINGLE\
|
||||
".align 4\n" \
|
||||
"__" #f "_handler:\n" \
|
||||
"ENTSP_lu6 0\n" \
|
||||
"kentsp " #args " + 19\n" \
|
||||
"__kent:" \
|
||||
save_state(f,args) \
|
||||
@@ -154,19 +164,24 @@
|
||||
restore_state(f,args) \
|
||||
"krestsp " #args " + 19 \n" \
|
||||
"__kret:\n" \
|
||||
"kret\n" \
|
||||
".L__" #f "_handler_skip:\n");
|
||||
"kret\n");
|
||||
|
||||
#define set_interrupt_handler(f, nstackwords, args, c, ...) \
|
||||
asm (" .section .dp.data, \"adw\", @progbits\n" \
|
||||
" .align 4\n" \
|
||||
#define register_interrupt_handler(f, args, nstackwords) \
|
||||
asm (" .section .dp.data, \"adw\", @progbits\n" \
|
||||
" .globl __" #f "_kernel_stack_end\n" \
|
||||
" .globl __" #f "_handler\n" \
|
||||
" .align 8\n" \
|
||||
"__" #f "_kernel_stack:\n" \
|
||||
" .space " #nstackwords ", 0\n" \
|
||||
" .text\n"); \
|
||||
asm("mov r10, %0; ldaw r11, dp[__" #f "_kernel_stack];add r11, r11, r10;ldaw r10, sp[0]; "\
|
||||
"set sp,r11;stw r10, sp[0]; krestsp 0"::"r"(nstackwords-8):"r10","r11"); \
|
||||
"__" #f "_kernel_stack_end:\n" \
|
||||
" .space 2\n"\
|
||||
" .text\n"); \
|
||||
do_interrupt_handler(f, args)
|
||||
|
||||
#define set_interrupt_handler(f, args, c, ...) \
|
||||
asm("ldaw r11, dp[__" #f "_kernel_stack_end];ldaw r10, sp[0]; " \
|
||||
"set sp,r11;stw r10, sp[0]; krestsp 0":::"r10","r11"); \
|
||||
store_args ## args(c, __VA_ARGS__) \
|
||||
do_interrupt_handler(f, args) \
|
||||
asm("ldap r11, __" #f "_handler; setv res[%0],r11"::"r"(c):"r11"); \
|
||||
asm("setc res[%0], 0xa; eeu res[%0]"::"r"(c)); \
|
||||
asm("setsr (((0) & ~(((1 << 0x1) - 1) << 0x1)) | (((1) << 0x1) & (((1 << 0x1) - 1) << 0x1)))");
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
* \param c_aud_ctl Audio control channel connected to Endpoint0()
|
||||
* \param p_off_mclk A port that is clocked of the MCLK input (not the MCLK input itself)
|
||||
*/
|
||||
#include "devicedefines.h"
|
||||
|
||||
void buffer(chanend c_aud_out,
|
||||
chanend c_aud_in,
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined (UAC_FORCE_FEEDBACK_EP)
|
||||
|
||||
@@ -317,6 +317,10 @@ void buffer(register chanend c_aud_out, register chanend c_aud_in,
|
||||
sofCount = 0;
|
||||
clocks = 0;
|
||||
remnant = 0;
|
||||
int min, mid, max;
|
||||
GetADCCounts(sampleFreq, min, mid, max);
|
||||
g_speed = mid<<16;
|
||||
|
||||
|
||||
}
|
||||
/* Ideally we want to wait for handshake (and pass back up) here. But we cannot keep this
|
||||
@@ -384,7 +388,7 @@ void buffer(register chanend c_aud_out, register chanend c_aud_in,
|
||||
* lastClock being incorrect */
|
||||
|
||||
/* Get MCLK count */
|
||||
asm (" getts %0, res[%1]" : "=r" (u_tmp) : "r" (p_off_mclk));
|
||||
asm volatile(" getts %0, res[%1]" : "=r" (u_tmp) : "r" (p_off_mclk));
|
||||
|
||||
GET_SHARED_GLOBAL(freqChange, g_freqChange);
|
||||
if(freqChange == SET_SAMPLE_FREQ)
|
||||
@@ -428,7 +432,7 @@ void buffer(register chanend c_aud_out, register chanend c_aud_in,
|
||||
#endif
|
||||
{
|
||||
int usb_speed;
|
||||
asm("stw %0, dp[g_speed]"::"r"(clocks)); // g_speed = clocks
|
||||
asm volatile("stw %0, dp[g_speed]"::"r"(clocks)); // g_speed = clocks
|
||||
|
||||
GET_SHARED_GLOBAL(usb_speed, g_curUsbSpeed);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user