//void s4285_data(int rx_chan, int ch, int nsamps, TYPECPX *samps) void s4285_data(int rx_chan, int ch, int nsamps, TYPEMONO16 *samps) { s4285_t *e = &s4285[rx_chan]; if (e->mode == MODE_TX_LOOPBACK) { //m_CSt4285[rx_chan].getTxOutput((void *) samps, nsamps, TYPE_IQ_F32_DATA, K_AMPMAX); m_CSt4285[rx_chan].getTxOutput((void *) samps, nsamps, TYPE_REAL_S16_DATA, K_AMPMAX); if (e->rx_task) TaskWakeup(e->rx_task, TRUE, e->rx_chan); } else { #if 0 static u4_t last_time; u4_t now = timer_us(); printf("s4285 nsamps %d %7.3f msec\n", nsamps, (float) (now - last_time) / 1e3); last_time = now; #endif assert(nsamps == N_RXBLK); memcpy(&s4285_rx_blocks[s4285_rx_wa][0], samps, sizeof(TYPEMONO16)*N_RXBLK); s4285_rx_wa++; if (s4285_rx_wa == N_RXBLKS) s4285_rx_wa = 0; s4285_rx_count++; if (s4285_rx_count > s4285_rx_count_max) { printf("%d\n", s4285_rx_count); s4285_rx_count_max = s4285_rx_count; } assert(s4285_rx_count < N_RXBLKS); if (e->rx_task) TaskWakeup(e->rx_task, TRUE, e->rx_chan); } }
static void data_pump() { ctrl_clr_set(CTRL_INTERRUPT, 0); spi_set(CmdSetRXNsamps, NRX_SAMPS-1); evDP(EC_EVENT, EV_DPUMP, -1, "dpump_init", evprintf("INIT: SPI CTRL_INTERRUPT %d", GPIO_READ_BIT(GPIO0_15))); while (1) { evDP(EC_EVENT, EV_DPUMP, -1, "data_pump", evprintf("SLEEPING: SPI CTRL_INTERRUPT %d", GPIO_READ_BIT(GPIO0_15))); TaskSleep(0); ctrl_clr_set(CTRL_INTERRUPT, 0); // ack interrupt, and updates spi status evDP(EC_EVENT, EV_DPUMP, -1, "data_pump", evprintf("WAKEUP: SPI CTRL_INTERRUPT %d", GPIO_READ_BIT(GPIO0_15))); interrupt_task_last_run = timer_us64(); evDP(EC_EVENT, EV_DPUMP, -1, "data_pump", evprintf("interrupt last run @%.6f ", (float) interrupt_task_last_run / 1000000)); snd_service(); for (int ch=0; ch < RX_CHANS; ch++) { rx_chan_t *rx = &rx_chan[ch]; if (!rx->enabled) continue; conn_t *c = rx->conn; assert(c); if (c->task) { TaskWakeup(c->task, FALSE, 0); } #ifdef SND_SEQ_CHECK if (audio_dropped != last_audio_dropped) { send_msg(c, SM_NO_DEBUG, "MSG audio_dropped=%d", audio_dropped); } #endif } #ifdef SND_SEQ_CHECK if (audio_dropped != last_audio_dropped) last_audio_dropped = audio_dropped; #endif } }
static void spi_scan(SPI_MOSI *mosi, SPI_MISO *miso=&junk, int rbytes=0) { int i; assert(rbytes <= NSPI_RX); int tx_bytes = sizeof(SPI_MOSI); int tx_xfers = SPI_B2X(tx_bytes); int rx_bytes = sizeof(miso->status) + rbytes; int rx_xfers = SPI_B2X(rx_bytes); int arx_xfers = MAX(tx_xfers, prev->len_xfers); int arx_bytes = SPI_X2B(arx_xfers); //jks #if 0 static u4_t last_st; static float acc_st, acc2_st; static int big_rx; if (arx_bytes > 1024) big_rx = 1; u4_t st = timer_us(); float inc_st = (float) (st - last_st) / 1000.0; acc_st += inc_st; if (mosi->cmd == CmdSetWFFreq) acc2_st = 0; printf("SCAN +%.3f %6.3f %6.3f %12s %16s tx(%dX=%dB) rx(%dX=%dB) arx(%dX=%dB)\n", inc_st, acc_st, acc2_st, TaskName(), cmds[mosi->cmd], tx_xfers, tx_bytes, rx_xfers, rx_bytes, arx_xfers, arx_bytes); if (mosi->cmd == CmdDuplex && big_rx) { acc_st = 0; big_rx = 0; } else { } acc2_st += inc_st; last_st = st; #endif //memset(miso, 0xee, sizeof(*miso)); miso->len_xfers = rx_xfers; miso->cmd = mosi->cmd; rx_xfers = arx_xfers; if (mosi->cmd == CmdDuplex) mosi->cmd = CmdDummy; if (mosi->cmd == CmdNoDuplex) mosi->cmd = CmdDummy; for (;;) { peri_spi(SPI_HOST, mosi->msg, tx_xfers, // MOSI: new request prev->msg, rx_xfers); // MISO: response to previous caller's request evSpi(EV_SPILOOP, "spiScan", "peri_spi done"); // fixme: understand why is this needed (hangs w/o it) if (spi_delay) spin_us(spi_delay); else usleep(10); evSpi(EV_SPILOOP, "spiScan", "spin_us done"); if (prev->status != BUSY) break; // new request accepted? evSpi(EV_SPILOOP, "spiScan", "BUSY -> NextTask"); NextTaskL("spi_scan"); // wait and try again } //jks #if 0 printf("RX %d: ", prev->len_xfers); if (prev == &junk) { printf("(junk) "); } else { printf("%s ", cmds[prev->cmd]); } for (i=0; i<(prev->len_xfers+10); i++) { printf("%d:", i); #ifdef SPI_8 printf("%02x ", prev->msg[i]); #endif #ifdef SPI_16 printf("%04x ", prev->msg[i]); #endif #ifdef SPI_32 printf("%08x ", prev->msg[i]); #endif } printf("\n"); #endif u4_t status = prev->status; prev = miso; // next caller collects this for us pcmd=mosi->cmd; //if (status & 0x0fff) //printf("st %04x\n", status); //if (mosi->cmd == CmdGetRXCount) printf("C"); //if (mosi->cmd == CmdGetRX) printf("GRX\n"); static int ff; if (status & (1<<SPI_SFT)) { rx0_wakeup = 1; evSnd(EV_SND, "wakeup", ""); //printf("."); ff = 0; } else { rx0_wakeup = 0; if (!ff) { //printf("."); ff = 1; } } // process rx channel wakeup bits for (i=0; i<RX_CHANS; i++) { u4_t ch = 1<<(i+SPI_SFT); conn_t *c; if (status & ch) { c = &conns[i*2]; assert(c->type == STREAM_SOUND); //if (c->task && !c->stop_data) printf("wakeup %d\n", c->task); //if (c->task && !c->stop_data) { printf("%d:%d ", i, c->task); fflush(stdout); } if (c->task && !c->stop_data) TaskWakeup(c->task, FALSE, 0); } } }