forked from PAWPAW-Mirror/lib_xua
Basic feedback endpoint working for class 2
This commit is contained in:
@@ -101,6 +101,7 @@ void XUA_Buffer_lite(chanend c_aud_out, chanend c_feedback, chanend c_aud_in, ch
|
|||||||
|
|
||||||
#define FEEDBACK_BUFF_SIZE 4
|
#define FEEDBACK_BUFF_SIZE 4
|
||||||
unsigned char buffer_feedback[FEEDBACK_BUFF_SIZE];
|
unsigned char buffer_feedback[FEEDBACK_BUFF_SIZE];
|
||||||
|
unsigned int fb_clocks[1] = {0};
|
||||||
|
|
||||||
|
|
||||||
unsigned in_subslot_size = (AUDIO_CLASS == 1) ? FS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES : HS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES;
|
unsigned in_subslot_size = (AUDIO_CLASS == 1) ? FS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES : HS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES;
|
||||||
@@ -111,6 +112,12 @@ void XUA_Buffer_lite(chanend c_aud_out, chanend c_feedback, chanend c_aud_in, ch
|
|||||||
|
|
||||||
unsigned tmp;
|
unsigned tmp;
|
||||||
|
|
||||||
|
unsigned lastClock = 0;
|
||||||
|
unsigned clocks = 0;
|
||||||
|
long long clockcounter = 0;
|
||||||
|
unsigned sof_count=0;
|
||||||
|
unsigned mod_from_last_time = 0;
|
||||||
|
|
||||||
|
|
||||||
XUD_ep ep_aud_out = XUD_InitEp(c_aud_out);
|
XUD_ep ep_aud_out = XUD_InitEp(c_aud_out);
|
||||||
XUD_ep ep_feedback = XUD_InitEp(c_feedback);
|
XUD_ep ep_feedback = XUD_InitEp(c_feedback);
|
||||||
@@ -180,44 +187,38 @@ void XUA_Buffer_lite(chanend c_aud_out, chanend c_feedback, chanend c_aud_in, ch
|
|||||||
unsigned mclk_port_count = 0;
|
unsigned mclk_port_count = 0;
|
||||||
asm volatile(" getts %0, res[%1]" : "=r" (mclk_port_count) : "r" (p_for_mclk_count));
|
asm volatile(" getts %0, res[%1]" : "=r" (mclk_port_count) : "r" (p_for_mclk_count));
|
||||||
|
|
||||||
static unsigned sof_count=0;
|
|
||||||
sof_count++;
|
|
||||||
if (sof_count > SOF_FREQ_HZ * 10){
|
|
||||||
debug_printf("SOF\n");
|
|
||||||
sof_count = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Assuming 48kHz from a 24.576 master clock (0.0407uS period)
|
/* Assuming 48kHz from a 24.576 master clock (0.0407uS period)
|
||||||
* MCLK ticks per SOF = 125uS / 0.0407 = 3072 MCLK ticks per SOF.
|
* MCLK ticks per SOF = 125uS / 0.0407 = 3072 MCLK ticks per SOF.
|
||||||
* expected Feedback is 48000/8000 = 6 samples. so 0x60000 in 16:16 format.
|
* expected Feedback is 48000/8000 = 6 samples. so 0x60000 in 16:16 format.
|
||||||
* Average over 128 SOFs - 128 x 3072 = 0x60000.
|
* Average over 128 SOFs - 128 x 3072 = 0x60000.
|
||||||
*/
|
*/
|
||||||
#if 0
|
|
||||||
unsigned long long feedbackMul = 64ULL;
|
unsigned long long feedbackMul = 64ULL;
|
||||||
if(usb_speed != XUD_SPEED_HS)
|
if(AUDIO_CLASS == 1)
|
||||||
feedbackMul = 8ULL; /* TODO Use 4 instead of 8 to avoid windows LSB issues? */
|
feedbackMul = 8ULL; /* TODO Use 4 instead of 8 to avoid windows LSB issues? */
|
||||||
|
|
||||||
/* Number of MCLK ticks in this SOF period (E.g = 125 * 24.576 = 3072) */
|
/* Number of MCLK ticks in this SOF period (E.g = 125 * 24.576 = 3072) */
|
||||||
int count = (int) ((short)(u_tmp - lastClock));
|
int count = (int) ((short)(mclk_port_count - lastClock));
|
||||||
|
|
||||||
unsigned long long full_result = count * feedbackMul * sampleFreq;
|
unsigned long long full_result = count * feedbackMul * DEFAULT_FREQ;
|
||||||
|
|
||||||
clockcounter += full_result;
|
clockcounter += full_result;
|
||||||
|
|
||||||
/* Store MCLK for next time around... */
|
/* Store MCLK for next time around... */
|
||||||
lastClock = u_tmp;
|
lastClock = mclk_port_count;
|
||||||
|
|
||||||
/* Reset counts based on SOF counting. Expect 16ms (128 HS SOFs/16 FS SOFS) per feedback poll
|
/* Reset counts based on SOF counting. Expect 16ms (128 HS SOFs/16 FS SOFS) per feedback poll
|
||||||
* We always count 128 SOFs, so 16ms @ HS, 128ms @ FS */
|
* We always count 128 SOFs, so 16ms @ HS, 128ms @ FS */
|
||||||
if(sofCount == 128)
|
if(sof_count == 128)
|
||||||
{
|
{
|
||||||
sofCount = 0;
|
debug_printf("fb\n");
|
||||||
|
sof_count = 0;
|
||||||
|
|
||||||
clockcounter += mod_from_last_time;
|
clockcounter += mod_from_last_time;
|
||||||
clocks = clockcounter / masterClockFreq;
|
clocks = clockcounter / MCLK_48;
|
||||||
mod_from_last_time = clockcounter % masterClockFreq;
|
mod_from_last_time = clockcounter % MCLK_48;
|
||||||
|
|
||||||
if(usb_speed == XUD_SPEED_HS)
|
if(AUDIO_CLASS == 2)
|
||||||
{
|
{
|
||||||
clocks <<= 3;
|
clocks <<= 3;
|
||||||
}
|
}
|
||||||
@@ -230,9 +231,8 @@ void XUA_Buffer_lite(chanend c_aud_out, chanend c_feedback, chanend c_aud_in, ch
|
|||||||
int usb_speed;
|
int usb_speed;
|
||||||
asm volatile("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);
|
|
||||||
|
|
||||||
if (usb_speed == XUD_SPEED_HS)
|
if (AUDIO_CLASS == 2)
|
||||||
{
|
{
|
||||||
fb_clocks[0] = clocks;
|
fb_clocks[0] = clocks;
|
||||||
}
|
}
|
||||||
@@ -243,8 +243,7 @@ void XUA_Buffer_lite(chanend c_aud_out, chanend c_feedback, chanend c_aud_in, ch
|
|||||||
}
|
}
|
||||||
clockcounter = 0;
|
clockcounter = 0;
|
||||||
}
|
}
|
||||||
#endif
|
sof_count++;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//Receive samples from host
|
//Receive samples from host
|
||||||
@@ -264,7 +263,16 @@ void XUA_Buffer_lite(chanend c_aud_out, chanend c_feedback, chanend c_aud_in, ch
|
|||||||
//Send feedback
|
//Send feedback
|
||||||
case XUD_SetData_Select(c_feedback, ep_feedback, result):
|
case XUD_SetData_Select(c_feedback, ep_feedback, result):
|
||||||
//debug_printf("ep_feedback\n");
|
//debug_printf("ep_feedback\n");
|
||||||
XUD_SetReady_InPtr(ep_feedback, (unsigned)buffer_feedback, FEEDBACK_BUFF_SIZE);
|
//XUD_SetReady_InPtr(ep_feedback, (unsigned)buffer_feedback, FEEDBACK_BUFF_SIZE);
|
||||||
|
if (AUDIO_CLASS == 2)
|
||||||
|
{
|
||||||
|
XUD_SetReady_In(ep_feedback, (fb_clocks, unsigned char[]), 4);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XUD_SetReady_In(ep_feedback, (fb_clocks, unsigned char[]), 3);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//Send samples to host
|
//Send samples to host
|
||||||
|
|||||||
@@ -299,13 +299,15 @@ void XUA_Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl,
|
|||||||
{
|
{
|
||||||
#if XUA_LITE
|
#if XUA_LITE
|
||||||
unsigned char sbuffer[120];
|
unsigned char sbuffer[120];
|
||||||
unsigned length;
|
unsigned length = 0;
|
||||||
|
XUD_Result_t result = XUD_RES_ERR;
|
||||||
|
|
||||||
//XUD_Result_t result = XUD_GetSetupBuffer(ep0_out, sbuffer, &length); //Flattened from xud_device
|
//XUD_Result_t result = XUD_GetSetupBuffer(ep0_out, sbuffer, &length); //Flattened from xud_device
|
||||||
XUD_Result_t result = XUD_GetSetupData(ep0_out, sbuffer, &length);//Flattened from XUD_EpFunctions.xc
|
result = XUD_GetSetupData(ep0_out, sbuffer, &length);//Flattened from XUD_EpFunctions.xc
|
||||||
|
|
||||||
//Next step:
|
// select{
|
||||||
//void XUD_GetSetupData_Select(chan c,XUD_ep e_out, unsigned &length, XUD_Result_t &result);
|
// case XUD_GetSetupData_Select(c_ep0_out, ep0_out, &length, &result):
|
||||||
|
// break;
|
||||||
|
|
||||||
if (result == XUD_RES_OKAY)
|
if (result == XUD_RES_OKAY)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user