1e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* 2e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef comedi/drivers/das16.c 3e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DAS16 driver 4e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 5e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef COMEDI - Linux Control and Measurement Device Interface 6e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef Copyright (C) 2000 David A. Schleef <ds@schleef.org> 7e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef Copyright (C) 2000 Chris R. Baugher <baugher@enteract.com> 8e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef Copyright (C) 2001,2002 Frank Mori Hess <fmhess@users.sourceforge.net> 9e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 10e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef This program is free software; you can redistribute it and/or modify 11e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef it under the terms of the GNU General Public License as published by 12e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef the Free Software Foundation; either version 2 of the License, or 13e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef (at your option) any later version. 14e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 15e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef This program is distributed in the hope that it will be useful, 16e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef but WITHOUT ANY WARRANTY; without even the implied warranty of 17e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef GNU General Public License for more details. 19e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 20e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef You should have received a copy of the GNU General Public License 21e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef along with this program; if not, write to the Free Software 22e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 24e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef************************************************************************ 25e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/ 26e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* 27e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefDriver: das16 28e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefDescription: DAS16 compatible boards 29e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefAuthor: Sam Moore, Warren Jasper, ds, Chris Baugher, Frank Hess, Roman Fietze 30e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefDevices: [Keithley Metrabyte] DAS-16 (das-16), DAS-16G (das-16g), 31e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DAS-16F (das-16f), DAS-1201 (das-1201), DAS-1202 (das-1202), 32e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DAS-1401 (das-1401), DAS-1402 (das-1402), DAS-1601 (das-1601), 33e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DAS-1602 (das-1602), 34e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef [ComputerBoards] PC104-DAS16/JR (pc104-das16jr), 35e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef PC104-DAS16JR/16 (pc104-das16jr/16), 36e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef CIO-DAS16JR/16 (cio-das16jr/16), 37e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef CIO-DAS16/JR (cio-das16/jr), CIO-DAS1401/12 (cio-das1401/12), 38e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef CIO-DAS1402/12 (cio-das1402/12), CIO-DAS1402/16 (cio-das1402/16), 39e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef CIO-DAS1601/12 (cio-das1601/12), CIO-DAS1602/12 (cio-das1602/12), 40e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef CIO-DAS1602/16 (cio-das1602/16), CIO-DAS16/330 (cio-das16/330) 41e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefStatus: works 42e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefUpdated: 2003-10-12 43e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 44e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefA rewrite of the das16 and das1600 drivers. 45e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefOptions: 46e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef [0] - base io address 47e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef [1] - irq (does nothing, irq is not used anymore) 48e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef [2] - dma (optional, required for comedi_command support) 49e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef [3] - master clock speed in MHz (optional, 1 or 10, ignored if 50e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef board can probe clock, defaults to 1) 51e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef [4] - analog input range lowest voltage in microvolts (optional, 52e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef only useful if your board does not have software 53e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef programmable gain) 54e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef [5] - analog input range highest voltage in microvolts (optional, 55e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef only useful if board does not have software programmable 56e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef gain) 57e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef [6] - analog output range lowest voltage in microvolts (optional) 58e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef [7] - analog output range highest voltage in microvolts (optional) 59e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef [8] - use timer mode for DMA. Timer mode is needed e.g. for 60e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef buggy DMA controllers in NS CS5530A (Geode Companion), and for 61e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 'jr' cards that lack a hardware fifo. This option is no 62e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef longer needed, since timer mode is _always_ used. 63e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 64e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefPassing a zero for an option is the same as leaving it unspecified. 65e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 66e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/ 67e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* 68e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 69e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefTesting and debugging help provided by Daniel Koch. 70e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 71e64374f8f37c5325dd3e4dad619d49a289226d7dDavid SchleefKeithley Manuals: 72e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 2309.PDF (das16) 73e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 4919.PDF (das1400, 1600) 74e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 4922.PDF (das-1400) 75e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 4923.PDF (das1200, 1400, 1600) 76e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 773c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo SilvaComputer boards manuals also available from their website 783c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silvawww.measurementcomputing.com 79e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 80e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/ 81e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 82e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include <linux/pci.h> 835a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 8425436dc9d84f1be60ff549c9ab712bba2835f284Greg Kroah-Hartman#include <linux/interrupt.h> 85e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include <asm/dma.h> 86e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include "../comedidev.h" 87e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 88e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include "8253.h" 89e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include "8255.h" 90e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#include "comedi_fc.h" 91e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 92e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#undef DEBUG 932696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton/* #define DEBUG */ 94e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 95e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#ifdef DEBUG 963c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva#define DEBUG_PRINT(format, args...) \ 973c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_DEBUG "das16: " format, ## args) 98e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#else 99e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DEBUG_PRINT(format, args...) 100e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#endif 101e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1022696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton#define DAS16_SIZE 20 /* number of ioports */ 1032696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton#define DAS16_DMA_SIZE 0xff00 /* size in bytes of allocated dma buffer */ 104e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 105e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* 106e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cio-das16.pdf 107e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 108e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef "das16" 109e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef "das16/f" 110e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 111e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 0 a/d bits 0-3 start 12 bit 112e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1 a/d bits 4-11 unused 113e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 2 mux read mux set 114e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 3 di 4 bit do 4 bit 115e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 4 unused ao0_lsb 116e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 5 unused ao0_msb 117e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 6 unused ao1_lsb 118e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 7 unused ao1_msb 119e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 8 status eoc uni/bip interrupt reset 120e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 9 dma, int, trig ctrl set dma, int 121e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef a pacer control unused 122e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef b reserved reserved 123e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cdef 8254 124e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 0123 8255 125e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 126e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/ 127e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 128e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* 129e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cio-das16jr.pdf 130e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 131e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef "das16jr" 132e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 133e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 0 a/d bits 0-3 start 12 bit 134e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1 a/d bits 4-11 unused 135e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 2 mux read mux set 136e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 3 di 4 bit do 4 bit 137e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 4567 unused unused 138e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 8 status eoc uni/bip interrupt reset 139e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 9 dma, int, trig ctrl set dma, int 140e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef a pacer control unused 141e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef b gain status gain control 142e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cdef 8254 143e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 144e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/ 145e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 146e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* 147e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cio-das16jr_16.pdf 148e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 149e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef "das16jr_16" 150e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 151e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 0 a/d bits 0-7 start 16 bit 152e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1 a/d bits 8-15 unused 153e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 2 mux read mux set 154e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 3 di 4 bit do 4 bit 155e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 4567 unused unused 156e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 8 status eoc uni/bip interrupt reset 157e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 9 dma, int, trig ctrl set dma, int 158e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef a pacer control unused 159e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef b gain status gain control 160e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cdef 8254 161e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 162e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/ 163e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* 164e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cio-das160x-1x.pdf 165e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 166e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef "das1601/12" 167e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef "das1602/12" 168e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef "das1602/16" 169e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 170e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 0 a/d bits 0-3 start 12 bit 171e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1 a/d bits 4-11 unused 172e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 2 mux read mux set 173e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 3 di 4 bit do 4 bit 174e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 4 unused ao0_lsb 175e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 5 unused ao0_msb 176e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 6 unused ao1_lsb 177e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 7 unused ao1_msb 178e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 8 status eoc uni/bip interrupt reset 179e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 9 dma, int, trig ctrl set dma, int 180e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef a pacer control unused 181e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef b gain status gain control 182e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cdef 8254 183e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 400 8255 184e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 404 unused conversion enable 185e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 405 unused burst enable 186e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 406 unused das1600 enable 187e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 407 status 188e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 189e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/ 190e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1913c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva/* size in bytes of a sample from board */ 1923c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silvastatic const int sample_size = 2; 193e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 194e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_TRIG 0 195e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_AI_LSB 0 196e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_AI_MSB 1 197e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_MUX 2 198e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_DIO 3 1993c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva#define DAS16_AO_LSB(x) ((x) ? 6 : 4) 2003c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva#define DAS16_AO_MSB(x) ((x) ? 7 : 5) 201e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_STATUS 8 202e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define BUSY (1<<7) 203e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define UNIPOLAR (1<<6) 204e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_MUXBIT (1<<5) 205e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_INT (1<<4) 206e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CONTROL 9 207e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_INTE (1<<7) 208e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_IRQ(x) (((x) & 0x7) << 4) 209e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DMA_ENABLE (1<<2) 210e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define PACING_MASK 0x3 211e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define INT_PACER 0x03 212e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define EXT_PACER 0x02 213e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_SOFT 0x00 214e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_PACER 0x0A 215e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CTR0 (1<<1) 216e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_TRIG0 (1<<0) 217e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define BURST_LEN_BITS(x) (((x) & 0xf) << 4) 218e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_GAIN 0x0B 219e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR0_DATA 0x0C 220e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR1_DATA 0x0D 221e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR2_DATA 0x0E 222e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR_CONTROL 0x0F 223e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_TERM_CNT 0x00 224e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_ONE_SHOT 0x02 225e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_RATE_GEN 0x04 226e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR_LSB_MSB 0x30 227e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR0 0x00 228e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR1 0x40 229e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_CNTR2 0x80 230e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 231e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_CONV 0x404 232e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_CONV_DISABLE 0x40 233e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_BURST 0x405 234e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_BURST_VAL 0x40 235e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_ENABLE 0x406 236e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_ENABLE_VAL 0x40 237e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_STATUS_B 0x407 238e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_BME 0x40 239e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_ME 0x20 240e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_CD 0x10 241e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_WS 0x02 242e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS1600_CLK_10MHZ 0x01 243e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 2449ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das1x01_bip = { 4, { 2450a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(10), 2460a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(1), 2470a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(0.1), 2480a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(0.01), 2490a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral } 250e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 2510a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral 2529ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das1x01_unip = { 4, { 2530a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(10), 2540a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(1), 2550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(0.1), 2560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(0.01), 2570a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral } 258e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 2590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral 2609ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das1x02_bip = { 4, { 2610a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(10), 2620a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(5), 2630a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(2.5), 2640a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(1.25), 2650a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral } 266e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 2670a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral 2689ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das1x02_unip = { 4, { 2690a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(10), 2700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(5), 2710a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(2.5), 2720a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(1.25), 2730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral } 274e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 2750a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral 2769ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das16jr = { 9, { 2773c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva /* also used by 16/330 */ 2780a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(10), 2790a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(5), 2800a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(2.5), 2810a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(1.25), 2820a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(0.625), 2830a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(10), 2840a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(5), 2850a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(2.5), 2860a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(1.25), 2870a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral } 288e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 2890a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral 2909ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange range_das16jr_16 = { 8, { 2910a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(10), 2920a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(5), 2930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(2.5), 2940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral BIP_RANGE(1.25), 2950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(10), 2960a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(5), 2970a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(2.5), 2980a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral UNI_RANGE(1.25), 2990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral } 300e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 301e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 302e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic const int das16jr_gainlist[] = { 8, 0, 1, 2, 3, 4, 5, 6, 7 }; 303e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic const int das16jr_16_gainlist[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; 304e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic const int das1600_gainlist[] = { 0, 1, 2, 3 }; 3050a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral 306e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefenum { 307e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das16_pg_none = 0, 308e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das16_pg_16jr, 309e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das16_pg_16jr_16, 310e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das16_pg_1601, 311e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das16_pg_1602, 312e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 313e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic const int *const das16_gainlists[] = { 314e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef NULL, 315e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das16jr_gainlist, 316e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das16jr_16_gainlist, 317e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das1600_gainlist, 318e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das1600_gainlist, 319e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 3200a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral 3219ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange *const das16_ai_uni_lranges[] = { 322e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef &range_unknown, 323e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef &range_das16jr, 324e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef &range_das16jr_16, 325e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef &range_das1x01_unip, 326e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef &range_das1x02_unip, 327e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 3280a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral 3299ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pembertonstatic const struct comedi_lrange *const das16_ai_bip_lranges[] = { 330e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef &range_unknown, 331e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef &range_das16jr, 332e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef &range_das16jr_16, 333e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef &range_das1x01_bip, 334e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef &range_das1x02_bip, 335e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 336e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 337e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstruct munge_info { 338e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef uint8_t byte; 339e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned have_byte:1; 340e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 341e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 342814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s, 3430a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_insn *insn, unsigned int *data); 344814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_do_wbits(struct comedi_device *dev, struct comedi_subdevice *s, 3450a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_insn *insn, unsigned int *data); 346814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_di_rbits(struct comedi_device *dev, struct comedi_subdevice *s, 3470a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_insn *insn, unsigned int *data); 348814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s, 3490a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_insn *insn, unsigned int *data); 350814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pemberton 351814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_cmd_test(struct comedi_device *dev, struct comedi_subdevice *s, 3520a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_cmd *cmd); 3530a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukralstatic int das16_cmd_exec(struct comedi_device *dev, 3540a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_subdevice *s); 355814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das16_cancel(struct comedi_device *dev, struct comedi_subdevice *s); 3560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukralstatic void das16_ai_munge(struct comedi_device *dev, 3570a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_subdevice *s, void *array, 3580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral unsigned int num_bytes, 3590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral unsigned int start_chan_index); 360e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 361814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic void das16_reset(struct comedi_device *dev); 36270265d24e3404fe798b6edd55a02016b1edb49d7Jiri Slabystatic irqreturn_t das16_dma_interrupt(int irq, void *d); 363e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic void das16_timer_interrupt(unsigned long arg); 364814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic void das16_interrupt(struct comedi_device *dev); 365e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 366814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic unsigned int das16_set_pacer(struct comedi_device *dev, unsigned int ns, 3670a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral int flags); 368814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic int das1600_mode_detect(struct comedi_device *dev); 369814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic unsigned int das16_suggest_transfer_size(struct comedi_device *dev, 3700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_cmd cmd); 371e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 372814900c904140cfe7f3e48cabec06b3eec57e0eaBill Pembertonstatic void reg_dump(struct comedi_device *dev); 373e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 374947a33fd2196209a1aa8f00de4068e8a09a19cd9Bill Pembertonstruct das16_board { 375e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef const char *name; 376e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef void *ai; 377e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int ai_nbits; 3782696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton unsigned int ai_speed; /* max conversion speed in nanosec */ 379e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int ai_pg; 380e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef void *ao; 381e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int ao_nbits; 382e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef void *di; 383e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef void *do_; 384e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 385e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int i8255_offset; 386e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int i8254_offset; 387e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 388e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int size; 389e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int id; 390947a33fd2196209a1aa8f00de4068e8a09a19cd9Bill Pemberton}; 391e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 392947a33fd2196209a1aa8f00de4068e8a09a19cd9Bill Pembertonstatic const struct das16_board das16_boards[] = { 393e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 3940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "das-16", 3950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 3960a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 3970a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 15000, 3980a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_none, 3990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = das16_ao_winsn, 4000a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao_nbits = 12, 4010a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 4020a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 4030a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x10, 4040a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 4050a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x14, 4060a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0x00, 4070a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 408e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 4090a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "das-16g", 4100a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 4110a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 4120a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 15000, 4130a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_none, 4140a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = das16_ao_winsn, 4150a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao_nbits = 12, 4160a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 4170a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 4180a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x10, 4190a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 4200a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x14, 4210a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0x00, 4220a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 423e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 4240a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "das-16f", 4250a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 4260a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 4270a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 8500, 4280a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_none, 4290a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = das16_ao_winsn, 4300a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao_nbits = 12, 4310a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 4320a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 4330a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x10, 4340a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 4350a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x14, 4360a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0x00, 4370a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 438e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 4390a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "cio-das16", /* cio-das16.pdf */ 4400a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 4410a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 4420a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 20000, 4430a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_none, 4440a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = das16_ao_winsn, 4450a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao_nbits = 12, 4460a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 4470a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 4480a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x10, 4490a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 4500a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x14, 4510a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0x80, 4520a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 453e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 4540a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "cio-das16/f", /* das16.pdf */ 4550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 4560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 4570a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 10000, 4580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_none, 4590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = das16_ao_winsn, 4600a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao_nbits = 12, 4610a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 4620a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 4630a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x10, 4640a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 4650a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x14, 4660a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0x80, 4670a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 468e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 4690a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "cio-das16/jr", /* cio-das16jr.pdf */ 4700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 4710a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 4720a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 7692, 4730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_16jr, 4740a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 4750a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 4760a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 4770a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0, 4780a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 4790a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x10, 4800a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0x00, 4810a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 482e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 4830a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "pc104-das16jr", /* pc104-das16jr_xx.pdf */ 4840a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 4850a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 4860a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 3300, 4870a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_16jr, 4880a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 4890a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 4900a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 4910a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0, 4920a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 4930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x10, 4940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0x00, 4950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 496e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 4970a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "cio-das16jr/16", /* cio-das16jr_16.pdf */ 4980a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 4990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 16, 5000a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 10000, 5010a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_16jr_16, 5020a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 5030a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 5040a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 5050a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0, 5060a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 5070a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x10, 5080a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0x00, 5090a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 510e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 5110a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "pc104-das16jr/16", /* pc104-das16jr_xx.pdf */ 5120a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 5130a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 16, 5140a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 10000, 5150a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_16jr_16, 5160a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 5170a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 5180a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 5190a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0, 5200a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 5210a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x10, 5220a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0x00, 5230a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 524e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 5250a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "das-1201", /* 4924.pdf (keithley user's manual) */ 5260a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 5270a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 5280a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 20000, 5290a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_none, 5300a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 5310a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 5320a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 5330a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x400, 5340a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 5350a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 5360a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0x20, 5370a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 538e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 5390a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "das-1202", /* 4924.pdf (keithley user's manual) */ 5400a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 5410a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 5420a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 10000, 5430a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_none, 5440a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 5450a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 5460a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 5470a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x400, 5480a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 5490a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 5500a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0x20, 5510a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 552e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 5533c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva /* 4919.pdf and 4922.pdf (keithley user's manual) */ 5543c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva .name = "das-1401", 5550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 5560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 5570a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 10000, 5580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_1601, 5590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 5600a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 5610a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 5620a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x0, 5630a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 5640a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 5653c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva .id = 0xc0 /* 4919.pdf says id bits are 0xe0, 4922.pdf says 0xc0 */ 5660a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 567e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 5683c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva /* 4919.pdf and 4922.pdf (keithley user's manual) */ 5693c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva .name = "das-1402", 5700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 5710a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 5720a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 10000, 5730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_1602, 5740a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 5750a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 5760a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 5770a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x0, 5780a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 5790a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 5803c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva .id = 0xc0 /* 4919.pdf says id bits are 0xe0, 4922.pdf says 0xc0 */ 5810a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 582e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 5830a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "das-1601", /* 4919.pdf */ 5840a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 5850a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 5860a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 10000, 5870a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_1601, 5880a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = das16_ao_winsn, 5890a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao_nbits = 12, 5900a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 5910a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 5920a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x400, 5930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 5940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 5950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0xc0}, 596e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 5970a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "das-1602", /* 4919.pdf */ 5980a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 5990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 6000a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 10000, 6010a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_1602, 6020a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = das16_ao_winsn, 6030a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao_nbits = 12, 6040a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 6050a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 6060a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x400, 6070a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 6080a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 6090a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0xc0}, 610e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 6110a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "cio-das1401/12", /* cio-das1400_series.pdf */ 6120a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 6130a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 6140a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 6250, 6150a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_1601, 6160a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 6170a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 6180a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 6190a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0, 6200a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 6210a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 6220a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0xc0}, 623e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 6240a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "cio-das1402/12", /* cio-das1400_series.pdf */ 6250a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 6260a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 6270a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 6250, 6280a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_1602, 6290a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 6300a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 6310a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 6320a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0, 6330a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 6340a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 6350a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0xc0}, 636e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 6370a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "cio-das1402/16", /* cio-das1400_series.pdf */ 6380a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 6390a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 16, 6400a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 10000, 6410a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_1602, 6420a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 6430a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 6440a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 6450a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0, 6460a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 6470a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 6480a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0xc0}, 649e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 6500a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "cio-das1601/12", /* cio-das160x-1x.pdf */ 6510a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 6520a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 6530a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 6250, 6540a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_1601, 6550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = das16_ao_winsn, 6560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao_nbits = 12, 6570a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 6580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 6590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x400, 6600a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 6610a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 6620a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0xc0}, 663e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 6640a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "cio-das1602/12", /* cio-das160x-1x.pdf */ 6650a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 6660a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 6670a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 10000, 6680a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_1602, 6690a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = das16_ao_winsn, 6700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao_nbits = 12, 6710a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 6720a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 6730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x400, 6740a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 6750a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 6760a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0xc0}, 677e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 6780a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "cio-das1602/16", /* cio-das160x-1x.pdf */ 6790a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 6800a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 16, 6810a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 10000, 6820a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_1602, 6830a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = das16_ao_winsn, 6840a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao_nbits = 12, 6850a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 6860a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 6870a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0x400, 6880a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 6890a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x408, 6900a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0xc0}, 691e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 6920a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "cio-das16/330", /* ? */ 6930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai = das16_ai_rinsn, 6940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_nbits = 12, 6950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_speed = 3030, 6960a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ai_pg = das16_pg_16jr, 6970a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .ao = NULL, 6980a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .di = das16_di_rbits, 6990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .do_ = das16_do_wbits, 7000a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8255_offset = 0, 7010a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .i8254_offset = 0x0c, 7020a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .size = 0x14, 7030a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .id = 0xf0}, 704e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#if 0 705e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 7060a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "das16/330i", /* ? */ 7070a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 708e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 7090a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral .name = "das16/jr/ctr5", /* ? */ 7100a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 711e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef { 7123c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva /* cio-das16_m1_16.pdf, this board is a bit quirky, no dma */ 7133c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva .name = "cio-das16/m1/16", 7140a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral }, 715e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#endif 716e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 717e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 718da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it); 719da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_detach(struct comedi_device *dev); 720139dfbdfacb02e3ef3df936d2fabd1ad5f14ea88Bill Pembertonstatic struct comedi_driver driver_das16 = { 72168c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton .driver_name = "das16", 72268c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton .module = THIS_MODULE, 72368c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton .attach = das16_attach, 72468c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton .detach = das16_detach, 72568c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton .board_name = &das16_boards[0].name, 7268629efa4cbf6f89a54a85af4b8bc31762af01800Bill Pemberton .num_names = ARRAY_SIZE(das16_boards), 72768c3dbff9fc9f25872408d0e95980d41733d48d0Bill Pemberton .offset = sizeof(das16_boards[0]), 728e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 729e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 730e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define DAS16_TIMEOUT 1000 731e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 732e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* Period for timer interrupt in jiffies. It's a function 733e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * to deal with possibility of dynamic HZ patches */ 734e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic inline int timer_period(void) 735e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 736e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return HZ / 20; 737e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 7380a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral 739e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstruct das16_private_struct { 7402696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton unsigned int ai_unipolar; /* unipolar flag */ 7412696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton unsigned int ai_singleended; /* single ended flag */ 7422696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton unsigned int clockbase; /* master clock speed in ns */ 7432696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton volatile unsigned int control_state; /* dma, interrupt and trigger control bits */ 7442696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton volatile unsigned long adc_byte_count; /* number of bytes remaining */ 7453c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva /* divisor dividing master clock to get conversion frequency */ 7463c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva unsigned int divisor1; 7473c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva /* divisor dividing master clock to get conversion frequency */ 7483c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva unsigned int divisor2; 7492696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton unsigned int dma_chan; /* dma channel */ 750e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef uint16_t *dma_buffer[2]; 751e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef dma_addr_t dma_buffer_addr[2]; 752e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int current_buffer; 7532696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton volatile unsigned int dma_transfer_size; /* target number of bytes to transfer per dma shot */ 7543c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva /** 7553c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva * user-defined analog input and output ranges 7563c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva * defined from config options 7573c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva */ 7589ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pemberton struct comedi_lrange *user_ai_range_table; 7599ced1de69125b60f40127eddaa3be2a92bb0a1dfBill Pemberton struct comedi_lrange *user_ao_range_table; 760e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 7612696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton struct timer_list timer; /* for timed interrupt */ 762e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef volatile short timer_running; 7632696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton volatile short timer_mode; /* true if using timer mode */ 764e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef}; 765e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#define devpriv ((struct das16_private_struct *)(dev->private)) 766947a33fd2196209a1aa8f00de4068e8a09a19cd9Bill Pemberton#define thisboard ((struct das16_board *)(dev->board_ptr)) 767e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 768da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_cmd_test(struct comedi_device *dev, struct comedi_subdevice *s, 7690a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_cmd *cmd) 770e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 771e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int err = 0, tmp; 772e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int gain, start_chan, i; 773e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int mask; 774e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 775e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* make sure triggers are valid */ 776e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef tmp = cmd->start_src; 777e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->start_src &= TRIG_NOW; 778e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (!cmd->start_src || tmp != cmd->start_src) 779e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 780e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 781e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef tmp = cmd->scan_begin_src; 782e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef mask = TRIG_FOLLOW; 7832696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* if board supports burst mode */ 784e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->size > 0x400) 785e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef mask |= TRIG_TIMER | TRIG_EXT; 786e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->scan_begin_src &= mask; 787e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src) 788e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 789e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 790e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef tmp = cmd->convert_src; 791e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef mask = TRIG_TIMER | TRIG_EXT; 7922696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* if board supports burst mode */ 793e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->size > 0x400) 794e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef mask |= TRIG_NOW; 795e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->convert_src &= mask; 796e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (!cmd->convert_src || tmp != cmd->convert_src) 797e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 798e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 799e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef tmp = cmd->scan_end_src; 800e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->scan_end_src &= TRIG_COUNT; 801e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (!cmd->scan_end_src || tmp != cmd->scan_end_src) 802e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 803e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 804e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef tmp = cmd->stop_src; 805e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->stop_src &= TRIG_COUNT | TRIG_NONE; 806e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (!cmd->stop_src || tmp != cmd->stop_src) 807e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 808e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 809e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (err) 810e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 1; 811e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 8123c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva /** 8133c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva * step 2: make sure trigger sources are unique and 8143c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva * mutually compatible 8153c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva */ 816e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->scan_begin_src != TRIG_TIMER && 8170a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral cmd->scan_begin_src != TRIG_EXT && 8180a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral cmd->scan_begin_src != TRIG_FOLLOW) 819e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 820e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->convert_src != TRIG_TIMER && 8210a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral cmd->convert_src != TRIG_EXT && cmd->convert_src != TRIG_NOW) 822e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 823e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_COUNT) 824e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 825e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 8262696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* make sure scan_begin_src and convert_src dont conflict */ 827e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->scan_begin_src == TRIG_FOLLOW && cmd->convert_src == TRIG_NOW) 828e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 829e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->scan_begin_src != TRIG_FOLLOW && cmd->convert_src != TRIG_NOW) 830e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 831e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 832e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (err) 833e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 2; 834e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 835e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* step 3: make sure arguments are trivially compatible */ 836e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->start_arg != 0) { 837e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->start_arg = 0; 838e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 839e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 840e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 841e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->scan_begin_src == TRIG_FOLLOW) { 842e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* internal trigger */ 843e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->scan_begin_arg != 0) { 844e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->scan_begin_arg = 0; 845e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 846e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 847e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 848e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 849e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->scan_end_arg != cmd->chanlist_len) { 850e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->scan_end_arg = cmd->chanlist_len; 851e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 852e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 8532696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* check against maximum frequency */ 854e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->scan_begin_src == TRIG_TIMER) { 855e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->scan_begin_arg < 8560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral thisboard->ai_speed * cmd->chanlist_len) { 857e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->scan_begin_arg = 8580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral thisboard->ai_speed * cmd->chanlist_len; 859e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 860e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 861e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 862e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->convert_src == TRIG_TIMER) { 863e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->convert_arg < thisboard->ai_speed) { 864e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->convert_arg = thisboard->ai_speed; 865e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 866e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 867e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 868e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 869e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->stop_src == TRIG_NONE) { 870e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->stop_arg != 0) { 871e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->stop_arg = 0; 872e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 873e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 874e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 875e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (err) 876e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 3; 877e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 8782696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* step 4: fix up arguments */ 879e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->scan_begin_src == TRIG_TIMER) { 880e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int tmp = cmd->scan_begin_arg; 8812696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* set divisors, correct timing arguments */ 882e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef i8253_cascade_ns_to_timer_2div(devpriv->clockbase, 8830a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral &(devpriv->divisor1), 8840a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral &(devpriv->divisor2), 8850a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral &(cmd->scan_begin_arg), 8860a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral cmd->flags & TRIG_ROUND_MASK); 887e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err += (tmp != cmd->scan_begin_arg); 888e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 889e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->convert_src == TRIG_TIMER) { 890e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int tmp = cmd->convert_arg; 8912696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* set divisors, correct timing arguments */ 892e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef i8253_cascade_ns_to_timer_2div(devpriv->clockbase, 8930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral &(devpriv->divisor1), 8940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral &(devpriv->divisor2), 8950a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral &(cmd->convert_arg), 8960a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral cmd->flags & TRIG_ROUND_MASK); 897e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err += (tmp != cmd->convert_arg); 898e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 899e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (err) 900e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 4; 901e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 9022696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* check channel/gain list against card's limitations */ 903e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->chanlist) { 904e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef gain = CR_RANGE(cmd->chanlist[0]); 905e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef start_chan = CR_CHAN(cmd->chanlist[0]); 906e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef for (i = 1; i < cmd->chanlist_len; i++) { 907e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (CR_CHAN(cmd->chanlist[i]) != 9080a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral (start_chan + i) % s->n_chan) { 909e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef comedi_error(dev, 9103c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva "entries in chanlist must be " 9113c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva "consecutive channels, " 9123c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva "counting upwards\n"); 913e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 914e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 915e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (CR_RANGE(cmd->chanlist[i]) != gain) { 916e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef comedi_error(dev, 9173c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva "entries in chanlist must all " 9183c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva "have the same gain\n"); 919e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef err++; 920e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 921e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 922e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 923e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (err) 924e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 5; 925e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 926e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 0; 927e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 928e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 929da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_cmd_exec(struct comedi_device *dev, struct comedi_subdevice *s) 930e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 931d163679ceec20c50f9aee880fa76c0c1185244a8Bill Pemberton struct comedi_async *async = s->async; 932ea6d0d4cab4f4f2d6a88f3bce4707fe92696fd3fBill Pemberton struct comedi_cmd *cmd = &async->cmd; 933e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int byte; 934e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned long flags; 935e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int range; 936e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 937e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv->dma_chan == 0 || (dev->irq == 0 9380a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral && devpriv->timer_mode == 0)) { 939e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef comedi_error(dev, 9403c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva "irq (or use of 'timer mode') dma required to " 9413c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva "execute comedi_cmd"); 942e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -1; 943e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 944e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->flags & TRIG_RT) { 9453c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva comedi_error(dev, "isa dma transfers cannot be performed with " 9463c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva "TRIG_RT, aborting"); 947e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -1; 948e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 949e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 950e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->adc_byte_count = 9510a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral cmd->stop_arg * cmd->chanlist_len * sizeof(uint16_t); 952e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 9532696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* disable conversions for das1600 mode */ 9543c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva if (thisboard->size > 0x400) 955e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(DAS1600_CONV_DISABLE, dev->iobase + DAS1600_CONV); 9563c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva 9572696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* set scan limits */ 958e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef byte = CR_CHAN(cmd->chanlist[0]); 959e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef byte |= CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]) << 4; 960e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(byte, dev->iobase + DAS16_MUX); 961e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 962e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* set gain (this is also burst rate register but according to 9633c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva * computer boards manual, burst rate does nothing, even on 9643c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva * keithley cards) */ 965e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->ai_pg != das16_pg_none) { 966e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef range = CR_RANGE(cmd->chanlist[0]); 967e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb((das16_gainlists[thisboard->ai_pg])[range], 9680a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral dev->iobase + DAS16_GAIN); 969e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 970e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 971e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* set counter mode and counts */ 972e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd->convert_arg = 9730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral das16_set_pacer(dev, cmd->convert_arg, 9740a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral cmd->flags & TRIG_ROUND_MASK); 975e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("pacer period: %d ns\n", cmd->convert_arg); 976e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 977e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* enable counters */ 978e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef byte = 0; 979e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* Enable burst mode if appropriate. */ 980e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->size > 0x400) { 981e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->convert_src == TRIG_NOW) { 982e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(DAS1600_BURST_VAL, dev->iobase + DAS1600_BURST); 9832696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* set burst length */ 984e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef byte |= BURST_LEN_BITS(cmd->chanlist_len - 1); 985e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 986e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0, dev->iobase + DAS1600_BURST); 987e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 988e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 989e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(byte, dev->iobase + DAS16_PACER); 990e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 9912696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* set up dma transfer */ 992e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef flags = claim_dma_lock(); 993e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef disable_dma(devpriv->dma_chan); 994e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* clear flip-flop to make sure 2-byte registers for 995e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * count and address get set correctly */ 996e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef clear_dma_ff(devpriv->dma_chan); 997e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->current_buffer = 0; 998e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef set_dma_addr(devpriv->dma_chan, 9990a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral devpriv->dma_buffer_addr[devpriv->current_buffer]); 10002696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* set appropriate size of transfer */ 1001e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->dma_transfer_size = das16_suggest_transfer_size(dev, *cmd); 1002e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef set_dma_count(devpriv->dma_chan, devpriv->dma_transfer_size); 1003e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef enable_dma(devpriv->dma_chan); 1004e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef release_dma_lock(flags); 1005e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 10062696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* set up interrupt */ 1007e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv->timer_mode) { 1008e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->timer_running = 1; 1009e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->timer.expires = jiffies + timer_period(); 1010e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef add_timer(&devpriv->timer); 1011e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->control_state &= ~DAS16_INTE; 1012e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1013e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* clear interrupt bit */ 1014e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0x00, dev->iobase + DAS16_STATUS); 1015e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* enable interrupts */ 1016e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->control_state |= DAS16_INTE; 1017e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1018e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->control_state |= DMA_ENABLE; 1019e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->control_state &= ~PACING_MASK; 1020e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->convert_src == TRIG_EXT) 1021e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->control_state |= EXT_PACER; 1022e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef else 1023e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->control_state |= INT_PACER; 1024e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(devpriv->control_state, dev->iobase + DAS16_CONTROL); 1025e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1026e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* Enable conversions if using das1600 mode */ 10273c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva if (thisboard->size > 0x400) 1028e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0, dev->iobase + DAS1600_CONV); 10293c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva 1030e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1031e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 0; 1032e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1033e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1034da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_cancel(struct comedi_device *dev, struct comedi_subdevice *s) 1035e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1036e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned long flags; 1037e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 10385f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman spin_lock_irqsave(&dev->spinlock, flags); 1039e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* disable interrupts, dma and pacer clocked conversions */ 1040e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->control_state &= ~DAS16_INTE & ~PACING_MASK & ~DMA_ENABLE; 1041e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(devpriv->control_state, dev->iobase + DAS16_CONTROL); 1042e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv->dma_chan) 1043e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef disable_dma(devpriv->dma_chan); 1044e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 10452696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* disable SW timer */ 1046e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv->timer_mode && devpriv->timer_running) { 1047e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->timer_running = 0; 1048e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef del_timer(&devpriv->timer); 1049e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1050e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1051e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* disable burst mode */ 10523c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva if (thisboard->size > 0x400) 1053e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0, dev->iobase + DAS1600_BURST); 10543c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva 1055e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 10565f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman spin_unlock_irqrestore(&dev->spinlock, flags); 1057e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1058e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 0; 1059e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1060e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1061da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic void das16_reset(struct comedi_device *dev) 1062e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1063e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0, dev->iobase + DAS16_STATUS); 1064e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0, dev->iobase + DAS16_CONTROL); 1065e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0, dev->iobase + DAS16_PACER); 1066e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0, dev->iobase + DAS16_CNTR_CONTROL); 1067e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1068e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1069da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s, 10700a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_insn *insn, unsigned int *data) 1071e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1072e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int i, n; 1073e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int range; 1074e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int chan; 1075e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int msb, lsb; 1076e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 10772696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* disable interrupts and pacing */ 1078e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->control_state &= ~DAS16_INTE & ~DMA_ENABLE & ~PACING_MASK; 1079e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(devpriv->control_state, dev->iobase + DAS16_CONTROL); 1080e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1081e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* set multiplexer */ 1082e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef chan = CR_CHAN(insn->chanspec); 1083e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef chan |= CR_CHAN(insn->chanspec) << 4; 1084e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(chan, dev->iobase + DAS16_MUX); 1085e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1086e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* set gain */ 1087e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->ai_pg != das16_pg_none) { 1088e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef range = CR_RANGE(insn->chanspec); 1089e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb((das16_gainlists[thisboard->ai_pg])[range], 10900a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral dev->iobase + DAS16_GAIN); 1091e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1092e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1093e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef for (n = 0; n < insn->n; n++) { 1094e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* trigger conversion */ 1095e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb_p(0, dev->iobase + DAS16_TRIG); 1096e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1097e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef for (i = 0; i < DAS16_TIMEOUT; i++) { 1098e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (!(inb(dev->iobase + DAS16_STATUS) & BUSY)) 1099e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef break; 1100e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1101e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (i == DAS16_TIMEOUT) { 11025f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman printk("das16: timeout\n"); 1103e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -ETIME; 1104e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1105e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef msb = inb(dev->iobase + DAS16_AI_MSB); 1106e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef lsb = inb(dev->iobase + DAS16_AI_LSB); 11073c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva if (thisboard->ai_nbits == 12) 1108e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef data[n] = ((lsb >> 4) & 0xf) | (msb << 4); 11093c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva else 1110e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef data[n] = lsb | (msb << 8); 11113c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva 1112e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1113e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1114e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return n; 1115e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1116e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1117da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_di_rbits(struct comedi_device *dev, struct comedi_subdevice *s, 11180a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_insn *insn, unsigned int *data) 1119e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1120790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton unsigned int bits; 1121e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1122e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef bits = inb(dev->iobase + DAS16_DIO) & 0xf; 1123e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef data[1] = bits; 1124e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef data[0] = 0; 1125e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1126e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 2; 1127e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1128e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1129da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_do_wbits(struct comedi_device *dev, struct comedi_subdevice *s, 11300a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_insn *insn, unsigned int *data) 1131e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1132790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton unsigned int wbits; 1133e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 11342696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* only set bits that have been masked */ 1135e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef data[0] &= 0xf; 1136e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef wbits = s->state; 11372696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* zero bits that have been masked */ 1138e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef wbits &= ~data[0]; 11392696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* set masked bits */ 1140e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef wbits |= data[0] & data[1]; 1141e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->state = wbits; 1142e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef data[1] = wbits; 1143e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1144e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(s->state, dev->iobase + DAS16_DIO); 1145e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1146e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 2; 1147e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1148e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1149da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s, 11500a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_insn *insn, unsigned int *data) 1151e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1152e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int i; 1153e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int lsb, msb; 1154e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int chan; 1155e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1156e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef chan = CR_CHAN(insn->chanspec); 1157e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1158e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef for (i = 0; i < insn->n; i++) { 1159e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->ao_nbits == 12) { 1160e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef lsb = (data[i] << 4) & 0xff; 1161e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef msb = (data[i] >> 4) & 0xff; 1162e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1163e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef lsb = data[i] & 0xff; 1164e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef msb = (data[i] >> 8) & 0xff; 1165e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1166e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(lsb, dev->iobase + DAS16_AO_LSB(chan)); 1167e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(msb, dev->iobase + DAS16_AO_MSB(chan)); 1168e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1169e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1170e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return i; 1171e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1172e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 117370265d24e3404fe798b6edd55a02016b1edb49d7Jiri Slabystatic irqreturn_t das16_dma_interrupt(int irq, void *d) 1174e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1175e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int status; 117671b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton struct comedi_device *dev = d; 1177e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1178e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef status = inb(dev->iobase + DAS16_STATUS); 1179e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1180e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if ((status & DAS16_INT) == 0) { 1181e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("spurious interrupt\n"); 1182e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return IRQ_NONE; 1183e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1184e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1185e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* clear interrupt */ 1186e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0x00, dev->iobase + DAS16_STATUS); 1187e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das16_interrupt(dev); 1188e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return IRQ_HANDLED; 1189e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1190e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1191e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleefstatic void das16_timer_interrupt(unsigned long arg) 1192e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 11930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_device *dev = (struct comedi_device *)arg; 1194e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1195e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das16_interrupt(dev); 1196e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1197e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv->timer_running) 1198e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef mod_timer(&devpriv->timer, jiffies + timer_period()); 1199e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1200e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1201e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* the pc104-das16jr (at least) has problems if the dma 1202e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef transfer is interrupted in the middle of transferring 1203e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef a 16 bit sample, so this function takes care to get 1204e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef an even transfer count after disabling dma 1205e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef channel. 1206e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef*/ 1207da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int disable_dma_on_even(struct comedi_device *dev) 1208e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1209e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int residue; 1210e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int i; 1211e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef static const int disable_limit = 100; 1212e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef static const int enable_timeout = 100; 1213e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef disable_dma(devpriv->dma_chan); 1214e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef residue = get_dma_residue(devpriv->dma_chan); 1215e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef for (i = 0; i < disable_limit && (residue % 2); ++i) { 1216e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int j; 1217e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef enable_dma(devpriv->dma_chan); 1218e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef for (j = 0; j < enable_timeout; ++j) { 1219e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int new_residue; 12205f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman udelay(2); 1221e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef new_residue = get_dma_residue(devpriv->dma_chan); 1222e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (new_residue != residue) 1223e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef break; 1224e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1225e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef disable_dma(devpriv->dma_chan); 1226e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef residue = get_dma_residue(devpriv->dma_chan); 1227e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1228e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (i == disable_limit) { 12293c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva comedi_error(dev, "failed to get an even dma transfer, " 12303c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva "could be trouble."); 1231e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1232e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return residue; 1233e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1234e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1235da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic void das16_interrupt(struct comedi_device *dev) 1236e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1237e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned long dma_flags, spin_flags; 123834c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton struct comedi_subdevice *s = dev->read_subdev; 1239d163679ceec20c50f9aee880fa76c0c1185244a8Bill Pemberton struct comedi_async *async; 1240ea6d0d4cab4f4f2d6a88f3bce4707fe92696fd3fBill Pemberton struct comedi_cmd *cmd; 1241e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int num_bytes, residue; 1242e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int buffer_index; 1243e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1244e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (dev->attached == 0) { 1245e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef comedi_error(dev, "premature interrupt"); 1246e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return; 1247e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 12482696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* initialize async here to make sure it is not NULL */ 1249e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef async = s->async; 1250e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cmd = &async->cmd; 1251e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1252e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv->dma_chan == 0) { 1253e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef comedi_error(dev, "interrupt with no dma channel?"); 1254e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return; 1255e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1256e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 12575f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman spin_lock_irqsave(&dev->spinlock, spin_flags); 1258e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if ((devpriv->control_state & DMA_ENABLE) == 0) { 12595f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman spin_unlock_irqrestore(&dev->spinlock, spin_flags); 1260e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("interrupt while dma disabled?\n"); 1261e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return; 1262e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1263e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1264e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef dma_flags = claim_dma_lock(); 1265e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef clear_dma_ff(devpriv->dma_chan); 1266e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef residue = disable_dma_on_even(dev); 1267e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 12682696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* figure out how many points to read */ 1269e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (residue > devpriv->dma_transfer_size) { 1270e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef comedi_error(dev, "residue > transfer size!\n"); 1271e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA; 1272e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef num_bytes = 0; 1273e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else 1274e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef num_bytes = devpriv->dma_transfer_size - residue; 1275e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 12763c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva if (cmd->stop_src == TRIG_COUNT && 12773c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva num_bytes >= devpriv->adc_byte_count) { 1278e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef num_bytes = devpriv->adc_byte_count; 1279e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef async->events |= COMEDI_CB_EOA; 1280e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1281e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1282e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef buffer_index = devpriv->current_buffer; 1283e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->current_buffer = (devpriv->current_buffer + 1) % 2; 1284e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->adc_byte_count -= num_bytes; 1285e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 12862696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* figure out how many bytes for next transfer */ 1287e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd->stop_src == TRIG_COUNT && devpriv->timer_mode == 0 && 12880a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral devpriv->dma_transfer_size > devpriv->adc_byte_count) 1289e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->dma_transfer_size = devpriv->adc_byte_count; 1290e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 12912696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* re-enable dma */ 1292e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if ((async->events & COMEDI_CB_EOA) == 0) { 1293e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef set_dma_addr(devpriv->dma_chan, 12940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral devpriv->dma_buffer_addr[devpriv->current_buffer]); 1295e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef set_dma_count(devpriv->dma_chan, devpriv->dma_transfer_size); 1296e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef enable_dma(devpriv->dma_chan); 1297e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* reenable conversions for das1600 mode, (stupid hardware) */ 12983c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva if (thisboard->size > 0x400 && devpriv->timer_mode == 0) 1299e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0x00, dev->iobase + DAS1600_CONV); 13003c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva 1301e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1302e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef release_dma_lock(dma_flags); 1303e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 13045f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman spin_unlock_irqrestore(&dev->spinlock, spin_flags); 1305e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1306e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cfc_write_array_to_buffer(s, 13070a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral devpriv->dma_buffer[buffer_index], num_bytes); 1308e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1309e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef cfc_handle_events(dev, s); 1310e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1311e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1312da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic unsigned int das16_set_pacer(struct comedi_device *dev, unsigned int ns, 13130a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral int rounding_flags) 1314e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1315e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef i8253_cascade_ns_to_timer_2div(devpriv->clockbase, &(devpriv->divisor1), 13160a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral &(devpriv->divisor2), &ns, 13170a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral rounding_flags & TRIG_ROUND_MASK); 1318e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1319e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* Write the values of ctr1 and ctr2 into counters 1 and 2 */ 1320e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef i8254_load(dev->iobase + DAS16_CNTR0_DATA, 0, 1, devpriv->divisor1, 2); 1321e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef i8254_load(dev->iobase + DAS16_CNTR0_DATA, 0, 2, devpriv->divisor2, 2); 1322e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1323e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return ns; 1324e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1325e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1326da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic void reg_dump(struct comedi_device *dev) 1327e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1328e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("********DAS1600 REGISTER DUMP********\n"); 1329e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("DAS16_MUX: %x\n", inb(dev->iobase + DAS16_MUX)); 1330e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("DAS16_DIO: %x\n", inb(dev->iobase + DAS16_DIO)); 1331e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("DAS16_STATUS: %x\n", inb(dev->iobase + DAS16_STATUS)); 1332e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("DAS16_CONTROL: %x\n", inb(dev->iobase + DAS16_CONTROL)); 1333e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("DAS16_PACER: %x\n", inb(dev->iobase + DAS16_PACER)); 1334e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("DAS16_GAIN: %x\n", inb(dev->iobase + DAS16_GAIN)); 1335e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("DAS16_CNTR_CONTROL: %x\n", 13360a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral inb(dev->iobase + DAS16_CNTR_CONTROL)); 1337e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("DAS1600_CONV: %x\n", inb(dev->iobase + DAS1600_CONV)); 1338e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("DAS1600_BURST: %x\n", inb(dev->iobase + DAS1600_BURST)); 1339e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("DAS1600_ENABLE: %x\n", inb(dev->iobase + DAS1600_ENABLE)); 1340e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef DEBUG_PRINT("DAS1600_STATUS_B: %x\n", 13410a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral inb(dev->iobase + DAS1600_STATUS_B)); 1342e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1343e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1344da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_probe(struct comedi_device *dev, struct comedi_devconfig *it) 1345e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1346e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int status; 1347e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int diobits; 1348e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1349e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* status is available on all boards */ 1350e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1351e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef status = inb(dev->iobase + DAS16_STATUS); 1352e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 13533c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva if ((status & UNIPOLAR)) 1354e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->ai_unipolar = 1; 13553c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva else 1356e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->ai_unipolar = 0; 1357e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 13583c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva 13593c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva if ((status & DAS16_MUXBIT)) 1360e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->ai_singleended = 1; 13613c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva else 1362e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->ai_singleended = 0; 13633c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva 1364e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1365e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* diobits indicates boards */ 1366e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1367e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef diobits = inb(dev->iobase + DAS16_DIO) & 0xf0; 1368e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 13693c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_INFO " id bits are 0x%02x\n", diobits); 1370e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->id != diobits) { 13713c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_INFO " requested board's id bits are 0x%x (ignore)\n", 13720a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral thisboard->id); 1373e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1374e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1375e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 0; 1376e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1377e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1378da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das1600_mode_detect(struct comedi_device *dev) 1379e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1380e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int status = 0; 1381e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1382e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef status = inb(dev->iobase + DAS1600_STATUS_B); 1383e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1384e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (status & DAS1600_CLK_10MHZ) { 1385e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->clockbase = 100; 13863c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_INFO " 10MHz pacer clock\n"); 1387e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1388e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->clockbase = 1000; 13893c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_INFO " 1MHz pacer clock\n"); 1390e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1391e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1392e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef reg_dump(dev); 1393e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1394e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 0; 1395e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1396e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1397e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef/* 1398e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * 1399e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * Options list: 1400e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * 0 I/O base 1401e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * 1 IRQ 1402e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * 2 DMA 1403e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * 3 Clock speed (in MHz) 1404e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef */ 1405e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1406da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it) 1407e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 140834c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton struct comedi_subdevice *s; 1409e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int ret; 1410e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int irq; 1411e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned long iobase; 1412e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int dma_chan; 1413e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int timer_mode; 1414e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned long flags; 14151f6325d629ce03501e8927480495685828561f26Bill Pemberton struct comedi_krange *user_ai_range, *user_ao_range; 1416e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1417e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef iobase = it->options[0]; 1418e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#if 0 1419e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef irq = it->options[1]; 1420e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef timer_mode = it->options[8]; 1421e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef#endif 1422e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* always use time_mode since using irq can drop samples while 1423e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * waiting for dma done interrupt (due to hardware limitations) */ 1424e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef irq = 0; 1425e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef timer_mode = 1; 1426e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (timer_mode) 1427e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef irq = 0; 1428e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 14293c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_INFO "comedi%d: das16:", dev->minor); 1430e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 14312696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* check that clock setting is valid */ 1432e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (it->options[3]) { 1433e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (it->options[3] != 0 && 14340a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral it->options[3] != 1 && it->options[3] != 10) { 14350a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral printk 14363c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva ("\n Invalid option. Master clock must be set " 14373c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva "to 1 or 10 (MHz)\n"); 1438e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -EINVAL; 1439e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1440e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1441e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1442c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton ret = alloc_private(dev, sizeof(struct das16_private_struct)); 1443c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton if (ret < 0) 1444e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return ret; 1445e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1446e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->size < 0x400) { 1447e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef printk(" 0x%04lx-0x%04lx\n", iobase, iobase + thisboard->size); 1448e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (!request_region(iobase, thisboard->size, "das16")) { 14493c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_ERR " I/O port conflict\n"); 1450e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -EIO; 1451e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1452e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 14533c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_INFO " 0x%04lx-0x%04lx 0x%04lx-0x%04lx\n", 14540a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral iobase, iobase + 0x0f, 14550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral iobase + 0x400, 14560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral iobase + 0x400 + (thisboard->size & 0x3ff)); 1457e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (!request_region(iobase, 0x10, "das16")) { 14583c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_ERR " I/O port conflict: 0x%04lx-0x%04lx\n", 14590a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral iobase, iobase + 0x0f); 1460e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -EIO; 1461e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1462e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (!request_region(iobase + 0x400, thisboard->size & 0x3ff, 14630a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral "das16")) { 1464e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef release_region(iobase, 0x10); 14653c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_ERR " I/O port conflict: 0x%04lx-0x%04lx\n", 14660a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral iobase + 0x400, 14670a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral iobase + 0x400 + (thisboard->size & 0x3ff)); 1468e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -EIO; 1469e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1470e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1471e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1472e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef dev->iobase = iobase; 1473e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 14742696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* probe id bits to make sure they are consistent */ 1475e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (das16_probe(dev, it)) { 14763c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_ERR " id bits do not match selected board, aborting\n"); 1477e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -EINVAL; 1478e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1479e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef dev->board_name = thisboard->name; 1480e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 14812696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* get master clock speed */ 1482e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->size < 0x400) { 1483e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (it->options[3]) 1484e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->clockbase = 1000 / it->options[3]; 1485e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef else 14862696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton devpriv->clockbase = 1000; /* 1 MHz default */ 1487e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1488e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das1600_mode_detect(dev); 1489e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1490e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1491e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* now for the irq */ 1492e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (irq > 1 && irq < 8) { 14935f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman ret = request_irq(irq, das16_dma_interrupt, 0, "das16", dev); 1494c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton 1495c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton if (ret < 0) 1496e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return ret; 1497e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef dev->irq = irq; 14983c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_INFO " ( irq = %u )", irq); 1499e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else if (irq == 0) { 1500e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef printk(" ( no irq )"); 1501e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1502e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef printk(" invalid irq\n"); 1503e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -EINVAL; 1504e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1505e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 15062696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* initialize dma */ 1507e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef dma_chan = it->options[2]; 1508e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (dma_chan == 1 || dma_chan == 3) { 15092696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* allocate dma buffers */ 1510e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int i; 1511e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef for (i = 0; i < 2; i++) { 15123c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva devpriv->dma_buffer[i] = pci_alloc_consistent( 15133c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva NULL, DAS16_DMA_SIZE, 15143c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva &devpriv->dma_buffer_addr[i]); 15153c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva 1516e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv->dma_buffer[i] == NULL) 1517e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -ENOMEM; 1518e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1519e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (request_dma(dma_chan, "das16")) { 15203c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_ERR " failed to allocate dma channel %i\n", 15210a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral dma_chan); 1522e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -EINVAL; 1523e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1524e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->dma_chan = dma_chan; 1525e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef flags = claim_dma_lock(); 1526e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef disable_dma(devpriv->dma_chan); 1527e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef set_dma_mode(devpriv->dma_chan, DMA_MODE_READ); 1528e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef release_dma_lock(flags); 15293c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_INFO " ( dma = %u)\n", dma_chan); 1530e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else if (dma_chan == 0) { 15313c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_INFO " ( no dma )\n"); 1532e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 15333c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_ERR " invalid dma channel\n"); 1534e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return -EINVAL; 1535e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1536e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 15372696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* get any user-defined input range */ 1538e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->ai_pg == das16_pg_none && 15390a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral (it->options[4] || it->options[5])) { 15402696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* allocate single-range range table */ 1541e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->user_ai_range_table = 15420a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral kmalloc(sizeof(struct comedi_lrange) + 15430a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral sizeof(struct comedi_krange), GFP_KERNEL); 15442696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* initialize ai range */ 1545e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->user_ai_range_table->length = 1; 1546e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef user_ai_range = devpriv->user_ai_range_table->range; 1547e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef user_ai_range->min = it->options[4]; 1548e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef user_ai_range->max = it->options[5]; 1549e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef user_ai_range->flags = UNIT_volt; 1550e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 15512696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* get any user-defined output range */ 1552e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (it->options[6] || it->options[7]) { 15532696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* allocate single-range range table */ 1554e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->user_ao_range_table = 15550a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral kmalloc(sizeof(struct comedi_lrange) + 15560a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral sizeof(struct comedi_krange), GFP_KERNEL); 15572696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* initialize ao range */ 1558e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->user_ao_range_table->length = 1; 1559e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef user_ao_range = devpriv->user_ao_range_table->range; 1560e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef user_ao_range->min = it->options[6]; 1561e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef user_ao_range->max = it->options[7]; 1562e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef user_ao_range->flags = UNIT_volt; 1563e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1564e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1565e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (timer_mode) { 1566e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef init_timer(&(devpriv->timer)); 1567e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->timer.function = das16_timer_interrupt; 1568e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->timer.data = (unsigned long)dev; 1569e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1570e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->timer_mode = timer_mode ? 1 : 0; 1571e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1572c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton ret = alloc_subdevices(dev, 5); 1573c3744138715045adb316284ee7a1e608f0278f6cBill Pemberton if (ret < 0) 1574e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return ret; 1575e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1576e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s = dev->subdevices + 0; 1577e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef dev->read_subdev = s; 1578e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* ai */ 1579e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->ai) { 1580e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->type = COMEDI_SUBD_AI; 1581e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->subdev_flags = SDF_READABLE | SDF_CMD_READ; 1582e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv->ai_singleended) { 1583e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->n_chan = 16; 1584e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->len_chanlist = 16; 1585e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->subdev_flags |= SDF_GROUND; 1586e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1587e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->n_chan = 8; 1588e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->len_chanlist = 8; 1589e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->subdev_flags |= SDF_DIFF; 1590e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1591e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->maxdata = (1 << thisboard->ai_nbits) - 1; 15923c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva if (devpriv->user_ai_range_table) { /* user defined ai range */ 1593e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->range_table = devpriv->user_ai_range_table; 1594e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else if (devpriv->ai_unipolar) { 1595e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->range_table = das16_ai_uni_lranges[thisboard->ai_pg]; 1596e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1597e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->range_table = das16_ai_bip_lranges[thisboard->ai_pg]; 1598e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1599e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->insn_read = thisboard->ai; 1600e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->do_cmdtest = das16_cmd_test; 1601e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->do_cmd = das16_cmd_exec; 1602e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->cancel = das16_cancel; 1603e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->munge = das16_ai_munge; 1604e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1605e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->type = COMEDI_SUBD_UNUSED; 1606e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1607e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1608e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s = dev->subdevices + 1; 1609e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* ao */ 1610e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->ao) { 1611e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->type = COMEDI_SUBD_AO; 1612e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->subdev_flags = SDF_WRITABLE; 1613e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->n_chan = 2; 1614e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->maxdata = (1 << thisboard->ao_nbits) - 1; 16153c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva /* user defined ao range */ 16163c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva if (devpriv->user_ao_range_table) 1617e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->range_table = devpriv->user_ao_range_table; 16183c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva else 1619e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->range_table = &range_unknown; 16203c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva 1621e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->insn_write = thisboard->ao; 1622e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1623e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->type = COMEDI_SUBD_UNUSED; 1624e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1625e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1626e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s = dev->subdevices + 2; 1627e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* di */ 1628e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->di) { 1629e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->type = COMEDI_SUBD_DI; 1630e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->subdev_flags = SDF_READABLE; 1631e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->n_chan = 4; 1632e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->maxdata = 1; 1633e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->range_table = &range_digital; 1634e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->insn_bits = thisboard->di; 1635e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1636e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->type = COMEDI_SUBD_UNUSED; 1637e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1638e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1639e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s = dev->subdevices + 3; 1640e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* do */ 1641e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->do_) { 1642e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->type = COMEDI_SUBD_DO; 1643e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->subdev_flags = SDF_WRITABLE | SDF_READABLE; 1644e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->n_chan = 4; 1645e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->maxdata = 1; 1646e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->range_table = &range_digital; 1647e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->insn_bits = thisboard->do_; 16482696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* initialize digital output lines */ 1649e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(s->state, dev->iobase + DAS16_DIO); 1650e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1651e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->type = COMEDI_SUBD_UNUSED; 1652e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1653e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1654e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s = dev->subdevices + 4; 1655e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* 8255 */ 1656e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->i8255_offset != 0) { 1657e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef subdev_8255_init(dev, s, NULL, (dev->iobase + 16580a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral thisboard->i8255_offset)); 1659e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1660e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef s->type = COMEDI_SUBD_UNUSED; 1661e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1662e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1663e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das16_reset(dev); 1664e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* set the interrupt level */ 1665e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef devpriv->control_state = DAS16_IRQ(dev->irq); 1666e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(devpriv->control_state, dev->iobase + DAS16_CONTROL); 1667e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 16682696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* turn on das1600 mode if available */ 1669e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->size > 0x400) { 1670e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(DAS1600_ENABLE_VAL, dev->iobase + DAS1600_ENABLE); 1671e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0, dev->iobase + DAS1600_CONV); 1672e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef outb(0, dev->iobase + DAS1600_BURST); 1673e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1674e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1675e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 0; 1676e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1677e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1678da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic int das16_detach(struct comedi_device *dev) 1679e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 16803c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva printk(KERN_INFO "comedi%d: das16: remove\n", dev->minor); 1681e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1682e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef das16_reset(dev); 1683e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1684e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (dev->subdevices) 1685e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef subdev_8255_cleanup(dev, dev->subdevices + 4); 1686e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1687e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv) { 1688e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef int i; 1689e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef for (i = 0; i < 2; i++) { 1690e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv->dma_buffer[i]) 1691e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef pci_free_consistent(NULL, DAS16_DMA_SIZE, 16920a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral devpriv->dma_buffer[i], 16930a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral devpriv-> 16940a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral dma_buffer_addr[i]); 1695e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1696e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv->dma_chan) 1697e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef free_dma(devpriv->dma_chan); 1698e4e1f289be88a75dc8b63d50ade1f9a2e6168021Ilia Mirkin kfree(devpriv->user_ai_range_table); 1699e4e1f289be88a75dc8b63d50ade1f9a2e6168021Ilia Mirkin kfree(devpriv->user_ao_range_table); 1700e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1701e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1702e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (dev->irq) 17035f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman free_irq(dev->irq, dev); 1704e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1705e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (dev->iobase) { 1706e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (thisboard->size < 0x400) { 1707e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef release_region(dev->iobase, thisboard->size); 1708e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 1709e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef release_region(dev->iobase, 0x10); 1710e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef release_region(dev->iobase + 0x400, 17110a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral thisboard->size & 0x3ff); 1712e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1713e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1714e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1715e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return 0; 1716e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1717e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 17187114a28011f9d5f3d981731ad341177c21f9d948Arun Thomasstatic int __init driver_das16_init_module(void) 17197114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas{ 17207114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas return comedi_driver_register(&driver_das16); 17217114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas} 17227114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas 17237114a28011f9d5f3d981731ad341177c21f9d948Arun Thomasstatic void __exit driver_das16_cleanup_module(void) 17247114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas{ 17257114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas comedi_driver_unregister(&driver_das16); 17267114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas} 17277114a28011f9d5f3d981731ad341177c21f9d948Arun Thomas 17287114a28011f9d5f3d981731ad341177c21f9d948Arun Thomasmodule_init(driver_das16_init_module); 17297114a28011f9d5f3d981731ad341177c21f9d948Arun Thomasmodule_exit(driver_das16_cleanup_module); 1730e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 17312696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton/* utility function that suggests a dma transfer size in bytes */ 1732da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonstatic unsigned int das16_suggest_transfer_size(struct comedi_device *dev, 17330a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_cmd cmd) 1734e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1735e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int size; 1736e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef unsigned int freq; 1737e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1738e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* if we are using timer interrupt, we don't care how long it 1739e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * will take to complete transfer since it will be interrupted 1740e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * by timer interrupt */ 1741e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (devpriv->timer_mode) 1742e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return DAS16_DMA_SIZE; 1743e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1744e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef /* otherwise, we are relying on dma terminal count interrupt, 1745e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef * so pick a reasonable size */ 1746e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd.convert_src == TRIG_TIMER) 1747e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef freq = 1000000000 / cmd.convert_arg; 1748e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef else if (cmd.scan_begin_src == TRIG_TIMER) 1749e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef freq = (1000000000 / cmd.scan_begin_arg) * cmd.chanlist_len; 17502696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* return some default value */ 1751e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef else 1752e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef freq = 0xffffffff; 1753e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1754e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd.flags & TRIG_WAKE_EOS) { 1755e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef size = sample_size * cmd.chanlist_len; 1756e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } else { 17572696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* make buffer fill in no more than 1/3 second */ 1758e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef size = (freq / 3) * sample_size; 1759e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1760e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 17612696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton /* set a minimum and maximum size allowed */ 1762e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (size > DAS16_DMA_SIZE) 1763e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef size = DAS16_DMA_SIZE - DAS16_DMA_SIZE % sample_size; 1764e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef else if (size < sample_size) 1765e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef size = sample_size; 1766e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1767e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef if (cmd.stop_src == TRIG_COUNT && size > devpriv->adc_byte_count) 1768e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef size = devpriv->adc_byte_count; 1769e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1770e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef return size; 1771e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 1772e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 17730a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukralstatic void das16_ai_munge(struct comedi_device *dev, 17740a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral struct comedi_subdevice *s, void *array, 17750a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral unsigned int num_bytes, 17760a85b6f0ab0d2edb0d41b32697111ce0e4f43496Mithlesh Thukral unsigned int start_chan_index) 1777e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef{ 1778790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton unsigned int i, num_samples = num_bytes / sizeof(short); 1779790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton short *data = array; 1780e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef 1781e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef for (i = 0; i < num_samples; i++) { 1782e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef data[i] = le16_to_cpu(data[i]); 17833c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva if (thisboard->ai_nbits == 12) 1784e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef data[i] = (data[i] >> 4) & 0xfff; 17853c0d681e7d31fe747a2cbed0a93dd92049521683Gustavo Silva 1786e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef } 1787e64374f8f37c5325dd3e4dad619d49a289226d7dDavid Schleef} 178890f703d30dd3e0c16ff80f35e34e511385a05ad5Arun Thomas 178990f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_AUTHOR("Comedi http://www.comedi.org"); 179090f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_DESCRIPTION("Comedi low-level driver"); 179190f703d30dd3e0c16ff80f35e34e511385a05ad5Arun ThomasMODULE_LICENSE("GPL"); 1792