From 3cfafaa22d6ff3f6f98a6ddacba08d3f83617cde Mon Sep 17 00:00:00 2001 From: Frank Mori Hess Date: Tue, 17 Oct 2006 15:36:37 +0000 Subject: [PATCH] Made insn_rw_emulate_bits() work for dio subdevice with more than 32 channels (ni_65xx). --- comedi/drivers.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/comedi/drivers.c b/comedi/drivers.c index 69f31ca4..6b8d0c0e 100644 --- a/comedi/drivers.c +++ b/comedi/drivers.c @@ -354,25 +354,26 @@ static int insn_rw_emulate_bits(comedi_device *dev,comedi_subdevice *s, { comedi_insn new_insn; int ret; - lsampl_t new_data[2]; unsigned int chan; + static const unsigned channels_per_bitfield = 32; chan = CR_CHAN(insn->chanspec); - - memset(&new_insn,0,sizeof(new_insn)); + const unsigned num_bitfields = (chan + channels_per_bitfield) / channels_per_bitfield; + lsampl_t new_data[2 * num_bitfields]; + memset(new_data, 0, sizeof(new_data)); + memset(&new_insn, 0, sizeof(new_insn)); new_insn.insn = INSN_BITS; - new_insn.n = 2; + new_insn.n = 2 * num_bitfields; new_insn.data = new_data; new_insn.subdev = insn->subdev; - if(insn->insn == INSN_WRITE){ + if(insn->insn == INSN_WRITE) + { if(!(s->subdev_flags & SDF_WRITABLE)) return -EINVAL; - new_data[0] = 1<insn_bits(dev,s,&new_insn,new_data); -- 2.26.2