kopia lustrzana https://github.com/cariboulabs/cariboulite
stream start/stop bugfix
rodzic
c4ea098d20
commit
789bc2dc8b
|
@ -429,11 +429,10 @@ static struct dma_async_tx_descriptor *stream_smi_dma_submit_sgl(struct bcm2835_
|
|||
write_smi_reg(inst, read_smi_reg(inst, SMICS) | SMICS_ACTIVE, SMICS);
|
||||
return NULL;
|
||||
}
|
||||
//printk(KERN_ERR DRIVER_NAME": CB\n");
|
||||
|
||||
desc->callback = callback;
|
||||
desc->callback_param = inst;
|
||||
|
||||
//printk(KERN_ERR DRIVER_NAME": SUBMIT_DESC\n");
|
||||
if (dmaengine_submit(desc) < 0)
|
||||
{
|
||||
return NULL;
|
||||
|
@ -492,17 +491,14 @@ ssize_t stream_smi_user_dma( struct bcm2835_smi_instance *inst,
|
|||
spin_unlock(&inst->transaction_lock);
|
||||
return 0;
|
||||
}
|
||||
//printk(KERN_ERR DRIVER_NAME": ASYNC PENDING\n");
|
||||
dma_async_issue_pending(inst->dma_chan);
|
||||
|
||||
//printk(KERN_ERR DRIVER_NAME": PROGRAMMED READ\n");
|
||||
dma_async_issue_pending(inst->dma_chan);
|
||||
|
||||
// we have only 8 bit width
|
||||
if (dma_dir == DMA_DEV_TO_MEM)
|
||||
{
|
||||
if (smi_init_programmed_read(inst, DMA_BOUNCE_BUFFER_SIZE) != 0)
|
||||
{
|
||||
//dev_err(inst->dev, "smi_init_programmed_read failed");
|
||||
spin_unlock(&inst->transaction_lock);
|
||||
return 0;
|
||||
}
|
||||
|
@ -511,7 +507,6 @@ ssize_t stream_smi_user_dma( struct bcm2835_smi_instance *inst,
|
|||
{
|
||||
if (smi_init_programmed_write(inst, DMA_BOUNCE_BUFFER_SIZE) != 0)
|
||||
{
|
||||
//dev_err(inst->dev, "smi_init_programmed_write failed");
|
||||
spin_unlock(&inst->transaction_lock);
|
||||
return 0;
|
||||
}
|
||||
|
@ -585,13 +580,28 @@ int reader_thread_stream_function(void *pv)
|
|||
// timeout. This means that we didn't get enough data into the buffer during this period. we shall
|
||||
// "continue" and try again
|
||||
start = ktime_get();
|
||||
while (1)
|
||||
{
|
||||
// wait for completion, but if not complete (timeout) - nevermind,
|
||||
// try to wait more, unless someone tells us to stop
|
||||
if (down_timeout(&bounce->callback_sem, msecs_to_jiffies(1000)))
|
||||
{
|
||||
dev_info(inst->dev, "DMA bounce timed out");
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// after each timeout check if we are still entitled to keep trying
|
||||
// if not, shut down the DMA transaction and continue empty loop
|
||||
if (inst->state != smi_stream_rx_channel_0 && inst->state != smi_stream_rx_channel_1)
|
||||
{
|
||||
spin_lock(&inst->smi_inst->transaction_lock);
|
||||
dmaengine_terminate_sync(inst->smi_inst->dma_chan);
|
||||
spin_unlock(&inst->smi_inst->transaction_lock);
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
t3 = ktime_to_ns(ktime_sub(ktime_get(), start));
|
||||
|
||||
|
|
Plik diff jest za duży
Load Diff
|
@ -27,7 +27,7 @@ void cariboulite_radio_init(cariboulite_radio_state_st* radio, sys_st *sys, cari
|
|||
memset (radio, 0, sizeof(cariboulite_radio_state_st));
|
||||
|
||||
radio->sys = sys;
|
||||
radio->active = true;
|
||||
radio->active = false;
|
||||
radio->channel_direction = cariboulite_channel_dir_rx;
|
||||
radio->type = type;
|
||||
radio->cw_output = false;
|
||||
|
@ -43,7 +43,7 @@ void cariboulite_radio_init(cariboulite_radio_state_st* radio, sys_st *sys, cari
|
|||
//=========================================================================
|
||||
int cariboulite_radio_dispose(cariboulite_radio_state_st* radio)
|
||||
{
|
||||
radio->active = false;
|
||||
cariboulite_radio_activate_channel(radio, cariboulite_channel_dir_rx, false);
|
||||
|
||||
at86rf215_radio_set_state( &radio->sys->modem,
|
||||
GET_MODEM_CH(radio->type),
|
||||
|
@ -772,9 +772,6 @@ int cariboulite_radio_set_frequency(cariboulite_radio_state_st* radio,
|
|||
radio->requested_rf_frequency = f_rf;
|
||||
radio->rf_frequency_error = radio->actual_rf_frequency - radio->requested_rf_frequency;
|
||||
if (freq) *freq = act_freq;
|
||||
|
||||
// activate the channel according to the new configuration
|
||||
//cariboulite_radio_activate_channel(radio, 1);
|
||||
}
|
||||
|
||||
if (error >= 0)
|
||||
|
@ -783,7 +780,8 @@ int cariboulite_radio_set_frequency(cariboulite_radio_state_st* radio,
|
|||
radio->type, f_rf, act_freq, modem_act_freq, lo_act_freq);
|
||||
}
|
||||
|
||||
return -error;
|
||||
// reactivate the channel if it was active before the frequency change request was issued
|
||||
return cariboulite_radio_activate_channel(radio, radio->channel_direction, radio->active);
|
||||
}
|
||||
|
||||
//=========================================================================
|
||||
|
@ -801,21 +799,20 @@ int cariboulite_radio_activate_channel(cariboulite_radio_state_st* radio,
|
|||
bool activate)
|
||||
{
|
||||
radio->channel_direction = dir;
|
||||
radio->active = activate;
|
||||
|
||||
ZF_LOGD("Activating channel %d, dir = %s, activate = %d", radio->type, radio->channel_direction==cariboulite_channel_dir_rx?"RX":"TX", activate);
|
||||
|
||||
// Deactivation first
|
||||
if (activate == false)
|
||||
{
|
||||
int ret = 0;
|
||||
caribou_fpga_set_smi_channel (&radio->sys->fpga, (radio->type == cariboulite_channel_s1g) ? caribou_fpga_smi_channel_0 : caribou_fpga_smi_channel_1);
|
||||
caribou_fpga_set_io_ctrl_dig (&radio->sys->fpga, (radio->type == cariboulite_channel_s1g) ? 0 : 1, 0);
|
||||
|
||||
// if we deactivate, first shut off the smi stream
|
||||
if (caribou_smi_set_driver_streaming_state(&radio->sys->smi, smi_stream_idle) != 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
usleep(100000);
|
||||
ret = caribou_smi_set_driver_streaming_state(&radio->sys->smi, smi_stream_idle);
|
||||
usleep(30000);
|
||||
|
||||
// then deactivate the modem's stream
|
||||
at86rf215_radio_set_state( &radio->sys->modem,
|
||||
|
@ -825,7 +822,7 @@ int cariboulite_radio_activate_channel(cariboulite_radio_state_st* radio,
|
|||
|
||||
//caribou_smi_set_driver_streaming_state(&radio->sys->smi, smi_stream_idle);
|
||||
ZF_LOGD("Setup Modem state trx_off");
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@ -851,7 +848,7 @@ int cariboulite_radio_activate_channel(cariboulite_radio_state_st* radio,
|
|||
at86rf215_radio_state_cmd_rx);
|
||||
radio->state = at86rf215_radio_state_cmd_rx;
|
||||
ZF_LOGD("Setup Modem state cmd_rx");
|
||||
usleep(100000);
|
||||
usleep(30000);
|
||||
|
||||
// after modem is activated turn on the the smi stream
|
||||
smi_stream_state_en smi_state = smi_stream_idle;
|
||||
|
@ -861,7 +858,7 @@ int cariboulite_radio_activate_channel(cariboulite_radio_state_st* radio,
|
|||
smi_state = smi_stream_rx_channel_1;
|
||||
|
||||
caribou_fpga_set_smi_channel (&radio->sys->fpga, radio->type == cariboulite_channel_s1g? caribou_fpga_smi_channel_0 : caribou_fpga_smi_channel_1);
|
||||
caribou_fpga_set_io_ctrl_dig (&radio->sys->fpga, radio->type == cariboulite_channel_s1g?0:1, 0);
|
||||
caribou_fpga_set_io_ctrl_dig (&radio->sys->fpga, radio->type == cariboulite_channel_s1g? 0 : 1, 0);
|
||||
|
||||
// apply the state
|
||||
if (caribou_smi_set_driver_streaming_state(&radio->sys->smi, smi_state) != 0)
|
||||
|
|
Plik binarny nie jest wyświetlany.
Ładowanie…
Reference in New Issue