cb_pcidda.c revision 07c2412a5e65f3f7087473d86742b418cd4c96fb
1/* 2 comedi/drivers/cb_pcidda.c 3 This intends to be a driver for the ComputerBoards / MeasurementComputing 4 PCI-DDA series. 5 6 Copyright (C) 2001 Ivan Martinez <ivanmr@altavista.com> 7 Copyright (C) 2001 Frank Mori Hess <fmhess@users.sourceforge.net> 8 9 COMEDI - Linux Control and Measurement Device Interface 10 Copyright (C) 1997-8 David A. Schleef <ds@schleef.org> 11 12 This program is free software; you can redistribute it and/or modify 13 it under the terms of the GNU General Public License as published by 14 the Free Software Foundation; either version 2 of the License, or 15 (at your option) any later version. 16 17 This program is distributed in the hope that it will be useful, 18 but WITHOUT ANY WARRANTY; without even the implied warranty of 19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 GNU General Public License for more details. 21 22 You should have received a copy of the GNU General Public License 23 along with this program; if not, write to the Free Software 24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 25 26*/ 27/* 28Driver: cb_pcidda 29Description: MeasurementComputing PCI-DDA series 30Author: Ivan Martinez <ivanmr@altavista.com>, Frank Mori Hess <fmhess@users.sourceforge.net> 31Status: Supports 08/16, 04/16, 02/16, 08/12, 04/12, and 02/12 32Devices: [Measurement Computing] PCI-DDA08/12 (cb_pcidda), PCI-DDA04/12, 33 PCI-DDA02/12, PCI-DDA08/16, PCI-DDA04/16, PCI-DDA02/16 34 35Configuration options: 36 [0] - PCI bus of device (optional) 37 [1] - PCI slot of device (optional) 38 If bus/slot is not specified, the first available PCI 39 device will be used. 40 41Only simple analog output writing is supported. 42 43So far it has only been tested with: 44 - PCI-DDA08/12 45Please report success/failure with other different cards to 46<comedi@comedi.org>. 47*/ 48 49#include "../comedidev.h" 50 51#include "comedi_pci.h" 52#include "8255.h" 53 54#define PCI_VENDOR_ID_CB 0x1307 /* PCI vendor number of ComputerBoards */ 55#define EEPROM_SIZE 128 /* number of entries in eeprom */ 56#define MAX_AO_CHANNELS 8 /* maximum number of ao channels for supported boards */ 57 58/* PCI-DDA base addresses */ 59#define DIGITALIO_BADRINDEX 2 60 /* DIGITAL I/O is pci_dev->resource[2] */ 61#define DIGITALIO_SIZE 8 62 /* DIGITAL I/O uses 8 I/O port addresses */ 63#define DAC_BADRINDEX 3 64 /* DAC is pci_dev->resource[3] */ 65 66/* Digital I/O registers */ 67#define PORT1A 0 /* PORT 1A DATA */ 68 69#define PORT1B 1 /* PORT 1B DATA */ 70 71#define PORT1C 2 /* PORT 1C DATA */ 72 73#define CONTROL1 3 /* CONTROL REGISTER 1 */ 74 75#define PORT2A 4 /* PORT 2A DATA */ 76 77#define PORT2B 5 /* PORT 2B DATA */ 78 79#define PORT2C 6 /* PORT 2C DATA */ 80 81#define CONTROL2 7 /* CONTROL REGISTER 2 */ 82 83/* DAC registers */ 84#define DACONTROL 0 /* D/A CONTROL REGISTER */ 85#define SU 0000001 /* Simultaneous update enabled */ 86#define NOSU 0000000 /* Simultaneous update disabled */ 87#define ENABLEDAC 0000002 /* Enable specified DAC */ 88#define DISABLEDAC 0000000 /* Disable specified DAC */ 89#define RANGE2V5 0000000 /* 2.5V */ 90#define RANGE5V 0000200 /* 5V */ 91#define RANGE10V 0000300 /* 10V */ 92#define UNIP 0000400 /* Unipolar outputs */ 93#define BIP 0000000 /* Bipolar outputs */ 94 95#define DACALIBRATION1 4 /* D/A CALIBRATION REGISTER 1 */ 96/* write bits */ 97#define SERIAL_IN_BIT 0x1 /* serial data input for eeprom, caldacs, reference dac */ 98#define CAL_CHANNEL_MASK (0x7 << 1) 99#define CAL_CHANNEL_BITS(channel) (((channel) << 1) & CAL_CHANNEL_MASK) 100/* read bits */ 101#define CAL_COUNTER_MASK 0x1f 102#define CAL_COUNTER_OVERFLOW_BIT 0x20 /* calibration counter overflow status bit */ 103#define AO_BELOW_REF_BIT 0x40 /* analog output is less than reference dac voltage */ 104#define SERIAL_OUT_BIT 0x80 /* serial data out, for reading from eeprom */ 105 106#define DACALIBRATION2 6 /* D/A CALIBRATION REGISTER 2 */ 107#define SELECT_EEPROM_BIT 0x1 /* send serial data in to eeprom */ 108#define DESELECT_REF_DAC_BIT 0x2 /* don't send serial data to MAX542 reference dac */ 109#define DESELECT_CALDAC_BIT(n) (0x4 << (n)) /* don't send serial data to caldac n */ 110#define DUMMY_BIT 0x40 /* manual says to set this bit with no explanation */ 111 112#define DADATA 8 /* FIRST D/A DATA REGISTER (0) */ 113 114static const struct comedi_lrange cb_pcidda_ranges = { 115 6, 116 { 117 BIP_RANGE(10), 118 BIP_RANGE(5), 119 BIP_RANGE(2.5), 120 UNI_RANGE(10), 121 UNI_RANGE(5), 122 UNI_RANGE(2.5), 123 } 124}; 125 126/* 127 * Board descriptions for two imaginary boards. Describing the 128 * boards in this way is optional, and completely driver-dependent. 129 * Some drivers use arrays such as this, other do not. 130 */ 131struct cb_pcidda_board { 132 const char *name; 133 char status; /* Driver status: */ 134 135 /* 136 * 0 - tested 137 * 1 - manual read, not tested 138 * 2 - manual not read 139 */ 140 141 unsigned short device_id; 142 int ao_chans; 143 int ao_bits; 144 const struct comedi_lrange *ranges; 145}; 146 147static const struct cb_pcidda_board cb_pcidda_boards[] = { 148 { 149 .name = "pci-dda02/12", 150 .status = 1, 151 .device_id = 0x20, 152 .ao_chans = 2, 153 .ao_bits = 12, 154 .ranges = &cb_pcidda_ranges, 155 }, 156 { 157 .name = "pci-dda04/12", 158 .status = 1, 159 .device_id = 0x21, 160 .ao_chans = 4, 161 .ao_bits = 12, 162 .ranges = &cb_pcidda_ranges, 163 }, 164 { 165 .name = "pci-dda08/12", 166 .status = 0, 167 .device_id = 0x22, 168 .ao_chans = 8, 169 .ao_bits = 12, 170 .ranges = &cb_pcidda_ranges, 171 }, 172 { 173 .name = "pci-dda02/16", 174 .status = 2, 175 .device_id = 0x23, 176 .ao_chans = 2, 177 .ao_bits = 16, 178 .ranges = &cb_pcidda_ranges, 179 }, 180 { 181 .name = "pci-dda04/16", 182 .status = 2, 183 .device_id = 0x24, 184 .ao_chans = 4, 185 .ao_bits = 16, 186 .ranges = &cb_pcidda_ranges, 187 }, 188 { 189 .name = "pci-dda08/16", 190 .status = 0, 191 .device_id = 0x25, 192 .ao_chans = 8, 193 .ao_bits = 16, 194 .ranges = &cb_pcidda_ranges, 195 }, 196}; 197 198static DEFINE_PCI_DEVICE_TABLE(cb_pcidda_pci_table) = { 199 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0020) }, 200 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0021) }, 201 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0022) }, 202 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0023) }, 203 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0024) }, 204 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0025) }, 205 { 0 } 206}; 207 208MODULE_DEVICE_TABLE(pci, cb_pcidda_pci_table); 209 210/* 211 * Useful for shorthand access to the particular board structure 212 */ 213#define thisboard ((const struct cb_pcidda_board *)dev->board_ptr) 214 215/* this structure is for data unique to this hardware driver. If 216 several hardware drivers keep similar information in this structure, 217 feel free to suggest moving the variable to the struct comedi_device struct. */ 218struct cb_pcidda_private { 219 int data; 220 221 /* would be useful for a PCI device */ 222 struct pci_dev *pci_dev; 223 224 unsigned long digitalio; 225 unsigned long dac; 226 227 /* unsigned long control_status; */ 228 /* unsigned long adc_fifo; */ 229 230 unsigned int dac_cal1_bits; /* bits last written to da calibration register 1 */ 231 unsigned int ao_range[MAX_AO_CHANNELS]; /* current range settings for output channels */ 232 u16 eeprom_data[EEPROM_SIZE]; /* software copy of board's eeprom */ 233}; 234 235/* 236 * most drivers define the following macro to make it easy to 237 * access the private structure. 238 */ 239#define devpriv ((struct cb_pcidda_private *)dev->private) 240 241static int cb_pcidda_attach(struct comedi_device *dev, 242 struct comedi_devconfig *it); 243static int cb_pcidda_detach(struct comedi_device *dev); 244/* static int cb_pcidda_ai_rinsn(struct comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data); */ 245static int cb_pcidda_ao_winsn(struct comedi_device *dev, 246 struct comedi_subdevice *s, 247 struct comedi_insn *insn, unsigned int *data); 248 249/* static int cb_pcidda_ai_cmd(struct comedi_device *dev, struct *comedi_subdevice *s);*/ 250/* static int cb_pcidda_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd); */ 251/* static int cb_pcidda_ns_to_timer(unsigned int *ns,int *round); */ 252 253static unsigned int cb_pcidda_serial_in(struct comedi_device *dev); 254static void cb_pcidda_serial_out(struct comedi_device *dev, unsigned int value, 255 unsigned int num_bits); 256static unsigned int cb_pcidda_read_eeprom(struct comedi_device *dev, 257 unsigned int address); 258static void cb_pcidda_calibrate(struct comedi_device *dev, unsigned int channel, 259 unsigned int range); 260 261/* 262 * The struct comedi_driver structure tells the Comedi core module 263 * which functions to call to configure/deconfigure (attach/detach) 264 * the board, and also about the kernel module that contains 265 * the device code. 266 */ 267static struct comedi_driver driver_cb_pcidda = { 268 .driver_name = "cb_pcidda", 269 .module = THIS_MODULE, 270 .attach = cb_pcidda_attach, 271 .detach = cb_pcidda_detach, 272}; 273 274/* 275 * Attach is called by the Comedi core to configure the driver 276 * for a particular board. 277 */ 278static int cb_pcidda_attach(struct comedi_device *dev, 279 struct comedi_devconfig *it) 280{ 281 struct comedi_subdevice *s; 282 struct pci_dev *pcidev = NULL; 283 int index; 284 285 printk("comedi%d: cb_pcidda: ", dev->minor); 286 287/* 288 * Allocate the private structure area. 289 */ 290 if (alloc_private(dev, sizeof(struct cb_pcidda_private)) < 0) 291 return -ENOMEM; 292 293/* 294 * Probe the device to determine what device in the series it is. 295 */ 296 printk("\n"); 297 298 for_each_pci_dev(pcidev) { 299 if (pcidev->vendor == PCI_VENDOR_ID_CB) { 300 if (it->options[0] || it->options[1]) { 301 if (pcidev->bus->number != it->options[0] || 302 PCI_SLOT(pcidev->devfn) != it->options[1]) { 303 continue; 304 } 305 } 306 for (index = 0; index < ARRAY_SIZE(cb_pcidda_boards); index++) { 307 if (cb_pcidda_boards[index].device_id == 308 pcidev->device) { 309 goto found; 310 } 311 } 312 } 313 } 314 if (!pcidev) { 315 printk 316 ("Not a ComputerBoards/MeasurementComputing card on requested position\n"); 317 return -EIO; 318 } 319found: 320 devpriv->pci_dev = pcidev; 321 dev->board_ptr = cb_pcidda_boards + index; 322 /* "thisboard" macro can be used from here. */ 323 printk("Found %s at requested position\n", thisboard->name); 324 325 /* 326 * Enable PCI device and request regions. 327 */ 328 if (comedi_pci_enable(pcidev, thisboard->name)) { 329 printk 330 ("cb_pcidda: failed to enable PCI device and request regions\n"); 331 return -EIO; 332 } 333 334/* 335 * Allocate the I/O ports. 336 */ 337 devpriv->digitalio = 338 pci_resource_start(devpriv->pci_dev, DIGITALIO_BADRINDEX); 339 devpriv->dac = pci_resource_start(devpriv->pci_dev, DAC_BADRINDEX); 340 341/* 342 * Warn about the status of the driver. 343 */ 344 if (thisboard->status == 2) 345 printk 346 ("WARNING: DRIVER FOR THIS BOARD NOT CHECKED WITH MANUAL. " 347 "WORKS ASSUMING FULL COMPATIBILITY WITH PCI-DDA08/12. " 348 "PLEASE REPORT USAGE TO <ivanmr@altavista.com>.\n"); 349 350/* 351 * Initialize dev->board_name. 352 */ 353 dev->board_name = thisboard->name; 354 355/* 356 * Allocate the subdevice structures. 357 */ 358 if (alloc_subdevices(dev, 3) < 0) 359 return -ENOMEM; 360 361 s = dev->subdevices + 0; 362 /* analog output subdevice */ 363 s->type = COMEDI_SUBD_AO; 364 s->subdev_flags = SDF_WRITABLE; 365 s->n_chan = thisboard->ao_chans; 366 s->maxdata = (1 << thisboard->ao_bits) - 1; 367 s->range_table = thisboard->ranges; 368 s->insn_write = cb_pcidda_ao_winsn; 369 370 /* s->subdev_flags |= SDF_CMD_READ; */ 371 /* s->do_cmd = cb_pcidda_ai_cmd; */ 372 /* s->do_cmdtest = cb_pcidda_ai_cmdtest; */ 373 374 /* two 8255 digital io subdevices */ 375 s = dev->subdevices + 1; 376 subdev_8255_init(dev, s, NULL, devpriv->digitalio); 377 s = dev->subdevices + 2; 378 subdev_8255_init(dev, s, NULL, devpriv->digitalio + PORT2A); 379 380 printk(" eeprom:"); 381 for (index = 0; index < EEPROM_SIZE; index++) { 382 devpriv->eeprom_data[index] = cb_pcidda_read_eeprom(dev, index); 383 printk(" %i:0x%x ", index, devpriv->eeprom_data[index]); 384 } 385 printk("\n"); 386 387 /* set calibrations dacs */ 388 for (index = 0; index < thisboard->ao_chans; index++) 389 cb_pcidda_calibrate(dev, index, devpriv->ao_range[index]); 390 391 return 1; 392} 393 394/* 395 * _detach is called to deconfigure a device. It should deallocate 396 * resources. 397 * This function is also called when _attach() fails, so it should be 398 * careful not to release resources that were not necessarily 399 * allocated by _attach(). dev->private and dev->subdevices are 400 * deallocated automatically by the core. 401 */ 402static int cb_pcidda_detach(struct comedi_device *dev) 403{ 404/* 405 * Deallocate the I/O ports. 406 */ 407 if (devpriv) { 408 if (devpriv->pci_dev) { 409 if (devpriv->dac) 410 comedi_pci_disable(devpriv->pci_dev); 411 pci_dev_put(devpriv->pci_dev); 412 } 413 } 414 /* cleanup 8255 */ 415 if (dev->subdevices) { 416 subdev_8255_cleanup(dev, dev->subdevices + 1); 417 subdev_8255_cleanup(dev, dev->subdevices + 2); 418 } 419 420 printk("comedi%d: cb_pcidda: remove\n", dev->minor); 421 422 return 0; 423} 424 425/* 426 * I will program this later... ;-) 427 */ 428#if 0 429static int cb_pcidda_ai_cmd(struct comedi_device *dev, 430 struct comedi_subdevice *s) 431{ 432 printk("cb_pcidda_ai_cmd\n"); 433 printk("subdev: %d\n", cmd->subdev); 434 printk("flags: %d\n", cmd->flags); 435 printk("start_src: %d\n", cmd->start_src); 436 printk("start_arg: %d\n", cmd->start_arg); 437 printk("scan_begin_src: %d\n", cmd->scan_begin_src); 438 printk("convert_src: %d\n", cmd->convert_src); 439 printk("convert_arg: %d\n", cmd->convert_arg); 440 printk("scan_end_src: %d\n", cmd->scan_end_src); 441 printk("scan_end_arg: %d\n", cmd->scan_end_arg); 442 printk("stop_src: %d\n", cmd->stop_src); 443 printk("stop_arg: %d\n", cmd->stop_arg); 444 printk("chanlist_len: %d\n", cmd->chanlist_len); 445} 446#endif 447 448#if 0 449static int cb_pcidda_ai_cmdtest(struct comedi_device *dev, 450 struct comedi_subdevice *s, 451 struct comedi_cmd *cmd) 452{ 453 int err = 0; 454 int tmp; 455 456 /* cmdtest tests a particular command to see if it is valid. 457 * Using the cmdtest ioctl, a user can create a valid cmd 458 * and then have it executes by the cmd ioctl. 459 * 460 * cmdtest returns 1,2,3,4 or 0, depending on which tests 461 * the command passes. */ 462 463 /* step 1: make sure trigger sources are trivially valid */ 464 465 tmp = cmd->start_src; 466 cmd->start_src &= TRIG_NOW; 467 if (!cmd->start_src || tmp != cmd->start_src) 468 err++; 469 470 tmp = cmd->scan_begin_src; 471 cmd->scan_begin_src &= TRIG_TIMER | TRIG_EXT; 472 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src) 473 err++; 474 475 tmp = cmd->convert_src; 476 cmd->convert_src &= TRIG_TIMER | TRIG_EXT; 477 if (!cmd->convert_src || tmp != cmd->convert_src) 478 err++; 479 480 tmp = cmd->scan_end_src; 481 cmd->scan_end_src &= TRIG_COUNT; 482 if (!cmd->scan_end_src || tmp != cmd->scan_end_src) 483 err++; 484 485 tmp = cmd->stop_src; 486 cmd->stop_src &= TRIG_COUNT | TRIG_NONE; 487 if (!cmd->stop_src || tmp != cmd->stop_src) 488 err++; 489 490 if (err) 491 return 1; 492 493 /* step 2: make sure trigger sources are unique and mutually compatible */ 494 495 /* note that mutual compatibility is not an issue here */ 496 if (cmd->scan_begin_src != TRIG_TIMER 497 && cmd->scan_begin_src != TRIG_EXT) 498 err++; 499 if (cmd->convert_src != TRIG_TIMER && cmd->convert_src != TRIG_EXT) 500 err++; 501 if (cmd->stop_src != TRIG_TIMER && cmd->stop_src != TRIG_EXT) 502 err++; 503 504 if (err) 505 return 2; 506 507 /* step 3: make sure arguments are trivially compatible */ 508 509 if (cmd->start_arg != 0) { 510 cmd->start_arg = 0; 511 err++; 512 } 513#define MAX_SPEED 10000 /* in nanoseconds */ 514#define MIN_SPEED 1000000000 /* in nanoseconds */ 515 516 if (cmd->scan_begin_src == TRIG_TIMER) { 517 if (cmd->scan_begin_arg < MAX_SPEED) { 518 cmd->scan_begin_arg = MAX_SPEED; 519 err++; 520 } 521 if (cmd->scan_begin_arg > MIN_SPEED) { 522 cmd->scan_begin_arg = MIN_SPEED; 523 err++; 524 } 525 } else { 526 /* external trigger */ 527 /* should be level/edge, hi/lo specification here */ 528 /* should specify multiple external triggers */ 529 if (cmd->scan_begin_arg > 9) { 530 cmd->scan_begin_arg = 9; 531 err++; 532 } 533 } 534 if (cmd->convert_src == TRIG_TIMER) { 535 if (cmd->convert_arg < MAX_SPEED) { 536 cmd->convert_arg = MAX_SPEED; 537 err++; 538 } 539 if (cmd->convert_arg > MIN_SPEED) { 540 cmd->convert_arg = MIN_SPEED; 541 err++; 542 } 543 } else { 544 /* external trigger */ 545 /* see above */ 546 if (cmd->convert_arg > 9) { 547 cmd->convert_arg = 9; 548 err++; 549 } 550 } 551 552 if (cmd->scan_end_arg != cmd->chanlist_len) { 553 cmd->scan_end_arg = cmd->chanlist_len; 554 err++; 555 } 556 if (cmd->stop_src == TRIG_COUNT) { 557 if (cmd->stop_arg > 0x00ffffff) { 558 cmd->stop_arg = 0x00ffffff; 559 err++; 560 } 561 } else { 562 /* TRIG_NONE */ 563 if (cmd->stop_arg != 0) { 564 cmd->stop_arg = 0; 565 err++; 566 } 567 } 568 569 if (err) 570 return 3; 571 572 /* step 4: fix up any arguments */ 573 574 if (cmd->scan_begin_src == TRIG_TIMER) { 575 tmp = cmd->scan_begin_arg; 576 cb_pcidda_ns_to_timer(&cmd->scan_begin_arg, 577 cmd->flags & TRIG_ROUND_MASK); 578 if (tmp != cmd->scan_begin_arg) 579 err++; 580 } 581 if (cmd->convert_src == TRIG_TIMER) { 582 tmp = cmd->convert_arg; 583 cb_pcidda_ns_to_timer(&cmd->convert_arg, 584 cmd->flags & TRIG_ROUND_MASK); 585 if (tmp != cmd->convert_arg) 586 err++; 587 if (cmd->scan_begin_src == TRIG_TIMER && 588 cmd->scan_begin_arg < 589 cmd->convert_arg * cmd->scan_end_arg) { 590 cmd->scan_begin_arg = 591 cmd->convert_arg * cmd->scan_end_arg; 592 err++; 593 } 594 } 595 596 if (err) 597 return 4; 598 599 return 0; 600} 601#endif 602 603/* This function doesn't require a particular form, this is just 604 * what happens to be used in some of the drivers. It should 605 * convert ns nanoseconds to a counter value suitable for programming 606 * the device. Also, it should adjust ns so that it cooresponds to 607 * the actual time that the device will use. */ 608#if 0 609static int cb_pcidda_ns_to_timer(unsigned int *ns, int round) 610{ 611 /* trivial timer */ 612 return *ns; 613} 614#endif 615 616static int cb_pcidda_ao_winsn(struct comedi_device *dev, 617 struct comedi_subdevice *s, 618 struct comedi_insn *insn, unsigned int *data) 619{ 620 unsigned int command; 621 unsigned int channel, range; 622 623 channel = CR_CHAN(insn->chanspec); 624 range = CR_RANGE(insn->chanspec); 625 626 /* adjust calibration dacs if range has changed */ 627 if (range != devpriv->ao_range[channel]) 628 cb_pcidda_calibrate(dev, channel, range); 629 630 /* output channel configuration */ 631 command = NOSU | ENABLEDAC; 632 633 /* output channel range */ 634 switch (range) { 635 case 0: 636 command |= BIP | RANGE10V; 637 break; 638 case 1: 639 command |= BIP | RANGE5V; 640 break; 641 case 2: 642 command |= BIP | RANGE2V5; 643 break; 644 case 3: 645 command |= UNIP | RANGE10V; 646 break; 647 case 4: 648 command |= UNIP | RANGE5V; 649 break; 650 case 5: 651 command |= UNIP | RANGE2V5; 652 break; 653 }; 654 655 /* output channel specification */ 656 command |= channel << 2; 657 outw(command, devpriv->dac + DACONTROL); 658 659 /* write data */ 660 outw(data[0], devpriv->dac + DADATA + channel * 2); 661 662 /* return the number of samples read/written */ 663 return 1; 664} 665 666/* lowlevel read from eeprom */ 667static unsigned int cb_pcidda_serial_in(struct comedi_device *dev) 668{ 669 unsigned int value = 0; 670 int i; 671 const int value_width = 16; /* number of bits wide values are */ 672 673 for (i = 1; i <= value_width; i++) { 674 /* read bits most significant bit first */ 675 if (inw_p(devpriv->dac + DACALIBRATION1) & SERIAL_OUT_BIT) 676 value |= 1 << (value_width - i); 677 } 678 679 return value; 680} 681 682/* lowlevel write to eeprom/dac */ 683static void cb_pcidda_serial_out(struct comedi_device *dev, unsigned int value, 684 unsigned int num_bits) 685{ 686 int i; 687 688 for (i = 1; i <= num_bits; i++) { 689 /* send bits most significant bit first */ 690 if (value & (1 << (num_bits - i))) 691 devpriv->dac_cal1_bits |= SERIAL_IN_BIT; 692 else 693 devpriv->dac_cal1_bits &= ~SERIAL_IN_BIT; 694 outw_p(devpriv->dac_cal1_bits, devpriv->dac + DACALIBRATION1); 695 } 696} 697 698/* reads a 16 bit value from board's eeprom */ 699static unsigned int cb_pcidda_read_eeprom(struct comedi_device *dev, 700 unsigned int address) 701{ 702 unsigned int i; 703 unsigned int cal2_bits; 704 unsigned int value; 705 const int max_num_caldacs = 4; /* one caldac for every two dac channels */ 706 const int read_instruction = 0x6; /* bits to send to tell eeprom we want to read */ 707 const int instruction_length = 3; 708 const int address_length = 8; 709 710 /* send serial output stream to eeprom */ 711 cal2_bits = SELECT_EEPROM_BIT | DESELECT_REF_DAC_BIT | DUMMY_BIT; 712 /* deactivate caldacs (one caldac for every two channels) */ 713 for (i = 0; i < max_num_caldacs; i++) 714 cal2_bits |= DESELECT_CALDAC_BIT(i); 715 outw_p(cal2_bits, devpriv->dac + DACALIBRATION2); 716 717 /* tell eeprom we want to read */ 718 cb_pcidda_serial_out(dev, read_instruction, instruction_length); 719 /* send address we want to read from */ 720 cb_pcidda_serial_out(dev, address, address_length); 721 722 value = cb_pcidda_serial_in(dev); 723 724 /* deactivate eeprom */ 725 cal2_bits &= ~SELECT_EEPROM_BIT; 726 outw_p(cal2_bits, devpriv->dac + DACALIBRATION2); 727 728 return value; 729} 730 731/* writes to 8 bit calibration dacs */ 732static void cb_pcidda_write_caldac(struct comedi_device *dev, 733 unsigned int caldac, unsigned int channel, 734 unsigned int value) 735{ 736 unsigned int cal2_bits; 737 unsigned int i; 738 const int num_channel_bits = 3; /* caldacs use 3 bit channel specification */ 739 const int num_caldac_bits = 8; /* 8 bit calibration dacs */ 740 const int max_num_caldacs = 4; /* one caldac for every two dac channels */ 741 742 /* write 3 bit channel */ 743 cb_pcidda_serial_out(dev, channel, num_channel_bits); 744 /* write 8 bit caldac value */ 745 cb_pcidda_serial_out(dev, value, num_caldac_bits); 746 747/* 748* latch stream into appropriate caldac deselect reference dac 749*/ 750 cal2_bits = DESELECT_REF_DAC_BIT | DUMMY_BIT; 751 /* deactivate caldacs (one caldac for every two channels) */ 752 for (i = 0; i < max_num_caldacs; i++) 753 cal2_bits |= DESELECT_CALDAC_BIT(i); 754 /* activate the caldac we want */ 755 cal2_bits &= ~DESELECT_CALDAC_BIT(caldac); 756 outw_p(cal2_bits, devpriv->dac + DACALIBRATION2); 757 /* deactivate caldac */ 758 cal2_bits |= DESELECT_CALDAC_BIT(caldac); 759 outw_p(cal2_bits, devpriv->dac + DACALIBRATION2); 760} 761 762/* returns caldac that calibrates given analog out channel */ 763static unsigned int caldac_number(unsigned int channel) 764{ 765 return channel / 2; 766} 767 768/* returns caldac channel that provides fine gain for given ao channel */ 769static unsigned int fine_gain_channel(unsigned int ao_channel) 770{ 771 return 4 * (ao_channel % 2); 772} 773 774/* returns caldac channel that provides coarse gain for given ao channel */ 775static unsigned int coarse_gain_channel(unsigned int ao_channel) 776{ 777 return 1 + 4 * (ao_channel % 2); 778} 779 780/* returns caldac channel that provides coarse offset for given ao channel */ 781static unsigned int coarse_offset_channel(unsigned int ao_channel) 782{ 783 return 2 + 4 * (ao_channel % 2); 784} 785 786/* returns caldac channel that provides fine offset for given ao channel */ 787static unsigned int fine_offset_channel(unsigned int ao_channel) 788{ 789 return 3 + 4 * (ao_channel % 2); 790} 791 792/* returns eeprom address that provides offset for given ao channel and range */ 793static unsigned int offset_eeprom_address(unsigned int ao_channel, 794 unsigned int range) 795{ 796 return 0x7 + 2 * range + 12 * ao_channel; 797} 798 799/* returns eeprom address that provides gain calibration for given ao channel and range */ 800static unsigned int gain_eeprom_address(unsigned int ao_channel, 801 unsigned int range) 802{ 803 return 0x8 + 2 * range + 12 * ao_channel; 804} 805 806/* returns upper byte of eeprom entry, which gives the coarse adjustment values */ 807static unsigned int eeprom_coarse_byte(unsigned int word) 808{ 809 return (word >> 8) & 0xff; 810} 811 812/* returns lower byte of eeprom entry, which gives the fine adjustment values */ 813static unsigned int eeprom_fine_byte(unsigned int word) 814{ 815 return word & 0xff; 816} 817 818/* set caldacs to eeprom values for given channel and range */ 819static void cb_pcidda_calibrate(struct comedi_device *dev, unsigned int channel, 820 unsigned int range) 821{ 822 unsigned int coarse_offset, fine_offset, coarse_gain, fine_gain; 823 824 /* remember range so we can tell when we need to readjust calibration */ 825 devpriv->ao_range[channel] = range; 826 827 /* get values from eeprom data */ 828 coarse_offset = 829 eeprom_coarse_byte(devpriv->eeprom_data 830 [offset_eeprom_address(channel, range)]); 831 fine_offset = 832 eeprom_fine_byte(devpriv->eeprom_data 833 [offset_eeprom_address(channel, range)]); 834 coarse_gain = 835 eeprom_coarse_byte(devpriv->eeprom_data 836 [gain_eeprom_address(channel, range)]); 837 fine_gain = 838 eeprom_fine_byte(devpriv->eeprom_data 839 [gain_eeprom_address(channel, range)]); 840 841 /* set caldacs */ 842 cb_pcidda_write_caldac(dev, caldac_number(channel), 843 coarse_offset_channel(channel), coarse_offset); 844 cb_pcidda_write_caldac(dev, caldac_number(channel), 845 fine_offset_channel(channel), fine_offset); 846 cb_pcidda_write_caldac(dev, caldac_number(channel), 847 coarse_gain_channel(channel), coarse_gain); 848 cb_pcidda_write_caldac(dev, caldac_number(channel), 849 fine_gain_channel(channel), fine_gain); 850} 851 852/* 853 * A convenient macro that defines init_module() and cleanup_module(), 854 * as necessary. 855 */ 856static int __devinit driver_cb_pcidda_pci_probe(struct pci_dev *dev, 857 const struct pci_device_id *ent) 858{ 859 return comedi_pci_auto_config(dev, driver_cb_pcidda.driver_name); 860} 861 862static void __devexit driver_cb_pcidda_pci_remove(struct pci_dev *dev) 863{ 864 comedi_pci_auto_unconfig(dev); 865} 866 867static struct pci_driver driver_cb_pcidda_pci_driver = { 868 .id_table = cb_pcidda_pci_table, 869 .probe = &driver_cb_pcidda_pci_probe, 870 .remove = __devexit_p(&driver_cb_pcidda_pci_remove) 871}; 872 873static int __init driver_cb_pcidda_init_module(void) 874{ 875 int retval; 876 877 retval = comedi_driver_register(&driver_cb_pcidda); 878 if (retval < 0) 879 return retval; 880 881 driver_cb_pcidda_pci_driver.name = (char *)driver_cb_pcidda.driver_name; 882 return pci_register_driver(&driver_cb_pcidda_pci_driver); 883} 884 885static void __exit driver_cb_pcidda_cleanup_module(void) 886{ 887 pci_unregister_driver(&driver_cb_pcidda_pci_driver); 888 comedi_driver_unregister(&driver_cb_pcidda); 889} 890 891module_init(driver_cb_pcidda_init_module); 892module_exit(driver_cb_pcidda_cleanup_module); 893 894MODULE_AUTHOR("Comedi http://www.comedi.org"); 895MODULE_DESCRIPTION("Comedi low-level driver"); 896MODULE_LICENSE("GPL"); 897