Commit 0d7eae66 authored by Federico Vaga's avatar Federico Vaga

features from fmc-adc-100m gateware 4.1

parents a6a3d20d b501b6f3
......@@ -343,6 +343,8 @@ static int __fa_init(struct fa_dev *fa)
/* Retrieve calibration from the eeprom and validate*/
fa_read_eeprom_calib(fa);
fa->mshot_max_samples = fa_readl(fa, fa->fa_adc_csr_base,
&zfad_regs[ZFA_MULT_MAX_SAMP]);
/* Force stop FSM to prevent early trigger fire */
fa_writel(fa, fa->fa_adc_csr_base, &zfad_regs[ZFA_CTL_FMS_CMD],
......
......@@ -227,19 +227,14 @@ void zfat_irq_acq_end(struct zio_cset *cset)
* This ultimate check is not crucial because the HW implements
* a solid state machine and acq-end can happens only after
* the execution of the n requested shots.
*
* FIXME (v4.0) this work only for multi-shot acquisition
*/
fa->n_fires = fa->n_shots;
if (fa->n_shots > 1) {
fa->n_fires -= fa_readl(fa, fa->fa_adc_csr_base,
&zfad_regs[ZFAT_SHOTS_REM]);
if (fa->n_fires != fa->n_shots) {
dev_err(&fa->fmc->dev,
"Expected %i trigger fires, but %i occurs\n",
fa->n_shots, fa->n_fires);
}
fa->n_fires = fa->n_shots - fa_readl(fa, fa->fa_adc_csr_base,
&zfad_regs[ZFAT_SHOTS_REM]);
if (fa->n_fires != fa->n_shots) {
dev_err(&fa->fmc->dev,
"Expected %i trigger fires, but %i occurs\n",
fa->n_shots, fa->n_fires);
}
}
......
......@@ -78,6 +78,8 @@ const struct zfa_field_desc zfad_regs[] = {
[ZFA_CH4_GAIN] = {0x78, 0x0000FFFF, 0},
[ZFA_CH4_OFFSET] = {0x7C, 0x0000FFFF, 0},
[ZFA_CH4_SAT] = {0x80, 0x00007FFF, 0},
/* Other options */
[ZFA_MULT_MAX_SAMP] = {0x84, 0xFFFFFFFF, 0},
/* IRQ */
[ZFA_IRQ_ADC_DISABLE_MASK] = {0x00, 0x00000003, 0},
[ZFA_IRQ_ADC_ENABLE_MASK] = {0x04, 0x00000003, 0},
......
......@@ -121,6 +121,7 @@ static struct zio_attribute zfad_cset_ext_zattr[] = {
ZIO_PARAM_EXT("rst-ch-offset", ZIO_WO_PERM, ZFA_CTL_DAC_CLR_N, 1),
ZIO_PARAM_EXT("sample-frequency", ZIO_RO_PERM, ZFAT_SAMPLING_HZ, 0),
ZIO_PARAM_EXT("max-sample-mshot", ZIO_RO_PERM, ZFA_MULT_MAX_SAMP, 0),
};
#if 0 /* FIXME Unused until TLV control will be available */
......
......@@ -67,8 +67,6 @@ enum fa100m14b4c_dev_ext_attr {
/* ADC DDR memory */
#define FA100M14B4C_MAX_ACQ_BYTE 0x10000000 /* 256MB */
/* In Multi shot mode samples go through a dpram which has a limited size */
#define FA100M14B4C_MAX_MSHOT_ACQ_BYTE 0x3FE8 /* 2045 samples (2045*8 bytes) */
enum fa100m14b4c_input_range {
FA100M14B4C_RANGE_10V = 0x0,
......@@ -195,6 +193,9 @@ enum zfadc_dregs_enum {
ZFA_CHx_GAIN,
ZFA_CHx_OFFSET,
ZFA_CHx_SAT,
/* Other options */
ZFA_MULT_MAX_SAMP,
/* end:declaration block requiring some order */
/* two wishbone core for IRQ: VIC, ADC */
ZFA_IRQ_ADC_DISABLE_MASK,
......@@ -342,6 +343,7 @@ struct fa_dev {
/* Acquisition */
unsigned int n_shots;
unsigned int n_fires;
unsigned int mshot_max_samples;
/* Statistic informations */
unsigned int n_dma_err;
......@@ -402,8 +404,9 @@ extern struct zio_trigger_type zfat_type;
static inline int zfat_overflow_detection(struct zio_ti *ti, unsigned int addr,
uint32_t val)
{
struct fa_dev *fa = ti->cset->zdev->priv_d;
struct zio_attribute *ti_zattr = ti->zattr_set.std_zattr;
uint32_t pre_t, post_t, nshot_t;
uint32_t pre_t, post_t, nshot_t, nsamples;
size_t shot_size;
if (!addr)
......@@ -424,18 +427,20 @@ static inline int zfat_overflow_detection(struct zio_ti *ti, unsigned int addr,
* post-sample by the ADC
* +2 because of the timetag at the end
*/
shot_size = ((pre_t + post_t + 1 + 2) * ti->cset->ssize) * FA100M14B4C_NCHAN;
nsamples = pre_t + post_t + 1;
shot_size = ((nsamples + 2) * ti->cset->ssize) * FA100M14B4C_NCHAN;
if ( (shot_size * nshot_t) > FA100M14B4C_MAX_ACQ_BYTE ) {
dev_err(&ti->head.dev, "Cannot acquire, dev memory overflow\n");
return -ENOMEM;
}
/* in case of multi shot, each shot cannot exceed the dpram size */
if ( (nshot_t > 1) &&
(shot_size > FA100M14B4C_MAX_MSHOT_ACQ_BYTE) ) {
(nsamples > fa->mshot_max_samples) ) {
dev_err(&ti->head.dev, "Cannot acquire such amount of samples "
"(shot_size: %d pre-samp:%d post-samp:%d) in multi shot mode."
"(req: %d , max: %d) in multi shot mode."
"dev memory overflow\n",
(int)shot_size, pre_t, post_t);
nsamples, fa->mshot_max_samples);
return -ENOMEM;
}
return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment