cb_pcidas.c revision 814900c904140cfe7f3e48cabec06b3eec57e0ea
1/* 2 comedi/drivers/cb_pcidas.c 3 4 Developed by Ivan Martinez and Frank Mori Hess, with valuable help from 5 David Schleef and the rest of the Comedi developers comunity. 6 7 Copyright (C) 2001-2003 Ivan Martinez <imr@oersted.dtu.dk> 8 Copyright (C) 2001,2002 Frank Mori Hess <fmhess@users.sourceforge.net> 9 10 COMEDI - Linux Control and Measurement Device Interface 11 Copyright (C) 1997-8 David A. Schleef <ds@schleef.org> 12 13 This program is free software; you can redistribute it and/or modify 14 it under the terms of the GNU General Public License as published by 15 the Free Software Foundation; either version 2 of the License, or 16 (at your option) any later version. 17 18 This program is distributed in the hope that it will be useful, 19 but WITHOUT ANY WARRANTY; without even the implied warranty of 20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21 GNU General Public License for more details. 22 23 You should have received a copy of the GNU General Public License 24 along with this program; if not, write to the Free Software 25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 26 27************************************************************************ 28*/ 29/* 30Driver: cb_pcidas 31Description: MeasurementComputing PCI-DAS series with the AMCC S5933 PCI controller 32Author: Ivan Martinez <imr@oersted.dtu.dk>, 33 Frank Mori Hess <fmhess@users.sourceforge.net> 34Updated: 2003-3-11 35Devices: [Measurement Computing] PCI-DAS1602/16 (cb_pcidas), 36 PCI-DAS1602/16jr, PCI-DAS1602/12, PCI-DAS1200, PCI-DAS1200jr, 37 PCI-DAS1000, PCI-DAS1001, PCI_DAS1002 38 39Status: 40 There are many reports of the driver being used with most of the 41 supported cards. Despite no detailed log is maintained, it can 42 be said that the driver is quite tested and stable. 43 44 The boards may be autocalibrated using the comedi_calibrate 45 utility. 46 47Configuration options: 48 [0] - PCI bus of device (optional) 49 [1] - PCI slot of device (optional) 50 If bus/slot is not specified, the first supported 51 PCI device found will be used. 52 53For commands, the scanned channels must be consecutive 54(i.e. 4-5-6-7, 2-3-4,...), and must all have the same 55range and aref. 56*/ 57/* 58 59TODO: 60 61analog triggering on 1602 series 62*/ 63 64#include "../comedidev.h" 65#include <linux/delay.h> 66#include <linux/interrupt.h> 67 68#include "8253.h" 69#include "8255.h" 70#include "amcc_s5933.h" 71#include "comedi_pci.h" 72#include "comedi_fc.h" 73 74#undef CB_PCIDAS_DEBUG /* disable debugging code */ 75/* #define CB_PCIDAS_DEBUG enable debugging code */ 76 77/* PCI vendor number of ComputerBoards/MeasurementComputing */ 78#define PCI_VENDOR_ID_CB 0x1307 79#define TIMER_BASE 100 /* 10MHz master clock */ 80#define AI_BUFFER_SIZE 1024 /* maximum fifo size of any supported board */ 81#define AO_BUFFER_SIZE 1024 /* maximum fifo size of any supported board */ 82#define NUM_CHANNELS_8800 8 83#define NUM_CHANNELS_7376 1 84#define NUM_CHANNELS_8402 2 85#define NUM_CHANNELS_DAC08 1 86 87/* PCI-DAS base addresses */ 88 89/* indices of base address regions */ 90#define S5933_BADRINDEX 0 91#define CONT_STAT_BADRINDEX 1 92#define ADC_FIFO_BADRINDEX 2 93#define PACER_BADRINDEX 3 94#define AO_BADRINDEX 4 95/* sizes of io regions */ 96#define CONT_STAT_SIZE 10 97#define ADC_FIFO_SIZE 4 98#define PACER_SIZE 12 99#define AO_SIZE 4 100 101/* Control/Status registers */ 102#define INT_ADCFIFO 0 /* INTERRUPT / ADC FIFO register */ 103#define INT_EOS 0x1 /* interrupt end of scan */ 104#define INT_FHF 0x2 /* interrupt fifo half full */ 105#define INT_FNE 0x3 /* interrupt fifo not empty */ 106#define INT_MASK 0x3 /* mask of interrupt select bits */ 107#define INTE 0x4 /* interrupt enable */ 108#define DAHFIE 0x8 /* dac half full interrupt enable */ 109#define EOAIE 0x10 /* end of aquisition interrupt enable */ 110#define DAHFI 0x20 /* dac half full read status / write interrupt clear */ 111#define EOAI 0x40 /* read end of acq. interrupt status / write clear */ 112#define INT 0x80 /* read interrupt status / write clear */ 113#define EOBI 0x200 /* read end of burst interrupt status */ 114#define ADHFI 0x400 /* read half-full interrupt status */ 115#define ADNEI 0x800 /* read fifo not empty interrupt latch status */ 116#define ADNE 0x1000 /* read, fifo not empty (realtime, not latched) status */ 117#define DAEMIE 0x1000 /* write, dac empty interrupt enable */ 118#define LADFUL 0x2000 /* read fifo overflow / write clear */ 119#define DAEMI 0x4000 /* dac fifo empty interrupt status / write clear */ 120 121#define ADCMUX_CONT 2 /* ADC CHANNEL MUX AND CONTROL register */ 122#define BEGIN_SCAN(x) ((x) & 0xf) 123#define END_SCAN(x) (((x) & 0xf) << 4) 124#define GAIN_BITS(x) (((x) & 0x3) << 8) 125#define UNIP 0x800 /* Analog front-end unipolar for range */ 126#define SE 0x400 /* Inputs in single-ended mode */ 127#define PACER_MASK 0x3000 /* pacer source bits */ 128#define PACER_INT 0x1000 /* internal pacer */ 129#define PACER_EXT_FALL 0x2000 /* external falling edge */ 130#define PACER_EXT_RISE 0x3000 /* external rising edge */ 131#define EOC 0x4000 /* adc not busy */ 132 133#define TRIG_CONTSTAT 4 /* TRIGGER CONTROL/STATUS register */ 134#define SW_TRIGGER 0x1 /* software start trigger */ 135#define EXT_TRIGGER 0x2 /* external start trigger */ 136#define ANALOG_TRIGGER 0x3 /* external analog trigger */ 137#define TRIGGER_MASK 0x3 /* mask of bits that determine start trigger */ 138#define TGEN 0x10 /* enable external start trigger */ 139#define BURSTE 0x20 /* burst mode enable */ 140#define XTRCL 0x80 /* clear external trigger */ 141 142#define CALIBRATION_REG 6 /* CALIBRATION register */ 143#define SELECT_8800_BIT 0x100 /* select 8800 caldac */ 144#define SELECT_TRIMPOT_BIT 0x200 /* select ad7376 trim pot */ 145#define SELECT_DAC08_BIT 0x400 /* select dac08 caldac */ 146#define CAL_SRC_BITS(x) (((x) & 0x7) << 11) 147#define CAL_EN_BIT 0x4000 /* read calibration source instead of analog input channel 0 */ 148#define SERIAL_DATA_IN_BIT 0x8000 /* serial data stream going to 8800 and 7376 */ 149 150#define DAC_CSR 0x8 /* dac control and status register */ 151enum dac_csr_bits { 152 DACEN = 0x2, /* dac enable */ 153 DAC_MODE_UPDATE_BOTH = 0x80, /* update both dacs when dac0 is written */ 154}; 155static inline unsigned int DAC_RANGE(unsigned int channel, unsigned int range) 156{ 157 return (range & 0x3) << (8 + 2 * (channel & 0x1)); 158} 159static inline unsigned int DAC_RANGE_MASK(unsigned int channel) 160{ 161 return 0x3 << (8 + 2 * (channel & 0x1)); 162}; 163 164/* bits for 1602 series only */ 165enum dac_csr_bits_1602 { 166 DAC_EMPTY = 0x1, /* dac fifo empty, read, write clear */ 167 DAC_START = 0x4, /* start/arm dac fifo operations */ 168 DAC_PACER_MASK = 0x18, /* bits that set dac pacer source */ 169 DAC_PACER_INT = 0x8, /* dac internal pacing */ 170 DAC_PACER_EXT_FALL = 0x10, /* dac external pacing, falling edge */ 171 DAC_PACER_EXT_RISE = 0x18, /* dac external pacing, rising edge */ 172}; 173static inline unsigned int DAC_CHAN_EN(unsigned int channel) 174{ 175 return 1 << (5 + (channel & 0x1)); /* enable channel 0 or 1 */ 176}; 177 178/* analog input fifo */ 179#define ADCDATA 0 /* ADC DATA register */ 180#define ADCFIFOCLR 2 /* ADC FIFO CLEAR */ 181 182/* pacer, counter, dio registers */ 183#define ADC8254 0 184#define DIO_8255 4 185#define DAC8254 8 186 187/* analog output registers for 100x, 1200 series */ 188static inline unsigned int DAC_DATA_REG(unsigned int channel) 189{ 190 return 2 * (channel & 0x1); 191} 192 193/* analog output registers for 1602 series*/ 194#define DACDATA 0 /* DAC DATA register */ 195#define DACFIFOCLR 2 /* DAC FIFO CLEAR */ 196 197/* bit in hexadecimal representation of range index that indicates unipolar input range */ 198#define IS_UNIPOLAR 0x4 199/* analog input ranges for most boards */ 200static const struct comedi_lrange cb_pcidas_ranges = { 201 8, 202 { 203 BIP_RANGE(10), 204 BIP_RANGE(5), 205 BIP_RANGE(2.5), 206 BIP_RANGE(1.25), 207 UNI_RANGE(10), 208 UNI_RANGE(5), 209 UNI_RANGE(2.5), 210 UNI_RANGE(1.25) 211 } 212}; 213 214/* pci-das1001 input ranges */ 215static const struct comedi_lrange cb_pcidas_alt_ranges = { 216 8, 217 { 218 BIP_RANGE(10), 219 BIP_RANGE(1), 220 BIP_RANGE(0.1), 221 BIP_RANGE(0.01), 222 UNI_RANGE(10), 223 UNI_RANGE(1), 224 UNI_RANGE(0.1), 225 UNI_RANGE(0.01) 226 } 227}; 228 229/* analog output ranges */ 230static const struct comedi_lrange cb_pcidas_ao_ranges = { 231 4, 232 { 233 BIP_RANGE(5), 234 BIP_RANGE(10), 235 UNI_RANGE(5), 236 UNI_RANGE(10), 237 } 238}; 239 240enum trimpot_model { 241 AD7376, 242 AD8402, 243}; 244 245struct cb_pcidas_board { 246 const char *name; 247 unsigned short device_id; 248 int ai_se_chans; /* Inputs in single-ended mode */ 249 int ai_diff_chans; /* Inputs in differential mode */ 250 int ai_bits; /* analog input resolution */ 251 int ai_speed; /* fastest conversion period in ns */ 252 int ao_nchan; /* number of analog out channels */ 253 int has_ao_fifo; /* analog output has fifo */ 254 int ao_scan_speed; /* analog output speed for 1602 series (for a scan, not conversion) */ 255 int fifo_size; /* number of samples fifo can hold */ 256 const struct comedi_lrange *ranges; 257 enum trimpot_model trimpot; 258 unsigned has_dac08:1; 259}; 260 261static const struct cb_pcidas_board cb_pcidas_boards[] = { 262 { 263 .name = "pci-das1602/16", 264 .device_id = 0x1, 265 .ai_se_chans = 16, 266 .ai_diff_chans = 8, 267 .ai_bits = 16, 268 .ai_speed = 5000, 269 .ao_nchan = 2, 270 .has_ao_fifo = 1, 271 .ao_scan_speed = 10000, 272 .fifo_size = 512, 273 .ranges = &cb_pcidas_ranges, 274 .trimpot = AD8402, 275 .has_dac08 = 1, 276 }, 277 { 278 .name = "pci-das1200", 279 .device_id = 0xF, 280 .ai_se_chans = 16, 281 .ai_diff_chans = 8, 282 .ai_bits = 12, 283 .ai_speed = 3200, 284 .ao_nchan = 2, 285 .has_ao_fifo = 0, 286 .fifo_size = 1024, 287 .ranges = &cb_pcidas_ranges, 288 .trimpot = AD7376, 289 .has_dac08 = 0, 290 }, 291 { 292 .name = "pci-das1602/12", 293 .device_id = 0x10, 294 .ai_se_chans = 16, 295 .ai_diff_chans = 8, 296 .ai_bits = 12, 297 .ai_speed = 3200, 298 .ao_nchan = 2, 299 .has_ao_fifo = 1, 300 .ao_scan_speed = 4000, 301 .fifo_size = 1024, 302 .ranges = &cb_pcidas_ranges, 303 .trimpot = AD7376, 304 .has_dac08 = 0, 305 }, 306 { 307 .name = "pci-das1200/jr", 308 .device_id = 0x19, 309 .ai_se_chans = 16, 310 .ai_diff_chans = 8, 311 .ai_bits = 12, 312 .ai_speed = 3200, 313 .ao_nchan = 0, 314 .has_ao_fifo = 0, 315 .fifo_size = 1024, 316 .ranges = &cb_pcidas_ranges, 317 .trimpot = AD7376, 318 .has_dac08 = 0, 319 }, 320 { 321 .name = "pci-das1602/16/jr", 322 .device_id = 0x1C, 323 .ai_se_chans = 16, 324 .ai_diff_chans = 8, 325 .ai_bits = 16, 326 .ai_speed = 5000, 327 .ao_nchan = 0, 328 .has_ao_fifo = 0, 329 .fifo_size = 512, 330 .ranges = &cb_pcidas_ranges, 331 .trimpot = AD8402, 332 .has_dac08 = 1, 333 }, 334 { 335 .name = "pci-das1000", 336 .device_id = 0x4C, 337 .ai_se_chans = 16, 338 .ai_diff_chans = 8, 339 .ai_bits = 12, 340 .ai_speed = 4000, 341 .ao_nchan = 0, 342 .has_ao_fifo = 0, 343 .fifo_size = 1024, 344 .ranges = &cb_pcidas_ranges, 345 .trimpot = AD7376, 346 .has_dac08 = 0, 347 }, 348 { 349 .name = "pci-das1001", 350 .device_id = 0x1a, 351 .ai_se_chans = 16, 352 .ai_diff_chans = 8, 353 .ai_bits = 12, 354 .ai_speed = 6800, 355 .ao_nchan = 2, 356 .has_ao_fifo = 0, 357 .fifo_size = 1024, 358 .ranges = &cb_pcidas_alt_ranges, 359 .trimpot = AD7376, 360 .has_dac08 = 0, 361 }, 362 { 363 .name = "pci-das1002", 364 .device_id = 0x1b, 365 .ai_se_chans = 16, 366 .ai_diff_chans = 8, 367 .ai_bits = 12, 368 .ai_speed = 6800, 369 .ao_nchan = 2, 370 .has_ao_fifo = 0, 371 .fifo_size = 1024, 372 .ranges = &cb_pcidas_ranges, 373 .trimpot = AD7376, 374 .has_dac08 = 0, 375 }, 376}; 377 378/* Number of boards in cb_pcidas_boards */ 379#define N_BOARDS (sizeof(cb_pcidas_boards) / sizeof(struct cb_pcidas_board)) 380 381static DEFINE_PCI_DEVICE_TABLE(cb_pcidas_pci_table) = { 382 {PCI_VENDOR_ID_CB, 0x0001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 383 {PCI_VENDOR_ID_CB, 0x000f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 384 {PCI_VENDOR_ID_CB, 0x0010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 385 {PCI_VENDOR_ID_CB, 0x0019, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 386 {PCI_VENDOR_ID_CB, 0x001c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 387 {PCI_VENDOR_ID_CB, 0x004c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 388 {PCI_VENDOR_ID_CB, 0x001a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 389 {PCI_VENDOR_ID_CB, 0x001b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 390 {0} 391}; 392 393MODULE_DEVICE_TABLE(pci, cb_pcidas_pci_table); 394 395/* 396 * Useful for shorthand access to the particular board structure 397 */ 398#define thisboard ((const struct cb_pcidas_board *)dev->board_ptr) 399 400/* this structure is for data unique to this hardware driver. If 401 several hardware drivers keep similar information in this structure, 402 feel free to suggest moving the variable to the struct comedi_device struct. */ 403struct cb_pcidas_private { 404 /* would be useful for a PCI device */ 405 struct pci_dev *pci_dev; 406 /* base addresses */ 407 unsigned long s5933_config; 408 unsigned long control_status; 409 unsigned long adc_fifo; 410 unsigned long pacer_counter_dio; 411 unsigned long ao_registers; 412 /* divisors of master clock for analog input pacing */ 413 unsigned int divisor1; 414 unsigned int divisor2; 415 volatile unsigned int count; /* number of analog input samples remaining */ 416 volatile unsigned int adc_fifo_bits; /* bits to write to interupt/adcfifo register */ 417 volatile unsigned int s5933_intcsr_bits; /* bits to write to amcc s5933 interrupt control/status register */ 418 volatile unsigned int ao_control_bits; /* bits to write to ao control and status register */ 419 short ai_buffer[AI_BUFFER_SIZE]; 420 short ao_buffer[AO_BUFFER_SIZE]; 421 /* divisors of master clock for analog output pacing */ 422 unsigned int ao_divisor1; 423 unsigned int ao_divisor2; 424 volatile unsigned int ao_count; /* number of analog output samples remaining */ 425 int ao_value[2]; /* remember what the analog outputs are set to, to allow readback */ 426 unsigned int caldac_value[NUM_CHANNELS_8800]; /* for readback of caldac */ 427 unsigned int trimpot_value[NUM_CHANNELS_8402]; /* for readback of trimpot */ 428 unsigned int dac08_value; 429 unsigned int calibration_source; 430}; 431 432/* 433 * most drivers define the following macro to make it easy to 434 * access the private structure. 435 */ 436#define devpriv ((struct cb_pcidas_private *)dev->private) 437 438/* 439 * The struct comedi_driver structure tells the Comedi core module 440 * which functions to call to configure/deconfigure (attach/detach) 441 * the board, and also about the kernel module that contains 442 * the device code. 443 */ 444static int cb_pcidas_attach(struct comedi_device *dev, struct comedi_devconfig *it); 445static int cb_pcidas_detach(struct comedi_device *dev); 446static struct comedi_driver driver_cb_pcidas = { 447 .driver_name = "cb_pcidas", 448 .module = THIS_MODULE, 449 .attach = cb_pcidas_attach, 450 .detach = cb_pcidas_detach, 451}; 452 453static int cb_pcidas_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice * s, 454 struct comedi_insn *insn, unsigned int *data); 455static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s, 456 struct comedi_insn *insn, unsigned int *data); 457static int cb_pcidas_ao_nofifo_winsn(struct comedi_device *dev, struct comedi_subdevice *s, 458 struct comedi_insn *insn, unsigned int *data); 459static int cb_pcidas_ao_fifo_winsn(struct comedi_device *dev, struct comedi_subdevice *s, 460 struct comedi_insn *insn, unsigned int *data); 461static int cb_pcidas_ao_readback_insn(struct comedi_device *dev, struct comedi_subdevice *s, 462 struct comedi_insn *insn, unsigned int *data); 463static int cb_pcidas_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s); 464static int cb_pcidas_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, 465 struct comedi_cmd *cmd); 466static int cb_pcidas_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s); 467static int cb_pcidas_ao_inttrig(struct comedi_device *dev, 468 struct comedi_subdevice *subdev, 469 unsigned int trig_num); 470static int cb_pcidas_ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, 471 struct comedi_cmd *cmd); 472static irqreturn_t cb_pcidas_interrupt(int irq, void *d); 473static void handle_ao_interrupt(struct comedi_device *dev, unsigned int status); 474static int cb_pcidas_cancel(struct comedi_device *dev, struct comedi_subdevice *s); 475static int cb_pcidas_ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s); 476static void cb_pcidas_load_counters(struct comedi_device *dev, unsigned int *ns, 477 int round_flags); 478static int eeprom_read_insn(struct comedi_device *dev, struct comedi_subdevice *s, 479 struct comedi_insn *insn, unsigned int *data); 480static int caldac_read_insn(struct comedi_device *dev, struct comedi_subdevice *s, 481 struct comedi_insn *insn, unsigned int *data); 482static int caldac_write_insn(struct comedi_device *dev, struct comedi_subdevice *s, 483 struct comedi_insn *insn, unsigned int *data); 484static int trimpot_read_insn(struct comedi_device *dev, struct comedi_subdevice *s, 485 struct comedi_insn *insn, unsigned int *data); 486static int cb_pcidas_trimpot_write(struct comedi_device *dev, unsigned int channel, 487 unsigned int value); 488static int trimpot_write_insn(struct comedi_device *dev, struct comedi_subdevice *s, 489 struct comedi_insn *insn, unsigned int *data); 490static int dac08_read_insn(struct comedi_device *dev, struct comedi_subdevice *s, 491 struct comedi_insn *insn, unsigned int *data); 492static int dac08_write(struct comedi_device *dev, unsigned int value); 493static int dac08_write_insn(struct comedi_device *dev, struct comedi_subdevice *s, 494 struct comedi_insn *insn, unsigned int *data); 495static int caldac_8800_write(struct comedi_device *dev, unsigned int address, 496 uint8_t value); 497static int trimpot_7376_write(struct comedi_device *dev, uint8_t value); 498static int trimpot_8402_write(struct comedi_device *dev, unsigned int channel, 499 uint8_t value); 500static int nvram_read(struct comedi_device *dev, unsigned int address, 501 uint8_t *data); 502 503static inline unsigned int cal_enable_bits(struct comedi_device *dev) 504{ 505 return CAL_EN_BIT | CAL_SRC_BITS(devpriv->calibration_source); 506} 507 508/* 509 * Attach is called by the Comedi core to configure the driver 510 * for a particular board. 511 */ 512static int cb_pcidas_attach(struct comedi_device *dev, struct comedi_devconfig *it) 513{ 514 struct comedi_subdevice *s; 515 struct pci_dev *pcidev; 516 int index; 517 int i; 518 519 printk("comedi%d: cb_pcidas: ", dev->minor); 520 521/* 522 * Allocate the private structure area. 523 */ 524 if (alloc_private(dev, sizeof(struct cb_pcidas_private)) < 0) 525 return -ENOMEM; 526 527/* 528 * Probe the device to determine what device in the series it is. 529 */ 530 printk("\n"); 531 532 for (pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); 533 pcidev != NULL; 534 pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) { 535 /* is it not a computer boards card? */ 536 if (pcidev->vendor != PCI_VENDOR_ID_CB) 537 continue; 538 /* loop through cards supported by this driver */ 539 for (index = 0; index < N_BOARDS; index++) { 540 if (cb_pcidas_boards[index].device_id != pcidev->device) 541 continue; 542 /* was a particular bus/slot requested? */ 543 if (it->options[0] || it->options[1]) { 544 /* are we on the wrong bus/slot? */ 545 if (pcidev->bus->number != it->options[0] || 546 PCI_SLOT(pcidev->devfn) != 547 it->options[1]) { 548 continue; 549 } 550 } 551 devpriv->pci_dev = pcidev; 552 dev->board_ptr = cb_pcidas_boards + index; 553 goto found; 554 } 555 } 556 557 printk("No supported ComputerBoards/MeasurementComputing card found on " 558 "requested position\n"); 559 return -EIO; 560 561 found: 562 563 printk("Found %s on bus %i, slot %i\n", cb_pcidas_boards[index].name, 564 pcidev->bus->number, PCI_SLOT(pcidev->devfn)); 565 566 /* 567 * Enable PCI device and reserve I/O ports. 568 */ 569 if (comedi_pci_enable(pcidev, "cb_pcidas")) { 570 printk(" Failed to enable PCI device and request regions\n"); 571 return -EIO; 572 } 573 /* 574 * Initialize devpriv->control_status and devpriv->adc_fifo to point to 575 * their base address. 576 */ 577 devpriv->s5933_config = 578 pci_resource_start(devpriv->pci_dev, S5933_BADRINDEX); 579 devpriv->control_status = 580 pci_resource_start(devpriv->pci_dev, CONT_STAT_BADRINDEX); 581 devpriv->adc_fifo = 582 pci_resource_start(devpriv->pci_dev, ADC_FIFO_BADRINDEX); 583 devpriv->pacer_counter_dio = 584 pci_resource_start(devpriv->pci_dev, PACER_BADRINDEX); 585 if (thisboard->ao_nchan) { 586 devpriv->ao_registers = 587 pci_resource_start(devpriv->pci_dev, AO_BADRINDEX); 588 } 589 /* disable and clear interrupts on amcc s5933 */ 590 outl(INTCSR_INBOX_INTR_STATUS, 591 devpriv->s5933_config + AMCC_OP_REG_INTCSR); 592 593 /* get irq */ 594 if (comedi_request_irq(devpriv->pci_dev->irq, cb_pcidas_interrupt, 595 IRQF_SHARED, "cb_pcidas", dev)) { 596 printk(" unable to allocate irq %d\n", devpriv->pci_dev->irq); 597 return -EINVAL; 598 } 599 dev->irq = devpriv->pci_dev->irq; 600 601 /* Initialize dev->board_name */ 602 dev->board_name = thisboard->name; 603 604/* 605 * Allocate the subdevice structures. 606 */ 607 if (alloc_subdevices(dev, 7) < 0) 608 return -ENOMEM; 609 610 s = dev->subdevices + 0; 611 /* analog input subdevice */ 612 dev->read_subdev = s; 613 s->type = COMEDI_SUBD_AI; 614 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DIFF | SDF_CMD_READ; 615 /* WARNING: Number of inputs in differential mode is ignored */ 616 s->n_chan = thisboard->ai_se_chans; 617 s->len_chanlist = thisboard->ai_se_chans; 618 s->maxdata = (1 << thisboard->ai_bits) - 1; 619 s->range_table = thisboard->ranges; 620 s->insn_read = cb_pcidas_ai_rinsn; 621 s->insn_config = ai_config_insn; 622 s->do_cmd = cb_pcidas_ai_cmd; 623 s->do_cmdtest = cb_pcidas_ai_cmdtest; 624 s->cancel = cb_pcidas_cancel; 625 626 /* analog output subdevice */ 627 s = dev->subdevices + 1; 628 if (thisboard->ao_nchan) { 629 s->type = COMEDI_SUBD_AO; 630 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_GROUND; 631 s->n_chan = thisboard->ao_nchan; 632 /* analog out resolution is the same as analog input resolution, so use ai_bits */ 633 s->maxdata = (1 << thisboard->ai_bits) - 1; 634 s->range_table = &cb_pcidas_ao_ranges; 635 s->insn_read = cb_pcidas_ao_readback_insn; 636 if (thisboard->has_ao_fifo) { 637 dev->write_subdev = s; 638 s->subdev_flags |= SDF_CMD_WRITE; 639 s->insn_write = cb_pcidas_ao_fifo_winsn; 640 s->do_cmdtest = cb_pcidas_ao_cmdtest; 641 s->do_cmd = cb_pcidas_ao_cmd; 642 s->cancel = cb_pcidas_ao_cancel; 643 } else { 644 s->insn_write = cb_pcidas_ao_nofifo_winsn; 645 } 646 } else { 647 s->type = COMEDI_SUBD_UNUSED; 648 } 649 650 /* 8255 */ 651 s = dev->subdevices + 2; 652 subdev_8255_init(dev, s, NULL, devpriv->pacer_counter_dio + DIO_8255); 653 654 /* serial EEPROM, */ 655 s = dev->subdevices + 3; 656 s->type = COMEDI_SUBD_MEMORY; 657 s->subdev_flags = SDF_READABLE | SDF_INTERNAL; 658 s->n_chan = 256; 659 s->maxdata = 0xff; 660 s->insn_read = eeprom_read_insn; 661 662 /* 8800 caldac */ 663 s = dev->subdevices + 4; 664 s->type = COMEDI_SUBD_CALIB; 665 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL; 666 s->n_chan = NUM_CHANNELS_8800; 667 s->maxdata = 0xff; 668 s->insn_read = caldac_read_insn; 669 s->insn_write = caldac_write_insn; 670 for (i = 0; i < s->n_chan; i++) 671 caldac_8800_write(dev, i, s->maxdata / 2); 672 673 /* trim potentiometer */ 674 s = dev->subdevices + 5; 675 s->type = COMEDI_SUBD_CALIB; 676 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL; 677 if (thisboard->trimpot == AD7376) { 678 s->n_chan = NUM_CHANNELS_7376; 679 s->maxdata = 0x7f; 680 } else { 681 s->n_chan = NUM_CHANNELS_8402; 682 s->maxdata = 0xff; 683 } 684 s->insn_read = trimpot_read_insn; 685 s->insn_write = trimpot_write_insn; 686 for (i = 0; i < s->n_chan; i++) 687 cb_pcidas_trimpot_write(dev, i, s->maxdata / 2); 688 689 /* dac08 caldac */ 690 s = dev->subdevices + 6; 691 if (thisboard->has_dac08) { 692 s->type = COMEDI_SUBD_CALIB; 693 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL; 694 s->n_chan = NUM_CHANNELS_DAC08; 695 s->insn_read = dac08_read_insn; 696 s->insn_write = dac08_write_insn; 697 s->maxdata = 0xff; 698 dac08_write(dev, s->maxdata / 2); 699 } else 700 s->type = COMEDI_SUBD_UNUSED; 701 702 /* make sure mailbox 4 is empty */ 703 inl(devpriv->s5933_config + AMCC_OP_REG_IMB4); 704 /* Set bits to enable incoming mailbox interrupts on amcc s5933. */ 705 devpriv->s5933_intcsr_bits = 706 INTCSR_INBOX_BYTE(3) | INTCSR_INBOX_SELECT(3) | 707 INTCSR_INBOX_FULL_INT; 708 /* clear and enable interrupt on amcc s5933 */ 709 outl(devpriv->s5933_intcsr_bits | INTCSR_INBOX_INTR_STATUS, 710 devpriv->s5933_config + AMCC_OP_REG_INTCSR); 711 712 return 1; 713} 714 715/* 716 * cb_pcidas_detach is called to deconfigure a device. It should deallocate 717 * resources. 718 * This function is also called when _attach() fails, so it should be 719 * careful not to release resources that were not necessarily 720 * allocated by _attach(). dev->private and dev->subdevices are 721 * deallocated automatically by the core. 722 */ 723static int cb_pcidas_detach(struct comedi_device *dev) 724{ 725 printk("comedi%d: cb_pcidas: remove\n", dev->minor); 726 727 if (devpriv) { 728 if (devpriv->s5933_config) { 729 /* disable and clear interrupts on amcc s5933 */ 730 outl(INTCSR_INBOX_INTR_STATUS, 731 devpriv->s5933_config + AMCC_OP_REG_INTCSR); 732#ifdef CB_PCIDAS_DEBUG 733 rt_printk("detaching, incsr is 0x%x\n", 734 inl(devpriv->s5933_config + 735 AMCC_OP_REG_INTCSR)); 736#endif 737 } 738 } 739 if (dev->irq) 740 comedi_free_irq(dev->irq, dev); 741 if (dev->subdevices) 742 subdev_8255_cleanup(dev, dev->subdevices + 2); 743 if (devpriv && devpriv->pci_dev) { 744 if (devpriv->s5933_config) { 745 comedi_pci_disable(devpriv->pci_dev); 746 } 747 pci_dev_put(devpriv->pci_dev); 748 } 749 750 return 0; 751} 752 753/* 754 * "instructions" read/write data in "one-shot" or "software-triggered" 755 * mode. 756 */ 757static int cb_pcidas_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s, 758 struct comedi_insn *insn, unsigned int *data) 759{ 760 int n, i; 761 unsigned int bits; 762 static const int timeout = 10000; 763 int channel; 764 /* enable calibration input if appropriate */ 765 if (insn->chanspec & CR_ALT_SOURCE) { 766 outw(cal_enable_bits(dev), 767 devpriv->control_status + CALIBRATION_REG); 768 channel = 0; 769 } else { 770 outw(0, devpriv->control_status + CALIBRATION_REG); 771 channel = CR_CHAN(insn->chanspec); 772 } 773 /* set mux limits and gain */ 774 bits = BEGIN_SCAN(channel) | 775 END_SCAN(channel) | GAIN_BITS(CR_RANGE(insn->chanspec)); 776 /* set unipolar/bipolar */ 777 if (CR_RANGE(insn->chanspec) & IS_UNIPOLAR) 778 bits |= UNIP; 779 /* set singleended/differential */ 780 if (CR_AREF(insn->chanspec) != AREF_DIFF) 781 bits |= SE; 782 outw(bits, devpriv->control_status + ADCMUX_CONT); 783 784 /* clear fifo */ 785 outw(0, devpriv->adc_fifo + ADCFIFOCLR); 786 787 /* convert n samples */ 788 for (n = 0; n < insn->n; n++) { 789 /* trigger conversion */ 790 outw(0, devpriv->adc_fifo + ADCDATA); 791 792 /* wait for conversion to end */ 793 /* return -ETIMEDOUT if there is a timeout */ 794 for (i = 0; i < timeout; i++) { 795 if (inw(devpriv->control_status + ADCMUX_CONT) & EOC) 796 break; 797 } 798 if (i == timeout) 799 return -ETIMEDOUT; 800 801 /* read data */ 802 data[n] = inw(devpriv->adc_fifo + ADCDATA); 803 } 804 805 /* return the number of samples read/written */ 806 return n; 807} 808 809static int ai_config_calibration_source(struct comedi_device *dev, unsigned int *data) 810{ 811 static const int num_calibration_sources = 8; 812 unsigned int source = data[1]; 813 814 if (source >= num_calibration_sources) { 815 printk("invalid calibration source: %i\n", source); 816 return -EINVAL; 817 } 818 819 devpriv->calibration_source = source; 820 821 return 2; 822} 823 824static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s, 825 struct comedi_insn *insn, unsigned int *data) 826{ 827 int id = data[0]; 828 829 switch (id) { 830 case INSN_CONFIG_ALT_SOURCE: 831 return ai_config_calibration_source(dev, data); 832 break; 833 default: 834 return -EINVAL; 835 break; 836 } 837 return -EINVAL; 838} 839 840/* analog output insn for pcidas-1000 and 1200 series */ 841static int cb_pcidas_ao_nofifo_winsn(struct comedi_device *dev, struct comedi_subdevice *s, 842 struct comedi_insn *insn, unsigned int *data) 843{ 844 int channel; 845 unsigned long flags; 846 847 /* set channel and range */ 848 channel = CR_CHAN(insn->chanspec); 849 comedi_spin_lock_irqsave(&dev->spinlock, flags); 850 devpriv->ao_control_bits &= 851 ~DAC_MODE_UPDATE_BOTH & ~DAC_RANGE_MASK(channel); 852 devpriv->ao_control_bits |= 853 DACEN | DAC_RANGE(channel, CR_RANGE(insn->chanspec)); 854 outw(devpriv->ao_control_bits, devpriv->control_status + DAC_CSR); 855 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 856 857 /* remember value for readback */ 858 devpriv->ao_value[channel] = data[0]; 859 /* send data */ 860 outw(data[0], devpriv->ao_registers + DAC_DATA_REG(channel)); 861 862 return 1; 863} 864 865/* analog output insn for pcidas-1602 series */ 866static int cb_pcidas_ao_fifo_winsn(struct comedi_device *dev, struct comedi_subdevice *s, 867 struct comedi_insn *insn, unsigned int *data) 868{ 869 int channel; 870 unsigned long flags; 871 872 /* clear dac fifo */ 873 outw(0, devpriv->ao_registers + DACFIFOCLR); 874 875 /* set channel and range */ 876 channel = CR_CHAN(insn->chanspec); 877 comedi_spin_lock_irqsave(&dev->spinlock, flags); 878 devpriv->ao_control_bits &= 879 ~DAC_CHAN_EN(0) & ~DAC_CHAN_EN(1) & ~DAC_RANGE_MASK(channel) & 880 ~DAC_PACER_MASK; 881 devpriv->ao_control_bits |= 882 DACEN | DAC_RANGE(channel, 883 CR_RANGE(insn->chanspec)) | DAC_CHAN_EN(channel) | DAC_START; 884 outw(devpriv->ao_control_bits, devpriv->control_status + DAC_CSR); 885 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 886 887 /* remember value for readback */ 888 devpriv->ao_value[channel] = data[0]; 889 /* send data */ 890 outw(data[0], devpriv->ao_registers + DACDATA); 891 892 return 1; 893} 894 895/* analog output readback insn */ 896/* XXX loses track of analog output value back after an analog ouput command is executed */ 897static int cb_pcidas_ao_readback_insn(struct comedi_device *dev, struct comedi_subdevice *s, 898 struct comedi_insn *insn, unsigned int *data) 899{ 900 data[0] = devpriv->ao_value[CR_CHAN(insn->chanspec)]; 901 902 return 1; 903} 904 905static int eeprom_read_insn(struct comedi_device *dev, struct comedi_subdevice *s, 906 struct comedi_insn *insn, unsigned int *data) 907{ 908 uint8_t nvram_data; 909 int retval; 910 911 retval = nvram_read(dev, CR_CHAN(insn->chanspec), &nvram_data); 912 if (retval < 0) 913 return retval; 914 915 data[0] = nvram_data; 916 917 return 1; 918} 919 920static int caldac_write_insn(struct comedi_device *dev, struct comedi_subdevice *s, 921 struct comedi_insn *insn, unsigned int *data) 922{ 923 const unsigned int channel = CR_CHAN(insn->chanspec); 924 925 return caldac_8800_write(dev, channel, data[0]); 926} 927 928static int caldac_read_insn(struct comedi_device *dev, struct comedi_subdevice *s, 929 struct comedi_insn *insn, unsigned int *data) 930{ 931 data[0] = devpriv->caldac_value[CR_CHAN(insn->chanspec)]; 932 933 return 1; 934} 935 936/* 1602/16 pregain offset */ 937static int dac08_write(struct comedi_device *dev, unsigned int value) 938{ 939 if (devpriv->dac08_value == value) 940 return 1; 941 942 devpriv->dac08_value = value; 943 944 outw(cal_enable_bits(dev) | (value & 0xff), 945 devpriv->control_status + CALIBRATION_REG); 946 comedi_udelay(1); 947 outw(cal_enable_bits(dev) | SELECT_DAC08_BIT | (value & 0xff), 948 devpriv->control_status + CALIBRATION_REG); 949 comedi_udelay(1); 950 outw(cal_enable_bits(dev) | (value & 0xff), 951 devpriv->control_status + CALIBRATION_REG); 952 comedi_udelay(1); 953 954 return 1; 955} 956 957static int dac08_write_insn(struct comedi_device *dev, struct comedi_subdevice *s, 958 struct comedi_insn *insn, unsigned int *data) 959{ 960 return dac08_write(dev, data[0]); 961} 962 963static int dac08_read_insn(struct comedi_device *dev, struct comedi_subdevice *s, 964 struct comedi_insn *insn, unsigned int *data) 965{ 966 data[0] = devpriv->dac08_value; 967 968 return 1; 969} 970 971static int cb_pcidas_trimpot_write(struct comedi_device *dev, 972 unsigned int channel, unsigned int value) 973{ 974 if (devpriv->trimpot_value[channel] == value) 975 return 1; 976 977 devpriv->trimpot_value[channel] = value; 978 switch (thisboard->trimpot) { 979 case AD7376: 980 trimpot_7376_write(dev, value); 981 break; 982 case AD8402: 983 trimpot_8402_write(dev, channel, value); 984 break; 985 default: 986 comedi_error(dev, "driver bug?"); 987 return -1; 988 break; 989 } 990 991 return 1; 992} 993 994static int trimpot_write_insn(struct comedi_device *dev, struct comedi_subdevice *s, 995 struct comedi_insn *insn, unsigned int *data) 996{ 997 unsigned int channel = CR_CHAN(insn->chanspec); 998 999 return cb_pcidas_trimpot_write(dev, channel, data[0]); 1000} 1001 1002static int trimpot_read_insn(struct comedi_device *dev, struct comedi_subdevice *s, 1003 struct comedi_insn *insn, unsigned int *data) 1004{ 1005 unsigned int channel = CR_CHAN(insn->chanspec); 1006 1007 data[0] = devpriv->trimpot_value[channel]; 1008 1009 return 1; 1010} 1011 1012static int cb_pcidas_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, 1013 struct comedi_cmd *cmd) 1014{ 1015 int err = 0; 1016 int tmp; 1017 int i, gain, start_chan; 1018 1019 /* cmdtest tests a particular command to see if it is valid. 1020 * Using the cmdtest ioctl, a user can create a valid cmd 1021 * and then have it executes by the cmd ioctl. 1022 * 1023 * cmdtest returns 1,2,3,4 or 0, depending on which tests 1024 * the command passes. */ 1025 1026 /* step 1: make sure trigger sources are trivially valid */ 1027 1028 tmp = cmd->start_src; 1029 cmd->start_src &= TRIG_NOW | TRIG_EXT; 1030 if (!cmd->start_src || tmp != cmd->start_src) 1031 err++; 1032 1033 tmp = cmd->scan_begin_src; 1034 cmd->scan_begin_src &= TRIG_FOLLOW | TRIG_TIMER | TRIG_EXT; 1035 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src) 1036 err++; 1037 1038 tmp = cmd->convert_src; 1039 cmd->convert_src &= TRIG_TIMER | TRIG_NOW | TRIG_EXT; 1040 if (!cmd->convert_src || tmp != cmd->convert_src) 1041 err++; 1042 1043 tmp = cmd->scan_end_src; 1044 cmd->scan_end_src &= TRIG_COUNT; 1045 if (!cmd->scan_end_src || tmp != cmd->scan_end_src) 1046 err++; 1047 1048 tmp = cmd->stop_src; 1049 cmd->stop_src &= TRIG_COUNT | TRIG_NONE; 1050 if (!cmd->stop_src || tmp != cmd->stop_src) 1051 err++; 1052 1053 if (err) 1054 return 1; 1055 1056 /* step 2: make sure trigger sources are unique and mutually compatible */ 1057 1058 if (cmd->start_src != TRIG_NOW && cmd->start_src != TRIG_EXT) 1059 err++; 1060 if (cmd->scan_begin_src != TRIG_FOLLOW && 1061 cmd->scan_begin_src != TRIG_TIMER && 1062 cmd->scan_begin_src != TRIG_EXT) 1063 err++; 1064 if (cmd->convert_src != TRIG_TIMER && 1065 cmd->convert_src != TRIG_EXT && cmd->convert_src != TRIG_NOW) 1066 err++; 1067 if (cmd->stop_src != TRIG_COUNT && cmd->stop_src != TRIG_NONE) 1068 err++; 1069 1070 /* make sure trigger sources are compatible with each other */ 1071 if (cmd->scan_begin_src == TRIG_FOLLOW && cmd->convert_src == TRIG_NOW) 1072 err++; 1073 if (cmd->scan_begin_src != TRIG_FOLLOW && cmd->convert_src != TRIG_NOW) 1074 err++; 1075 if (cmd->start_src == TRIG_EXT && 1076 (cmd->convert_src == TRIG_EXT 1077 || cmd->scan_begin_src == TRIG_EXT)) 1078 err++; 1079 1080 if (err) 1081 return 2; 1082 1083 /* step 3: make sure arguments are trivially compatible */ 1084 1085 if (cmd->start_arg != 0) { 1086 cmd->start_arg = 0; 1087 err++; 1088 } 1089 1090 if (cmd->scan_begin_src == TRIG_TIMER) { 1091 if (cmd->scan_begin_arg < 1092 thisboard->ai_speed * cmd->chanlist_len) { 1093 cmd->scan_begin_arg = 1094 thisboard->ai_speed * cmd->chanlist_len; 1095 err++; 1096 } 1097 } 1098 if (cmd->convert_src == TRIG_TIMER) { 1099 if (cmd->convert_arg < thisboard->ai_speed) { 1100 cmd->convert_arg = thisboard->ai_speed; 1101 err++; 1102 } 1103 } 1104 1105 if (cmd->scan_end_arg != cmd->chanlist_len) { 1106 cmd->scan_end_arg = cmd->chanlist_len; 1107 err++; 1108 } 1109 if (cmd->stop_src == TRIG_NONE) { 1110 /* TRIG_NONE */ 1111 if (cmd->stop_arg != 0) { 1112 cmd->stop_arg = 0; 1113 err++; 1114 } 1115 } 1116 1117 if (err) 1118 return 3; 1119 1120 /* step 4: fix up any arguments */ 1121 1122 if (cmd->scan_begin_src == TRIG_TIMER) { 1123 tmp = cmd->scan_begin_arg; 1124 i8253_cascade_ns_to_timer_2div(TIMER_BASE, 1125 &(devpriv->divisor1), &(devpriv->divisor2), 1126 &(cmd->scan_begin_arg), cmd->flags & TRIG_ROUND_MASK); 1127 if (tmp != cmd->scan_begin_arg) 1128 err++; 1129 } 1130 if (cmd->convert_src == TRIG_TIMER) { 1131 tmp = cmd->convert_arg; 1132 i8253_cascade_ns_to_timer_2div(TIMER_BASE, 1133 &(devpriv->divisor1), &(devpriv->divisor2), 1134 &(cmd->convert_arg), cmd->flags & TRIG_ROUND_MASK); 1135 if (tmp != cmd->convert_arg) 1136 err++; 1137 } 1138 1139 if (err) 1140 return 4; 1141 1142 /* check channel/gain list against card's limitations */ 1143 if (cmd->chanlist) { 1144 gain = CR_RANGE(cmd->chanlist[0]); 1145 start_chan = CR_CHAN(cmd->chanlist[0]); 1146 for (i = 1; i < cmd->chanlist_len; i++) { 1147 if (CR_CHAN(cmd->chanlist[i]) != 1148 (start_chan + i) % s->n_chan) { 1149 comedi_error(dev, 1150 "entries in chanlist must be consecutive channels, counting upwards\n"); 1151 err++; 1152 } 1153 if (CR_RANGE(cmd->chanlist[i]) != gain) { 1154 comedi_error(dev, 1155 "entries in chanlist must all have the same gain\n"); 1156 err++; 1157 } 1158 } 1159 } 1160 1161 if (err) 1162 return 5; 1163 1164 return 0; 1165} 1166 1167static int cb_pcidas_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) 1168{ 1169 struct comedi_async *async = s->async; 1170 struct comedi_cmd *cmd = &async->cmd; 1171 unsigned int bits; 1172 unsigned long flags; 1173 1174 /* make sure CAL_EN_BIT is disabled */ 1175 outw(0, devpriv->control_status + CALIBRATION_REG); 1176 /* initialize before settings pacer source and count values */ 1177 outw(0, devpriv->control_status + TRIG_CONTSTAT); 1178 /* clear fifo */ 1179 outw(0, devpriv->adc_fifo + ADCFIFOCLR); 1180 1181 /* set mux limits, gain and pacer source */ 1182 bits = BEGIN_SCAN(CR_CHAN(cmd->chanlist[0])) | 1183 END_SCAN(CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1])) | 1184 GAIN_BITS(CR_RANGE(cmd->chanlist[0])); 1185 /* set unipolar/bipolar */ 1186 if (CR_RANGE(cmd->chanlist[0]) & IS_UNIPOLAR) 1187 bits |= UNIP; 1188 /* set singleended/differential */ 1189 if (CR_AREF(cmd->chanlist[0]) != AREF_DIFF) 1190 bits |= SE; 1191 /* set pacer source */ 1192 if (cmd->convert_src == TRIG_EXT || cmd->scan_begin_src == TRIG_EXT) 1193 bits |= PACER_EXT_RISE; 1194 else 1195 bits |= PACER_INT; 1196 outw(bits, devpriv->control_status + ADCMUX_CONT); 1197 1198#ifdef CB_PCIDAS_DEBUG 1199 rt_printk("comedi: sent 0x%x to adcmux control\n", bits); 1200#endif 1201 1202 /* load counters */ 1203 if (cmd->convert_src == TRIG_TIMER) 1204 cb_pcidas_load_counters(dev, &cmd->convert_arg, 1205 cmd->flags & TRIG_ROUND_MASK); 1206 else if (cmd->scan_begin_src == TRIG_TIMER) 1207 cb_pcidas_load_counters(dev, &cmd->scan_begin_arg, 1208 cmd->flags & TRIG_ROUND_MASK); 1209 1210 /* set number of conversions */ 1211 if (cmd->stop_src == TRIG_COUNT) { 1212 devpriv->count = cmd->chanlist_len * cmd->stop_arg; 1213 } 1214 /* enable interrupts */ 1215 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1216 devpriv->adc_fifo_bits |= INTE; 1217 devpriv->adc_fifo_bits &= ~INT_MASK; 1218 if (cmd->flags & TRIG_WAKE_EOS) { 1219 if (cmd->convert_src == TRIG_NOW && cmd->chanlist_len > 1) 1220 devpriv->adc_fifo_bits |= INT_EOS; /* interrupt end of burst */ 1221 else 1222 devpriv->adc_fifo_bits |= INT_FNE; /* interrupt fifo not empty */ 1223 } else { 1224 devpriv->adc_fifo_bits |= INT_FHF; /* interrupt fifo half full */ 1225 } 1226#ifdef CB_PCIDAS_DEBUG 1227 rt_printk("comedi: adc_fifo_bits are 0x%x\n", devpriv->adc_fifo_bits); 1228#endif 1229 /* enable (and clear) interrupts */ 1230 outw(devpriv->adc_fifo_bits | EOAI | INT | LADFUL, 1231 devpriv->control_status + INT_ADCFIFO); 1232 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1233 1234 /* set start trigger and burst mode */ 1235 bits = 0; 1236 if (cmd->start_src == TRIG_NOW) 1237 bits |= SW_TRIGGER; 1238 else if (cmd->start_src == TRIG_EXT) 1239 bits |= EXT_TRIGGER | TGEN | XTRCL; 1240 else { 1241 comedi_error(dev, "bug!"); 1242 return -1; 1243 } 1244 if (cmd->convert_src == TRIG_NOW && cmd->chanlist_len > 1) 1245 bits |= BURSTE; 1246 outw(bits, devpriv->control_status + TRIG_CONTSTAT); 1247#ifdef CB_PCIDAS_DEBUG 1248 rt_printk("comedi: sent 0x%x to trig control\n", bits); 1249#endif 1250 1251 return 0; 1252} 1253 1254static int cb_pcidas_ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, 1255 struct comedi_cmd *cmd) 1256{ 1257 int err = 0; 1258 int tmp; 1259 1260 /* cmdtest tests a particular command to see if it is valid. 1261 * Using the cmdtest ioctl, a user can create a valid cmd 1262 * and then have it executes by the cmd ioctl. 1263 * 1264 * cmdtest returns 1,2,3,4 or 0, depending on which tests 1265 * the command passes. */ 1266 1267 /* step 1: make sure trigger sources are trivially valid */ 1268 1269 tmp = cmd->start_src; 1270 cmd->start_src &= TRIG_INT; 1271 if (!cmd->start_src || tmp != cmd->start_src) 1272 err++; 1273 1274 tmp = cmd->scan_begin_src; 1275 cmd->scan_begin_src &= TRIG_TIMER | TRIG_EXT; 1276 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src) 1277 err++; 1278 1279 tmp = cmd->convert_src; 1280 cmd->convert_src &= TRIG_NOW; 1281 if (!cmd->convert_src || tmp != cmd->convert_src) 1282 err++; 1283 1284 tmp = cmd->scan_end_src; 1285 cmd->scan_end_src &= TRIG_COUNT; 1286 if (!cmd->scan_end_src || tmp != cmd->scan_end_src) 1287 err++; 1288 1289 tmp = cmd->stop_src; 1290 cmd->stop_src &= TRIG_COUNT | TRIG_NONE; 1291 if (!cmd->stop_src || tmp != cmd->stop_src) 1292 err++; 1293 1294 if (err) 1295 return 1; 1296 1297 /* step 2: make sure trigger sources are unique and mutually compatible */ 1298 1299 if (cmd->scan_begin_src != TRIG_TIMER && 1300 cmd->scan_begin_src != TRIG_EXT) 1301 err++; 1302 if (cmd->stop_src != TRIG_COUNT && cmd->stop_src != TRIG_NONE) 1303 err++; 1304 1305 if (err) 1306 return 2; 1307 1308 /* step 3: make sure arguments are trivially compatible */ 1309 1310 if (cmd->start_arg != 0) { 1311 cmd->start_arg = 0; 1312 err++; 1313 } 1314 1315 if (cmd->scan_begin_src == TRIG_TIMER) { 1316 if (cmd->scan_begin_arg < thisboard->ao_scan_speed) { 1317 cmd->scan_begin_arg = thisboard->ao_scan_speed; 1318 err++; 1319 } 1320 } 1321 1322 if (cmd->scan_end_arg != cmd->chanlist_len) { 1323 cmd->scan_end_arg = cmd->chanlist_len; 1324 err++; 1325 } 1326 if (cmd->stop_src == TRIG_NONE) { 1327 /* TRIG_NONE */ 1328 if (cmd->stop_arg != 0) { 1329 cmd->stop_arg = 0; 1330 err++; 1331 } 1332 } 1333 1334 if (err) 1335 return 3; 1336 1337 /* step 4: fix up any arguments */ 1338 1339 if (cmd->scan_begin_src == TRIG_TIMER) { 1340 tmp = cmd->scan_begin_arg; 1341 i8253_cascade_ns_to_timer_2div(TIMER_BASE, 1342 &(devpriv->ao_divisor1), &(devpriv->ao_divisor2), 1343 &(cmd->scan_begin_arg), cmd->flags & TRIG_ROUND_MASK); 1344 if (tmp != cmd->scan_begin_arg) 1345 err++; 1346 } 1347 1348 if (err) 1349 return 4; 1350 1351 /* check channel/gain list against card's limitations */ 1352 if (cmd->chanlist && cmd->chanlist_len > 1) { 1353 if (CR_CHAN(cmd->chanlist[0]) != 0 || 1354 CR_CHAN(cmd->chanlist[1]) != 1) { 1355 comedi_error(dev, 1356 "channels must be ordered channel 0, channel 1 in chanlist\n"); 1357 err++; 1358 } 1359 } 1360 1361 if (err) 1362 return 5; 1363 1364 return 0; 1365} 1366 1367static int cb_pcidas_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s) 1368{ 1369 struct comedi_async *async = s->async; 1370 struct comedi_cmd *cmd = &async->cmd; 1371 unsigned int i; 1372 unsigned long flags; 1373 1374 /* set channel limits, gain */ 1375 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1376 for (i = 0; i < cmd->chanlist_len; i++) { 1377 /* enable channel */ 1378 devpriv->ao_control_bits |= 1379 DAC_CHAN_EN(CR_CHAN(cmd->chanlist[i])); 1380 /* set range */ 1381 devpriv->ao_control_bits |= DAC_RANGE(CR_CHAN(cmd->chanlist[i]), 1382 CR_RANGE(cmd->chanlist[i])); 1383 } 1384 1385 /* disable analog out before settings pacer source and count values */ 1386 outw(devpriv->ao_control_bits, devpriv->control_status + DAC_CSR); 1387 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1388 1389 /* clear fifo */ 1390 outw(0, devpriv->ao_registers + DACFIFOCLR); 1391 1392 /* load counters */ 1393 if (cmd->scan_begin_src == TRIG_TIMER) { 1394 i8253_cascade_ns_to_timer_2div(TIMER_BASE, 1395 &(devpriv->ao_divisor1), &(devpriv->ao_divisor2), 1396 &(cmd->scan_begin_arg), cmd->flags); 1397 1398 /* Write the values of ctr1 and ctr2 into counters 1 and 2 */ 1399 i8254_load(devpriv->pacer_counter_dio + DAC8254, 0, 1, 1400 devpriv->ao_divisor1, 2); 1401 i8254_load(devpriv->pacer_counter_dio + DAC8254, 0, 2, 1402 devpriv->ao_divisor2, 2); 1403 } 1404 /* set number of conversions */ 1405 if (cmd->stop_src == TRIG_COUNT) { 1406 devpriv->ao_count = cmd->chanlist_len * cmd->stop_arg; 1407 } 1408 /* set pacer source */ 1409 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1410 switch (cmd->scan_begin_src) { 1411 case TRIG_TIMER: 1412 devpriv->ao_control_bits |= DAC_PACER_INT; 1413 break; 1414 case TRIG_EXT: 1415 devpriv->ao_control_bits |= DAC_PACER_EXT_RISE; 1416 break; 1417 default: 1418 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1419 comedi_error(dev, "error setting dac pacer source"); 1420 return -1; 1421 break; 1422 } 1423 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1424 1425 async->inttrig = cb_pcidas_ao_inttrig; 1426 1427 return 0; 1428} 1429 1430static int cb_pcidas_ao_inttrig(struct comedi_device *dev, 1431 struct comedi_subdevice *s, 1432 unsigned int trig_num) 1433{ 1434 unsigned int num_bytes, num_points = thisboard->fifo_size; 1435 struct comedi_async *async = s->async; 1436 struct comedi_cmd *cmd = &s->async->cmd; 1437 unsigned long flags; 1438 1439 if (trig_num != 0) 1440 return -EINVAL; 1441 1442 /* load up fifo */ 1443 if (cmd->stop_src == TRIG_COUNT && devpriv->ao_count < num_points) 1444 num_points = devpriv->ao_count; 1445 1446 num_bytes = cfc_read_array_from_buffer(s, devpriv->ao_buffer, 1447 num_points * sizeof(short)); 1448 num_points = num_bytes / sizeof(short); 1449 1450 if (cmd->stop_src == TRIG_COUNT) { 1451 devpriv->ao_count -= num_points; 1452 } 1453 /* write data to board's fifo */ 1454 outsw(devpriv->ao_registers + DACDATA, devpriv->ao_buffer, num_bytes); 1455 1456 /* enable dac half-full and empty interrupts */ 1457 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1458 devpriv->adc_fifo_bits |= DAEMIE | DAHFIE; 1459#ifdef CB_PCIDAS_DEBUG 1460 rt_printk("comedi: adc_fifo_bits are 0x%x\n", devpriv->adc_fifo_bits); 1461#endif 1462 /* enable and clear interrupts */ 1463 outw(devpriv->adc_fifo_bits | DAEMI | DAHFI, 1464 devpriv->control_status + INT_ADCFIFO); 1465 1466 /* start dac */ 1467 devpriv->ao_control_bits |= DAC_START | DACEN | DAC_EMPTY; 1468 outw(devpriv->ao_control_bits, devpriv->control_status + DAC_CSR); 1469#ifdef CB_PCIDAS_DEBUG 1470 rt_printk("comedi: sent 0x%x to dac control\n", 1471 devpriv->ao_control_bits); 1472#endif 1473 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1474 1475 async->inttrig = NULL; 1476 1477 return 0; 1478} 1479 1480static irqreturn_t cb_pcidas_interrupt(int irq, void *d) 1481{ 1482 struct comedi_device *dev = (struct comedi_device *) d; 1483 struct comedi_subdevice *s = dev->read_subdev; 1484 struct comedi_async *async; 1485 int status, s5933_status; 1486 int half_fifo = thisboard->fifo_size / 2; 1487 unsigned int num_samples, i; 1488 static const int timeout = 10000; 1489 unsigned long flags; 1490 1491 if (dev->attached == 0) { 1492 return IRQ_NONE; 1493 } 1494 1495 async = s->async; 1496 async->events = 0; 1497 1498 s5933_status = inl(devpriv->s5933_config + AMCC_OP_REG_INTCSR); 1499#ifdef CB_PCIDAS_DEBUG 1500 rt_printk("intcsr 0x%x\n", s5933_status); 1501 rt_printk("mbef 0x%x\n", inl(devpriv->s5933_config + AMCC_OP_REG_MBEF)); 1502#endif 1503 1504 if ((INTCSR_INTR_ASSERTED & s5933_status) == 0) 1505 return IRQ_NONE; 1506 1507 /* make sure mailbox 4 is empty */ 1508 inl_p(devpriv->s5933_config + AMCC_OP_REG_IMB4); 1509 /* clear interrupt on amcc s5933 */ 1510 outl(devpriv->s5933_intcsr_bits | INTCSR_INBOX_INTR_STATUS, 1511 devpriv->s5933_config + AMCC_OP_REG_INTCSR); 1512 1513 status = inw(devpriv->control_status + INT_ADCFIFO); 1514#ifdef CB_PCIDAS_DEBUG 1515 if ((status & (INT | EOAI | LADFUL | DAHFI | DAEMI)) == 0) { 1516 comedi_error(dev, "spurious interrupt"); 1517 } 1518#endif 1519 1520 /* check for analog output interrupt */ 1521 if (status & (DAHFI | DAEMI)) { 1522 handle_ao_interrupt(dev, status); 1523 } 1524 /* check for analog input interrupts */ 1525 /* if fifo half-full */ 1526 if (status & ADHFI) { 1527 /* read data */ 1528 num_samples = half_fifo; 1529 if (async->cmd.stop_src == TRIG_COUNT && 1530 num_samples > devpriv->count) { 1531 num_samples = devpriv->count; 1532 } 1533 insw(devpriv->adc_fifo + ADCDATA, devpriv->ai_buffer, 1534 num_samples); 1535 cfc_write_array_to_buffer(s, devpriv->ai_buffer, 1536 num_samples * sizeof(short)); 1537 devpriv->count -= num_samples; 1538 if (async->cmd.stop_src == TRIG_COUNT && devpriv->count == 0) { 1539 async->events |= COMEDI_CB_EOA; 1540 cb_pcidas_cancel(dev, s); 1541 } 1542 /* clear half-full interrupt latch */ 1543 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1544 outw(devpriv->adc_fifo_bits | INT, 1545 devpriv->control_status + INT_ADCFIFO); 1546 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1547 /* else if fifo not empty */ 1548 } else if (status & (ADNEI | EOBI)) { 1549 for (i = 0; i < timeout; i++) { 1550 /* break if fifo is empty */ 1551 if ((ADNE & inw(devpriv->control_status + 1552 INT_ADCFIFO)) == 0) 1553 break; 1554 cfc_write_to_buffer(s, inw(devpriv->adc_fifo)); 1555 if (async->cmd.stop_src == TRIG_COUNT && --devpriv->count == 0) { /* end of acquisition */ 1556 cb_pcidas_cancel(dev, s); 1557 async->events |= COMEDI_CB_EOA; 1558 break; 1559 } 1560 } 1561 /* clear not-empty interrupt latch */ 1562 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1563 outw(devpriv->adc_fifo_bits | INT, 1564 devpriv->control_status + INT_ADCFIFO); 1565 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1566 } else if (status & EOAI) { 1567 comedi_error(dev, 1568 "bug! encountered end of aquisition interrupt?"); 1569 /* clear EOA interrupt latch */ 1570 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1571 outw(devpriv->adc_fifo_bits | EOAI, 1572 devpriv->control_status + INT_ADCFIFO); 1573 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1574 } 1575 /* check for fifo overflow */ 1576 if (status & LADFUL) { 1577 comedi_error(dev, "fifo overflow"); 1578 /* clear overflow interrupt latch */ 1579 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1580 outw(devpriv->adc_fifo_bits | LADFUL, 1581 devpriv->control_status + INT_ADCFIFO); 1582 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1583 cb_pcidas_cancel(dev, s); 1584 async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR; 1585 } 1586 1587 comedi_event(dev, s); 1588 1589 return IRQ_HANDLED; 1590} 1591 1592static void handle_ao_interrupt(struct comedi_device *dev, unsigned int status) 1593{ 1594 struct comedi_subdevice *s = dev->write_subdev; 1595 struct comedi_async *async = s->async; 1596 struct comedi_cmd *cmd = &async->cmd; 1597 unsigned int half_fifo = thisboard->fifo_size / 2; 1598 unsigned int num_points; 1599 unsigned int flags; 1600 1601 async->events = 0; 1602 1603 if (status & DAEMI) { 1604 /* clear dac empty interrupt latch */ 1605 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1606 outw(devpriv->adc_fifo_bits | DAEMI, 1607 devpriv->control_status + INT_ADCFIFO); 1608 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1609 if (inw(devpriv->ao_registers + DAC_CSR) & DAC_EMPTY) { 1610 if (cmd->stop_src == TRIG_NONE || 1611 (cmd->stop_src == TRIG_COUNT 1612 && devpriv->ao_count)) { 1613 comedi_error(dev, "dac fifo underflow"); 1614 cb_pcidas_ao_cancel(dev, s); 1615 async->events |= COMEDI_CB_ERROR; 1616 } 1617 async->events |= COMEDI_CB_EOA; 1618 } 1619 } else if (status & DAHFI) { 1620 unsigned int num_bytes; 1621 1622 /* figure out how many points we are writing to fifo */ 1623 num_points = half_fifo; 1624 if (cmd->stop_src == TRIG_COUNT && 1625 devpriv->ao_count < num_points) 1626 num_points = devpriv->ao_count; 1627 num_bytes = 1628 cfc_read_array_from_buffer(s, devpriv->ao_buffer, 1629 num_points * sizeof(short)); 1630 num_points = num_bytes / sizeof(short); 1631 1632 if (async->cmd.stop_src == TRIG_COUNT) { 1633 devpriv->ao_count -= num_points; 1634 } 1635 /* write data to board's fifo */ 1636 outsw(devpriv->ao_registers + DACDATA, devpriv->ao_buffer, 1637 num_points); 1638 /* clear half-full interrupt latch */ 1639 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1640 outw(devpriv->adc_fifo_bits | DAHFI, 1641 devpriv->control_status + INT_ADCFIFO); 1642 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1643 } 1644 1645 comedi_event(dev, s); 1646} 1647 1648/* cancel analog input command */ 1649static int cb_pcidas_cancel(struct comedi_device *dev, struct comedi_subdevice *s) 1650{ 1651 unsigned long flags; 1652 1653 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1654 /* disable interrupts */ 1655 devpriv->adc_fifo_bits &= ~INTE & ~EOAIE; 1656 outw(devpriv->adc_fifo_bits, devpriv->control_status + INT_ADCFIFO); 1657 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1658 1659 /* disable start trigger source and burst mode */ 1660 outw(0, devpriv->control_status + TRIG_CONTSTAT); 1661 /* software pacer source */ 1662 outw(0, devpriv->control_status + ADCMUX_CONT); 1663 1664 return 0; 1665} 1666 1667/* cancel analog output command */ 1668static int cb_pcidas_ao_cancel(struct comedi_device *dev, 1669 struct comedi_subdevice *s) 1670{ 1671 unsigned long flags; 1672 1673 comedi_spin_lock_irqsave(&dev->spinlock, flags); 1674 /* disable interrupts */ 1675 devpriv->adc_fifo_bits &= ~DAHFIE & ~DAEMIE; 1676 outw(devpriv->adc_fifo_bits, devpriv->control_status + INT_ADCFIFO); 1677 1678 /* disable output */ 1679 devpriv->ao_control_bits &= ~DACEN & ~DAC_PACER_MASK; 1680 outw(devpriv->ao_control_bits, devpriv->control_status + DAC_CSR); 1681 comedi_spin_unlock_irqrestore(&dev->spinlock, flags); 1682 1683 return 0; 1684} 1685 1686static void cb_pcidas_load_counters(struct comedi_device *dev, unsigned int *ns, 1687 int rounding_flags) 1688{ 1689 i8253_cascade_ns_to_timer_2div(TIMER_BASE, &(devpriv->divisor1), 1690 &(devpriv->divisor2), ns, rounding_flags & TRIG_ROUND_MASK); 1691 1692 /* Write the values of ctr1 and ctr2 into counters 1 and 2 */ 1693 i8254_load(devpriv->pacer_counter_dio + ADC8254, 0, 1, 1694 devpriv->divisor1, 2); 1695 i8254_load(devpriv->pacer_counter_dio + ADC8254, 0, 2, 1696 devpriv->divisor2, 2); 1697} 1698 1699static void write_calibration_bitstream(struct comedi_device *dev, 1700 unsigned int register_bits, unsigned int bitstream, 1701 unsigned int bitstream_length) 1702{ 1703 static const int write_delay = 1; 1704 unsigned int bit; 1705 1706 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) { 1707 if (bitstream & bit) 1708 register_bits |= SERIAL_DATA_IN_BIT; 1709 else 1710 register_bits &= ~SERIAL_DATA_IN_BIT; 1711 comedi_udelay(write_delay); 1712 outw(register_bits, devpriv->control_status + CALIBRATION_REG); 1713 } 1714} 1715 1716static int caldac_8800_write(struct comedi_device *dev, unsigned int address, 1717 uint8_t value) 1718{ 1719 static const int num_caldac_channels = 8; 1720 static const int bitstream_length = 11; 1721 unsigned int bitstream = ((address & 0x7) << 8) | value; 1722 static const int caldac_8800_comedi_udelay = 1; 1723 1724 if (address >= num_caldac_channels) { 1725 comedi_error(dev, "illegal caldac channel"); 1726 return -1; 1727 } 1728 1729 if (value == devpriv->caldac_value[address]) 1730 return 1; 1731 1732 devpriv->caldac_value[address] = value; 1733 1734 write_calibration_bitstream(dev, cal_enable_bits(dev), bitstream, 1735 bitstream_length); 1736 1737 comedi_udelay(caldac_8800_comedi_udelay); 1738 outw(cal_enable_bits(dev) | SELECT_8800_BIT, 1739 devpriv->control_status + CALIBRATION_REG); 1740 comedi_udelay(caldac_8800_comedi_udelay); 1741 outw(cal_enable_bits(dev), devpriv->control_status + CALIBRATION_REG); 1742 1743 return 1; 1744} 1745 1746static int trimpot_7376_write(struct comedi_device *dev, uint8_t value) 1747{ 1748 static const int bitstream_length = 7; 1749 unsigned int bitstream = value & 0x7f; 1750 unsigned int register_bits; 1751 static const int ad7376_comedi_udelay = 1; 1752 1753 register_bits = cal_enable_bits(dev) | SELECT_TRIMPOT_BIT; 1754 comedi_udelay(ad7376_comedi_udelay); 1755 outw(register_bits, devpriv->control_status + CALIBRATION_REG); 1756 1757 write_calibration_bitstream(dev, register_bits, bitstream, 1758 bitstream_length); 1759 1760 comedi_udelay(ad7376_comedi_udelay); 1761 outw(cal_enable_bits(dev), devpriv->control_status + CALIBRATION_REG); 1762 1763 return 0; 1764} 1765 1766/* For 1602/16 only 1767 * ch 0 : adc gain 1768 * ch 1 : adc postgain offset */ 1769static int trimpot_8402_write(struct comedi_device *dev, unsigned int channel, 1770 uint8_t value) 1771{ 1772 static const int bitstream_length = 10; 1773 unsigned int bitstream = ((channel & 0x3) << 8) | (value & 0xff); 1774 unsigned int register_bits; 1775 static const int ad8402_comedi_udelay = 1; 1776 1777 register_bits = cal_enable_bits(dev) | SELECT_TRIMPOT_BIT; 1778 comedi_udelay(ad8402_comedi_udelay); 1779 outw(register_bits, devpriv->control_status + CALIBRATION_REG); 1780 1781 write_calibration_bitstream(dev, register_bits, bitstream, 1782 bitstream_length); 1783 1784 comedi_udelay(ad8402_comedi_udelay); 1785 outw(cal_enable_bits(dev), devpriv->control_status + CALIBRATION_REG); 1786 1787 return 0; 1788} 1789 1790static int wait_for_nvram_ready(unsigned long s5933_base_addr) 1791{ 1792 static const int timeout = 1000; 1793 unsigned int i; 1794 1795 for (i = 0; i < timeout; i++) { 1796 if ((inb(s5933_base_addr + 1797 AMCC_OP_REG_MCSR_NVCMD) & MCSR_NV_BUSY) 1798 == 0) 1799 return 0; 1800 comedi_udelay(1); 1801 } 1802 return -1; 1803} 1804 1805static int nvram_read(struct comedi_device *dev, unsigned int address, uint8_t *data) 1806{ 1807 unsigned long iobase = devpriv->s5933_config; 1808 1809 if (wait_for_nvram_ready(iobase) < 0) 1810 return -ETIMEDOUT; 1811 1812 outb(MCSR_NV_ENABLE | MCSR_NV_LOAD_LOW_ADDR, 1813 iobase + AMCC_OP_REG_MCSR_NVCMD); 1814 outb(address & 0xff, iobase + AMCC_OP_REG_MCSR_NVDATA); 1815 outb(MCSR_NV_ENABLE | MCSR_NV_LOAD_HIGH_ADDR, 1816 iobase + AMCC_OP_REG_MCSR_NVCMD); 1817 outb((address >> 8) & 0xff, iobase + AMCC_OP_REG_MCSR_NVDATA); 1818 outb(MCSR_NV_ENABLE | MCSR_NV_READ, iobase + AMCC_OP_REG_MCSR_NVCMD); 1819 1820 if (wait_for_nvram_ready(iobase) < 0) 1821 return -ETIMEDOUT; 1822 1823 *data = inb(iobase + AMCC_OP_REG_MCSR_NVDATA); 1824 1825 return 0; 1826} 1827 1828/* 1829 * A convenient macro that defines init_module() and cleanup_module(), 1830 * as necessary. 1831 */ 1832COMEDI_PCI_INITCLEANUP(driver_cb_pcidas, cb_pcidas_pci_table); 1833