コード例 #1
0
ファイル: s4285.c プロジェクト: TomGaussiran/Beagle_SDR_GPS
//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);
	}
}
コード例 #2
0
ファイル: data_pump.cpp プロジェクト: Analias/Beagle_SDR_GPS
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
	}
}
コード例 #3
0
ファイル: spi.cpp プロジェクト: hailynch/Beagle_SDR_GPS
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);
		}
	}
}