In breif
parseSpDifTerminate() in SpdifReceive.S crashes after receiving CT_END from streaming channel.
In detail
this post is the continue of https://www.xcore.com/forum/viewtopic.p ... it=#p24231.
The scheme of my solution was:
Code: Select all
XMOS input port1 -> spdifReceive(ch1, clock1) -\
-> clockGen(ch1, ch2) -> ... -> mixer() -> USB rec
XMOS input port2 -> spdifReceive(ch2, clock2) -/
My code was:
Code: Select all
par
{
...
on tile[SPDIF_RX_TILE]:
{
thread_speed();
SpdifReceive(p1, ch1, 1, clk1);
}
on tile[SPDIF_RX_TILE]:
{
thread_speed();
SpdifReceive(p2, ch2, 1, clk2);
}
}
=====================================================
Now I have new challenge. After adding some modules to my project there are only two free clockblocks: CLKBLK_REF & CLKBLK_1.
I can't use CLKBLK_REF for spdifReceive() because CLKBLK_REF doesn't allow to set frequency divider.
So I must share CLKBLK_1 between two spdifReceive() modules.
Code: Select all
XMOS input port1 -> spdifReceive1(ch1, clock) -\
-> clockGen(ch1, ch2) -> ... -> mixer() -> USB rec
XMOS input port2 -> spdifReceive2(ch2, clock) -/
Now I try to realize the second method from Ross:
Ross:
SpdifReceive() would then exits and you can call it with another port. This isn't something it supports at the moment by the looks of it and would need adding.
After analyzing spdifReceive.S code (in ASM) I found parseSpDifTerminate() in it.
Code: Select all
parseSpDifTerminate:
INCT r11, r1
#ifdef TEST
parseSpDifE:
#endif
CLRSR XS1_SR_EEBLE_MASK
CLRSR XS1_SR_FAST_MASK
EDU r1
OR r0, r4, r4
OR r1, r5, r5
LDWSP r2, 8
LDWSP r4, 1
LDWSP r5, 2
LDWSP r6, 3
LDWSP r7, 4
LDWSP r8, 5
LDWSP r9, 6
LDWSP r10, 7
RETSP STACK
Now my scheme is:
Code: Select all
XMOS input port1 -> spdifReceive1(ch1, clock) -> clockGen(ch1, ch2) -> ... -> mixer() -> USB rec
user change input -> stop spdifReceive1, start spdifReceive2
XMOS input port2 -> spdifReceive2(ch2, clock) -> clockGen(ch1, ch2) -> ... -> mixer() -> USB rec
user change input -> stop spdifReceive2, start spdifReceive1
XMOS input port1 -> spdifReceive1(ch1, clock) -> clockGen(ch1, ch2) -> ... -> mixer() -> USB rec
...
Code: Select all
par
{
...
on tile[SPDIF_RX_TILE]:
{
thread_speed();
SpdifReceiveWrapper(p1, ch1, p2, ch2, 1, clk);
}
}
void SpdifReceiveWrapper(p1, ch1, p2, ch2, initial_divider, clk)
{
while(1)
{
SpdifReceive1(p1, ch1, initial_divider, clk);
SpdifReceive2(p2, ch2, initial_divider, clk);
}
}
Code: Select all
void SpdifReceiveWrapper(p1, ch1, p2, ch2, initial_divider, clk)
{
while(1)
{
SpdifReceive1(p1, ch1, initial_divider, clk);
}
}
Send CT_END from clockGen() to SpdifReceive1()
Code: Select all
c <: XS1_CT_END;