staging: comedi: s626: move encoder functions part 2
Move some more functions to help avoid the forward declaration of `s626_enc_chan_info[]`. Signed-off-by: Ian Abbott <abbotti@mev.co.uk> Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
010be96fb6
commit
17afeac2fd
1 changed files with 239 additions and 239 deletions
|
@ -793,6 +793,245 @@ static uint16_t get_mode_b(struct comedi_device *dev,
|
||||||
return setup;
|
return setup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the operating mode for the specified counter. The setup
|
||||||
|
* parameter is treated as a COUNTER_SETUP data type. The following
|
||||||
|
* parameters are programmable (all other parms are ignored): ClkMult,
|
||||||
|
* ClkPol, ClkEnab, IndexSrc, IndexPol, LoadSrc.
|
||||||
|
*/
|
||||||
|
static void set_mode_a(struct comedi_device *dev, const struct s626_enc_info *k,
|
||||||
|
uint16_t setup, uint16_t disable_int_src)
|
||||||
|
{
|
||||||
|
struct s626_private *devpriv = dev->private;
|
||||||
|
uint16_t cra;
|
||||||
|
uint16_t crb;
|
||||||
|
|
||||||
|
/* Initialize CRA and CRB images. */
|
||||||
|
/* Preload trigger is passed through. */
|
||||||
|
cra = setup & CRAMSK_LOADSRC_A;
|
||||||
|
/* IndexSrc is restricted to ENC_X or IndxPol. */
|
||||||
|
cra |= ((setup & STDMSK_INDXSRC) >>
|
||||||
|
(STDBIT_INDXSRC - (CRABIT_INDXSRC_A + 1)));
|
||||||
|
|
||||||
|
/* Reset any pending CounterA event captures. */
|
||||||
|
crb = CRBMSK_INTRESETCMD | CRBMSK_INTRESET_A;
|
||||||
|
/* Clock enable is passed through. */
|
||||||
|
crb |= (setup & STDMSK_CLKENAB) << (CRBBIT_CLKENAB_A - STDBIT_CLKENAB);
|
||||||
|
|
||||||
|
/* Force IntSrc to Disabled if disable_int_src is asserted. */
|
||||||
|
if (!disable_int_src)
|
||||||
|
cra |= ((setup & STDMSK_INTSRC) >> (STDBIT_INTSRC -
|
||||||
|
CRABIT_INTSRC_A));
|
||||||
|
|
||||||
|
/* Populate all mode-dependent attributes of CRA & CRB images. */
|
||||||
|
switch ((setup & STDMSK_CLKSRC) >> STDBIT_CLKSRC) {
|
||||||
|
case CLKSRC_EXTENDER: /* Extender Mode: Force to Timer mode
|
||||||
|
* (Extender valid only for B counters). */
|
||||||
|
/* Fall through to case CLKSRC_TIMER: */
|
||||||
|
case CLKSRC_TIMER: /* Timer Mode: */
|
||||||
|
/* ClkSrcA<1> selects system clock */
|
||||||
|
cra |= 2 << CRABIT_CLKSRC_A;
|
||||||
|
/* Count direction (ClkSrcA<0>) obtained from ClkPol. */
|
||||||
|
cra |= (setup & STDMSK_CLKPOL) >>
|
||||||
|
(STDBIT_CLKPOL - CRABIT_CLKSRC_A);
|
||||||
|
/* ClkPolA behaves as always-on clock enable. */
|
||||||
|
cra |= 1 << CRABIT_CLKPOL_A;
|
||||||
|
/* ClkMult must be 1x. */
|
||||||
|
cra |= MULT_X1 << CRABIT_CLKMULT_A;
|
||||||
|
break;
|
||||||
|
default: /* Counter Mode: */
|
||||||
|
/* Select ENC_C and ENC_D as clock/direction inputs. */
|
||||||
|
cra |= CLKSRC_COUNTER;
|
||||||
|
/* Clock polarity is passed through. */
|
||||||
|
cra |= (setup & STDMSK_CLKPOL) <<
|
||||||
|
(CRABIT_CLKPOL_A - STDBIT_CLKPOL);
|
||||||
|
/* Force multiplier to x1 if not legal, else pass through. */
|
||||||
|
if ((setup & STDMSK_CLKMULT) == (MULT_X0 << STDBIT_CLKMULT))
|
||||||
|
cra |= MULT_X1 << CRABIT_CLKMULT_A;
|
||||||
|
else
|
||||||
|
cra |= (setup & STDMSK_CLKMULT) <<
|
||||||
|
(CRABIT_CLKMULT_A - STDBIT_CLKMULT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Force positive index polarity if IndxSrc is software-driven only,
|
||||||
|
* otherwise pass it through.
|
||||||
|
*/
|
||||||
|
if (~setup & STDMSK_INDXSRC)
|
||||||
|
cra |= (setup & STDMSK_INDXPOL) <<
|
||||||
|
(CRABIT_INDXPOL_A - STDBIT_INDXPOL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If IntSrc has been forced to Disabled, update the MISC2 interrupt
|
||||||
|
* enable mask to indicate the counter interrupt is disabled.
|
||||||
|
*/
|
||||||
|
if (disable_int_src)
|
||||||
|
devpriv->counter_int_enabs &= ~k->my_event_bits[3];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* While retaining CounterB and LatchSrc configurations, program the
|
||||||
|
* new counter operating mode.
|
||||||
|
*/
|
||||||
|
debi_replace(dev, k->my_cra, CRAMSK_INDXSRC_B | CRAMSK_CLKSRC_B, cra);
|
||||||
|
debi_replace(dev, k->my_crb, ~(CRBMSK_INTCTRL | CRBMSK_CLKENAB_A), crb);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_mode_b(struct comedi_device *dev, const struct s626_enc_info *k,
|
||||||
|
uint16_t setup, uint16_t disable_int_src)
|
||||||
|
{
|
||||||
|
struct s626_private *devpriv = dev->private;
|
||||||
|
uint16_t cra;
|
||||||
|
uint16_t crb;
|
||||||
|
|
||||||
|
/* Initialize CRA and CRB images. */
|
||||||
|
/* IndexSrc field is restricted to ENC_X or IndxPol. */
|
||||||
|
cra = (setup & STDMSK_INDXSRC) <<
|
||||||
|
(CRABIT_INDXSRC_B + 1 - STDBIT_INDXSRC);
|
||||||
|
|
||||||
|
/* Reset event captures and disable interrupts. */
|
||||||
|
crb = CRBMSK_INTRESETCMD | CRBMSK_INTRESET_B;
|
||||||
|
/* Clock enable is passed through. */
|
||||||
|
crb |= (setup & STDMSK_CLKENAB) << (CRBBIT_CLKENAB_B - STDBIT_CLKENAB);
|
||||||
|
/* Preload trigger source is passed through. */
|
||||||
|
crb |= (setup & STDMSK_LOADSRC) >> (STDBIT_LOADSRC - CRBBIT_LOADSRC_B);
|
||||||
|
|
||||||
|
/* Force IntSrc to Disabled if disable_int_src is asserted. */
|
||||||
|
if (!disable_int_src)
|
||||||
|
crb |= (setup & STDMSK_INTSRC) >>
|
||||||
|
(STDBIT_INTSRC - CRBBIT_INTSRC_B);
|
||||||
|
|
||||||
|
/* Populate all mode-dependent attributes of CRA & CRB images. */
|
||||||
|
switch ((setup & STDMSK_CLKSRC) >> STDBIT_CLKSRC) {
|
||||||
|
case CLKSRC_TIMER: /* Timer Mode: */
|
||||||
|
/* ClkSrcB<1> selects system clock */
|
||||||
|
cra |= 2 << CRABIT_CLKSRC_B;
|
||||||
|
/* with direction (ClkSrcB<0>) obtained from ClkPol. */
|
||||||
|
cra |= (setup & STDMSK_CLKPOL) <<
|
||||||
|
(CRABIT_CLKSRC_B - STDBIT_CLKPOL);
|
||||||
|
/* ClkPolB behaves as always-on clock enable. */
|
||||||
|
crb |= 1 << CRBBIT_CLKPOL_B;
|
||||||
|
/* ClkMultB must be 1x. */
|
||||||
|
crb |= MULT_X1 << CRBBIT_CLKMULT_B;
|
||||||
|
break;
|
||||||
|
case CLKSRC_EXTENDER: /* Extender Mode: */
|
||||||
|
/* ClkSrcB source is OverflowA (same as "timer") */
|
||||||
|
cra |= 2 << CRABIT_CLKSRC_B;
|
||||||
|
/* with direction obtained from ClkPol. */
|
||||||
|
cra |= (setup & STDMSK_CLKPOL) <<
|
||||||
|
(CRABIT_CLKSRC_B - STDBIT_CLKPOL);
|
||||||
|
/* ClkPolB controls IndexB -- always set to active. */
|
||||||
|
crb |= 1 << CRBBIT_CLKPOL_B;
|
||||||
|
/* ClkMultB selects OverflowA as the clock source. */
|
||||||
|
crb |= MULT_X0 << CRBBIT_CLKMULT_B;
|
||||||
|
break;
|
||||||
|
default: /* Counter Mode: */
|
||||||
|
/* Select ENC_C and ENC_D as clock/direction inputs. */
|
||||||
|
cra |= CLKSRC_COUNTER << CRABIT_CLKSRC_B;
|
||||||
|
/* ClkPol is passed through. */
|
||||||
|
crb |= (setup & STDMSK_CLKPOL) >>
|
||||||
|
(STDBIT_CLKPOL - CRBBIT_CLKPOL_B);
|
||||||
|
/* Force ClkMult to x1 if not legal, otherwise pass through. */
|
||||||
|
if ((setup & STDMSK_CLKMULT) == (MULT_X0 << STDBIT_CLKMULT))
|
||||||
|
crb |= MULT_X1 << CRBBIT_CLKMULT_B;
|
||||||
|
else
|
||||||
|
crb |= (setup & STDMSK_CLKMULT) <<
|
||||||
|
(CRBBIT_CLKMULT_B - STDBIT_CLKMULT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Force positive index polarity if IndxSrc is software-driven only,
|
||||||
|
* otherwise pass it through.
|
||||||
|
*/
|
||||||
|
if (~setup & STDMSK_INDXSRC)
|
||||||
|
crb |= (setup & STDMSK_INDXPOL) >>
|
||||||
|
(STDBIT_INDXPOL - CRBBIT_INDXPOL_B);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If IntSrc has been forced to Disabled, update the MISC2 interrupt
|
||||||
|
* enable mask to indicate the counter interrupt is disabled.
|
||||||
|
*/
|
||||||
|
if (disable_int_src)
|
||||||
|
devpriv->counter_int_enabs &= ~k->my_event_bits[3];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* While retaining CounterA and LatchSrc configurations, program the
|
||||||
|
* new counter operating mode.
|
||||||
|
*/
|
||||||
|
debi_replace(dev, k->my_cra, ~(CRAMSK_INDXSRC_B | CRAMSK_CLKSRC_B),
|
||||||
|
cra);
|
||||||
|
debi_replace(dev, k->my_crb, CRBMSK_CLKENAB_A | CRBMSK_LATCHSRC, crb);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return/set a counter's enable. enab: 0=always enabled, 1=enabled by index.
|
||||||
|
*/
|
||||||
|
static void set_enable_a(struct comedi_device *dev,
|
||||||
|
const struct s626_enc_info *k, uint16_t enab)
|
||||||
|
{
|
||||||
|
debi_replace(dev, k->my_crb, ~(CRBMSK_INTCTRL | CRBMSK_CLKENAB_A),
|
||||||
|
enab << CRBBIT_CLKENAB_A);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_enable_b(struct comedi_device *dev,
|
||||||
|
const struct s626_enc_info *k, uint16_t enab)
|
||||||
|
{
|
||||||
|
debi_replace(dev, k->my_crb, ~(CRBMSK_INTCTRL | CRBMSK_CLKENAB_B),
|
||||||
|
enab << CRBBIT_CLKENAB_B);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t get_enable_a(struct comedi_device *dev,
|
||||||
|
const struct s626_enc_info *k)
|
||||||
|
{
|
||||||
|
return (debi_read(dev, k->my_crb) >> CRBBIT_CLKENAB_A) & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t get_enable_b(struct comedi_device *dev,
|
||||||
|
const struct s626_enc_info *k)
|
||||||
|
{
|
||||||
|
return (debi_read(dev, k->my_crb) >> CRBBIT_CLKENAB_B) & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef unused
|
||||||
|
static uint16_t get_latch_source(struct comedi_device *dev,
|
||||||
|
const struct s626_enc_info *k)
|
||||||
|
{
|
||||||
|
return (debi_read(dev, k->my_crb) >> CRBBIT_LATCHSRC) & 3;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return/set the event that will trigger transfer of the preload
|
||||||
|
* register into the counter. 0=ThisCntr_Index, 1=ThisCntr_Overflow,
|
||||||
|
* 2=OverflowA (B counters only), 3=disabled.
|
||||||
|
*/
|
||||||
|
static void set_load_trig_a(struct comedi_device *dev,
|
||||||
|
const struct s626_enc_info *k, uint16_t trig)
|
||||||
|
{
|
||||||
|
debi_replace(dev, k->my_cra, ~CRAMSK_LOADSRC_A,
|
||||||
|
trig << CRABIT_LOADSRC_A);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_load_trig_b(struct comedi_device *dev,
|
||||||
|
const struct s626_enc_info *k, uint16_t trig)
|
||||||
|
{
|
||||||
|
debi_replace(dev, k->my_crb, ~(CRBMSK_LOADSRC_B | CRBMSK_INTCTRL),
|
||||||
|
trig << CRBBIT_LOADSRC_B);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t get_load_trig_a(struct comedi_device *dev,
|
||||||
|
const struct s626_enc_info *k)
|
||||||
|
{
|
||||||
|
return (debi_read(dev, k->my_cra) >> CRABIT_LOADSRC_A) & 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t get_load_trig_b(struct comedi_device *dev,
|
||||||
|
const struct s626_enc_info *k)
|
||||||
|
{
|
||||||
|
return (debi_read(dev, k->my_crb) >> CRBBIT_LOADSRC_B) & 3;
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned int s626_ai_reg_to_uint(int data)
|
static unsigned int s626_ai_reg_to_uint(int data)
|
||||||
{
|
{
|
||||||
unsigned int tempdata;
|
unsigned int tempdata;
|
||||||
|
@ -1964,245 +2203,6 @@ static void close_dma_b(struct comedi_device *dev, struct buffer_dma *pdma,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the operating mode for the specified counter. The setup
|
|
||||||
* parameter is treated as a COUNTER_SETUP data type. The following
|
|
||||||
* parameters are programmable (all other parms are ignored): ClkMult,
|
|
||||||
* ClkPol, ClkEnab, IndexSrc, IndexPol, LoadSrc.
|
|
||||||
*/
|
|
||||||
static void set_mode_a(struct comedi_device *dev, const struct s626_enc_info *k,
|
|
||||||
uint16_t setup, uint16_t disable_int_src)
|
|
||||||
{
|
|
||||||
struct s626_private *devpriv = dev->private;
|
|
||||||
uint16_t cra;
|
|
||||||
uint16_t crb;
|
|
||||||
|
|
||||||
/* Initialize CRA and CRB images. */
|
|
||||||
/* Preload trigger is passed through. */
|
|
||||||
cra = setup & CRAMSK_LOADSRC_A;
|
|
||||||
/* IndexSrc is restricted to ENC_X or IndxPol. */
|
|
||||||
cra |= ((setup & STDMSK_INDXSRC) >>
|
|
||||||
(STDBIT_INDXSRC - (CRABIT_INDXSRC_A + 1)));
|
|
||||||
|
|
||||||
/* Reset any pending CounterA event captures. */
|
|
||||||
crb = CRBMSK_INTRESETCMD | CRBMSK_INTRESET_A;
|
|
||||||
/* Clock enable is passed through. */
|
|
||||||
crb |= (setup & STDMSK_CLKENAB) << (CRBBIT_CLKENAB_A - STDBIT_CLKENAB);
|
|
||||||
|
|
||||||
/* Force IntSrc to Disabled if disable_int_src is asserted. */
|
|
||||||
if (!disable_int_src)
|
|
||||||
cra |= ((setup & STDMSK_INTSRC) >> (STDBIT_INTSRC -
|
|
||||||
CRABIT_INTSRC_A));
|
|
||||||
|
|
||||||
/* Populate all mode-dependent attributes of CRA & CRB images. */
|
|
||||||
switch ((setup & STDMSK_CLKSRC) >> STDBIT_CLKSRC) {
|
|
||||||
case CLKSRC_EXTENDER: /* Extender Mode: Force to Timer mode
|
|
||||||
* (Extender valid only for B counters). */
|
|
||||||
/* Fall through to case CLKSRC_TIMER: */
|
|
||||||
case CLKSRC_TIMER: /* Timer Mode: */
|
|
||||||
/* ClkSrcA<1> selects system clock */
|
|
||||||
cra |= 2 << CRABIT_CLKSRC_A;
|
|
||||||
/* Count direction (ClkSrcA<0>) obtained from ClkPol. */
|
|
||||||
cra |= (setup & STDMSK_CLKPOL) >>
|
|
||||||
(STDBIT_CLKPOL - CRABIT_CLKSRC_A);
|
|
||||||
/* ClkPolA behaves as always-on clock enable. */
|
|
||||||
cra |= 1 << CRABIT_CLKPOL_A;
|
|
||||||
/* ClkMult must be 1x. */
|
|
||||||
cra |= MULT_X1 << CRABIT_CLKMULT_A;
|
|
||||||
break;
|
|
||||||
default: /* Counter Mode: */
|
|
||||||
/* Select ENC_C and ENC_D as clock/direction inputs. */
|
|
||||||
cra |= CLKSRC_COUNTER;
|
|
||||||
/* Clock polarity is passed through. */
|
|
||||||
cra |= (setup & STDMSK_CLKPOL) <<
|
|
||||||
(CRABIT_CLKPOL_A - STDBIT_CLKPOL);
|
|
||||||
/* Force multiplier to x1 if not legal, else pass through. */
|
|
||||||
if ((setup & STDMSK_CLKMULT) == (MULT_X0 << STDBIT_CLKMULT))
|
|
||||||
cra |= MULT_X1 << CRABIT_CLKMULT_A;
|
|
||||||
else
|
|
||||||
cra |= (setup & STDMSK_CLKMULT) <<
|
|
||||||
(CRABIT_CLKMULT_A - STDBIT_CLKMULT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Force positive index polarity if IndxSrc is software-driven only,
|
|
||||||
* otherwise pass it through.
|
|
||||||
*/
|
|
||||||
if (~setup & STDMSK_INDXSRC)
|
|
||||||
cra |= (setup & STDMSK_INDXPOL) <<
|
|
||||||
(CRABIT_INDXPOL_A - STDBIT_INDXPOL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If IntSrc has been forced to Disabled, update the MISC2 interrupt
|
|
||||||
* enable mask to indicate the counter interrupt is disabled.
|
|
||||||
*/
|
|
||||||
if (disable_int_src)
|
|
||||||
devpriv->counter_int_enabs &= ~k->my_event_bits[3];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* While retaining CounterB and LatchSrc configurations, program the
|
|
||||||
* new counter operating mode.
|
|
||||||
*/
|
|
||||||
debi_replace(dev, k->my_cra, CRAMSK_INDXSRC_B | CRAMSK_CLKSRC_B, cra);
|
|
||||||
debi_replace(dev, k->my_crb, ~(CRBMSK_INTCTRL | CRBMSK_CLKENAB_A), crb);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void set_mode_b(struct comedi_device *dev, const struct s626_enc_info *k,
|
|
||||||
uint16_t setup, uint16_t disable_int_src)
|
|
||||||
{
|
|
||||||
struct s626_private *devpriv = dev->private;
|
|
||||||
uint16_t cra;
|
|
||||||
uint16_t crb;
|
|
||||||
|
|
||||||
/* Initialize CRA and CRB images. */
|
|
||||||
/* IndexSrc field is restricted to ENC_X or IndxPol. */
|
|
||||||
cra = (setup & STDMSK_INDXSRC) <<
|
|
||||||
(CRABIT_INDXSRC_B + 1 - STDBIT_INDXSRC);
|
|
||||||
|
|
||||||
/* Reset event captures and disable interrupts. */
|
|
||||||
crb = CRBMSK_INTRESETCMD | CRBMSK_INTRESET_B;
|
|
||||||
/* Clock enable is passed through. */
|
|
||||||
crb |= (setup & STDMSK_CLKENAB) << (CRBBIT_CLKENAB_B - STDBIT_CLKENAB);
|
|
||||||
/* Preload trigger source is passed through. */
|
|
||||||
crb |= (setup & STDMSK_LOADSRC) >> (STDBIT_LOADSRC - CRBBIT_LOADSRC_B);
|
|
||||||
|
|
||||||
/* Force IntSrc to Disabled if disable_int_src is asserted. */
|
|
||||||
if (!disable_int_src)
|
|
||||||
crb |= (setup & STDMSK_INTSRC) >>
|
|
||||||
(STDBIT_INTSRC - CRBBIT_INTSRC_B);
|
|
||||||
|
|
||||||
/* Populate all mode-dependent attributes of CRA & CRB images. */
|
|
||||||
switch ((setup & STDMSK_CLKSRC) >> STDBIT_CLKSRC) {
|
|
||||||
case CLKSRC_TIMER: /* Timer Mode: */
|
|
||||||
/* ClkSrcB<1> selects system clock */
|
|
||||||
cra |= 2 << CRABIT_CLKSRC_B;
|
|
||||||
/* with direction (ClkSrcB<0>) obtained from ClkPol. */
|
|
||||||
cra |= (setup & STDMSK_CLKPOL) <<
|
|
||||||
(CRABIT_CLKSRC_B - STDBIT_CLKPOL);
|
|
||||||
/* ClkPolB behaves as always-on clock enable. */
|
|
||||||
crb |= 1 << CRBBIT_CLKPOL_B;
|
|
||||||
/* ClkMultB must be 1x. */
|
|
||||||
crb |= MULT_X1 << CRBBIT_CLKMULT_B;
|
|
||||||
break;
|
|
||||||
case CLKSRC_EXTENDER: /* Extender Mode: */
|
|
||||||
/* ClkSrcB source is OverflowA (same as "timer") */
|
|
||||||
cra |= 2 << CRABIT_CLKSRC_B;
|
|
||||||
/* with direction obtained from ClkPol. */
|
|
||||||
cra |= (setup & STDMSK_CLKPOL) <<
|
|
||||||
(CRABIT_CLKSRC_B - STDBIT_CLKPOL);
|
|
||||||
/* ClkPolB controls IndexB -- always set to active. */
|
|
||||||
crb |= 1 << CRBBIT_CLKPOL_B;
|
|
||||||
/* ClkMultB selects OverflowA as the clock source. */
|
|
||||||
crb |= MULT_X0 << CRBBIT_CLKMULT_B;
|
|
||||||
break;
|
|
||||||
default: /* Counter Mode: */
|
|
||||||
/* Select ENC_C and ENC_D as clock/direction inputs. */
|
|
||||||
cra |= CLKSRC_COUNTER << CRABIT_CLKSRC_B;
|
|
||||||
/* ClkPol is passed through. */
|
|
||||||
crb |= (setup & STDMSK_CLKPOL) >>
|
|
||||||
(STDBIT_CLKPOL - CRBBIT_CLKPOL_B);
|
|
||||||
/* Force ClkMult to x1 if not legal, otherwise pass through. */
|
|
||||||
if ((setup & STDMSK_CLKMULT) == (MULT_X0 << STDBIT_CLKMULT))
|
|
||||||
crb |= MULT_X1 << CRBBIT_CLKMULT_B;
|
|
||||||
else
|
|
||||||
crb |= (setup & STDMSK_CLKMULT) <<
|
|
||||||
(CRBBIT_CLKMULT_B - STDBIT_CLKMULT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Force positive index polarity if IndxSrc is software-driven only,
|
|
||||||
* otherwise pass it through.
|
|
||||||
*/
|
|
||||||
if (~setup & STDMSK_INDXSRC)
|
|
||||||
crb |= (setup & STDMSK_INDXPOL) >>
|
|
||||||
(STDBIT_INDXPOL - CRBBIT_INDXPOL_B);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If IntSrc has been forced to Disabled, update the MISC2 interrupt
|
|
||||||
* enable mask to indicate the counter interrupt is disabled.
|
|
||||||
*/
|
|
||||||
if (disable_int_src)
|
|
||||||
devpriv->counter_int_enabs &= ~k->my_event_bits[3];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* While retaining CounterA and LatchSrc configurations, program the
|
|
||||||
* new counter operating mode.
|
|
||||||
*/
|
|
||||||
debi_replace(dev, k->my_cra, ~(CRAMSK_INDXSRC_B | CRAMSK_CLKSRC_B),
|
|
||||||
cra);
|
|
||||||
debi_replace(dev, k->my_crb, CRBMSK_CLKENAB_A | CRBMSK_LATCHSRC, crb);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return/set a counter's enable. enab: 0=always enabled, 1=enabled by index.
|
|
||||||
*/
|
|
||||||
static void set_enable_a(struct comedi_device *dev,
|
|
||||||
const struct s626_enc_info *k, uint16_t enab)
|
|
||||||
{
|
|
||||||
debi_replace(dev, k->my_crb, ~(CRBMSK_INTCTRL | CRBMSK_CLKENAB_A),
|
|
||||||
enab << CRBBIT_CLKENAB_A);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void set_enable_b(struct comedi_device *dev, const
|
|
||||||
struct s626_enc_info *k, uint16_t enab)
|
|
||||||
{
|
|
||||||
debi_replace(dev, k->my_crb, ~(CRBMSK_INTCTRL | CRBMSK_CLKENAB_B),
|
|
||||||
enab << CRBBIT_CLKENAB_B);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint16_t get_enable_a(struct comedi_device *dev,
|
|
||||||
const struct s626_enc_info *k)
|
|
||||||
{
|
|
||||||
return (debi_read(dev, k->my_crb) >> CRBBIT_CLKENAB_A) & 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint16_t get_enable_b(struct comedi_device *dev,
|
|
||||||
const struct s626_enc_info *k)
|
|
||||||
{
|
|
||||||
return (debi_read(dev, k->my_crb) >> CRBBIT_CLKENAB_B) & 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef unused
|
|
||||||
static uint16_t get_latch_source(struct comedi_device *dev,
|
|
||||||
const struct s626_enc_info *k)
|
|
||||||
{
|
|
||||||
return (debi_read(dev, k->my_crb) >> CRBBIT_LATCHSRC) & 3;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return/set the event that will trigger transfer of the preload
|
|
||||||
* register into the counter. 0=ThisCntr_Index, 1=ThisCntr_Overflow,
|
|
||||||
* 2=OverflowA (B counters only), 3=disabled.
|
|
||||||
*/
|
|
||||||
static void set_load_trig_a(struct comedi_device *dev,
|
|
||||||
const struct s626_enc_info *k, uint16_t trig)
|
|
||||||
{
|
|
||||||
debi_replace(dev, k->my_cra, ~CRAMSK_LOADSRC_A,
|
|
||||||
trig << CRABIT_LOADSRC_A);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void set_load_trig_b(struct comedi_device *dev,
|
|
||||||
const struct s626_enc_info *k, uint16_t trig)
|
|
||||||
{
|
|
||||||
debi_replace(dev, k->my_crb, ~(CRBMSK_LOADSRC_B | CRBMSK_INTCTRL),
|
|
||||||
trig << CRBBIT_LOADSRC_B);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint16_t get_load_trig_a(struct comedi_device *dev,
|
|
||||||
const struct s626_enc_info *k)
|
|
||||||
{
|
|
||||||
return (debi_read(dev, k->my_cra) >> CRABIT_LOADSRC_A) & 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint16_t get_load_trig_b(struct comedi_device *dev,
|
|
||||||
const struct s626_enc_info *k)
|
|
||||||
{
|
|
||||||
return (debi_read(dev, k->my_crb) >> CRBBIT_LOADSRC_B) & 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return/set counter interrupt source and clear any captured
|
* Return/set counter interrupt source and clear any captured
|
||||||
* index/overflow events. int_source: 0=Disabled, 1=OverflowOnly,
|
* index/overflow events. int_source: 0=Disabled, 1=OverflowOnly,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue