rtd520.c revision 8086fff871940e6a348a733a303f39c086e4b3c5
1/* 2 comedi/drivers/rtd520.c 3 Comedi driver for Real Time Devices (RTD) PCI4520/DM7520 4 5 COMEDI - Linux Control and Measurement Device Interface 6 Copyright (C) 2001 David A. Schleef <ds@schleef.org> 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21*/ 22/* 23Driver: rtd520 24Description: Real Time Devices PCI4520/DM7520 25Author: Dan Christian 26Devices: [Real Time Devices] DM7520HR-1 (rtd520), DM7520HR-8, 27 PCI4520, PCI4520-8 28Status: Works. Only tested on DM7520-8. Not SMP safe. 29 30Configuration options: 31 [0] - PCI bus of device (optional) 32 If bus/slot is not specified, the first available PCI 33 device will be used. 34 [1] - PCI slot of device (optional) 35*/ 36/* 37 Created by Dan Christian, NASA Ames Research Center. 38 39 The PCI4520 is a PCI card. The DM7520 is a PC/104-plus card. 40 Both have: 41 8/16 12 bit ADC with FIFO and channel gain table 42 8 bits high speed digital out (for external MUX) (or 8 in or 8 out) 43 8 bits high speed digital in with FIFO and interrupt on change (or 8 IO) 44 2 12 bit DACs with FIFOs 45 2 bits output 46 2 bits input 47 bus mastering DMA 48 timers: ADC sample, pacer, burst, about, delay, DA1, DA2 49 sample counter 50 3 user timer/counters (8254) 51 external interrupt 52 53 The DM7520 has slightly fewer features (fewer gain steps). 54 55 These boards can support external multiplexors and multi-board 56 synchronization, but this driver doesn't support that. 57 58 Board docs: http://www.rtdusa.com/PC104/DM/analog%20IO/dm7520.htm 59 Data sheet: http://www.rtdusa.com/pdf/dm7520.pdf 60 Example source: http://www.rtdusa.com/examples/dm/dm7520.zip 61 Call them and ask for the register level manual. 62 PCI chip: http://www.plxtech.com/products/toolbox/9080.htm 63 64 Notes: 65 This board is memory mapped. There is some IO stuff, but it isn't needed. 66 67 I use a pretty loose naming style within the driver (rtd_blah). 68 All externally visible names should be rtd520_blah. 69 I use camelCase for structures (and inside them). 70 I may also use upper CamelCase for function names (old habit). 71 72 This board is somewhat related to the RTD PCI4400 board. 73 74 I borrowed heavily from the ni_mio_common, ni_atmio16d, mite, and 75 das1800, since they have the best documented code. Driver 76 cb_pcidas64.c uses the same DMA controller. 77 78 As far as I can tell, the About interrupt doesnt work if Sample is 79 also enabled. It turns out that About really isn't needed, since 80 we always count down samples read. 81 82 There was some timer/counter code, but it didn't follow the right API. 83 84*/ 85 86/* 87 driver status: 88 89 Analog-In supports instruction and command mode. 90 91 With DMA, you can sample at 1.15Mhz with 70% idle on a 400Mhz K6-2 92 (single channel, 64K read buffer). I get random system lockups when 93 using DMA with ALI-15xx based systems. I haven't been able to test 94 any other chipsets. The lockups happen soon after the start of an 95 acquistion, not in the middle of a long run. 96 97 Without DMA, you can do 620Khz sampling with 20% idle on a 400Mhz K6-2 98 (with a 256K read buffer). 99 100 Digital-IO and Analog-Out only support instruction mode. 101 102*/ 103 104#include <linux/delay.h> 105 106#include "../comedidev.h" 107#include "comedi_pci.h" 108 109#define DRV_NAME "rtd520" 110 111/*====================================================================== 112 Driver specific stuff (tunable) 113======================================================================*/ 114/* Enable this to test the new DMA support. You may get hard lock ups */ 115/*#define USE_DMA*/ 116 117/* We really only need 2 buffers. More than that means being much 118 smarter about knowing which ones are full. */ 119#define DMA_CHAIN_COUNT 2 /* max DMA segments/buffers in a ring (min 2) */ 120 121/* Target period for periodic transfers. This sets the user read latency. */ 122/* Note: There are certain rates where we give this up and transfer 1/2 FIFO */ 123/* If this is too low, efficiency is poor */ 124#define TRANS_TARGET_PERIOD 10000000 /* 10 ms (in nanoseconds) */ 125 126/* Set a practical limit on how long a list to support (affects memory use) */ 127/* The board support a channel list up to the FIFO length (1K or 8K) */ 128#define RTD_MAX_CHANLIST 128 /* max channel list that we allow */ 129 130/* tuning for ai/ao instruction done polling */ 131#ifdef FAST_SPIN 132#define WAIT_QUIETLY /* as nothing, spin on done bit */ 133#define RTD_ADC_TIMEOUT 66000 /* 2 msec at 33mhz bus rate */ 134#define RTD_DAC_TIMEOUT 66000 135#define RTD_DMA_TIMEOUT 33000 /* 1 msec */ 136#else 137/* by delaying, power and electrical noise are reduced somewhat */ 138#define WAIT_QUIETLY comedi_udelay (1) 139#define RTD_ADC_TIMEOUT 2000 /* in usec */ 140#define RTD_DAC_TIMEOUT 2000 /* in usec */ 141#define RTD_DMA_TIMEOUT 1000 /* in usec */ 142#endif 143 144/*====================================================================== 145 Board specific stuff 146======================================================================*/ 147 148/* registers */ 149#define PCI_VENDOR_ID_RTD 0x1435 150/* 151 The board has three memory windows: las0, las1, and lcfg (the PCI chip) 152 Las1 has the data and can be burst DMAed 32bits at a time. 153*/ 154#define LCFG_PCIINDEX 0 155/* PCI region 1 is a 256 byte IO space mapping. Use??? */ 156#define LAS0_PCIINDEX 2 /* PCI memory resources */ 157#define LAS1_PCIINDEX 3 158#define LCFG_PCISIZE 0x100 159#define LAS0_PCISIZE 0x200 160#define LAS1_PCISIZE 0x10 161 162#define RTD_CLOCK_RATE 8000000 /* 8Mhz onboard clock */ 163#define RTD_CLOCK_BASE 125 /* clock period in ns */ 164 165/* Note: these speed are slower than the spec, but fit the counter resolution*/ 166#define RTD_MAX_SPEED 1625 /* when sampling, in nanoseconds */ 167/* max speed if we don't have to wait for settling */ 168#define RTD_MAX_SPEED_1 875 /* if single channel, in nanoseconds */ 169 170#define RTD_MIN_SPEED 2097151875 /* (24bit counter) in nanoseconds */ 171/* min speed when only 1 channel (no burst counter) */ 172#define RTD_MIN_SPEED_1 5000000 /* 200Hz, in nanoseconds */ 173 174#include "rtd520.h" 175#include "plx9080.h" 176 177/* Setup continuous ring of 1/2 FIFO transfers. See RTD manual p91 */ 178#define DMA_MODE_BITS (\ 179 PLX_LOCAL_BUS_16_WIDE_BITS \ 180 | PLX_DMA_EN_READYIN_BIT \ 181 | PLX_DMA_LOCAL_BURST_EN_BIT \ 182 | PLX_EN_CHAIN_BIT \ 183 | PLX_DMA_INTR_PCI_BIT \ 184 | PLX_LOCAL_ADDR_CONST_BIT \ 185 | PLX_DEMAND_MODE_BIT) 186 187#define DMA_TRANSFER_BITS (\ 188/* descriptors in PCI memory*/ PLX_DESC_IN_PCI_BIT \ 189/* interrupt at end of block */ | PLX_INTR_TERM_COUNT \ 190/* from board to PCI */ | PLX_XFER_LOCAL_TO_PCI) 191 192/*====================================================================== 193 Comedi specific stuff 194======================================================================*/ 195 196/* 197 The board has 3 input modes and the gains of 1,2,4,...32 (, 64, 128) 198*/ 199static const comedi_lrange rtd_ai_7520_range = { 18, { 200 /* +-5V input range gain steps */ 201 BIP_RANGE(5.0), 202 BIP_RANGE(5.0 / 2), 203 BIP_RANGE(5.0 / 4), 204 BIP_RANGE(5.0 / 8), 205 BIP_RANGE(5.0 / 16), 206 BIP_RANGE(5.0 / 32), 207 /* +-10V input range gain steps */ 208 BIP_RANGE(10.0), 209 BIP_RANGE(10.0 / 2), 210 BIP_RANGE(10.0 / 4), 211 BIP_RANGE(10.0 / 8), 212 BIP_RANGE(10.0 / 16), 213 BIP_RANGE(10.0 / 32), 214 /* +10V input range gain steps */ 215 UNI_RANGE(10.0), 216 UNI_RANGE(10.0 / 2), 217 UNI_RANGE(10.0 / 4), 218 UNI_RANGE(10.0 / 8), 219 UNI_RANGE(10.0 / 16), 220 UNI_RANGE(10.0 / 32), 221 222 } 223}; 224 225/* PCI4520 has two more gains (6 more entries) */ 226static const comedi_lrange rtd_ai_4520_range = { 24, { 227 /* +-5V input range gain steps */ 228 BIP_RANGE(5.0), 229 BIP_RANGE(5.0 / 2), 230 BIP_RANGE(5.0 / 4), 231 BIP_RANGE(5.0 / 8), 232 BIP_RANGE(5.0 / 16), 233 BIP_RANGE(5.0 / 32), 234 BIP_RANGE(5.0 / 64), 235 BIP_RANGE(5.0 / 128), 236 /* +-10V input range gain steps */ 237 BIP_RANGE(10.0), 238 BIP_RANGE(10.0 / 2), 239 BIP_RANGE(10.0 / 4), 240 BIP_RANGE(10.0 / 8), 241 BIP_RANGE(10.0 / 16), 242 BIP_RANGE(10.0 / 32), 243 BIP_RANGE(10.0 / 64), 244 BIP_RANGE(10.0 / 128), 245 /* +10V input range gain steps */ 246 UNI_RANGE(10.0), 247 UNI_RANGE(10.0 / 2), 248 UNI_RANGE(10.0 / 4), 249 UNI_RANGE(10.0 / 8), 250 UNI_RANGE(10.0 / 16), 251 UNI_RANGE(10.0 / 32), 252 UNI_RANGE(10.0 / 64), 253 UNI_RANGE(10.0 / 128), 254 } 255}; 256 257/* Table order matches range values */ 258static const comedi_lrange rtd_ao_range = { 4, { 259 RANGE(0, 5), 260 RANGE(0, 10), 261 RANGE(-5, 5), 262 RANGE(-10, 10), 263 } 264}; 265 266/* 267 Board descriptions 268 */ 269typedef struct rtdBoard_struct { 270 const char *name; /* must be first */ 271 int device_id; 272 int aiChans; 273 int aiBits; 274 int aiMaxGain; 275 int range10Start; /* start of +-10V range */ 276 int rangeUniStart; /* start of +10V range */ 277} rtdBoard; 278 279static const rtdBoard rtd520Boards[] = { 280 { 281 name: "DM7520", 282 device_id:0x7520, 283 aiChans: 16, 284 aiBits: 12, 285 aiMaxGain:32, 286 range10Start:6, 287 rangeUniStart:12, 288 }, 289 { 290 name: "PCI4520", 291 device_id:0x4520, 292 aiChans: 16, 293 aiBits: 12, 294 aiMaxGain:128, 295 range10Start:8, 296 rangeUniStart:16, 297 }, 298}; 299 300static DEFINE_PCI_DEVICE_TABLE(rtd520_pci_table) = { 301 {PCI_VENDOR_ID_RTD, 0x7520, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 302 {PCI_VENDOR_ID_RTD, 0x4520, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 303 {0} 304}; 305 306MODULE_DEVICE_TABLE(pci, rtd520_pci_table); 307 308/* 309 * Useful for shorthand access to the particular board structure 310 */ 311#define thisboard ((const rtdBoard *)dev->board_ptr) 312 313/* 314 This structure is for data unique to this hardware driver. 315 This is also unique for each board in the system. 316*/ 317typedef struct { 318 /* memory mapped board structures */ 319 void *las0; 320 void *las1; 321 void *lcfg; 322 323 unsigned long intCount; /* interrupt count */ 324 long aiCount; /* total transfer size (samples) */ 325 int transCount; /* # to tranfer data. 0->1/2FIFO */ 326 int flags; /* flag event modes */ 327 328 /* PCI device info */ 329 struct pci_dev *pci_dev; 330 int got_regions; /* non-zero if PCI regions owned */ 331 332 /* channel list info */ 333 /* chanBipolar tracks whether a channel is bipolar (and needs +2048) */ 334 unsigned char chanBipolar[RTD_MAX_CHANLIST / 8]; /* bit array */ 335 336 /* read back data */ 337 lsampl_t aoValue[2]; /* Used for AO read back */ 338 339 /* timer gate (when enabled) */ 340 u8 utcGate[4]; /* 1 extra allows simple range check */ 341 342 /* shadow registers affect other registers, but cant be read back */ 343 /* The macros below update these on writes */ 344 u16 intMask; /* interrupt mask */ 345 u16 intClearMask; /* interrupt clear mask */ 346 u8 utcCtrl[4]; /* crtl mode for 3 utc + read back */ 347 u8 dioStatus; /* could be read back (dio0Ctrl) */ 348#ifdef USE_DMA 349 /* Always DMA 1/2 FIFO. Buffer (dmaBuff?) is (at least) twice that size. 350 After transferring, interrupt processes 1/2 FIFO and passes to comedi */ 351 s16 dma0Offset; /* current processing offset (0, 1/2) */ 352 uint16_t *dma0Buff[DMA_CHAIN_COUNT]; /* DMA buffers (for ADC) */ 353 dma_addr_t dma0BuffPhysAddr[DMA_CHAIN_COUNT]; /* physical addresses */ 354 struct plx_dma_desc *dma0Chain; /* DMA descriptor ring for dmaBuff */ 355 dma_addr_t dma0ChainPhysAddr; /* physical addresses */ 356 /* shadow registers */ 357 u8 dma0Control; 358 u8 dma1Control; 359#endif /* USE_DMA */ 360 unsigned fifoLen; 361} rtdPrivate; 362 363/* bit defines for "flags" */ 364#define SEND_EOS 0x01 /* send End Of Scan events */ 365#define DMA0_ACTIVE 0x02 /* DMA0 is active */ 366#define DMA1_ACTIVE 0x04 /* DMA1 is active */ 367 368/* Macros for accessing channel list bit array */ 369#define CHAN_ARRAY_TEST(array, index) \ 370 (((array)[(index)/8] >> ((index) & 0x7)) & 0x1) 371#define CHAN_ARRAY_SET(array, index) \ 372 (((array)[(index)/8] |= 1 << ((index) & 0x7))) 373#define CHAN_ARRAY_CLEAR(array, index) \ 374 (((array)[(index)/8] &= ~(1 << ((index) & 0x7)))) 375 376/* 377 * most drivers define the following macro to make it easy to 378 * access the private structure. 379 */ 380#define devpriv ((rtdPrivate *)dev->private) 381 382/* Macros to access registers */ 383 384/* Reset board */ 385#define RtdResetBoard(dev) \ 386 writel (0, devpriv->las0+LAS0_BOARD_RESET) 387 388/* Reset channel gain table read pointer */ 389#define RtdResetCGT(dev) \ 390 writel (0, devpriv->las0+LAS0_CGT_RESET) 391 392/* Reset channel gain table read and write pointers */ 393#define RtdClearCGT(dev) \ 394 writel (0, devpriv->las0+LAS0_CGT_CLEAR) 395 396/* Reset channel gain table read and write pointers */ 397#define RtdEnableCGT(dev, v) \ 398 writel ((v > 0) ? 1 : 0, devpriv->las0+LAS0_CGT_ENABLE) 399 400/* Write channel gain table entry */ 401#define RtdWriteCGTable(dev, v) \ 402 writel (v, devpriv->las0+LAS0_CGT_WRITE) 403 404/* Write Channel Gain Latch */ 405#define RtdWriteCGLatch(dev, v) \ 406 writel (v, devpriv->las0+LAS0_CGL_WRITE) 407 408/* Reset ADC FIFO */ 409#define RtdAdcClearFifo(dev) \ 410 writel (0, devpriv->las0+LAS0_ADC_FIFO_CLEAR) 411 412/* Set ADC start conversion source select (write only) */ 413#define RtdAdcConversionSource(dev, v) \ 414 writel (v, devpriv->las0+LAS0_ADC_CONVERSION) 415 416/* Set burst start source select (write only) */ 417#define RtdBurstStartSource(dev, v) \ 418 writel (v, devpriv->las0+LAS0_BURST_START) 419 420/* Set Pacer start source select (write only) */ 421#define RtdPacerStartSource(dev, v) \ 422 writel (v, devpriv->las0+LAS0_PACER_START) 423 424/* Set Pacer stop source select (write only) */ 425#define RtdPacerStopSource(dev, v) \ 426 writel (v, devpriv->las0+LAS0_PACER_STOP) 427 428/* Set Pacer clock source select (write only) 0=external 1=internal */ 429#define RtdPacerClockSource(dev, v) \ 430 writel ((v > 0) ? 1 : 0, devpriv->las0+LAS0_PACER_SELECT) 431 432/* Set sample counter source select (write only) */ 433#define RtdAdcSampleCounterSource(dev, v) \ 434 writel (v, devpriv->las0+LAS0_ADC_SCNT_SRC) 435 436/* Set Pacer trigger mode select (write only) 0=single cycle, 1=repeat */ 437#define RtdPacerTriggerMode(dev, v) \ 438 writel ((v > 0) ? 1 : 0, devpriv->las0+LAS0_PACER_REPEAT) 439 440/* Set About counter stop enable (write only) */ 441#define RtdAboutStopEnable(dev, v) \ 442 writel ((v > 0) ? 1 : 0, devpriv->las0+LAS0_ACNT_STOP_ENABLE) 443 444/* Set external trigger polarity (write only) 0=positive edge, 1=negative */ 445#define RtdTriggerPolarity(dev, v) \ 446 writel ((v > 0) ? 1 : 0, devpriv->las0+LAS0_ETRG_POLARITY) 447 448/* Start single ADC conversion */ 449#define RtdAdcStart(dev) \ 450 writew (0, devpriv->las0+LAS0_ADC) 451 452/* Read one ADC data value (12bit (with sign extend) as 16bit) */ 453/* Note: matches what DMA would get. Actual value >> 3 */ 454#define RtdAdcFifoGet(dev) \ 455 readw (devpriv->las1+LAS1_ADC_FIFO) 456 457/* Read two ADC data values (DOESNT WORK) */ 458#define RtdAdcFifoGet2(dev) \ 459 readl (devpriv->las1+LAS1_ADC_FIFO) 460 461/* FIFO status */ 462#define RtdFifoStatus(dev) \ 463 readl (devpriv->las0+LAS0_ADC) 464 465/* pacer start/stop read=start, write=stop*/ 466#define RtdPacerStart(dev) \ 467 readl (devpriv->las0+LAS0_PACER) 468#define RtdPacerStop(dev) \ 469 writel (0, devpriv->las0+LAS0_PACER) 470 471/* Interrupt status */ 472#define RtdInterruptStatus(dev) \ 473 readw (devpriv->las0+LAS0_IT) 474 475/* Interrupt mask */ 476#define RtdInterruptMask(dev, v) \ 477 writew ((devpriv->intMask = (v)), devpriv->las0+LAS0_IT) 478 479/* Interrupt status clear (only bits set in mask) */ 480#define RtdInterruptClear(dev) \ 481 readw (devpriv->las0+LAS0_CLEAR) 482 483/* Interrupt clear mask */ 484#define RtdInterruptClearMask(dev, v) \ 485 writew ((devpriv->intClearMask = (v)), devpriv->las0+LAS0_CLEAR) 486 487/* Interrupt overrun status */ 488#define RtdInterruptOverrunStatus(dev) \ 489 readl (devpriv->las0+LAS0_OVERRUN) 490 491/* Interrupt overrun clear */ 492#define RtdInterruptOverrunClear(dev) \ 493 writel (0, devpriv->las0+LAS0_OVERRUN) 494 495/* Pacer counter, 24bit */ 496#define RtdPacerCount(dev) \ 497 readl (devpriv->las0+LAS0_PCLK) 498#define RtdPacerCounter(dev, v) \ 499 writel ((v) & 0xffffff, devpriv->las0+LAS0_PCLK) 500 501/* Burst counter, 10bit */ 502#define RtdBurstCount(dev) \ 503 readl (devpriv->las0+LAS0_BCLK) 504#define RtdBurstCounter(dev, v) \ 505 writel ((v) & 0x3ff, devpriv->las0+LAS0_BCLK) 506 507/* Delay counter, 16bit */ 508#define RtdDelayCount(dev) \ 509 readl (devpriv->las0+LAS0_DCLK) 510#define RtdDelayCounter(dev, v) \ 511 writel ((v) & 0xffff, devpriv->las0+LAS0_DCLK) 512 513/* About counter, 16bit */ 514#define RtdAboutCount(dev) \ 515 readl (devpriv->las0+LAS0_ACNT) 516#define RtdAboutCounter(dev, v) \ 517 writel ((v) & 0xffff, devpriv->las0+LAS0_ACNT) 518 519/* ADC sample counter, 10bit */ 520#define RtdAdcSampleCount(dev) \ 521 readl (devpriv->las0+LAS0_ADC_SCNT) 522#define RtdAdcSampleCounter(dev, v) \ 523 writel ((v) & 0x3ff, devpriv->las0+LAS0_ADC_SCNT) 524 525/* User Timer/Counter (8254) */ 526#define RtdUtcCounterGet(dev, n) \ 527 readb (devpriv->las0 \ 528 + ((n <= 0) ? LAS0_UTC0 : ((1 == n) ? LAS0_UTC1 : LAS0_UTC2))) 529 530#define RtdUtcCounterPut(dev, n, v) \ 531 writeb ((v) & 0xff, devpriv->las0 \ 532 + ((n <= 0) ? LAS0_UTC0 : ((1 == n) ? LAS0_UTC1 : LAS0_UTC2))) 533 534/* Set UTC (8254) control byte */ 535#define RtdUtcCtrlPut(dev, n, v) \ 536 writeb (devpriv->utcCtrl[(n) & 3] = (((n) & 3) << 6) | ((v) & 0x3f), \ 537 devpriv->las0 + LAS0_UTC_CTRL) 538 539/* Set UTCn clock source (write only) */ 540#define RtdUtcClockSource(dev, n, v) \ 541 writew (v, devpriv->las0 \ 542 + ((n <= 0) ? LAS0_UTC0_CLOCK : \ 543 ((1 == n) ? LAS0_UTC1_CLOCK : LAS0_UTC2_CLOCK))) 544 545/* Set UTCn gate source (write only) */ 546#define RtdUtcGateSource(dev, n, v) \ 547 writew (v, devpriv->las0 \ 548 + ((n <= 0) ? LAS0_UTC0_GATE : \ 549 ((1 == n) ? LAS0_UTC1_GATE : LAS0_UTC2_GATE))) 550 551/* User output N source select (write only) */ 552#define RtdUsrOutSource(dev, n, v) \ 553 writel (v, devpriv->las0+((n <= 0) ? LAS0_UOUT0_SELECT : LAS0_UOUT1_SELECT)) 554 555/* Digital IO */ 556#define RtdDio0Read(dev) \ 557 (readw (devpriv->las0+LAS0_DIO0) & 0xff) 558#define RtdDio0Write(dev, v) \ 559 writew ((v) & 0xff, devpriv->las0+LAS0_DIO0) 560 561#define RtdDio1Read(dev) \ 562 (readw (devpriv->las0+LAS0_DIO1) & 0xff) 563#define RtdDio1Write(dev, v) \ 564 writew ((v) & 0xff, devpriv->las0+LAS0_DIO1) 565 566#define RtdDioStatusRead(dev) \ 567 (readw (devpriv->las0+LAS0_DIO_STATUS) & 0xff) 568#define RtdDioStatusWrite(dev, v) \ 569 writew ((devpriv->dioStatus = (v)), devpriv->las0+LAS0_DIO_STATUS) 570 571#define RtdDio0CtrlRead(dev) \ 572 (readw (devpriv->las0+LAS0_DIO0_CTRL) & 0xff) 573#define RtdDio0CtrlWrite(dev, v) \ 574 writew ((v) & 0xff, devpriv->las0+LAS0_DIO0_CTRL) 575 576/* Digital to Analog converter */ 577/* Write one data value (sign + 12bit + marker bits) */ 578/* Note: matches what DMA would put. Actual value << 3 */ 579#define RtdDacFifoPut(dev, n, v) \ 580 writew ((v), devpriv->las1 +(((n) == 0) ? LAS1_DAC1_FIFO : LAS1_DAC2_FIFO)) 581 582/* Start single DAC conversion */ 583#define RtdDacUpdate(dev, n) \ 584 writew (0, devpriv->las0 +(((n) == 0) ? LAS0_DAC1 : LAS0_DAC2)) 585 586/* Start single DAC conversion on both DACs */ 587#define RtdDacBothUpdate(dev) \ 588 writew (0, devpriv->las0+LAS0_DAC) 589 590/* Set DAC output type and range */ 591#define RtdDacRange(dev, n, v) \ 592 writew ((v) & 7, devpriv->las0 \ 593 +(((n) == 0) ? LAS0_DAC1_CTRL : LAS0_DAC2_CTRL)) 594 595/* Reset DAC FIFO */ 596#define RtdDacClearFifo(dev, n) \ 597 writel (0, devpriv->las0+(((n) == 0) ? LAS0_DAC1_RESET : LAS0_DAC2_RESET)) 598 599/* Set source for DMA 0 (write only, shadow?) */ 600#define RtdDma0Source(dev, n) \ 601 writel ((n) & 0xf, devpriv->las0+LAS0_DMA0_SRC) 602 603/* Set source for DMA 1 (write only, shadow?) */ 604#define RtdDma1Source(dev, n) \ 605 writel ((n) & 0xf, devpriv->las0+LAS0_DMA1_SRC) 606 607/* Reset board state for DMA 0 */ 608#define RtdDma0Reset(dev) \ 609 writel (0, devpriv->las0+LAS0_DMA0_RESET) 610 611/* Reset board state for DMA 1 */ 612#define RtdDma1Reset(dev) \ 613 writel (0, devpriv->las0+LAS0_DMA1_SRC) 614 615/* PLX9080 interrupt mask and status */ 616#define RtdPlxInterruptRead(dev) \ 617 readl (devpriv->lcfg+LCFG_ITCSR) 618#define RtdPlxInterruptWrite(dev, v) \ 619 writel (v, devpriv->lcfg+LCFG_ITCSR) 620 621/* Set mode for DMA 0 */ 622#define RtdDma0Mode(dev, m) \ 623 writel ((m), devpriv->lcfg+LCFG_DMAMODE0) 624 625/* Set PCI address for DMA 0 */ 626#define RtdDma0PciAddr(dev, a) \ 627 writel ((a), devpriv->lcfg+LCFG_DMAPADR0) 628 629/* Set local address for DMA 0 */ 630#define RtdDma0LocalAddr(dev, a) \ 631 writel ((a), devpriv->lcfg+LCFG_DMALADR0) 632 633/* Set byte count for DMA 0 */ 634#define RtdDma0Count(dev, c) \ 635 writel ((c), devpriv->lcfg+LCFG_DMASIZ0) 636 637/* Set next descriptor for DMA 0 */ 638#define RtdDma0Next(dev, a) \ 639 writel ((a), devpriv->lcfg+LCFG_DMADPR0) 640 641/* Set mode for DMA 1 */ 642#define RtdDma1Mode(dev, m) \ 643 writel ((m), devpriv->lcfg+LCFG_DMAMODE1) 644 645/* Set PCI address for DMA 1 */ 646#define RtdDma1PciAddr(dev, a) \ 647 writel ((a), devpriv->lcfg+LCFG_DMAADR1) 648 649/* Set local address for DMA 1 */ 650#define RtdDma1LocalAddr(dev, a) \ 651 writel ((a), devpriv->lcfg+LCFG_DMALADR1) 652 653/* Set byte count for DMA 1 */ 654#define RtdDma1Count(dev, c) \ 655 writel ((c), devpriv->lcfg+LCFG_DMASIZ1) 656 657/* Set next descriptor for DMA 1 */ 658#define RtdDma1Next(dev, a) \ 659 writel ((a), devpriv->lcfg+LCFG_DMADPR1) 660 661/* Set control for DMA 0 (write only, shadow?) */ 662#define RtdDma0Control(dev, n) \ 663 writeb (devpriv->dma0Control = (n), devpriv->lcfg+LCFG_DMACSR0) 664 665/* Get status for DMA 0 */ 666#define RtdDma0Status(dev) \ 667 readb (devpriv->lcfg+LCFG_DMACSR0) 668 669/* Set control for DMA 1 (write only, shadow?) */ 670#define RtdDma1Control(dev, n) \ 671 writeb (devpriv->dma1Control = (n), devpriv->lcfg+LCFG_DMACSR1) 672 673/* Get status for DMA 1 */ 674#define RtdDma1Status(dev) \ 675 readb (devpriv->lcfg+LCFG_DMACSR1) 676 677/* 678 * The comedi_driver structure tells the Comedi core module 679 * which functions to call to configure/deconfigure (attac/detach) 680 * the board, and also about the kernel module that contains 681 * the device code. 682 */ 683static int rtd_attach(comedi_device *dev, comedi_devconfig *it); 684static int rtd_detach(comedi_device *dev); 685 686static comedi_driver rtd520Driver = { 687 driver_name: DRV_NAME, 688 module:THIS_MODULE, 689 attach:rtd_attach, 690 detach:rtd_detach, 691}; 692 693static int rtd_ai_rinsn(comedi_device *dev, comedi_subdevice *s, 694 comedi_insn *insn, lsampl_t *data); 695static int rtd_ao_winsn(comedi_device *dev, comedi_subdevice *s, 696 comedi_insn *insn, lsampl_t *data); 697static int rtd_ao_rinsn(comedi_device *dev, comedi_subdevice *s, 698 comedi_insn *insn, lsampl_t *data); 699static int rtd_dio_insn_bits(comedi_device *dev, comedi_subdevice *s, 700 comedi_insn *insn, lsampl_t *data); 701static int rtd_dio_insn_config(comedi_device *dev, comedi_subdevice *s, 702 comedi_insn *insn, lsampl_t *data); 703static int rtd_ai_cmdtest(comedi_device *dev, comedi_subdevice *s, 704 comedi_cmd *cmd); 705static int rtd_ai_cmd(comedi_device *dev, comedi_subdevice *s); 706static int rtd_ai_cancel(comedi_device *dev, comedi_subdevice *s); 707/* static int rtd_ai_poll (comedi_device *dev,comedi_subdevice *s); */ 708static int rtd_ns_to_timer(unsigned int *ns, int roundMode); 709static irqreturn_t rtd_interrupt(int irq, void *d PT_REGS_ARG); 710static int rtd520_probe_fifo_depth(comedi_device *dev); 711 712/* 713 * Attach is called by the Comedi core to configure the driver 714 * for a particular board. If you specified a board_name array 715 * in the driver structure, dev->board_ptr contains that 716 * address. 717 */ 718static int rtd_attach(comedi_device *dev, comedi_devconfig *it) 719{ /* board name and options flags */ 720 comedi_subdevice *s; 721 struct pci_dev *pcidev; 722 int ret; 723 resource_size_t physLas0; /* configuation */ 724 resource_size_t physLas1; /* data area */ 725 resource_size_t physLcfg; /* PLX9080 */ 726#ifdef USE_DMA 727 int index; 728#endif 729 730 printk("comedi%d: rtd520 attaching.\n", dev->minor); 731 732#if defined (CONFIG_COMEDI_DEBUG) && defined (USE_DMA) 733 /* You can set this a load time: modprobe comedi comedi_debug=1 */ 734 if (0 == comedi_debug) /* force DMA debug printks */ 735 comedi_debug = 1; 736#endif 737 738 /* 739 * Allocate the private structure area. alloc_private() is a 740 * convenient macro defined in comedidev.h. 741 */ 742 if (alloc_private(dev, sizeof(rtdPrivate)) < 0) 743 return -ENOMEM; 744 745 /* 746 * Probe the device to determine what device in the series it is. 747 */ 748 for (pcidev = pci_get_device(PCI_VENDOR_ID_RTD, PCI_ANY_ID, NULL); 749 pcidev != NULL; 750 pcidev = pci_get_device(PCI_VENDOR_ID_RTD, PCI_ANY_ID, pcidev)) { 751 int i; 752 753 if (it->options[0] || it->options[1]) { 754 if (pcidev->bus->number != it->options[0] 755 || PCI_SLOT(pcidev->devfn) != 756 it->options[1]) { 757 continue; 758 } 759 } 760 for(i = 0; i < sizeof(rtd520Boards) / sizeof(rtd520Boards[0]); ++i) 761 { 762 if(pcidev->device == rtd520Boards[i].device_id) 763 { 764 dev->board_ptr = &rtd520Boards[i]; 765 break; 766 } 767 } 768 if(dev->board_ptr) break; /* found one */ 769 } 770 if (!pcidev) { 771 if (it->options[0] && it->options[1]) { 772 printk("No RTD card at bus=%d slot=%d.\n", 773 it->options[0], it->options[1]); 774 } else { 775 printk("No RTD card found.\n"); 776 } 777 return -EIO; 778 } 779 devpriv->pci_dev = pcidev; 780 dev->board_name = thisboard->name; 781 782 if ((ret = comedi_pci_enable(pcidev, DRV_NAME)) < 0) { 783 printk("Failed to enable PCI device and request regions.\n"); 784 return ret; 785 } 786 devpriv->got_regions = 1; 787 788 /* 789 * Initialize base addresses 790 */ 791 /* Get the physical address from PCI config */ 792 physLas0 = pci_resource_start(devpriv->pci_dev, LAS0_PCIINDEX); 793 physLas1 = pci_resource_start(devpriv->pci_dev, LAS1_PCIINDEX); 794 physLcfg = pci_resource_start(devpriv->pci_dev, LCFG_PCIINDEX); 795 /* Now have the kernel map this into memory */ 796 /* ASSUME page aligned */ 797 devpriv->las0 = ioremap_nocache(physLas0, LAS0_PCISIZE); 798 devpriv->las1 = ioremap_nocache(physLas1, LAS1_PCISIZE); 799 devpriv->lcfg = ioremap_nocache(physLcfg, LCFG_PCISIZE); 800 801 if (!devpriv->las0 || !devpriv->las1 || !devpriv->lcfg) { 802 return -ENOMEM; 803 } 804 805 DPRINTK("%s: LAS0=%llx, LAS1=%llx, CFG=%llx.\n", dev->board_name, 806 (unsigned long long)physLas0, (unsigned long long)physLas1, 807 (unsigned long long)physLcfg); 808 { /* The RTD driver does this */ 809 unsigned char pci_latency; 810 u16 revision; 811 /*uint32_t epld_version; */ 812 813 pci_read_config_word(devpriv->pci_dev, PCI_REVISION_ID, 814 &revision); 815 DPRINTK("%s: PCI revision %d.\n", dev->board_name, revision); 816 817 pci_read_config_byte(devpriv->pci_dev, 818 PCI_LATENCY_TIMER, &pci_latency); 819 if (pci_latency < 32) { 820 printk("%s: PCI latency changed from %d to %d\n", 821 dev->board_name, pci_latency, 32); 822 pci_write_config_byte(devpriv->pci_dev, 823 PCI_LATENCY_TIMER, 32); 824 } else { 825 DPRINTK("rtd520: PCI latency = %d\n", pci_latency); 826 } 827 828 /* Undocumented EPLD version (doesnt match RTD driver results) */ 829 /*DPRINTK ("rtd520: Reading epld from %p\n", 830 devpriv->las0+0); 831 epld_version = readl (devpriv->las0+0); 832 if ((epld_version & 0xF0) >> 4 == 0x0F) { 833 DPRINTK("rtd520: pre-v8 EPLD. (%x)\n", epld_version); 834 } else { 835 DPRINTK("rtd520: EPLD version %x.\n", epld_version >> 4); 836 } */ 837 } 838 839 /* Show board configuration */ 840 printk("%s:", dev->board_name); 841 842 /* 843 * Allocate the subdevice structures. alloc_subdevice() is a 844 * convenient macro defined in comedidev.h. 845 */ 846 if (alloc_subdevices(dev, 4) < 0) { 847 return -ENOMEM; 848 } 849 850 s = dev->subdevices + 0; 851 dev->read_subdev = s; 852 /* analog input subdevice */ 853 s->type = COMEDI_SUBD_AI; 854 s->subdev_flags = 855 SDF_READABLE | SDF_GROUND | SDF_COMMON | SDF_DIFF | 856 SDF_CMD_READ; 857 s->n_chan = thisboard->aiChans; 858 s->maxdata = (1 << thisboard->aiBits) - 1; 859 if (thisboard->aiMaxGain <= 32) { 860 s->range_table = &rtd_ai_7520_range; 861 } else { 862 s->range_table = &rtd_ai_4520_range; 863 } 864 s->len_chanlist = RTD_MAX_CHANLIST; /* devpriv->fifoLen */ 865 s->insn_read = rtd_ai_rinsn; 866 s->do_cmd = rtd_ai_cmd; 867 s->do_cmdtest = rtd_ai_cmdtest; 868 s->cancel = rtd_ai_cancel; 869 /* s->poll = rtd_ai_poll; */ /* not ready yet */ 870 871 s = dev->subdevices + 1; 872 /* analog output subdevice */ 873 s->type = COMEDI_SUBD_AO; 874 s->subdev_flags = SDF_WRITABLE; 875 s->n_chan = 2; 876 s->maxdata = (1 << thisboard->aiBits) - 1; 877 s->range_table = &rtd_ao_range; 878 s->insn_write = rtd_ao_winsn; 879 s->insn_read = rtd_ao_rinsn; 880 881 s = dev->subdevices + 2; 882 /* digital i/o subdevice */ 883 s->type = COMEDI_SUBD_DIO; 884 s->subdev_flags = SDF_READABLE | SDF_WRITABLE; 885 /* we only support port 0 right now. Ignoring port 1 and user IO */ 886 s->n_chan = 8; 887 s->maxdata = 1; 888 s->range_table = &range_digital; 889 s->insn_bits = rtd_dio_insn_bits; 890 s->insn_config = rtd_dio_insn_config; 891 892 /* timer/counter subdevices (not currently supported) */ 893 s = dev->subdevices + 3; 894 s->type = COMEDI_SUBD_COUNTER; 895 s->subdev_flags = SDF_READABLE | SDF_WRITABLE; 896 s->n_chan = 3; 897 s->maxdata = 0xffff; 898 899 /* initialize board, per RTD spec */ 900 /* also, initialize shadow registers */ 901 RtdResetBoard(dev); 902 comedi_udelay(100); /* needed? */ 903 RtdPlxInterruptWrite(dev, 0); 904 RtdInterruptMask(dev, 0); /* and sets shadow */ 905 RtdInterruptClearMask(dev, ~0); /* and sets shadow */ 906 RtdInterruptClear(dev); /* clears bits set by mask */ 907 RtdInterruptOverrunClear(dev); 908 RtdClearCGT(dev); 909 RtdAdcClearFifo(dev); 910 RtdDacClearFifo(dev, 0); 911 RtdDacClearFifo(dev, 1); 912 /* clear digital IO fifo */ 913 RtdDioStatusWrite(dev, 0); /* safe state, set shadow */ 914 RtdUtcCtrlPut(dev, 0, 0x30); /* safe state, set shadow */ 915 RtdUtcCtrlPut(dev, 1, 0x30); /* safe state, set shadow */ 916 RtdUtcCtrlPut(dev, 2, 0x30); /* safe state, set shadow */ 917 RtdUtcCtrlPut(dev, 3, 0); /* safe state, set shadow */ 918 /* TODO: set user out source ??? */ 919 920 /* check if our interrupt is available and get it */ 921 if ((ret = comedi_request_irq(devpriv->pci_dev->irq, rtd_interrupt, 922 IRQF_SHARED, DRV_NAME, dev)) < 0) { 923 printk("Could not get interrupt! (%u)\n", 924 devpriv->pci_dev->irq); 925 return ret; 926 } 927 dev->irq = devpriv->pci_dev->irq; 928 printk("( irq=%u )", dev->irq); 929 930 ret = rtd520_probe_fifo_depth(dev); 931 if(ret < 0) { 932 return ret; 933 } 934 devpriv->fifoLen = ret; 935 printk("( fifoLen=%d )", devpriv->fifoLen); 936 937#ifdef USE_DMA 938 if (dev->irq > 0) { 939 printk("( DMA buff=%d )\n", DMA_CHAIN_COUNT); 940 /* The PLX9080 has 2 DMA controllers, but there could be 4 sources: 941 ADC, digital, DAC1, and DAC2. Since only the ADC supports cmd mode 942 right now, this isn't an issue (yet) */ 943 devpriv->dma0Offset = 0; 944 945 for (index = 0; index < DMA_CHAIN_COUNT; index++) { 946 devpriv->dma0Buff[index] = 947 pci_alloc_consistent(devpriv->pci_dev, 948 sizeof(u16) * devpriv->fifoLen / 2, 949 &devpriv->dma0BuffPhysAddr[index]); 950 if (devpriv->dma0Buff[index] == NULL) { 951 ret = -ENOMEM; 952 goto rtd_attach_die_error; 953 } 954 /*DPRINTK ("buff[%d] @ %p virtual, %x PCI\n", 955 index, 956 devpriv->dma0Buff[index], devpriv->dma0BuffPhysAddr[index]); */ 957 } 958 959 /* setup DMA descriptor ring (use cpu_to_le32 for byte ordering?) */ 960 devpriv->dma0Chain = 961 pci_alloc_consistent(devpriv->pci_dev, 962 sizeof(struct plx_dma_desc) * DMA_CHAIN_COUNT, 963 &devpriv->dma0ChainPhysAddr); 964 for (index = 0; index < DMA_CHAIN_COUNT; index++) { 965 devpriv->dma0Chain[index].pci_start_addr = 966 devpriv->dma0BuffPhysAddr[index]; 967 devpriv->dma0Chain[index].local_start_addr = 968 DMALADDR_ADC; 969 devpriv->dma0Chain[index].transfer_size = 970 sizeof(u16) * devpriv->fifoLen / 2; 971 devpriv->dma0Chain[index].next = 972 (devpriv->dma0ChainPhysAddr + ((index + 973 1) % (DMA_CHAIN_COUNT)) 974 * sizeof(devpriv->dma0Chain[0])) 975 | DMA_TRANSFER_BITS; 976 /*DPRINTK ("ring[%d] @%lx PCI: %x, local: %x, N: 0x%x, next: %x\n", 977 index, 978 ((long)devpriv->dma0ChainPhysAddr 979 + (index * sizeof(devpriv->dma0Chain[0]))), 980 devpriv->dma0Chain[index].pci_start_addr, 981 devpriv->dma0Chain[index].local_start_addr, 982 devpriv->dma0Chain[index].transfer_size, 983 devpriv->dma0Chain[index].next); */ 984 } 985 986 if (devpriv->dma0Chain == NULL) { 987 ret = -ENOMEM; 988 goto rtd_attach_die_error; 989 } 990 991 RtdDma0Mode(dev, DMA_MODE_BITS); 992 RtdDma0Source(dev, DMAS_ADFIFO_HALF_FULL); /* set DMA trigger source */ 993 } else { 994 printk("( no IRQ->no DMA )"); 995 } 996#endif /* USE_DMA */ 997 998 if (dev->irq) { /* enable plx9080 interrupts */ 999 RtdPlxInterruptWrite(dev, ICS_PIE | ICS_PLIE); 1000 } 1001 1002 printk("\ncomedi%d: rtd520 driver attached.\n", dev->minor); 1003 1004 return 1; 1005 1006#if 0 1007 /* hit an error, clean up memory and return ret */ 1008/* rtd_attach_die_error: */ 1009#ifdef USE_DMA 1010 for (index = 0; index < DMA_CHAIN_COUNT; index++) { 1011 if (NULL != devpriv->dma0Buff[index]) { /* free buffer memory */ 1012 pci_free_consistent(devpriv->pci_dev, 1013 sizeof(u16) * devpriv->fifoLen / 2, 1014 devpriv->dma0Buff[index], 1015 devpriv->dma0BuffPhysAddr[index]); 1016 devpriv->dma0Buff[index] = NULL; 1017 } 1018 } 1019 if (NULL != devpriv->dma0Chain) { 1020 pci_free_consistent(devpriv->pci_dev, 1021 sizeof(struct plx_dma_desc) 1022 * DMA_CHAIN_COUNT, 1023 devpriv->dma0Chain, devpriv->dma0ChainPhysAddr); 1024 devpriv->dma0Chain = NULL; 1025 } 1026#endif /* USE_DMA */ 1027 /* subdevices and priv are freed by the core */ 1028 if (dev->irq) { 1029 /* disable interrupt controller */ 1030 RtdPlxInterruptWrite(dev, RtdPlxInterruptRead(dev) 1031 & ~(ICS_PLIE | ICS_DMA0_E | ICS_DMA1_E)); 1032 comedi_free_irq(dev->irq, dev); 1033 } 1034 1035 /* release all regions that were allocated */ 1036 if (devpriv->las0) { 1037 iounmap(devpriv->las0); 1038 } 1039 if (devpriv->las1) { 1040 iounmap(devpriv->las1); 1041 } 1042 if (devpriv->lcfg) { 1043 iounmap(devpriv->lcfg); 1044 } 1045 if (devpriv->pci_dev) { 1046 pci_dev_put(devpriv->pci_dev); 1047 } 1048 return ret; 1049#endif 1050} 1051 1052/* 1053 * _detach is called to deconfigure a device. It should deallocate 1054 * resources. 1055 * This function is also called when _attach() fails, so it should be 1056 * careful not to release resources that were not necessarily 1057 * allocated by _attach(). dev->private and dev->subdevices are 1058 * deallocated automatically by the core. 1059 */ 1060static int rtd_detach(comedi_device *dev) 1061{ 1062#ifdef USE_DMA 1063 int index; 1064#endif 1065 1066 DPRINTK("comedi%d: rtd520: removing (%ld ints)\n", 1067 dev->minor, (devpriv ? devpriv->intCount : 0L)); 1068 if (devpriv && devpriv->lcfg) { 1069 DPRINTK("(int status 0x%x, overrun status 0x%x, fifo status 0x%x)...\n", 0xffff & RtdInterruptStatus(dev), 0xffff & RtdInterruptOverrunStatus(dev), (0xffff & RtdFifoStatus(dev)) ^ 0x6666); 1070 } 1071 1072 if (devpriv) { 1073 /* Shut down any board ops by resetting it */ 1074#ifdef USE_DMA 1075 if (devpriv->lcfg) { 1076 RtdDma0Control(dev, 0); /* disable DMA */ 1077 RtdDma1Control(dev, 0); /* disable DMA */ 1078 RtdPlxInterruptWrite(dev, ICS_PIE | ICS_PLIE); 1079 } 1080#endif /* USE_DMA */ 1081 if (devpriv->las0) { 1082 RtdResetBoard(dev); 1083 RtdInterruptMask(dev, 0); 1084 RtdInterruptClearMask(dev, ~0); 1085 RtdInterruptClear(dev); /* clears bits set by mask */ 1086 } 1087#ifdef USE_DMA 1088 /* release DMA */ 1089 for (index = 0; index < DMA_CHAIN_COUNT; index++) { 1090 if (NULL != devpriv->dma0Buff[index]) { 1091 pci_free_consistent(devpriv->pci_dev, 1092 sizeof(u16) * devpriv->fifoLen / 2, 1093 devpriv->dma0Buff[index], 1094 devpriv->dma0BuffPhysAddr[index]); 1095 devpriv->dma0Buff[index] = NULL; 1096 } 1097 } 1098 if (NULL != devpriv->dma0Chain) { 1099 pci_free_consistent(devpriv->pci_dev, 1100 sizeof(struct plx_dma_desc) * DMA_CHAIN_COUNT, 1101 devpriv->dma0Chain, devpriv->dma0ChainPhysAddr); 1102 devpriv->dma0Chain = NULL; 1103 } 1104#endif /* USE_DMA */ 1105 1106 /* release IRQ */ 1107 if (dev->irq) { 1108 /* disable interrupt controller */ 1109 RtdPlxInterruptWrite(dev, RtdPlxInterruptRead(dev) 1110 & ~(ICS_PLIE | ICS_DMA0_E | ICS_DMA1_E)); 1111 comedi_free_irq(dev->irq, dev); 1112 } 1113 1114 /* release all regions that were allocated */ 1115 if (devpriv->las0) { 1116 iounmap(devpriv->las0); 1117 } 1118 if (devpriv->las1) { 1119 iounmap(devpriv->las1); 1120 } 1121 if (devpriv->lcfg) { 1122 iounmap(devpriv->lcfg); 1123 } 1124 if (devpriv->pci_dev) { 1125 if (devpriv->got_regions) { 1126 comedi_pci_disable(devpriv->pci_dev); 1127 } 1128 pci_dev_put(devpriv->pci_dev); 1129 } 1130 } 1131 1132 printk("comedi%d: rtd520: removed.\n", dev->minor); 1133 1134 return 0; 1135} 1136 1137/* 1138 Convert a single comedi channel-gain entry to a RTD520 table entry 1139*/ 1140static unsigned short rtdConvertChanGain(comedi_device *dev, 1141 unsigned int comediChan, int chanIndex) 1142{ /* index in channel list */ 1143 unsigned int chan, range, aref; 1144 unsigned short r = 0; 1145 1146 chan = CR_CHAN(comediChan); 1147 range = CR_RANGE(comediChan); 1148 aref = CR_AREF(comediChan); 1149 1150 r |= chan & 0xf; 1151 1152 /* Note: we also setup the channel list bipolar flag array */ 1153 if (range < thisboard->range10Start) { /* first batch are +-5 */ 1154 r |= 0x000; /* +-5 range */ 1155 r |= (range & 0x7) << 4; /* gain */ 1156 CHAN_ARRAY_SET(devpriv->chanBipolar, chanIndex); 1157 } else if (range < thisboard->rangeUniStart) { /* second batch are +-10 */ 1158 r |= 0x100; /* +-10 range */ 1159 r |= ((range - thisboard->range10Start) & 0x7) << 4; /* gain */ 1160 CHAN_ARRAY_SET(devpriv->chanBipolar, chanIndex); 1161 } else { /* last batch is +10 */ 1162 r |= 0x200; /* +10 range */ 1163 r |= ((range - thisboard->rangeUniStart) & 0x7) << 4; /* gain */ 1164 CHAN_ARRAY_CLEAR(devpriv->chanBipolar, chanIndex); 1165 } 1166 1167 switch (aref) { 1168 case AREF_GROUND: /* on-board ground */ 1169 break; 1170 1171 case AREF_COMMON: 1172 r |= 0x80; /* ref external analog common */ 1173 break; 1174 1175 case AREF_DIFF: 1176 r |= 0x400; /* differential inputs */ 1177 break; 1178 1179 case AREF_OTHER: /* ??? */ 1180 break; 1181 } 1182 /*printk ("chan=%d r=%d a=%d -> 0x%x\n", 1183 chan, range, aref, r); */ 1184 return r; 1185} 1186 1187/* 1188 Setup the channel-gain table from a comedi list 1189*/ 1190static void rtd_load_channelgain_list(comedi_device *dev, 1191 unsigned int n_chan, unsigned int *list) 1192{ 1193 if (n_chan > 1) { /* setup channel gain table */ 1194 int ii; 1195 RtdClearCGT(dev); 1196 RtdEnableCGT(dev, 1); /* enable table */ 1197 for (ii = 0; ii < n_chan; ii++) { 1198 RtdWriteCGTable(dev, rtdConvertChanGain(dev, list[ii], 1199 ii)); 1200 } 1201 } else { /* just use the channel gain latch */ 1202 RtdEnableCGT(dev, 0); /* disable table, enable latch */ 1203 RtdWriteCGLatch(dev, rtdConvertChanGain(dev, list[0], 0)); 1204 } 1205} 1206 1207/* determine fifo size by doing adc conversions until the fifo half 1208empty status flag clears */ 1209static int rtd520_probe_fifo_depth(comedi_device *dev) 1210{ 1211 lsampl_t chanspec = CR_PACK(0, 0, AREF_GROUND); 1212 unsigned i; 1213 static const unsigned limit = 0x2000; 1214 unsigned fifo_size = 0; 1215 1216 RtdAdcClearFifo(dev); 1217 rtd_load_channelgain_list(dev, 1, &chanspec); 1218 RtdAdcConversionSource(dev, 0); /* software */ 1219 /* convert samples */ 1220 for (i = 0; i < limit; ++i) { 1221 unsigned fifo_status; 1222 /* trigger conversion */ 1223 RtdAdcStart(dev); 1224 comedi_udelay(1); 1225 fifo_status = RtdFifoStatus(dev); 1226 if((fifo_status & FS_ADC_HEMPTY) == 0) { 1227 fifo_size = 2 * i; 1228 break; 1229 } 1230 } 1231 if(i == limit) 1232 { 1233 rt_printk("\ncomedi: %s: failed to probe fifo size.\n", DRV_NAME); 1234 return -EIO; 1235 } 1236 RtdAdcClearFifo(dev); 1237 if(fifo_size != 0x400 && fifo_size != 0x2000) 1238 { 1239 rt_printk("\ncomedi: %s: unexpected fifo size of %i, expected 1024 or 8192.\n", 1240 DRV_NAME, fifo_size); 1241 return -EIO; 1242 } 1243 return fifo_size; 1244} 1245 1246/* 1247 "instructions" read/write data in "one-shot" or "software-triggered" 1248 mode (simplest case). 1249 This doesnt use interrupts. 1250 1251 Note, we don't do any settling delays. Use a instruction list to 1252 select, delay, then read. 1253 */ 1254static int rtd_ai_rinsn(comedi_device *dev, 1255 comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) 1256{ 1257 int n, ii; 1258 int stat; 1259 1260 /* clear any old fifo data */ 1261 RtdAdcClearFifo(dev); 1262 1263 /* write channel to multiplexer and clear channel gain table */ 1264 rtd_load_channelgain_list(dev, 1, &insn->chanspec); 1265 1266 /* set conversion source */ 1267 RtdAdcConversionSource(dev, 0); /* software */ 1268 1269 /* convert n samples */ 1270 for (n = 0; n < insn->n; n++) { 1271 s16 d; 1272 /* trigger conversion */ 1273 RtdAdcStart(dev); 1274 1275 for (ii = 0; ii < RTD_ADC_TIMEOUT; ++ii) { 1276 stat = RtdFifoStatus(dev); 1277 if (stat & FS_ADC_NOT_EMPTY) /* 1 -> not empty */ 1278 break; 1279 WAIT_QUIETLY; 1280 } 1281 if (ii >= RTD_ADC_TIMEOUT) { 1282 DPRINTK("rtd520: Error: ADC never finished! FifoStatus=0x%x\n", stat ^ 0x6666); 1283 return -ETIMEDOUT; 1284 } 1285 1286 /* read data */ 1287 d = RtdAdcFifoGet(dev); /* get 2s comp value */ 1288 /*printk ("rtd520: Got 0x%x after %d usec\n", d, ii+1); */ 1289 d = d >> 3; /* low 3 bits are marker lines */ 1290 if (CHAN_ARRAY_TEST(devpriv->chanBipolar, 0)) { 1291 data[n] = d + 2048; /* convert to comedi unsigned data */ 1292 } else { 1293 data[n] = d; 1294 } 1295 } 1296 1297 /* return the number of samples read/written */ 1298 return n; 1299} 1300 1301/* 1302 Get what we know is there.... Fast! 1303 This uses 1/2 the bus cycles of read_dregs (below). 1304 1305 The manual claims that we can do a lword read, but it doesn't work here. 1306*/ 1307static int ai_read_n(comedi_device *dev, comedi_subdevice *s, int count) 1308{ 1309 int ii; 1310 1311 for (ii = 0; ii < count; ii++) { 1312 sampl_t sample; 1313 s16 d; 1314 1315 if (0 == devpriv->aiCount) { /* done */ 1316 d = RtdAdcFifoGet(dev); /* Read N and discard */ 1317 continue; 1318 } 1319#if 0 1320 if (0 == (RtdFifoStatus(dev) & FS_ADC_NOT_EMPTY)) { /* DEBUG */ 1321 DPRINTK("comedi: READ OOPS on %d of %d\n", ii + 1, 1322 count); 1323 break; 1324 } 1325#endif 1326 d = RtdAdcFifoGet(dev); /* get 2s comp value */ 1327 1328 d = d >> 3; /* low 3 bits are marker lines */ 1329 if (CHAN_ARRAY_TEST(devpriv->chanBipolar, s->async->cur_chan)) { 1330 sample = d + 2048; /* convert to comedi unsigned data */ 1331 } else { 1332 sample = d; 1333 } 1334 if (!comedi_buf_put(s->async, sample)) 1335 return -1; 1336 1337 if (devpriv->aiCount > 0) /* < 0, means read forever */ 1338 devpriv->aiCount--; 1339 } 1340 return 0; 1341} 1342 1343/* 1344 unknown amout of data is waiting in fifo. 1345*/ 1346static int ai_read_dregs(comedi_device *dev, comedi_subdevice *s) 1347{ 1348 while (RtdFifoStatus(dev) & FS_ADC_NOT_EMPTY) { /* 1 -> not empty */ 1349 sampl_t sample; 1350 s16 d = RtdAdcFifoGet(dev); /* get 2s comp value */ 1351 1352 if (0 == devpriv->aiCount) { /* done */ 1353 continue; /* read rest */ 1354 } 1355 1356 d = d >> 3; /* low 3 bits are marker lines */ 1357 if (CHAN_ARRAY_TEST(devpriv->chanBipolar, s->async->cur_chan)) { 1358 sample = d + 2048; /* convert to comedi unsigned data */ 1359 } else { 1360 sample = d; 1361 } 1362 if (!comedi_buf_put(s->async, sample)) 1363 return -1; 1364 1365 if (devpriv->aiCount > 0) /* < 0, means read forever */ 1366 devpriv->aiCount--; 1367 } 1368 return 0; 1369} 1370 1371#ifdef USE_DMA 1372/* 1373 Terminate a DMA transfer and wait for everything to quiet down 1374*/ 1375void abort_dma(comedi_device *dev, unsigned int channel) 1376{ /* DMA channel 0, 1 */ 1377 unsigned long dma_cs_addr; /* the control/status register */ 1378 uint8_t status; 1379 unsigned int ii; 1380 /* unsigned long flags; */ 1381 1382 dma_cs_addr = (unsigned long)devpriv->lcfg 1383 + ((channel == 0) ? LCFG_DMACSR0 : LCFG_DMACSR1); 1384 1385 /* spinlock for plx dma control/status reg */ 1386 /* comedi_spin_lock_irqsave( &dev->spinlock, flags ); */ 1387 1388 /* abort dma transfer if necessary */ 1389 status = readb(dma_cs_addr); 1390 if ((status & PLX_DMA_EN_BIT) == 0) { /* not enabled (Error?) */ 1391 DPRINTK("rtd520: AbortDma on non-active channel %d (0x%x)\n", 1392 channel, status); 1393 goto abortDmaExit; 1394 } 1395 1396 /* wait to make sure done bit is zero (needed?) */ 1397 for (ii = 0; (status & PLX_DMA_DONE_BIT) && ii < RTD_DMA_TIMEOUT; ii++) { 1398 WAIT_QUIETLY; 1399 status = readb(dma_cs_addr); 1400 } 1401 if (status & PLX_DMA_DONE_BIT) { 1402 printk("rtd520: Timeout waiting for dma %i done clear\n", 1403 channel); 1404 goto abortDmaExit; 1405 } 1406 1407 /* disable channel (required) */ 1408 writeb(0, dma_cs_addr); 1409 comedi_udelay(1); /* needed?? */ 1410 /* set abort bit for channel */ 1411 writeb(PLX_DMA_ABORT_BIT, dma_cs_addr); 1412 1413 /* wait for dma done bit to be set */ 1414 status = readb(dma_cs_addr); 1415 for (ii = 0; 1416 (status & PLX_DMA_DONE_BIT) == 0 && ii < RTD_DMA_TIMEOUT; 1417 ii++) { 1418 status = readb(dma_cs_addr); 1419 WAIT_QUIETLY; 1420 } 1421 if ((status & PLX_DMA_DONE_BIT) == 0) { 1422 printk("rtd520: Timeout waiting for dma %i done set\n", 1423 channel); 1424 } 1425 1426 abortDmaExit: 1427 /* comedi_spin_unlock_irqrestore( &dev->spinlock, flags ); */ 1428} 1429 1430/* 1431 Process what is in the DMA transfer buffer and pass to comedi 1432 Note: this is not re-entrant 1433*/ 1434static int ai_process_dma(comedi_device *dev, comedi_subdevice *s) 1435{ 1436 int ii, n; 1437 s16 *dp; 1438 1439 if (devpriv->aiCount == 0) /* transfer already complete */ 1440 return 0; 1441 1442 dp = devpriv->dma0Buff[devpriv->dma0Offset]; 1443 for (ii = 0; ii < devpriv->fifoLen / 2;) { /* convert samples */ 1444 sampl_t sample; 1445 1446 if (CHAN_ARRAY_TEST(devpriv->chanBipolar, s->async->cur_chan)) { 1447 sample = (*dp >> 3) + 2048; /* convert to comedi unsigned data */ 1448 } else { 1449 sample = *dp >> 3; /* low 3 bits are marker lines */ 1450 } 1451 *dp++ = sample; /* put processed value back */ 1452 1453 if (++s->async->cur_chan >= s->async->cmd.chanlist_len) 1454 s->async->cur_chan = 0; 1455 1456 ++ii; /* number ready to transfer */ 1457 if (devpriv->aiCount > 0) { /* < 0, means read forever */ 1458 if (--devpriv->aiCount == 0) { /* done */ 1459 /*DPRINTK ("rtd520: Final %d samples\n", ii); */ 1460 break; 1461 } 1462 } 1463 } 1464 1465 /* now pass the whole array to the comedi buffer */ 1466 dp = devpriv->dma0Buff[devpriv->dma0Offset]; 1467 n = comedi_buf_write_alloc(s->async, ii * sizeof(s16)); 1468 if (n < (ii * sizeof(s16))) { /* any residual is an error */ 1469 DPRINTK("rtd520:ai_process_dma buffer overflow %d samples!\n", 1470 ii - (n / sizeof(s16))); 1471 s->async->events |= COMEDI_CB_ERROR; 1472 return -1; 1473 } 1474 comedi_buf_memcpy_to(s->async, 0, dp, n); 1475 comedi_buf_write_free(s->async, n); 1476 1477 /* always at least 1 scan -- 1/2 FIFO is larger than our max scan list */ 1478 s->async->events |= COMEDI_CB_BLOCK | COMEDI_CB_EOS; 1479 1480 if (++devpriv->dma0Offset >= DMA_CHAIN_COUNT) { /* next buffer */ 1481 devpriv->dma0Offset = 0; 1482 } 1483 return 0; 1484} 1485#endif /* USE_DMA */ 1486 1487/* 1488 Handle all rtd520 interrupts. 1489 Runs atomically and is never re-entered. 1490 This is a "slow handler"; other interrupts may be active. 1491 The data conversion may someday happen in a "bottom half". 1492*/ 1493static irqreturn_t rtd_interrupt(int irq, /* interrupt number (ignored) */ 1494 void *d /* our data */ 1495 PT_REGS_ARG) 1496{ /* cpu context (ignored) */ 1497 comedi_device *dev = d; /* must be called "dev" for devpriv */ 1498 u16 status; 1499 u16 fifoStatus; 1500 comedi_subdevice *s = dev->subdevices + 0; /* analog in subdevice */ 1501 1502 if (!dev->attached) { 1503 return IRQ_NONE; 1504 } 1505 1506 devpriv->intCount++; /* DEBUG statistics */ 1507 1508 fifoStatus = RtdFifoStatus(dev); 1509 /* check for FIFO full, this automatically halts the ADC! */ 1510 if (!(fifoStatus & FS_ADC_NOT_FULL)) { /* 0 -> full */ 1511 DPRINTK("rtd520: FIFO full! fifo_status=0x%x\n", (fifoStatus ^ 0x6666) & 0x7777); /* should be all 0s */ 1512 goto abortTransfer; 1513 } 1514#ifdef USE_DMA 1515 if (devpriv->flags & DMA0_ACTIVE) { /* Check DMA */ 1516 u32 istatus = RtdPlxInterruptRead(dev); 1517 1518 if (istatus & ICS_DMA0_A) { 1519 if (ai_process_dma(dev, s) < 0) { 1520 DPRINTK("rtd520: comedi read buffer overflow (DMA) with %ld to go!\n", devpriv->aiCount); 1521 RtdDma0Control(dev, 1522 (devpriv-> 1523 dma0Control & 1524 ~PLX_DMA_START_BIT) 1525 | PLX_CLEAR_DMA_INTR_BIT); 1526 goto abortTransfer; 1527 } 1528 1529 /*DPRINTK ("rtd520: DMA transfer: %ld to go, istatus %x\n", 1530 devpriv->aiCount, istatus); */ 1531 RtdDma0Control(dev, 1532 (devpriv->dma0Control & ~PLX_DMA_START_BIT) 1533 | PLX_CLEAR_DMA_INTR_BIT); 1534 if (0 == devpriv->aiCount) { /* counted down */ 1535 DPRINTK("rtd520: Samples Done (DMA).\n"); 1536 goto transferDone; 1537 } 1538 comedi_event(dev, s); 1539 } else { 1540 /*DPRINTK ("rtd520: No DMA ready: istatus %x\n", istatus); */ 1541 } 1542 } 1543 /* Fall through and check for other interrupt sources */ 1544#endif /* USE_DMA */ 1545 1546 status = RtdInterruptStatus(dev); 1547 /* if interrupt was not caused by our board, or handled above */ 1548 if (0 == status) { 1549 return IRQ_HANDLED; 1550 } 1551 1552 if (status & IRQM_ADC_ABOUT_CNT) { /* sample count -> read FIFO */ 1553 /* since the priority interrupt controller may have queued a sample 1554 counter interrupt, even though we have already finished, 1555 we must handle the possibility that there is no data here */ 1556 if (!(fifoStatus & FS_ADC_HEMPTY)) { /* 0 -> 1/2 full */ 1557 /*DPRINTK("rtd520: Sample int, reading 1/2FIFO. fifo_status 0x%x\n", 1558 (fifoStatus ^ 0x6666) & 0x7777); */ 1559 if (ai_read_n(dev, s, devpriv->fifoLen / 2) < 0) { 1560 DPRINTK("rtd520: comedi read buffer overflow (1/2FIFO) with %ld to go!\n", devpriv->aiCount); 1561 goto abortTransfer; 1562 } 1563 if (0 == devpriv->aiCount) { /* counted down */ 1564 DPRINTK("rtd520: Samples Done (1/2). fifo_status was 0x%x\n", (fifoStatus ^ 0x6666) & 0x7777); /* should be all 0s */ 1565 goto transferDone; 1566 } 1567 comedi_event(dev, s); 1568 } else if (devpriv->transCount > 0) { /* read often */ 1569 /*DPRINTK("rtd520: Sample int, reading %d fifo_status 0x%x\n", 1570 devpriv->transCount, (fifoStatus ^ 0x6666) & 0x7777); */ 1571 if (fifoStatus & FS_ADC_NOT_EMPTY) { /* 1 -> not empty */ 1572 if (ai_read_n(dev, s, devpriv->transCount) < 0) { 1573 DPRINTK("rtd520: comedi read buffer overflow (N) with %ld to go!\n", devpriv->aiCount); 1574 goto abortTransfer; 1575 } 1576 if (0 == devpriv->aiCount) { /* counted down */ 1577 DPRINTK("rtd520: Samples Done (N). fifo_status was 0x%x\n", (fifoStatus ^ 0x6666) & 0x7777); 1578 goto transferDone; 1579 } 1580 comedi_event(dev, s); 1581 } 1582 } else { /* wait for 1/2 FIFO (old) */ 1583 DPRINTK("rtd520: Sample int. Wait for 1/2. fifo_status 0x%x\n", (fifoStatus ^ 0x6666) & 0x7777); 1584 } 1585 } else { 1586 DPRINTK("rtd520: unknown interrupt source!\n"); 1587 } 1588 1589 if (0xffff & RtdInterruptOverrunStatus(dev)) { /* interrupt overrun */ 1590 DPRINTK("rtd520: Interrupt overrun with %ld to go! over_status=0x%x\n", devpriv->aiCount, 0xffff & RtdInterruptOverrunStatus(dev)); 1591 goto abortTransfer; 1592 } 1593 1594 /* clear the interrupt */ 1595 RtdInterruptClearMask(dev, status); 1596 RtdInterruptClear(dev); 1597 return IRQ_HANDLED; 1598 1599 abortTransfer: 1600 RtdAdcClearFifo(dev); /* clears full flag */ 1601 s->async->events |= COMEDI_CB_ERROR; 1602 devpriv->aiCount = 0; /* stop and don't transfer any more */ 1603 /* fall into transferDone */ 1604 1605 transferDone: 1606 RtdPacerStopSource(dev, 0); /* stop on SOFTWARE stop */ 1607 RtdPacerStop(dev); /* Stop PACER */ 1608 RtdAdcConversionSource(dev, 0); /* software trigger only */ 1609 RtdInterruptMask(dev, 0); /* mask out SAMPLE */ 1610#ifdef USE_DMA 1611 if (devpriv->flags & DMA0_ACTIVE) { 1612 RtdPlxInterruptWrite(dev, /* disable any more interrupts */ 1613 RtdPlxInterruptRead(dev) & ~ICS_DMA0_E); 1614 abort_dma(dev, 0); 1615 devpriv->flags &= ~DMA0_ACTIVE; 1616 /* if Using DMA, then we should have read everything by now */ 1617 if (devpriv->aiCount > 0) { 1618 DPRINTK("rtd520: Lost DMA data! %ld remain\n", 1619 devpriv->aiCount); 1620 } 1621 } 1622#endif /* USE_DMA */ 1623 1624 if (devpriv->aiCount > 0) { /* there shouldn't be anything left */ 1625 fifoStatus = RtdFifoStatus(dev); 1626 DPRINTK("rtd520: Finishing up. %ld remain, fifoStat=%x\n", devpriv->aiCount, (fifoStatus ^ 0x6666) & 0x7777); /* should read all 0s */ 1627 ai_read_dregs(dev, s); /* read anything left in FIFO */ 1628 } 1629 1630 s->async->events |= COMEDI_CB_EOA; /* signal end to comedi */ 1631 comedi_event(dev, s); 1632 1633 /* clear the interrupt */ 1634 status = RtdInterruptStatus(dev); 1635 RtdInterruptClearMask(dev, status); 1636 RtdInterruptClear(dev); 1637 1638 fifoStatus = RtdFifoStatus(dev); /* DEBUG */ 1639 DPRINTK("rtd520: Acquisition complete. %ld ints, intStat=%x, overStat=%x\n", devpriv->intCount, status, 0xffff & RtdInterruptOverrunStatus(dev)); 1640 1641 return IRQ_HANDLED; 1642} 1643 1644#if 0 1645/* 1646 return the number of samples available 1647*/ 1648static int rtd_ai_poll(comedi_device *dev, comedi_subdevice *s) 1649{ 1650 /* TODO: This needs to mask interrupts, read_dregs, and then re-enable */ 1651 /* Not sure what to do if DMA is active */ 1652 return s->async->buf_write_count - s->async->buf_read_count; 1653} 1654#endif 1655 1656/* 1657 cmdtest tests a particular command to see if it is valid. 1658 Using the cmdtest ioctl, a user can create a valid cmd 1659 and then have it executed by the cmd ioctl (asyncronously). 1660 1661 cmdtest returns 1,2,3,4 or 0, depending on which tests 1662 the command passes. 1663*/ 1664 1665static int rtd_ai_cmdtest(comedi_device *dev, 1666 comedi_subdevice *s, comedi_cmd *cmd) 1667{ 1668 int err = 0; 1669 int tmp; 1670 1671 /* step 1: make sure trigger sources are trivially valid */ 1672 1673 tmp = cmd->start_src; 1674 cmd->start_src &= TRIG_NOW; 1675 if (!cmd->start_src || tmp != cmd->start_src) { 1676 err++; 1677 } 1678 1679 tmp = cmd->scan_begin_src; 1680 cmd->scan_begin_src &= TRIG_TIMER | TRIG_EXT; 1681 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src) { 1682 err++; 1683 } 1684 1685 tmp = cmd->convert_src; 1686 cmd->convert_src &= TRIG_TIMER | TRIG_EXT; 1687 if (!cmd->convert_src || tmp != cmd->convert_src) { 1688 err++; 1689 } 1690 1691 tmp = cmd->scan_end_src; 1692 cmd->scan_end_src &= TRIG_COUNT; 1693 if (!cmd->scan_end_src || tmp != cmd->scan_end_src) { 1694 err++; 1695 } 1696 1697 tmp = cmd->stop_src; 1698 cmd->stop_src &= TRIG_COUNT | TRIG_NONE; 1699 if (!cmd->stop_src || tmp != cmd->stop_src) { 1700 err++; 1701 } 1702 1703 if (err) 1704 return 1; 1705 1706 /* step 2: make sure trigger sources are unique 1707 and mutually compatible */ 1708 /* note that mutual compatiblity is not an issue here */ 1709 if (cmd->scan_begin_src != TRIG_TIMER && 1710 cmd->scan_begin_src != TRIG_EXT) { 1711 err++; 1712 } 1713 if (cmd->convert_src != TRIG_TIMER && cmd->convert_src != TRIG_EXT) { 1714 err++; 1715 } 1716 if (cmd->stop_src != TRIG_COUNT && cmd->stop_src != TRIG_NONE) { 1717 err++; 1718 } 1719 1720 if (err) { 1721 return 2; 1722 } 1723 1724 /* step 3: make sure arguments are trivially compatible */ 1725 1726 if (cmd->start_arg != 0) { 1727 cmd->start_arg = 0; 1728 err++; 1729 } 1730 1731 if (cmd->scan_begin_src == TRIG_TIMER) { 1732 /* Note: these are time periods, not actual rates */ 1733 if (1 == cmd->chanlist_len) { /* no scanning */ 1734 if (cmd->scan_begin_arg < RTD_MAX_SPEED_1) { 1735 cmd->scan_begin_arg = RTD_MAX_SPEED_1; 1736 rtd_ns_to_timer(&cmd->scan_begin_arg, 1737 TRIG_ROUND_UP); 1738 err++; 1739 } 1740 if (cmd->scan_begin_arg > RTD_MIN_SPEED_1) { 1741 cmd->scan_begin_arg = RTD_MIN_SPEED_1; 1742 rtd_ns_to_timer(&cmd->scan_begin_arg, 1743 TRIG_ROUND_DOWN); 1744 err++; 1745 } 1746 } else { 1747 if (cmd->scan_begin_arg < RTD_MAX_SPEED) { 1748 cmd->scan_begin_arg = RTD_MAX_SPEED; 1749 rtd_ns_to_timer(&cmd->scan_begin_arg, 1750 TRIG_ROUND_UP); 1751 err++; 1752 } 1753 if (cmd->scan_begin_arg > RTD_MIN_SPEED) { 1754 cmd->scan_begin_arg = RTD_MIN_SPEED; 1755 rtd_ns_to_timer(&cmd->scan_begin_arg, 1756 TRIG_ROUND_DOWN); 1757 err++; 1758 } 1759 } 1760 } else { 1761 /* external trigger */ 1762 /* should be level/edge, hi/lo specification here */ 1763 /* should specify multiple external triggers */ 1764 if (cmd->scan_begin_arg > 9) { 1765 cmd->scan_begin_arg = 9; 1766 err++; 1767 } 1768 } 1769 if (cmd->convert_src == TRIG_TIMER) { 1770 if (1 == cmd->chanlist_len) { /* no scanning */ 1771 if (cmd->convert_arg < RTD_MAX_SPEED_1) { 1772 cmd->convert_arg = RTD_MAX_SPEED_1; 1773 rtd_ns_to_timer(&cmd->convert_arg, 1774 TRIG_ROUND_UP); 1775 err++; 1776 } 1777 if (cmd->convert_arg > RTD_MIN_SPEED_1) { 1778 cmd->convert_arg = RTD_MIN_SPEED_1; 1779 rtd_ns_to_timer(&cmd->convert_arg, 1780 TRIG_ROUND_DOWN); 1781 err++; 1782 } 1783 } else { 1784 if (cmd->convert_arg < RTD_MAX_SPEED) { 1785 cmd->convert_arg = RTD_MAX_SPEED; 1786 rtd_ns_to_timer(&cmd->convert_arg, 1787 TRIG_ROUND_UP); 1788 err++; 1789 } 1790 if (cmd->convert_arg > RTD_MIN_SPEED) { 1791 cmd->convert_arg = RTD_MIN_SPEED; 1792 rtd_ns_to_timer(&cmd->convert_arg, 1793 TRIG_ROUND_DOWN); 1794 err++; 1795 } 1796 } 1797 } else { 1798 /* external trigger */ 1799 /* see above */ 1800 if (cmd->convert_arg > 9) { 1801 cmd->convert_arg = 9; 1802 err++; 1803 } 1804 } 1805 1806#if 0 1807 if (cmd->scan_end_arg != cmd->chanlist_len) { 1808 cmd->scan_end_arg = cmd->chanlist_len; 1809 err++; 1810 } 1811#endif 1812 if (cmd->stop_src == TRIG_COUNT) { 1813 /* TODO check for rounding error due to counter wrap */ 1814 1815 } else { 1816 /* TRIG_NONE */ 1817 if (cmd->stop_arg != 0) { 1818 cmd->stop_arg = 0; 1819 err++; 1820 } 1821 } 1822 1823 if (err) { 1824 return 3; 1825 } 1826 1827 /* step 4: fix up any arguments */ 1828 1829 if (cmd->chanlist_len > RTD_MAX_CHANLIST) { 1830 cmd->chanlist_len = RTD_MAX_CHANLIST; 1831 err++; 1832 } 1833 if (cmd->scan_begin_src == TRIG_TIMER) { 1834 tmp = cmd->scan_begin_arg; 1835 rtd_ns_to_timer(&cmd->scan_begin_arg, 1836 cmd->flags & TRIG_ROUND_MASK); 1837 if (tmp != cmd->scan_begin_arg) { 1838 err++; 1839 } 1840 } 1841 if (cmd->convert_src == TRIG_TIMER) { 1842 tmp = cmd->convert_arg; 1843 rtd_ns_to_timer(&cmd->convert_arg, 1844 cmd->flags & TRIG_ROUND_MASK); 1845 if (tmp != cmd->convert_arg) { 1846 err++; 1847 } 1848 if (cmd->scan_begin_src == TRIG_TIMER 1849 && (cmd->scan_begin_arg 1850 < (cmd->convert_arg * cmd->scan_end_arg))) { 1851 cmd->scan_begin_arg = 1852 cmd->convert_arg * cmd->scan_end_arg; 1853 err++; 1854 } 1855 } 1856 1857 if (err) { 1858 return 4; 1859 } 1860 1861 return 0; 1862} 1863 1864/* 1865 Execute a analog in command with many possible triggering options. 1866 The data get stored in the async structure of the subdevice. 1867 This is usually done by an interrupt handler. 1868 Userland gets to the data using read calls. 1869*/ 1870static int rtd_ai_cmd(comedi_device *dev, comedi_subdevice *s) 1871{ 1872 comedi_cmd *cmd = &s->async->cmd; 1873 int timer; 1874 1875 /* stop anything currently running */ 1876 RtdPacerStopSource(dev, 0); /* stop on SOFTWARE stop */ 1877 RtdPacerStop(dev); /* make sure PACER is stopped */ 1878 RtdAdcConversionSource(dev, 0); /* software trigger only */ 1879 RtdInterruptMask(dev, 0); 1880#ifdef USE_DMA 1881 if (devpriv->flags & DMA0_ACTIVE) { /* cancel anything running */ 1882 RtdPlxInterruptWrite(dev, /* disable any more interrupts */ 1883 RtdPlxInterruptRead(dev) & ~ICS_DMA0_E); 1884 abort_dma(dev, 0); 1885 devpriv->flags &= ~DMA0_ACTIVE; 1886 if (RtdPlxInterruptRead(dev) & ICS_DMA0_A) { /*clear pending int */ 1887 RtdDma0Control(dev, PLX_CLEAR_DMA_INTR_BIT); 1888 } 1889 } 1890 RtdDma0Reset(dev); /* reset onboard state */ 1891#endif /* USE_DMA */ 1892 RtdAdcClearFifo(dev); /* clear any old data */ 1893 RtdInterruptOverrunClear(dev); 1894 devpriv->intCount = 0; 1895 1896 if (!dev->irq) { /* we need interrupts for this */ 1897 DPRINTK("rtd520: ERROR! No interrupt available!\n"); 1898 return -ENXIO; 1899 } 1900 1901 /* start configuration */ 1902 /* load channel list and reset CGT */ 1903 rtd_load_channelgain_list(dev, cmd->chanlist_len, cmd->chanlist); 1904 1905 /* setup the common case and override if needed */ 1906 if (cmd->chanlist_len > 1) { 1907 /*DPRINTK ("rtd520: Multi channel setup\n"); */ 1908 RtdPacerStartSource(dev, 0); /* software triggers pacer */ 1909 RtdBurstStartSource(dev, 1); /* PACER triggers burst */ 1910 RtdAdcConversionSource(dev, 2); /* BURST triggers ADC */ 1911 } else { /* single channel */ 1912 /*DPRINTK ("rtd520: single channel setup\n"); */ 1913 RtdPacerStartSource(dev, 0); /* software triggers pacer */ 1914 RtdAdcConversionSource(dev, 1); /* PACER triggers ADC */ 1915 } 1916 RtdAboutCounter(dev, devpriv->fifoLen / 2 - 1); /* 1/2 FIFO */ 1917 1918 if (TRIG_TIMER == cmd->scan_begin_src) { 1919 /* scan_begin_arg is in nanoseconds */ 1920 /* find out how many samples to wait before transferring */ 1921 if (cmd->flags & TRIG_WAKE_EOS) { 1922 /* this may generate un-sustainable interrupt rates */ 1923 /* the application is responsible for doing the right thing */ 1924 devpriv->transCount = cmd->chanlist_len; 1925 devpriv->flags |= SEND_EOS; 1926 } else { 1927 /* arrange to transfer data periodically */ 1928 devpriv->transCount 1929 = 1930 (TRANS_TARGET_PERIOD * cmd->chanlist_len) / 1931 cmd->scan_begin_arg; 1932 if (devpriv->transCount < cmd->chanlist_len) { 1933 /* tranfer after each scan (and avoid 0) */ 1934 devpriv->transCount = cmd->chanlist_len; 1935 } else { /* make a multiple of scan length */ 1936 devpriv->transCount = 1937 (devpriv->transCount + 1938 cmd->chanlist_len - 1) 1939 / cmd->chanlist_len; 1940 devpriv->transCount *= cmd->chanlist_len; 1941 } 1942 devpriv->flags |= SEND_EOS; 1943 } 1944 if (devpriv->transCount >= (devpriv->fifoLen / 2)) { 1945 /* out of counter range, use 1/2 fifo instead */ 1946 devpriv->transCount = 0; 1947 devpriv->flags &= ~SEND_EOS; 1948 } else { 1949 /* interrupt for each tranfer */ 1950 RtdAboutCounter(dev, devpriv->transCount - 1); 1951 } 1952 1953 DPRINTK("rtd520: scanLen=%d tranferCount=%d fifoLen=%d\n scanTime(ns)=%d flags=0x%x\n", cmd->chanlist_len, devpriv->transCount, devpriv->fifoLen, cmd->scan_begin_arg, devpriv->flags); 1954 } else { /* unknown timing, just use 1/2 FIFO */ 1955 devpriv->transCount = 0; 1956 devpriv->flags &= ~SEND_EOS; 1957 } 1958 RtdPacerClockSource(dev, 1); /* use INTERNAL 8Mhz clock source */ 1959 RtdAboutStopEnable(dev, 1); /* just interrupt, dont stop */ 1960 1961 /* BUG??? these look like enumerated values, but they are bit fields */ 1962 1963 /* First, setup when to stop */ 1964 switch (cmd->stop_src) { 1965 case TRIG_COUNT: /* stop after N scans */ 1966 devpriv->aiCount = cmd->stop_arg * cmd->chanlist_len; 1967 if ((devpriv->transCount > 0) 1968 && (devpriv->transCount > devpriv->aiCount)) { 1969 devpriv->transCount = devpriv->aiCount; 1970 } 1971 break; 1972 1973 case TRIG_NONE: /* stop when cancel is called */ 1974 devpriv->aiCount = -1; /* read forever */ 1975 break; 1976 1977 default: 1978 DPRINTK("rtd520: Warning! ignoring stop_src mode %d\n", 1979 cmd->stop_src); 1980 } 1981 1982 /* Scan timing */ 1983 switch (cmd->scan_begin_src) { 1984 case TRIG_TIMER: /* periodic scanning */ 1985 timer = rtd_ns_to_timer(&cmd->scan_begin_arg, 1986 TRIG_ROUND_NEAREST); 1987 /* set PACER clock */ 1988 /*DPRINTK ("rtd520: loading %d into pacer\n", timer); */ 1989 RtdPacerCounter(dev, timer); 1990 1991 break; 1992 1993 case TRIG_EXT: 1994 RtdPacerStartSource(dev, 1); /* EXTERNALy trigger pacer */ 1995 break; 1996 1997 default: 1998 DPRINTK("rtd520: Warning! ignoring scan_begin_src mode %d\n", 1999 cmd->scan_begin_src); 2000 } 2001 2002 /* Sample timing within a scan */ 2003 switch (cmd->convert_src) { 2004 case TRIG_TIMER: /* periodic */ 2005 if (cmd->chanlist_len > 1) { /* only needed for multi-channel */ 2006 timer = rtd_ns_to_timer(&cmd->convert_arg, 2007 TRIG_ROUND_NEAREST); 2008 /* setup BURST clock */ 2009 /*DPRINTK ("rtd520: loading %d into burst\n", timer); */ 2010 RtdBurstCounter(dev, timer); 2011 } 2012 2013 break; 2014 2015 case TRIG_EXT: /* external */ 2016 RtdBurstStartSource(dev, 2); /* EXTERNALy trigger burst */ 2017 break; 2018 2019 default: 2020 DPRINTK("rtd520: Warning! ignoring convert_src mode %d\n", 2021 cmd->convert_src); 2022 } 2023 /* end configuration */ 2024 2025 /* This doesn't seem to work. There is no way to clear an interrupt 2026 that the priority controller has queued! */ 2027 RtdInterruptClearMask(dev, ~0); /* clear any existing flags */ 2028 RtdInterruptClear(dev); 2029 2030 /* TODO: allow multiple interrupt sources */ 2031 if (devpriv->transCount > 0) { /* transfer every N samples */ 2032 RtdInterruptMask(dev, IRQM_ADC_ABOUT_CNT); 2033 DPRINTK("rtd520: Transferring every %d\n", devpriv->transCount); 2034 } else { /* 1/2 FIFO transfers */ 2035#ifdef USE_DMA 2036 devpriv->flags |= DMA0_ACTIVE; 2037 2038 /* point to first transfer in ring */ 2039 devpriv->dma0Offset = 0; 2040 RtdDma0Mode(dev, DMA_MODE_BITS); 2041 RtdDma0Next(dev, /* point to first block */ 2042 devpriv->dma0Chain[DMA_CHAIN_COUNT - 1].next); 2043 RtdDma0Source(dev, DMAS_ADFIFO_HALF_FULL); /* set DMA trigger source */ 2044 2045 RtdPlxInterruptWrite(dev, /* enable interrupt */ 2046 RtdPlxInterruptRead(dev) | ICS_DMA0_E); 2047 /* Must be 2 steps. See PLX app note about "Starting a DMA transfer" */ 2048 RtdDma0Control(dev, PLX_DMA_EN_BIT); /* enable DMA (clear INTR?) */ 2049 RtdDma0Control(dev, PLX_DMA_EN_BIT | PLX_DMA_START_BIT); /*start DMA */ 2050 DPRINTK("rtd520: Using DMA0 transfers. plxInt %x RtdInt %x\n", 2051 RtdPlxInterruptRead(dev), devpriv->intMask); 2052#else /* USE_DMA */ 2053 RtdInterruptMask(dev, IRQM_ADC_ABOUT_CNT); 2054 DPRINTK("rtd520: Transferring every 1/2 FIFO\n"); 2055#endif /* USE_DMA */ 2056 } 2057 2058 /* BUG: start_src is ASSUMED to be TRIG_NOW */ 2059 /* BUG? it seems like things are running before the "start" */ 2060 RtdPacerStart(dev); /* Start PACER */ 2061 return 0; 2062} 2063 2064/* 2065 Stop a running data aquisition. 2066*/ 2067static int rtd_ai_cancel(comedi_device *dev, comedi_subdevice *s) 2068{ 2069 u16 status; 2070 2071 RtdPacerStopSource(dev, 0); /* stop on SOFTWARE stop */ 2072 RtdPacerStop(dev); /* Stop PACER */ 2073 RtdAdcConversionSource(dev, 0); /* software trigger only */ 2074 RtdInterruptMask(dev, 0); 2075 devpriv->aiCount = 0; /* stop and don't transfer any more */ 2076#ifdef USE_DMA 2077 if (devpriv->flags & DMA0_ACTIVE) { 2078 RtdPlxInterruptWrite(dev, /* disable any more interrupts */ 2079 RtdPlxInterruptRead(dev) & ~ICS_DMA0_E); 2080 abort_dma(dev, 0); 2081 devpriv->flags &= ~DMA0_ACTIVE; 2082 } 2083#endif /* USE_DMA */ 2084 status = RtdInterruptStatus(dev); 2085 DPRINTK("rtd520: Acquisition canceled. %ld ints, intStat=%x, overStat=%x\n", devpriv->intCount, status, 0xffff & RtdInterruptOverrunStatus(dev)); 2086 return 0; 2087} 2088 2089/* 2090 Given a desired period and the clock period (both in ns), 2091 return the proper counter value (divider-1). 2092 Sets the original period to be the true value. 2093 Note: you have to check if the value is larger than the counter range! 2094*/ 2095static int rtd_ns_to_timer_base(unsigned int *nanosec, /* desired period (in ns) */ 2096 int round_mode, int base) 2097{ /* clock period (in ns) */ 2098 int divider; 2099 2100 switch (round_mode) { 2101 case TRIG_ROUND_NEAREST: 2102 default: 2103 divider = (*nanosec + base / 2) / base; 2104 break; 2105 case TRIG_ROUND_DOWN: 2106 divider = (*nanosec) / base; 2107 break; 2108 case TRIG_ROUND_UP: 2109 divider = (*nanosec + base - 1) / base; 2110 break; 2111 } 2112 if (divider < 2) 2113 divider = 2; /* min is divide by 2 */ 2114 2115 /* Note: we don't check for max, because different timers 2116 have different ranges */ 2117 2118 *nanosec = base * divider; 2119 return divider - 1; /* countdown is divisor+1 */ 2120} 2121 2122/* 2123 Given a desired period (in ns), 2124 return the proper counter value (divider-1) for the internal clock. 2125 Sets the original period to be the true value. 2126*/ 2127static int rtd_ns_to_timer(unsigned int *ns, int round_mode) 2128{ 2129 return rtd_ns_to_timer_base(ns, round_mode, RTD_CLOCK_BASE); 2130} 2131 2132/* 2133 Output one (or more) analog values to a single port as fast as possible. 2134*/ 2135static int rtd_ao_winsn(comedi_device *dev, 2136 comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) 2137{ 2138 int i; 2139 int chan = CR_CHAN(insn->chanspec); 2140 int range = CR_RANGE(insn->chanspec); 2141 2142 /* Configure the output range (table index matches the range values) */ 2143 RtdDacRange(dev, chan, range); 2144 2145 /* Writing a list of values to an AO channel is probably not 2146 * very useful, but that's how the interface is defined. */ 2147 for (i = 0; i < insn->n; ++i) { 2148 int val = data[i] << 3; 2149 int stat = 0; /* initialize to avoid bogus warning */ 2150 int ii; 2151 2152 /* VERIFY: comedi range and offset conversions */ 2153 2154 if ((range > 1) /* bipolar */ 2155 &&(data[i] < 2048)) { 2156 /* offset and sign extend */ 2157 val = (((int)data[i]) - 2048) << 3; 2158 } else { /* unipolor */ 2159 val = data[i] << 3; 2160 } 2161 2162 DPRINTK("comedi: rtd520 DAC chan=%d range=%d writing %d as 0x%x\n", chan, range, data[i], val); 2163 2164 /* a typical programming sequence */ 2165 RtdDacFifoPut(dev, chan, val); /* put the value in */ 2166 RtdDacUpdate(dev, chan); /* trigger the conversion */ 2167 2168 devpriv->aoValue[chan] = data[i]; /* save for read back */ 2169 2170 for (ii = 0; ii < RTD_DAC_TIMEOUT; ++ii) { 2171 stat = RtdFifoStatus(dev); 2172 /* 1 -> not empty */ 2173 if (stat & ((0 == chan) ? FS_DAC1_NOT_EMPTY : 2174 FS_DAC2_NOT_EMPTY)) 2175 break; 2176 WAIT_QUIETLY; 2177 } 2178 if (ii >= RTD_DAC_TIMEOUT) { 2179 DPRINTK("rtd520: Error: DAC never finished! FifoStatus=0x%x\n", stat ^ 0x6666); 2180 return -ETIMEDOUT; 2181 } 2182 } 2183 2184 /* return the number of samples read/written */ 2185 return i; 2186} 2187 2188/* AO subdevices should have a read insn as well as a write insn. 2189 * Usually this means copying a value stored in devpriv. */ 2190static int rtd_ao_rinsn(comedi_device *dev, 2191 comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) 2192{ 2193 int i; 2194 int chan = CR_CHAN(insn->chanspec); 2195 2196 for (i = 0; i < insn->n; i++) { 2197 data[i] = devpriv->aoValue[chan]; 2198 } 2199 2200 return i; 2201} 2202 2203/* 2204 Write a masked set of bits and the read back the port. 2205 We track what the bits should be (i.e. we don't read the port first). 2206 2207 DIO devices are slightly special. Although it is possible to 2208 * implement the insn_read/insn_write interface, it is much more 2209 * useful to applications if you implement the insn_bits interface. 2210 * This allows packed reading/writing of the DIO channels. The 2211 * comedi core can convert between insn_bits and insn_read/write 2212 */ 2213static int rtd_dio_insn_bits(comedi_device *dev, 2214 comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) 2215{ 2216 if (insn->n != 2) 2217 return -EINVAL; 2218 2219 /* The insn data is a mask in data[0] and the new data 2220 * in data[1], each channel cooresponding to a bit. */ 2221 if (data[0]) { 2222 s->state &= ~data[0]; 2223 s->state |= data[0] & data[1]; 2224 2225 /* Write out the new digital output lines */ 2226 RtdDio0Write(dev, s->state); 2227 } 2228 /* on return, data[1] contains the value of the digital 2229 * input lines. */ 2230 data[1] = RtdDio0Read(dev); 2231 2232 /*DPRINTK("rtd520:port_0 wrote: 0x%x read: 0x%x\n", s->state, data[1]); */ 2233 2234 return 2; 2235} 2236 2237/* 2238 Configure one bit on a IO port as Input or Output (hence the name :-). 2239*/ 2240static int rtd_dio_insn_config(comedi_device *dev, 2241 comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) 2242{ 2243 int chan = CR_CHAN(insn->chanspec); 2244 2245 /* The input or output configuration of each digital line is 2246 * configured by a special insn_config instruction. chanspec 2247 * contains the channel to be changed, and data[0] contains the 2248 * value COMEDI_INPUT or COMEDI_OUTPUT. */ 2249 switch (data[0]) { 2250 case INSN_CONFIG_DIO_OUTPUT: 2251 s->io_bits |= 1 << chan; /* 1 means Out */ 2252 break; 2253 case INSN_CONFIG_DIO_INPUT: 2254 s->io_bits &= ~(1 << chan); 2255 break; 2256 case INSN_CONFIG_DIO_QUERY: 2257 data[1] = 2258 (s-> 2259 io_bits & (1 << chan)) ? COMEDI_OUTPUT : COMEDI_INPUT; 2260 return insn->n; 2261 break; 2262 default: 2263 return -EINVAL; 2264 } 2265 2266 DPRINTK("rtd520: port_0_direction=0x%x (1 means out)\n", s->io_bits); 2267 /* TODO support digital match interrupts and strobes */ 2268 RtdDioStatusWrite(dev, 0x01); /* make Dio0Ctrl point to direction */ 2269 RtdDio0CtrlWrite(dev, s->io_bits); /* set direction 1 means Out */ 2270 RtdDioStatusWrite(dev, 0); /* make Dio0Ctrl clear interrupts */ 2271 2272 /* port1 can only be all input or all output */ 2273 2274 /* there are also 2 user input lines and 2 user output lines */ 2275 2276 return 1; 2277} 2278 2279/* 2280 * A convenient macro that defines init_module() and cleanup_module(), 2281 * as necessary. 2282 */ 2283COMEDI_PCI_INITCLEANUP(rtd520Driver, rtd520_pci_table); 2284