stripped out some settle delays in analog input read insn, as per official policy
authorFrank Mori Hess <fmhess@speakeasy.net>
Thu, 25 Apr 2002 17:27:17 +0000 (17:27 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Thu, 25 Apr 2002 17:27:17 +0000 (17:27 +0000)
comedi/drivers/ni_at_a2150.c
comedi/drivers/ni_labpc.c
comedi/drivers/pcl711.c
comedi/drivers/pcl816.c
comedi/drivers/pcl818.c

index c95cef2af34834982540c64505d2fad8af513adb..86ae6de02748faa7c8e8587c0f80171176fbac09 100644 (file)
@@ -463,7 +463,6 @@ static int a2150_attach(comedi_device *dev, comedi_devconfig *it)
                if((DCAL_BIT & inw(dev->iobase + STATUS_REG)) == 0)
                        break;
                udelay(1000);
-       // probably should sleep instead of using udelay since wait is so long
        }
        if(i == timeout)
        {
@@ -759,11 +758,11 @@ static int a2150_ai_cmd(comedi_device *dev, comedi_subdevice *s)
        return 0;
 }
 
-// XXX doesn't seem to work
 static int a2150_ai_rinsn(comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data)
 {
        unsigned int i, n;
-       static const int timeout = 10000;
+       static const int timeout = 100000;
+       static const int filter_delay = 36;
 
        // clear fifo and reset triggering circuitry
        outw(0, dev->iobase + FIFO_RESET_REG);
@@ -789,9 +788,22 @@ static int a2150_ai_rinsn(comedi_device *dev, comedi_subdevice *s, comedi_insn *
        // start aquisition for soft trigger
        outw(0, dev->iobase + FIFO_START_REG);
 
-       /* there is a 35.6 sample delay for data to get through the antialias filter
-        * so we might as well wait a while */
-       udelay(500);
+       /* there is a 35.6 sample delay for data to get through the antialias filter */
+       for(n = 0; n < filter_delay; n++)
+       {
+               for(i = 0; i < timeout; i++)
+               {
+                       if(inw(dev->iobase + STATUS_REG) & FNE_BIT)
+                               break;
+                       udelay(1);
+               }
+               if(i == timeout)
+               {
+                       comedi_error(dev, "timeout");
+                       return -ETIME;
+               }
+               inw(dev->iobase + FIFO_DATA_REG);
+       }
 
        // read data
        for(n = 0; n < insn->n; n++)
@@ -800,6 +812,7 @@ static int a2150_ai_rinsn(comedi_device *dev, comedi_subdevice *s, comedi_insn *
                {
                        if(inw(dev->iobase + STATUS_REG) & FNE_BIT)
                                break;
+                       udelay(1);
                }
                if(i == timeout)
                {
index 1200f4b23828185514fadb9d3d83f7d2be540129..8ae35a2ccfb4825928665b790a4bbeb838020d12 100644 (file)
@@ -1542,9 +1542,6 @@ static int labpc_ai_rinsn(comedi_device *dev, comedi_subdevice *s, comedi_insn *
        thisboard->read_byte(dev->iobase + ADC_FIFO_REG);
        thisboard->read_byte(dev->iobase + ADC_FIFO_REG);
 
-       // give it a little settling time
-       udelay(5);
-
        for(n = 0; n < insn->n; n++)
        {
                /* trigger conversion */
index 12646502df8f4583a7ffe84f212f8150c665450c..1b444b94d0503edc51ef106c6b50cacfaeffeec6 100644 (file)
@@ -249,12 +249,6 @@ static int pcl711_ai_insn(comedi_device *dev,comedi_subdevice *s,
 
        pcl711_set_changain(dev,insn->chanspec);
 
-       /*
-          a sensible precaution to wait for the mux to
-          settle here.  is 10us enough?
-       */
-       udelay(10);
-
        for(n=0;n<insn->n;n++){
                /*
                 *  Write the correct mode (software polling) and start polling by writing
@@ -272,6 +266,7 @@ static int pcl711_ai_insn(comedi_device *dev,comedi_subdevice *s,
                        hi = inb(dev->iobase + PCL711_AD_HI);
                        if (!(hi & PCL711_DRDY))
                                goto ok;
+                       udelay(1);
                }
                rt_printk("comedi%d: pcl711: A/D timeout\n", dev->minor);
                return -ETIME;
index 31670d2903b0b5791c70d5eaf4a31cc59f7a7c06..1f536cd271e7621f130186e50e7b26478747bbe7 100644 (file)
@@ -230,22 +230,21 @@ static int pcl816_ai_insn_read(comedi_device *dev, comedi_subdevice *s,
        int timeout;
 
        DPRINTK("mode 0 analog input\n");
+       // software trigger, DMA and INT off 
+       outb (0, dev->iobase + PCL816_CONTROL); 
+       // clear INT (conversion end) flag 
+       outb (0, dev->iobase + PCL816_CLRINT);  
+       
+       // Set the input channel
+       outb (CR_CHAN(insn->chanspec) & 0xf, dev->iobase + PCL816_MUX); 
+       outb (CR_RANGE(insn->chanspec), dev->iobase + PCL816_RANGE);    /* select gain */
 
        for(n=0;n<insn->n;n++){
 
-               // software trigger, DMA and INT off 
-               outb (0, dev->iobase + PCL816_CONTROL); 
-               // clear INT (conversion end) flag 
-               outb (0, dev->iobase + PCL816_CLRINT);  
-               
-               // Set the input channel
-               outb (CR_CHAN(insn->chanspec) & 0xf, dev->iobase + PCL816_MUX); 
-           outb (CR_RANGE(insn->chanspec), dev->iobase + PCL816_RANGE);        /* select gain */
 
-               udelay (5);
                outb (0, dev->iobase + PCL816_AD_LO);   /* start conversion */
 
-               timeout=100;
+               timeout=100;
                while (timeout--) {
                if (!(inb (dev->iobase + PCL816_STATUS) & PCL816_STATUS_DRDY_MASK)) {
                        // return read value            
index cd34e2f0043a246aab454804b0d21171c9936887..64376deb637f62115f5143f71b7cc8eb165c0232 100644 (file)
@@ -368,22 +368,22 @@ static int pcl818_ai_insn_read(comedi_device *dev, comedi_subdevice *s,
        int n;
         int timeout; 
 
+       /* software trigger, DMA and INT off */
+               outb(0, dev->iobase+PCL818_CONTROL);
+
+       /* select channel */
+               outb(muxonechan[CR_CHAN(insn->chanspec)],
+               dev->iobase+PCL818_MUX);
+
+       /* select gain */
+               outb(CR_RANGE(insn->chanspec),
+               dev->iobase+PCL818_RANGE);
+
        for(n=0;n<insn->n;n++){
-               /* software trigger, DMA and INT off */
-               outb(0, dev->iobase+PCL818_CONTROL);
 
                /* clear INT (conversion end) flag */
                outb(0, dev->iobase+PCL818_CLRINT);
 
-               /* select channel */
-               outb(muxonechan[CR_CHAN(insn->chanspec)],
-                       dev->iobase+PCL818_MUX);
-
-               /* select gain */
-               outb(CR_RANGE(insn->chanspec),
-                       dev->iobase+PCL818_RANGE);
-
-               udelay(5);
                /* start conversion */
                outb(0, dev->iobase+PCL818_AD_LO);
 
@@ -391,6 +391,7 @@ static int pcl818_ai_insn_read(comedi_device *dev, comedi_subdevice *s,
                while (timeout--) {
                        if (inb(dev->iobase + PCL818_STATUS) & 0x10)
                                goto conv_finish;
+                       udelay(1);
                }
                comedi_error(dev,"A/D insn timeout");
                /* clear INT (conversion end) flag */