addi_common.c revision d9fcd77b567f338eb5d438747623c1984df050d5
1/** 2@verbatim 3 4Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module. 5 6 ADDI-DATA GmbH 7 Dieselstrasse 3 8 D-77833 Ottersweier 9 Tel: +19(0)7223/9493-0 10 Fax: +49(0)7223/9493-92 11 http://www.addi-data.com 12 info@addi-data.com 13 14This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 15 16This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 17 18You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 20You should also find the complete GPL in the COPYING file accompanying this source code. 21 22@endverbatim 23*/ 24/* 25 26 +-----------------------------------------------------------------------+ 27 | (C) ADDI-DATA GmbH Dieselstrasse 3 D-77833 Ottersweier | 28 +-----------------------------------------------------------------------+ 29 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com | 30 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com | 31 +-----------------------------------------------------------------------+ 32 | Project : ADDI DATA | Compiler : GCC | 33 | Modulname : addi_common.c | Version : 2.96 | 34 +-------------------------------+---------------------------------------+ 35 | Author : | Date : | 36 +-----------------------------------------------------------------------+ 37 | Description : ADDI COMMON Main Module | 38 +-----------------------------------------------------------------------+ 39 | CONFIG OPTIONS | 40 | option[0] - PCI bus number - if bus number and slot number are 0, | 41 | then driver search for first unused card | 42 | option[1] - PCI slot number | 43 | | 44 | option[2] = 0 - DMA ENABLE | 45 | = 1 - DMA DISABLE | 46 +----------+-----------+------------------------------------------------+ 47*/ 48 49#include <linux/kernel.h> 50#include <linux/module.h> 51#include <linux/sched.h> 52#include <linux/mm.h> 53#include <linux/errno.h> 54#include <linux/ioport.h> 55#include <linux/delay.h> 56#include <linux/interrupt.h> 57#include <linux/timex.h> 58#include <linux/timer.h> 59#include <linux/pci.h> 60#include <linux/gfp.h> 61#include <linux/io.h> 62#include "../../comedidev.h" 63#if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300) 64#include <asm/i387.h> 65#endif 66#include "../comedi_fc.h" 67 68#include "addi_common.h" 69#include "addi_amcc_s5933.h" 70 71#ifndef ADDIDATA_DRIVER_NAME 72#define ADDIDATA_DRIVER_NAME "addi_common" 73#endif 74 75/* Update-0.7.57->0.7.68MODULE_AUTHOR("ADDI-DATA GmbH <info@addi-data.com>"); */ 76/* Update-0.7.57->0.7.68MODULE_DESCRIPTION("Comedi ADDI-DATA module"); */ 77/* Update-0.7.57->0.7.68MODULE_LICENSE("GPL"); */ 78 79#define devpriv ((struct addi_private *)dev->private) 80#define this_board ((const struct addi_board *)dev->board_ptr) 81 82#if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300) 83/* BYTE b_SaveFPUReg [94]; */ 84 85void fpu_begin(void) 86{ 87 /* asm ("fstenv b_SaveFPUReg"); */ 88 kernel_fpu_begin(); 89} 90 91void fpu_end(void) 92{ 93 /* asm ("frstor b_SaveFPUReg"); */ 94 kernel_fpu_end(); 95} 96#endif 97 98#include "addi_eeprom.c" 99#if (defined (CONFIG_APCI_3120) || defined (CONFIG_APCI_3001)) 100#include "hwdrv_apci3120.c" 101#endif 102#ifdef CONFIG_APCI_1032 103#include "hwdrv_apci1032.c" 104#endif 105#ifdef CONFIG_APCI_1516 106#include "hwdrv_apci1516.c" 107#endif 108#ifdef CONFIG_APCI_2016 109#include "hwdrv_apci2016.c" 110#endif 111#ifdef CONFIG_APCI_2032 112#include "hwdrv_apci2032.c" 113#endif 114#ifdef CONFIG_APCI_2200 115#include "hwdrv_apci2200.c" 116#endif 117#ifdef CONFIG_APCI_1564 118#include "hwdrv_apci1564.c" 119#endif 120#ifdef CONFIG_APCI_1500 121#include "hwdrv_apci1500.c" 122#endif 123#ifdef CONFIG_APCI_3501 124#include "hwdrv_apci3501.c" 125#endif 126#ifdef CONFIG_APCI_035 127#include "hwdrv_apci035.c" 128#endif 129#if (defined (CONFIG_APCI_3200) || defined (CONFIG_APCI_3300)) 130#include "hwdrv_apci3200.c" 131#endif 132#ifdef CONFIG_APCI_1710 133#include "hwdrv_APCI1710.c" 134#endif 135#ifdef CONFIG_APCI_16XX 136#include "hwdrv_apci16xx.c" 137#endif 138#ifdef CONFIG_APCI_3XXX 139#include "hwdrv_apci3xxx.c" 140#endif 141 142#ifndef COMEDI_SUBD_TTLIO 143#define COMEDI_SUBD_TTLIO 11 /* Digital Input Output But TTL */ 144#endif 145 146static DEFINE_PCI_DEVICE_TABLE(addi_apci_tbl) = { 147#ifdef CONFIG_APCI_3120 148 {PCI_DEVICE(APCI3120_BOARD_VENDOR_ID, 0x818D)}, 149#endif 150#ifdef CONFIG_APCI_1032 151 {PCI_DEVICE(APCI1032_BOARD_VENDOR_ID, 0x1003)}, 152#endif 153#ifdef CONFIG_APCI_1516 154 {PCI_DEVICE(APCI1516_BOARD_VENDOR_ID, 0x1001)}, 155#endif 156#ifdef CONFIG_APCI_2016 157 {PCI_DEVICE(APCI2016_BOARD_VENDOR_ID, 0x1002)}, 158#endif 159#ifdef CONFIG_APCI_2032 160 {PCI_DEVICE(APCI2032_BOARD_VENDOR_ID, 0x1004)}, 161#endif 162#ifdef CONFIG_APCI_2200 163 {PCI_DEVICE(APCI2200_BOARD_VENDOR_ID, 0x1005)}, 164#endif 165#ifdef CONFIG_APCI_1564 166 {PCI_DEVICE(APCI1564_BOARD_VENDOR_ID, 0x1006)}, 167#endif 168#ifdef CONFIG_APCI_1500 169 {PCI_DEVICE(APCI1500_BOARD_VENDOR_ID, 0x80fc)}, 170#endif 171#ifdef CONFIG_APCI_3001 172 {PCI_DEVICE(APCI3120_BOARD_VENDOR_ID, 0x828D)}, 173#endif 174#ifdef CONFIG_APCI_3501 175 {PCI_DEVICE(APCI3501_BOARD_VENDOR_ID, 0x3001)}, 176#endif 177#ifdef CONFIG_APCI_035 178 {PCI_DEVICE(APCI035_BOARD_VENDOR_ID, 0x0300)}, 179#endif 180#ifdef CONFIG_APCI_3200 181 {PCI_DEVICE(APCI3200_BOARD_VENDOR_ID, 0x3000)}, 182#endif 183#ifdef CONFIG_APCI_3300 184 {PCI_DEVICE(APCI3200_BOARD_VENDOR_ID, 0x3007)}, 185#endif 186#ifdef CONFIG_APCI_1710 187 {PCI_DEVICE(APCI1710_BOARD_VENDOR_ID, APCI1710_BOARD_DEVICE_ID)}, 188#endif 189#ifdef CONFIG_APCI_16XX 190 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x1009)}, 191 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x100A)}, 192#endif 193#ifdef CONFIG_APCI_3XXX 194 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3010)}, 195 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300F)}, 196 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300E)}, 197 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3013)}, 198 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3014)}, 199 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3015)}, 200 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3016)}, 201 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3017)}, 202 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3018)}, 203 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3019)}, 204 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301A)}, 205 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301B)}, 206 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301C)}, 207 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301D)}, 208 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301E)}, 209 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301F)}, 210 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3020)}, 211 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3021)}, 212 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3022)}, 213 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3023)}, 214 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300B)}, 215 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3002)}, 216 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3003)}, 217 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3004)}, 218 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3024)}, 219#endif 220 {0} 221}; 222 223MODULE_DEVICE_TABLE(pci, addi_apci_tbl); 224 225static const struct addi_board boardtypes[] = { 226#ifdef CONFIG_APCI_3120 227 {"apci3120", 228 APCI3120_BOARD_VENDOR_ID, 229 0x818D, 230 AMCC_OP_REG_SIZE, 231 APCI3120_ADDRESS_RANGE, 232 8, 233 0, 234 ADDIDATA_NO_EEPROM, 235 NULL, 236 16, 237 8, 238 16, 239 8, 240 0xffff, 241 0x3fff, 242 &range_apci3120_ai, 243 &range_apci3120_ao, 244 4, 245 4, 246 0x0f, 247 0, 248 NULL, 249 1, 250 1, 251 1, 252 10000, 253 100000, 254 v_APCI3120_Interrupt, 255 i_APCI3120_Reset, 256 i_APCI3120_InsnConfigAnalogInput, 257 i_APCI3120_InsnReadAnalogInput, 258 NULL, 259 NULL, 260 i_APCI3120_CommandTestAnalogInput, 261 i_APCI3120_CommandAnalogInput, 262 i_APCI3120_StopCyclicAcquisition, 263 NULL, 264 i_APCI3120_InsnWriteAnalogOutput, 265 NULL, 266 NULL, 267 i_APCI3120_InsnReadDigitalInput, 268 NULL, 269 i_APCI3120_InsnBitsDigitalInput, 270 i_APCI3120_InsnConfigDigitalOutput, 271 i_APCI3120_InsnWriteDigitalOutput, 272 i_APCI3120_InsnBitsDigitalOutput, 273 NULL, 274 i_APCI3120_InsnConfigTimer, 275 i_APCI3120_InsnWriteTimer, 276 i_APCI3120_InsnReadTimer, 277 NULL, 278 NULL, 279 NULL, 280 NULL, 281 NULL}, 282#endif 283#ifdef CONFIG_APCI_1032 284 {"apci1032", 285 APCI1032_BOARD_VENDOR_ID, 286 0x1003, 287 4, 288 APCI1032_ADDRESS_RANGE, 289 0, 290 0, 291 ADDIDATA_EEPROM, 292 ADDIDATA_93C76, 293 0, 294 0, 295 0, 296 0, 297 0, 298 0, 299 NULL, 300 NULL, 301 32, 302 0, 303 0, 304 0, 305 NULL, 306 0, 307 0, 308 0, 309 0, 310 0, 311 v_APCI1032_Interrupt, 312 i_APCI1032_Reset, 313 NULL, 314 NULL, 315 NULL, 316 NULL, 317 NULL, 318 NULL, 319 NULL, 320 NULL, 321 NULL, 322 NULL, 323 i_APCI1032_ConfigDigitalInput, 324 i_APCI1032_Read1DigitalInput, 325 NULL, 326 i_APCI1032_ReadMoreDigitalInput, 327 NULL, 328 NULL, 329 NULL, 330 NULL, 331 NULL, 332 NULL, 333 NULL, 334 NULL, 335 NULL, 336 NULL, 337 NULL, 338 NULL}, 339#endif 340#ifdef CONFIG_APCI_1516 341 {"apci1516", 342 APCI1516_BOARD_VENDOR_ID, 343 0x1001, 344 128, 345 APCI1516_ADDRESS_RANGE, 346 32, 347 0, 348 ADDIDATA_EEPROM, 349 ADDIDATA_S5920, 350 0, 351 0, 352 0, 353 0, 354 0, 355 0, 356 NULL, 357 NULL, 358 8, 359 8, 360 0, 361 0, 362 NULL, 363 0, 364 1, 365 0, 366 0, 367 0, 368 NULL, 369 i_APCI1516_Reset, 370 NULL, NULL, 371 NULL, 372 NULL, 373 NULL, 374 NULL, 375 NULL, 376 NULL, 377 NULL, 378 NULL, 379 NULL, 380 i_APCI1516_Read1DigitalInput, 381 NULL, 382 i_APCI1516_ReadMoreDigitalInput, 383 i_APCI1516_ConfigDigitalOutput, 384 i_APCI1516_WriteDigitalOutput, 385 i_APCI1516_ReadDigitalOutput, 386 NULL, 387 i_APCI1516_ConfigWatchdog, 388 i_APCI1516_StartStopWriteWatchdog, 389 i_APCI1516_ReadWatchdog, 390 NULL, 391 NULL, 392 NULL, 393 NULL, 394 NULL}, 395#endif 396#ifdef CONFIG_APCI_2016 397 {"apci2016", 398 APCI2016_BOARD_VENDOR_ID, 399 0x1002, 400 128, 401 APCI2016_ADDRESS_RANGE, 402 32, 403 0, 404 ADDIDATA_EEPROM, 405 ADDIDATA_S5920, 406 0, 407 0, 408 0, 409 0, 410 0, 411 0, 412 NULL, 413 NULL, 414 0, 415 16, 416 0, 417 0, 418 NULL, 419 0, 420 1, 421 0, 422 0, 423 0, 424 NULL, 425 i_APCI2016_Reset, 426 NULL, 427 NULL, 428 NULL, 429 NULL, 430 NULL, 431 NULL, 432 NULL, 433 NULL, 434 NULL, 435 NULL, 436 NULL, 437 NULL, 438 NULL, 439 NULL, 440 i_APCI2016_ConfigDigitalOutput, 441 i_APCI2016_WriteDigitalOutput, 442 i_APCI2016_BitsDigitalOutput, 443 NULL, 444 i_APCI2016_ConfigWatchdog, 445 i_APCI2016_StartStopWriteWatchdog, 446 i_APCI2016_ReadWatchdog, 447 NULL, 448 NULL, 449 NULL, 450 NULL, 451 NULL}, 452#endif 453#ifdef CONFIG_APCI_2032 454 {"apci2032", 455 APCI2032_BOARD_VENDOR_ID, 456 0x1004, 457 4, 458 APCI2032_ADDRESS_RANGE, 459 0, 460 0, 461 ADDIDATA_EEPROM, 462 ADDIDATA_93C76, 463 0, 464 0, 465 0, 466 0, 467 0, 468 0, 469 NULL, 470 NULL, 471 0, 472 32, 473 0xffffffff, 474 0, 475 NULL, 476 0, 477 1, 478 0, 479 0, 480 0, 481 v_APCI2032_Interrupt, 482 i_APCI2032_Reset, 483 NULL, NULL, 484 NULL, 485 NULL, 486 NULL, 487 NULL, 488 NULL, 489 NULL, 490 NULL, 491 NULL, 492 NULL, 493 NULL, 494 NULL, 495 NULL, 496 i_APCI2032_ConfigDigitalOutput, 497 i_APCI2032_WriteDigitalOutput, 498 i_APCI2032_ReadDigitalOutput, 499 i_APCI2032_ReadInterruptStatus, 500 i_APCI2032_ConfigWatchdog, 501 i_APCI2032_StartStopWriteWatchdog, 502 i_APCI2032_ReadWatchdog, 503 NULL, 504 NULL, 505 NULL, 506 NULL, 507 NULL}, 508#endif 509#ifdef CONFIG_APCI_2200 510 {"apci2200", 511 APCI2200_BOARD_VENDOR_ID, 512 0x1005, 513 4, 514 APCI2200_ADDRESS_RANGE, 515 0, 516 0, 517 ADDIDATA_EEPROM, 518 ADDIDATA_93C76, 519 0, 520 0, 521 0, 522 0, 523 0, 524 0, 525 NULL, 526 NULL, 527 8, 528 16, 529 0, 530 0, 531 NULL, 532 0, 533 1, 534 0, 535 0, 536 0, 537 NULL, 538 i_APCI2200_Reset, 539 NULL, NULL, 540 NULL, 541 NULL, 542 NULL, 543 NULL, 544 NULL, 545 NULL, 546 NULL, 547 NULL, 548 NULL, 549 i_APCI2200_Read1DigitalInput, 550 NULL, 551 i_APCI2200_ReadMoreDigitalInput, 552 i_APCI2200_ConfigDigitalOutput, 553 i_APCI2200_WriteDigitalOutput, 554 i_APCI2200_ReadDigitalOutput, 555 NULL, 556 i_APCI2200_ConfigWatchdog, 557 i_APCI2200_StartStopWriteWatchdog, 558 i_APCI2200_ReadWatchdog, 559 NULL, 560 NULL, 561 NULL, 562 NULL, 563 NULL}, 564#endif 565#ifdef CONFIG_APCI_1564 566 {"apci1564", 567 APCI1564_BOARD_VENDOR_ID, 568 0x1006, 569 128, 570 APCI1564_ADDRESS_RANGE, 571 0, 572 0, 573 ADDIDATA_EEPROM, 574 ADDIDATA_93C76, 575 0, 576 0, 577 0, 578 0, 579 0, 580 0, 581 NULL, 582 NULL, 583 32, 584 32, 585 0xffffffff, 586 0, 587 NULL, 588 0, 589 1, 590 0, 591 0, 592 0, 593 v_APCI1564_Interrupt, 594 i_APCI1564_Reset, 595 NULL, 596 NULL, 597 NULL, 598 NULL, 599 NULL, 600 NULL, 601 NULL, 602 NULL, 603 NULL, 604 NULL, 605 i_APCI1564_ConfigDigitalInput, 606 i_APCI1564_Read1DigitalInput, 607 NULL, 608 i_APCI1564_ReadMoreDigitalInput, 609 i_APCI1564_ConfigDigitalOutput, 610 i_APCI1564_WriteDigitalOutput, 611 i_APCI1564_ReadDigitalOutput, 612 i_APCI1564_ReadInterruptStatus, 613 i_APCI1564_ConfigTimerCounterWatchdog, 614 i_APCI1564_StartStopWriteTimerCounterWatchdog, 615 i_APCI1564_ReadTimerCounterWatchdog, 616 NULL, 617 NULL, 618 NULL, 619 NULL, 620 NULL}, 621#endif 622#ifdef CONFIG_APCI_1500 623 {"apci1500", 624 APCI1500_BOARD_VENDOR_ID, 625 0x80fc, 626 128, 627 APCI1500_ADDRESS_RANGE, 628 4, 629 0, 630 ADDIDATA_NO_EEPROM, 631 NULL, 632 0, 633 0, 634 0, 635 0, 636 0, 637 0, 638 NULL, 639 NULL, 640 16, 641 16, 642 0xffff, 643 0, 644 NULL, 645 0, 646 1, 647 0, 648 0, 649 0, 650 v_APCI1500_Interrupt, 651 i_APCI1500_Reset, 652 NULL, 653 NULL, 654 NULL, 655 NULL, 656 NULL, 657 NULL, 658 NULL, 659 NULL, 660 NULL, 661 NULL, 662 i_APCI1500_ConfigDigitalInputEvent, 663 i_APCI1500_Initialisation, 664 i_APCI1500_StartStopInputEvent, 665 i_APCI1500_ReadMoreDigitalInput, 666 i_APCI1500_ConfigDigitalOutputErrorInterrupt, 667 i_APCI1500_WriteDigitalOutput, 668 i_APCI1500_ConfigureInterrupt, 669 NULL, 670 i_APCI1500_ConfigCounterTimerWatchdog, 671 i_APCI1500_StartStopTriggerTimerCounterWatchdog, 672 i_APCI1500_ReadInterruptMask, 673 i_APCI1500_ReadCounterTimerWatchdog, 674 NULL, 675 NULL, 676 NULL, 677 NULL}, 678#endif 679#ifdef CONFIG_APCI_3001 680 {"apci3001", 681 APCI3120_BOARD_VENDOR_ID, 682 0x828D, 683 AMCC_OP_REG_SIZE, 684 APCI3120_ADDRESS_RANGE, 685 8, 686 0, 687 ADDIDATA_NO_EEPROM, 688 NULL, 689 16, 690 8, 691 16, 692 0, 693 0xfff, 694 0, 695 &range_apci3120_ai, 696 NULL, 697 4, 698 4, 699 0x0f, 700 0, 701 NULL, 702 1, 703 1, 704 1, 705 10000, 706 100000, 707 v_APCI3120_Interrupt, 708 i_APCI3120_Reset, 709 i_APCI3120_InsnConfigAnalogInput, 710 i_APCI3120_InsnReadAnalogInput, 711 NULL, 712 NULL, 713 i_APCI3120_CommandTestAnalogInput, 714 i_APCI3120_CommandAnalogInput, 715 i_APCI3120_StopCyclicAcquisition, 716 NULL, 717 NULL, 718 NULL, 719 NULL, 720 i_APCI3120_InsnReadDigitalInput, 721 NULL, 722 i_APCI3120_InsnBitsDigitalInput, 723 i_APCI3120_InsnConfigDigitalOutput, 724 i_APCI3120_InsnWriteDigitalOutput, 725 i_APCI3120_InsnBitsDigitalOutput, 726 NULL, 727 i_APCI3120_InsnConfigTimer, 728 i_APCI3120_InsnWriteTimer, 729 i_APCI3120_InsnReadTimer, 730 NULL, 731 NULL, 732 NULL, 733 NULL, 734 NULL}, 735#endif 736#ifdef CONFIG_APCI_3501 737 {"apci3501", 738 APCI3501_BOARD_VENDOR_ID, 739 0x3001, 740 64, 741 APCI3501_ADDRESS_RANGE, 742 0, 743 0, 744 ADDIDATA_EEPROM, 745 ADDIDATA_S5933, 746 0, 747 0, 748 0, 749 8, 750 0, 751 16383, 752 NULL, 753 &range_apci3501_ao, 754 2, 755 2, 756 0x3, 757 0, 758 NULL, 759 0, 760 1, 761 0, 762 0, 763 0, 764 v_APCI3501_Interrupt, 765 i_APCI3501_Reset, 766 NULL, NULL, 767 NULL, 768 NULL, 769 NULL, 770 NULL, 771 NULL, 772 i_APCI3501_ConfigAnalogOutput, 773 i_APCI3501_WriteAnalogOutput, 774 NULL, 775 NULL, 776 NULL, 777 NULL, 778 i_APCI3501_ReadDigitalInput, 779 i_APCI3501_ConfigDigitalOutput, 780 i_APCI3501_WriteDigitalOutput, 781 i_APCI3501_ReadDigitalOutput, 782 NULL, 783 i_APCI3501_ConfigTimerCounterWatchdog, 784 i_APCI3501_StartStopWriteTimerCounterWatchdog, 785 i_APCI3501_ReadTimerCounterWatchdog, 786 NULL, 787 NULL, 788 NULL, 789 NULL, 790 NULL}, 791#endif 792#ifdef CONFIG_APCI_035 793 {"apci035", 794 APCI035_BOARD_VENDOR_ID, 795 0x0300, 796 127, 797 APCI035_ADDRESS_RANGE, 798 0, 799 0, 800 1, 801 ADDIDATA_S5920, 802 16, 803 8, 804 16, 805 0, 806 0xff, 807 0, 808 &range_apci035_ai, 809 NULL, 810 0, 811 0, 812 0, 813 0, 814 NULL, 815 0, 816 1, 817 0, 818 10000, 819 100000, 820 v_APCI035_Interrupt, 821 i_APCI035_Reset, 822 i_APCI035_ConfigAnalogInput, 823 i_APCI035_ReadAnalogInput, 824 NULL, 825 NULL, 826 NULL, 827 NULL, 828 NULL, 829 NULL, 830 NULL, 831 NULL, 832 NULL, 833 NULL, 834 NULL, 835 NULL, 836 NULL, 837 NULL, 838 NULL, 839 NULL, 840 i_APCI035_ConfigTimerWatchdog, 841 i_APCI035_StartStopWriteTimerWatchdog, 842 i_APCI035_ReadTimerWatchdog, 843 NULL, 844 NULL, 845 NULL, 846 NULL, 847 NULL}, 848#endif 849#ifdef CONFIG_APCI_3200 850 {"apci3200", 851 APCI3200_BOARD_VENDOR_ID, 852 0x3000, 853 128, 854 256, 855 4, 856 4, 857 ADDIDATA_EEPROM, 858 ADDIDATA_S5920, 859 16, 860 8, 861 16, 862 0, 863 0x3ffff, 864 0, 865 &range_apci3200_ai, 866 NULL, 867 4, 868 4, 869 0, 870 0, 871 NULL, 872 0, 873 0, 874 0, 875 10000, 876 100000, 877 v_APCI3200_Interrupt, 878 i_APCI3200_Reset, 879 i_APCI3200_ConfigAnalogInput, 880 i_APCI3200_ReadAnalogInput, 881 i_APCI3200_InsnWriteReleaseAnalogInput, 882 i_APCI3200_InsnBits_AnalogInput_Test, 883 i_APCI3200_CommandTestAnalogInput, 884 i_APCI3200_CommandAnalogInput, 885 i_APCI3200_StopCyclicAcquisition, 886 NULL, 887 NULL, 888 NULL, 889 NULL, 890 NULL, 891 NULL, 892 i_APCI3200_ReadDigitalInput, 893 i_APCI3200_ConfigDigitalOutput, 894 i_APCI3200_WriteDigitalOutput, 895 i_APCI3200_ReadDigitalOutput, 896 NULL, 897 NULL, 898 NULL, 899 NULL, 900 NULL, 901 NULL, 902 NULL, 903 NULL, 904 NULL}, 905#endif 906#ifdef CONFIG_APCI_3300 907 /* Begin JK .20.10.2004 = APCI-3300 integration */ 908 {"apci3300", 909 APCI3200_BOARD_VENDOR_ID, 910 0x3007, 911 128, 912 256, 913 4, 914 4, 915 ADDIDATA_EEPROM, 916 ADDIDATA_S5920, 917 0, 918 8, 919 8, 920 0, 921 0x3ffff, 922 0, 923 &range_apci3300_ai, 924 NULL, 925 4, 926 4, 927 0, 928 0, 929 NULL, 930 0, 931 0, 932 0, 933 10000, 934 100000, 935 v_APCI3200_Interrupt, 936 i_APCI3200_Reset, 937 i_APCI3200_ConfigAnalogInput, 938 i_APCI3200_ReadAnalogInput, 939 i_APCI3200_InsnWriteReleaseAnalogInput, 940 i_APCI3200_InsnBits_AnalogInput_Test, 941 i_APCI3200_CommandTestAnalogInput, 942 i_APCI3200_CommandAnalogInput, 943 i_APCI3200_StopCyclicAcquisition, 944 NULL, 945 NULL, 946 NULL, 947 NULL, 948 NULL, 949 NULL, 950 i_APCI3200_ReadDigitalInput, 951 i_APCI3200_ConfigDigitalOutput, 952 i_APCI3200_WriteDigitalOutput, 953 i_APCI3200_ReadDigitalOutput, 954 NULL, 955 NULL, 956 NULL, 957 NULL, 958 NULL, 959 NULL, 960 NULL, 961 NULL, 962 NULL}, 963#endif 964#ifdef CONFIG_APCI_1710 965 {"apci1710", APCI1710_BOARD_VENDOR_ID, APCI1710_BOARD_DEVICE_ID, 966 128, 967 8, 968 256, 969 0, 970 ADDIDATA_NO_EEPROM, 971 NULL, 972 0, 973 0, 974 0, 975 0, 976 0, 977 0, 978 NULL, 979 NULL, 980 0, 981 0, 982 0, 983 0, 984 NULL, 985 0, 986 0, 987 0, 988 0, 989 0, 990 v_APCI1710_Interrupt, 991 i_APCI1710_Reset, 992 NULL, 993 NULL, 994 NULL, 995 NULL, 996 NULL, 997 NULL, 998 NULL, 999 NULL, 1000 NULL, 1001 NULL, 1002 NULL, 1003 NULL, 1004 NULL, 1005 NULL, 1006 NULL, 1007 NULL, 1008 NULL, 1009 NULL, 1010 NULL, 1011 NULL, 1012 NULL, 1013 NULL, 1014 NULL, 1015 NULL, 1016 NULL, 1017 NULL}, 1018#endif 1019#ifdef CONFIG_APCI_16XX 1020 {"apci1648", 1021 PCI_VENDOR_ID_ADDIDATA, 1022 0x1009, 1023 128, 1024 0, 1025 0, 1026 0, 1027 ADDIDATA_NO_EEPROM, 1028 NULL, 1029 0, 1030 0, 1031 0, 1032 0, 1033 0, 1034 0, 1035 NULL, 1036 NULL, 1037 0, 1038 0, 1039 0, 1040 48, 1041 &range_apci16xx_ttl, 1042 0, 1043 0, 1044 0, 1045 0, 1046 0, 1047 NULL, 1048 i_APCI16XX_Reset, 1049 NULL, 1050 NULL, 1051 NULL, 1052 NULL, 1053 NULL, 1054 NULL, 1055 NULL, 1056 NULL, 1057 NULL, 1058 NULL, 1059 NULL, 1060 NULL, 1061 NULL, 1062 NULL, 1063 NULL, 1064 NULL, 1065 NULL, 1066 NULL, 1067 NULL, 1068 NULL, 1069 NULL, 1070 NULL, 1071 i_APCI16XX_InsnConfigInitTTLIO, 1072 i_APCI16XX_InsnBitsReadTTLIO, 1073 i_APCI16XX_InsnReadTTLIOAllPortValue, 1074 i_APCI16XX_InsnBitsWriteTTLIO}, 1075 1076 {"apci1696", 1077 PCI_VENDOR_ID_ADDIDATA, 1078 0x100A, 1079 128, 1080 0, 1081 0, 1082 0, 1083 ADDIDATA_NO_EEPROM, 1084 NULL, 1085 0, 1086 0, 1087 0, 1088 0, 1089 0, 1090 0, 1091 NULL, 1092 NULL, 1093 0, 1094 0, 1095 0, 1096 96, 1097 &range_apci16xx_ttl, 1098 0, 1099 0, 1100 0, 1101 0, 1102 0, 1103 NULL, 1104 i_APCI16XX_Reset, 1105 NULL, 1106 NULL, 1107 NULL, 1108 NULL, 1109 NULL, 1110 NULL, 1111 NULL, 1112 NULL, 1113 NULL, 1114 NULL, 1115 NULL, 1116 NULL, 1117 NULL, 1118 NULL, 1119 NULL, 1120 NULL, 1121 NULL, 1122 NULL, 1123 NULL, 1124 NULL, 1125 NULL, 1126 NULL, 1127 i_APCI16XX_InsnConfigInitTTLIO, 1128 i_APCI16XX_InsnBitsReadTTLIO, 1129 i_APCI16XX_InsnReadTTLIOAllPortValue, 1130 i_APCI16XX_InsnBitsWriteTTLIO}, 1131#endif 1132#ifdef CONFIG_APCI_3XXX 1133 {"apci3000-16", 1134 PCI_VENDOR_ID_ADDIDATA, 1135 0x3010, 1136 256, 1137 256, 1138 256, 1139 256, 1140 ADDIDATA_NO_EEPROM, 1141 ADDIDATA_9054, 1142 16, 1143 8, 1144 16, 1145 0, 1146 4095, 1147 0, 1148 &range_apci3XXX_ai, 1149 NULL, 1150 0, 1151 0, 1152 0, 1153 24, 1154 &range_apci3XXX_ttl, 1155 0, 1156 0, 1157 6, 1158 10000, 1159 0, 1160 v_APCI3XXX_Interrupt, 1161 i_APCI3XXX_Reset, 1162 i_APCI3XXX_InsnConfigAnalogInput, 1163 i_APCI3XXX_InsnReadAnalogInput, 1164 NULL, 1165 NULL, 1166 NULL, 1167 NULL, 1168 NULL, 1169 NULL, 1170 NULL, 1171 NULL, 1172 NULL, 1173 NULL, 1174 NULL, 1175 NULL, 1176 NULL, 1177 NULL, 1178 NULL, 1179 NULL, 1180 NULL, 1181 NULL, 1182 NULL, 1183 NULL, 1184 i_APCI3XXX_InsnConfigInitTTLIO, 1185 i_APCI3XXX_InsnBitsTTLIO, 1186 i_APCI3XXX_InsnReadTTLIO, 1187 i_APCI3XXX_InsnWriteTTLIO}, 1188 1189 {"apci3000-8", 1190 PCI_VENDOR_ID_ADDIDATA, 1191 0x300F, 1192 256, 1193 256, 1194 256, 1195 256, 1196 ADDIDATA_NO_EEPROM, 1197 ADDIDATA_9054, 1198 8, 1199 4, 1200 8, 1201 0, 1202 4095, 1203 0, 1204 &range_apci3XXX_ai, 1205 NULL, 1206 0, 1207 0, 1208 0, 1209 24, 1210 &range_apci3XXX_ttl, 1211 0, 1212 0, 1213 6, 1214 10000, 1215 0, 1216 v_APCI3XXX_Interrupt, 1217 i_APCI3XXX_Reset, 1218 i_APCI3XXX_InsnConfigAnalogInput, 1219 i_APCI3XXX_InsnReadAnalogInput, 1220 NULL, 1221 NULL, 1222 NULL, 1223 NULL, 1224 NULL, 1225 NULL, 1226 NULL, 1227 NULL, 1228 NULL, 1229 NULL, 1230 NULL, 1231 NULL, 1232 NULL, 1233 NULL, 1234 NULL, 1235 NULL, 1236 NULL, 1237 NULL, 1238 NULL, 1239 NULL, 1240 i_APCI3XXX_InsnConfigInitTTLIO, 1241 i_APCI3XXX_InsnBitsTTLIO, 1242 i_APCI3XXX_InsnReadTTLIO, 1243 i_APCI3XXX_InsnWriteTTLIO}, 1244 1245 {"apci3000-4", 1246 PCI_VENDOR_ID_ADDIDATA, 1247 0x300E, 1248 256, 1249 256, 1250 256, 1251 256, 1252 ADDIDATA_NO_EEPROM, 1253 ADDIDATA_9054, 1254 4, 1255 2, 1256 4, 1257 0, 1258 4095, 1259 0, 1260 &range_apci3XXX_ai, 1261 NULL, 1262 0, 1263 0, 1264 0, 1265 24, 1266 &range_apci3XXX_ttl, 1267 0, 1268 0, 1269 6, 1270 10000, 1271 0, 1272 v_APCI3XXX_Interrupt, 1273 i_APCI3XXX_Reset, 1274 i_APCI3XXX_InsnConfigAnalogInput, 1275 i_APCI3XXX_InsnReadAnalogInput, 1276 NULL, 1277 NULL, 1278 NULL, 1279 NULL, 1280 NULL, 1281 NULL, 1282 NULL, 1283 NULL, 1284 NULL, 1285 NULL, 1286 NULL, 1287 NULL, 1288 NULL, 1289 NULL, 1290 NULL, 1291 NULL, 1292 NULL, 1293 NULL, 1294 NULL, 1295 NULL, 1296 i_APCI3XXX_InsnConfigInitTTLIO, 1297 i_APCI3XXX_InsnBitsTTLIO, 1298 i_APCI3XXX_InsnReadTTLIO, 1299 i_APCI3XXX_InsnWriteTTLIO}, 1300 1301 {"apci3006-16", 1302 PCI_VENDOR_ID_ADDIDATA, 1303 0x3013, 1304 256, 1305 256, 1306 256, 1307 256, 1308 ADDIDATA_NO_EEPROM, 1309 ADDIDATA_9054, 1310 16, 1311 8, 1312 16, 1313 0, 1314 65535, 1315 0, 1316 &range_apci3XXX_ai, 1317 NULL, 1318 0, 1319 0, 1320 0, 1321 24, 1322 &range_apci3XXX_ttl, 1323 0, 1324 0, 1325 6, 1326 10000, 1327 0, 1328 v_APCI3XXX_Interrupt, 1329 i_APCI3XXX_Reset, 1330 i_APCI3XXX_InsnConfigAnalogInput, 1331 i_APCI3XXX_InsnReadAnalogInput, 1332 NULL, 1333 NULL, 1334 NULL, 1335 NULL, 1336 NULL, 1337 NULL, 1338 NULL, 1339 NULL, 1340 NULL, 1341 NULL, 1342 NULL, 1343 NULL, 1344 NULL, 1345 NULL, 1346 NULL, 1347 NULL, 1348 NULL, 1349 NULL, 1350 NULL, 1351 NULL, 1352 i_APCI3XXX_InsnConfigInitTTLIO, 1353 i_APCI3XXX_InsnBitsTTLIO, 1354 i_APCI3XXX_InsnReadTTLIO, 1355 i_APCI3XXX_InsnWriteTTLIO}, 1356 1357 {"apci3006-8", 1358 PCI_VENDOR_ID_ADDIDATA, 1359 0x3014, 1360 256, 1361 256, 1362 256, 1363 256, 1364 ADDIDATA_NO_EEPROM, 1365 ADDIDATA_9054, 1366 8, 1367 4, 1368 8, 1369 0, 1370 65535, 1371 0, 1372 &range_apci3XXX_ai, 1373 NULL, 1374 0, 1375 0, 1376 0, 1377 24, 1378 &range_apci3XXX_ttl, 1379 0, 1380 0, 1381 6, 1382 10000, 1383 0, 1384 v_APCI3XXX_Interrupt, 1385 i_APCI3XXX_Reset, 1386 i_APCI3XXX_InsnConfigAnalogInput, 1387 i_APCI3XXX_InsnReadAnalogInput, 1388 NULL, 1389 NULL, 1390 NULL, 1391 NULL, 1392 NULL, 1393 NULL, 1394 NULL, 1395 NULL, 1396 NULL, 1397 NULL, 1398 NULL, 1399 NULL, 1400 NULL, 1401 NULL, 1402 NULL, 1403 NULL, 1404 NULL, 1405 NULL, 1406 NULL, 1407 NULL, 1408 i_APCI3XXX_InsnConfigInitTTLIO, 1409 i_APCI3XXX_InsnBitsTTLIO, 1410 i_APCI3XXX_InsnReadTTLIO, 1411 i_APCI3XXX_InsnWriteTTLIO}, 1412 1413 {"apci3006-4", 1414 PCI_VENDOR_ID_ADDIDATA, 1415 0x3015, 1416 256, 1417 256, 1418 256, 1419 256, 1420 ADDIDATA_NO_EEPROM, 1421 ADDIDATA_9054, 1422 4, 1423 2, 1424 4, 1425 0, 1426 65535, 1427 0, 1428 &range_apci3XXX_ai, 1429 NULL, 1430 0, 1431 0, 1432 0, 1433 24, 1434 &range_apci3XXX_ttl, 1435 0, 1436 0, 1437 6, 1438 10000, 1439 0, 1440 v_APCI3XXX_Interrupt, 1441 i_APCI3XXX_Reset, 1442 i_APCI3XXX_InsnConfigAnalogInput, 1443 i_APCI3XXX_InsnReadAnalogInput, 1444 NULL, 1445 NULL, 1446 NULL, 1447 NULL, 1448 NULL, 1449 NULL, 1450 NULL, 1451 NULL, 1452 NULL, 1453 NULL, 1454 NULL, 1455 NULL, 1456 NULL, 1457 NULL, 1458 NULL, 1459 NULL, 1460 NULL, 1461 NULL, 1462 NULL, 1463 NULL, 1464 i_APCI3XXX_InsnConfigInitTTLIO, 1465 i_APCI3XXX_InsnBitsTTLIO, 1466 i_APCI3XXX_InsnReadTTLIO, 1467 i_APCI3XXX_InsnWriteTTLIO}, 1468 1469 {"apci3010-16", 1470 PCI_VENDOR_ID_ADDIDATA, 1471 0x3016, 1472 256, 1473 256, 1474 256, 1475 256, 1476 ADDIDATA_NO_EEPROM, 1477 ADDIDATA_9054, 1478 16, 1479 8, 1480 16, 1481 0, 1482 4095, 1483 0, 1484 &range_apci3XXX_ai, 1485 NULL, 1486 4, 1487 4, 1488 1, 1489 24, 1490 &range_apci3XXX_ttl, 1491 0, 1492 0, 1493 6, 1494 5000, 1495 0, 1496 v_APCI3XXX_Interrupt, 1497 i_APCI3XXX_Reset, 1498 i_APCI3XXX_InsnConfigAnalogInput, 1499 i_APCI3XXX_InsnReadAnalogInput, 1500 NULL, 1501 NULL, 1502 NULL, 1503 NULL, 1504 NULL, 1505 NULL, 1506 NULL, 1507 NULL, 1508 NULL, 1509 i_APCI3XXX_InsnReadDigitalInput, 1510 NULL, 1511 i_APCI3XXX_InsnBitsDigitalInput, 1512 NULL, 1513 i_APCI3XXX_InsnWriteDigitalOutput, 1514 i_APCI3XXX_InsnBitsDigitalOutput, 1515 i_APCI3XXX_InsnReadDigitalOutput, 1516 NULL, 1517 NULL, 1518 NULL, 1519 NULL, 1520 i_APCI3XXX_InsnConfigInitTTLIO, 1521 i_APCI3XXX_InsnBitsTTLIO, 1522 i_APCI3XXX_InsnReadTTLIO, 1523 i_APCI3XXX_InsnWriteTTLIO}, 1524 1525 {"apci3010-8", 1526 PCI_VENDOR_ID_ADDIDATA, 1527 0x3017, 1528 256, 1529 256, 1530 256, 1531 256, 1532 ADDIDATA_NO_EEPROM, 1533 ADDIDATA_9054, 1534 8, 1535 4, 1536 8, 1537 0, 1538 4095, 1539 0, 1540 &range_apci3XXX_ai, 1541 NULL, 1542 4, 1543 4, 1544 1, 1545 24, 1546 &range_apci3XXX_ttl, 1547 0, 1548 0, 1549 6, 1550 5000, 1551 0, 1552 v_APCI3XXX_Interrupt, 1553 i_APCI3XXX_Reset, 1554 i_APCI3XXX_InsnConfigAnalogInput, 1555 i_APCI3XXX_InsnReadAnalogInput, 1556 NULL, 1557 NULL, 1558 NULL, 1559 NULL, 1560 NULL, 1561 NULL, 1562 NULL, 1563 NULL, 1564 NULL, 1565 i_APCI3XXX_InsnReadDigitalInput, 1566 NULL, 1567 i_APCI3XXX_InsnBitsDigitalInput, 1568 NULL, 1569 i_APCI3XXX_InsnWriteDigitalOutput, 1570 i_APCI3XXX_InsnBitsDigitalOutput, 1571 i_APCI3XXX_InsnReadDigitalOutput, 1572 NULL, 1573 NULL, 1574 NULL, 1575 NULL, 1576 i_APCI3XXX_InsnConfigInitTTLIO, 1577 i_APCI3XXX_InsnBitsTTLIO, 1578 i_APCI3XXX_InsnReadTTLIO, 1579 i_APCI3XXX_InsnWriteTTLIO}, 1580 1581 {"apci3010-4", 1582 PCI_VENDOR_ID_ADDIDATA, 1583 0x3018, 1584 256, 1585 256, 1586 256, 1587 256, 1588 ADDIDATA_NO_EEPROM, 1589 ADDIDATA_9054, 1590 4, 1591 2, 1592 4, 1593 0, 1594 4095, 1595 0, 1596 &range_apci3XXX_ai, 1597 NULL, 1598 4, 1599 4, 1600 1, 1601 24, 1602 &range_apci3XXX_ttl, 1603 0, 1604 0, 1605 6, 1606 5000, 1607 0, 1608 v_APCI3XXX_Interrupt, 1609 i_APCI3XXX_Reset, 1610 i_APCI3XXX_InsnConfigAnalogInput, 1611 i_APCI3XXX_InsnReadAnalogInput, 1612 NULL, 1613 NULL, 1614 NULL, 1615 NULL, 1616 NULL, 1617 NULL, 1618 NULL, 1619 NULL, 1620 NULL, 1621 i_APCI3XXX_InsnReadDigitalInput, 1622 NULL, 1623 i_APCI3XXX_InsnBitsDigitalInput, 1624 NULL, 1625 i_APCI3XXX_InsnWriteDigitalOutput, 1626 i_APCI3XXX_InsnBitsDigitalOutput, 1627 i_APCI3XXX_InsnReadDigitalOutput, 1628 NULL, 1629 NULL, 1630 NULL, 1631 NULL, 1632 i_APCI3XXX_InsnConfigInitTTLIO, 1633 i_APCI3XXX_InsnBitsTTLIO, 1634 i_APCI3XXX_InsnReadTTLIO, 1635 i_APCI3XXX_InsnWriteTTLIO}, 1636 1637 {"apci3016-16", 1638 PCI_VENDOR_ID_ADDIDATA, 1639 0x3019, 1640 256, 1641 256, 1642 256, 1643 256, 1644 ADDIDATA_NO_EEPROM, 1645 ADDIDATA_9054, 1646 16, 1647 8, 1648 16, 1649 0, 1650 65535, 1651 0, 1652 &range_apci3XXX_ai, 1653 NULL, 1654 4, 1655 4, 1656 1, 1657 24, 1658 &range_apci3XXX_ttl, 1659 0, 1660 0, 1661 6, 1662 5000, 1663 0, 1664 v_APCI3XXX_Interrupt, 1665 i_APCI3XXX_Reset, 1666 i_APCI3XXX_InsnConfigAnalogInput, 1667 i_APCI3XXX_InsnReadAnalogInput, 1668 NULL, 1669 NULL, 1670 NULL, 1671 NULL, 1672 NULL, 1673 NULL, 1674 NULL, 1675 NULL, 1676 NULL, 1677 i_APCI3XXX_InsnReadDigitalInput, 1678 NULL, 1679 i_APCI3XXX_InsnBitsDigitalInput, 1680 NULL, 1681 i_APCI3XXX_InsnWriteDigitalOutput, 1682 i_APCI3XXX_InsnBitsDigitalOutput, 1683 i_APCI3XXX_InsnReadDigitalOutput, 1684 NULL, 1685 NULL, 1686 NULL, 1687 NULL, 1688 i_APCI3XXX_InsnConfigInitTTLIO, 1689 i_APCI3XXX_InsnBitsTTLIO, 1690 i_APCI3XXX_InsnReadTTLIO, 1691 i_APCI3XXX_InsnWriteTTLIO}, 1692 1693 {"apci3016-8", 1694 PCI_VENDOR_ID_ADDIDATA, 1695 0x301A, 1696 256, 1697 256, 1698 256, 1699 256, 1700 ADDIDATA_NO_EEPROM, 1701 ADDIDATA_9054, 1702 8, 1703 4, 1704 8, 1705 0, 1706 65535, 1707 0, 1708 &range_apci3XXX_ai, 1709 NULL, 1710 4, 1711 4, 1712 1, 1713 24, 1714 &range_apci3XXX_ttl, 1715 0, 1716 0, 1717 6, 1718 5000, 1719 0, 1720 v_APCI3XXX_Interrupt, 1721 i_APCI3XXX_Reset, 1722 i_APCI3XXX_InsnConfigAnalogInput, 1723 i_APCI3XXX_InsnReadAnalogInput, 1724 NULL, 1725 NULL, 1726 NULL, 1727 NULL, 1728 NULL, 1729 NULL, 1730 NULL, 1731 NULL, 1732 NULL, 1733 i_APCI3XXX_InsnReadDigitalInput, 1734 NULL, 1735 i_APCI3XXX_InsnBitsDigitalInput, 1736 NULL, 1737 i_APCI3XXX_InsnWriteDigitalOutput, 1738 i_APCI3XXX_InsnBitsDigitalOutput, 1739 i_APCI3XXX_InsnReadDigitalOutput, 1740 NULL, 1741 NULL, 1742 NULL, 1743 NULL, 1744 i_APCI3XXX_InsnConfigInitTTLIO, 1745 i_APCI3XXX_InsnBitsTTLIO, 1746 i_APCI3XXX_InsnReadTTLIO, 1747 i_APCI3XXX_InsnWriteTTLIO}, 1748 1749 {"apci3016-4", 1750 PCI_VENDOR_ID_ADDIDATA, 1751 0x301B, 1752 256, 1753 256, 1754 256, 1755 256, 1756 ADDIDATA_NO_EEPROM, 1757 ADDIDATA_9054, 1758 4, 1759 2, 1760 4, 1761 0, 1762 65535, 1763 0, 1764 &range_apci3XXX_ai, 1765 NULL, 1766 4, 1767 4, 1768 1, 1769 24, 1770 &range_apci3XXX_ttl, 1771 0, 1772 0, 1773 6, 1774 5000, 1775 0, 1776 v_APCI3XXX_Interrupt, 1777 i_APCI3XXX_Reset, 1778 i_APCI3XXX_InsnConfigAnalogInput, 1779 i_APCI3XXX_InsnReadAnalogInput, 1780 NULL, 1781 NULL, 1782 NULL, 1783 NULL, 1784 NULL, 1785 NULL, 1786 NULL, 1787 NULL, 1788 NULL, 1789 i_APCI3XXX_InsnReadDigitalInput, 1790 NULL, 1791 i_APCI3XXX_InsnBitsDigitalInput, 1792 NULL, 1793 i_APCI3XXX_InsnWriteDigitalOutput, 1794 i_APCI3XXX_InsnBitsDigitalOutput, 1795 i_APCI3XXX_InsnReadDigitalOutput, 1796 NULL, 1797 NULL, 1798 NULL, 1799 NULL, 1800 i_APCI3XXX_InsnConfigInitTTLIO, 1801 i_APCI3XXX_InsnBitsTTLIO, 1802 i_APCI3XXX_InsnReadTTLIO, 1803 i_APCI3XXX_InsnWriteTTLIO}, 1804 1805 {"apci3100-16-4", 1806 PCI_VENDOR_ID_ADDIDATA, 1807 0x301C, 1808 256, 1809 256, 1810 256, 1811 256, 1812 ADDIDATA_NO_EEPROM, 1813 ADDIDATA_9054, 1814 16, 1815 8, 1816 16, 1817 4, 1818 4095, 1819 4095, 1820 &range_apci3XXX_ai, 1821 &range_apci3XXX_ao, 1822 0, 1823 0, 1824 0, 1825 24, 1826 &range_apci3XXX_ttl, 1827 0, 1828 0, 1829 6, 1830 10000, 1831 0, 1832 v_APCI3XXX_Interrupt, 1833 i_APCI3XXX_Reset, 1834 i_APCI3XXX_InsnConfigAnalogInput, 1835 i_APCI3XXX_InsnReadAnalogInput, 1836 NULL, 1837 NULL, 1838 NULL, 1839 NULL, 1840 NULL, 1841 NULL, 1842 i_APCI3XXX_InsnWriteAnalogOutput, 1843 NULL, 1844 NULL, 1845 NULL, 1846 NULL, 1847 NULL, 1848 NULL, 1849 NULL, 1850 NULL, 1851 NULL, 1852 NULL, 1853 NULL, 1854 NULL, 1855 NULL, 1856 i_APCI3XXX_InsnConfigInitTTLIO, 1857 i_APCI3XXX_InsnBitsTTLIO, 1858 i_APCI3XXX_InsnReadTTLIO, 1859 i_APCI3XXX_InsnWriteTTLIO}, 1860 1861 {"apci3100-8-4", 1862 PCI_VENDOR_ID_ADDIDATA, 1863 0x301D, 1864 256, 1865 256, 1866 256, 1867 256, 1868 ADDIDATA_NO_EEPROM, 1869 ADDIDATA_9054, 1870 8, 1871 4, 1872 8, 1873 4, 1874 4095, 1875 4095, 1876 &range_apci3XXX_ai, 1877 &range_apci3XXX_ao, 1878 0, 1879 0, 1880 0, 1881 24, 1882 &range_apci3XXX_ttl, 1883 0, 1884 0, 1885 6, 1886 10000, 1887 0, 1888 v_APCI3XXX_Interrupt, 1889 i_APCI3XXX_Reset, 1890 i_APCI3XXX_InsnConfigAnalogInput, 1891 i_APCI3XXX_InsnReadAnalogInput, 1892 NULL, 1893 NULL, 1894 NULL, 1895 NULL, 1896 NULL, 1897 NULL, 1898 i_APCI3XXX_InsnWriteAnalogOutput, 1899 NULL, 1900 NULL, 1901 NULL, 1902 NULL, 1903 NULL, 1904 NULL, 1905 NULL, 1906 NULL, 1907 NULL, 1908 NULL, 1909 NULL, 1910 NULL, 1911 NULL, 1912 i_APCI3XXX_InsnConfigInitTTLIO, 1913 i_APCI3XXX_InsnBitsTTLIO, 1914 i_APCI3XXX_InsnReadTTLIO, 1915 i_APCI3XXX_InsnWriteTTLIO}, 1916 1917 {"apci3106-16-4", 1918 PCI_VENDOR_ID_ADDIDATA, 1919 0x301E, 1920 256, 1921 256, 1922 256, 1923 256, 1924 ADDIDATA_NO_EEPROM, 1925 ADDIDATA_9054, 1926 16, 1927 8, 1928 16, 1929 4, 1930 65535, 1931 4095, 1932 &range_apci3XXX_ai, 1933 &range_apci3XXX_ao, 1934 0, 1935 0, 1936 0, 1937 24, 1938 &range_apci3XXX_ttl, 1939 0, 1940 0, 1941 6, 1942 10000, 1943 0, 1944 v_APCI3XXX_Interrupt, 1945 i_APCI3XXX_Reset, 1946 i_APCI3XXX_InsnConfigAnalogInput, 1947 i_APCI3XXX_InsnReadAnalogInput, 1948 NULL, 1949 NULL, 1950 NULL, 1951 NULL, 1952 NULL, 1953 NULL, 1954 i_APCI3XXX_InsnWriteAnalogOutput, 1955 NULL, 1956 NULL, 1957 NULL, 1958 NULL, 1959 NULL, 1960 NULL, 1961 NULL, 1962 NULL, 1963 NULL, 1964 NULL, 1965 NULL, 1966 NULL, 1967 NULL, 1968 i_APCI3XXX_InsnConfigInitTTLIO, 1969 i_APCI3XXX_InsnBitsTTLIO, 1970 i_APCI3XXX_InsnReadTTLIO, 1971 i_APCI3XXX_InsnWriteTTLIO}, 1972 1973 {"apci3106-8-4", 1974 PCI_VENDOR_ID_ADDIDATA, 1975 0x301F, 1976 256, 1977 256, 1978 256, 1979 256, 1980 ADDIDATA_NO_EEPROM, 1981 ADDIDATA_9054, 1982 8, 1983 4, 1984 8, 1985 4, 1986 65535, 1987 4095, 1988 &range_apci3XXX_ai, 1989 &range_apci3XXX_ao, 1990 0, 1991 0, 1992 0, 1993 24, 1994 &range_apci3XXX_ttl, 1995 0, 1996 0, 1997 6, 1998 10000, 1999 0, 2000 v_APCI3XXX_Interrupt, 2001 i_APCI3XXX_Reset, 2002 i_APCI3XXX_InsnConfigAnalogInput, 2003 i_APCI3XXX_InsnReadAnalogInput, 2004 NULL, 2005 NULL, 2006 NULL, 2007 NULL, 2008 NULL, 2009 NULL, 2010 i_APCI3XXX_InsnWriteAnalogOutput, 2011 NULL, 2012 NULL, 2013 NULL, 2014 NULL, 2015 NULL, 2016 NULL, 2017 NULL, 2018 NULL, 2019 NULL, 2020 NULL, 2021 NULL, 2022 NULL, 2023 NULL, 2024 i_APCI3XXX_InsnConfigInitTTLIO, 2025 i_APCI3XXX_InsnBitsTTLIO, 2026 i_APCI3XXX_InsnReadTTLIO, 2027 i_APCI3XXX_InsnWriteTTLIO}, 2028 2029 {"apci3110-16-4", 2030 PCI_VENDOR_ID_ADDIDATA, 2031 0x3020, 2032 256, 2033 256, 2034 256, 2035 256, 2036 ADDIDATA_NO_EEPROM, 2037 ADDIDATA_9054, 2038 16, 2039 8, 2040 16, 2041 4, 2042 4095, 2043 4095, 2044 &range_apci3XXX_ai, 2045 &range_apci3XXX_ao, 2046 4, 2047 4, 2048 1, 2049 24, 2050 &range_apci3XXX_ttl, 2051 0, 2052 0, 2053 6, 2054 5000, 2055 0, 2056 v_APCI3XXX_Interrupt, 2057 i_APCI3XXX_Reset, 2058 i_APCI3XXX_InsnConfigAnalogInput, 2059 i_APCI3XXX_InsnReadAnalogInput, 2060 NULL, 2061 NULL, 2062 NULL, 2063 NULL, 2064 NULL, 2065 NULL, 2066 i_APCI3XXX_InsnWriteAnalogOutput, 2067 NULL, 2068 NULL, 2069 i_APCI3XXX_InsnReadDigitalInput, 2070 NULL, 2071 i_APCI3XXX_InsnBitsDigitalInput, 2072 NULL, 2073 i_APCI3XXX_InsnWriteDigitalOutput, 2074 i_APCI3XXX_InsnBitsDigitalOutput, 2075 i_APCI3XXX_InsnReadDigitalOutput, 2076 NULL, 2077 NULL, 2078 NULL, 2079 NULL, 2080 i_APCI3XXX_InsnConfigInitTTLIO, 2081 i_APCI3XXX_InsnBitsTTLIO, 2082 i_APCI3XXX_InsnReadTTLIO, 2083 i_APCI3XXX_InsnWriteTTLIO}, 2084 2085 {"apci3110-8-4", 2086 PCI_VENDOR_ID_ADDIDATA, 2087 0x3021, 2088 256, 2089 256, 2090 256, 2091 256, 2092 ADDIDATA_NO_EEPROM, 2093 ADDIDATA_9054, 2094 8, 2095 4, 2096 8, 2097 4, 2098 4095, 2099 4095, 2100 &range_apci3XXX_ai, 2101 &range_apci3XXX_ao, 2102 4, 2103 4, 2104 1, 2105 24, 2106 &range_apci3XXX_ttl, 2107 0, 2108 0, 2109 6, 2110 5000, 2111 0, 2112 v_APCI3XXX_Interrupt, 2113 i_APCI3XXX_Reset, 2114 i_APCI3XXX_InsnConfigAnalogInput, 2115 i_APCI3XXX_InsnReadAnalogInput, 2116 NULL, 2117 NULL, 2118 NULL, 2119 NULL, 2120 NULL, 2121 NULL, 2122 i_APCI3XXX_InsnWriteAnalogOutput, 2123 NULL, 2124 NULL, 2125 i_APCI3XXX_InsnReadDigitalInput, 2126 NULL, 2127 i_APCI3XXX_InsnBitsDigitalInput, 2128 NULL, 2129 i_APCI3XXX_InsnWriteDigitalOutput, 2130 i_APCI3XXX_InsnBitsDigitalOutput, 2131 i_APCI3XXX_InsnReadDigitalOutput, 2132 NULL, 2133 NULL, 2134 NULL, 2135 NULL, 2136 i_APCI3XXX_InsnConfigInitTTLIO, 2137 i_APCI3XXX_InsnBitsTTLIO, 2138 i_APCI3XXX_InsnReadTTLIO, 2139 i_APCI3XXX_InsnWriteTTLIO}, 2140 2141 {"apci3116-16-4", 2142 PCI_VENDOR_ID_ADDIDATA, 2143 0x3022, 2144 256, 2145 256, 2146 256, 2147 256, 2148 ADDIDATA_NO_EEPROM, 2149 ADDIDATA_9054, 2150 16, 2151 8, 2152 16, 2153 4, 2154 65535, 2155 4095, 2156 &range_apci3XXX_ai, 2157 &range_apci3XXX_ao, 2158 4, 2159 4, 2160 1, 2161 24, 2162 &range_apci3XXX_ttl, 2163 0, 2164 0, 2165 6, 2166 5000, 2167 0, 2168 v_APCI3XXX_Interrupt, 2169 i_APCI3XXX_Reset, 2170 i_APCI3XXX_InsnConfigAnalogInput, 2171 i_APCI3XXX_InsnReadAnalogInput, 2172 NULL, 2173 NULL, 2174 NULL, 2175 NULL, 2176 NULL, 2177 NULL, 2178 i_APCI3XXX_InsnWriteAnalogOutput, 2179 NULL, 2180 NULL, 2181 i_APCI3XXX_InsnReadDigitalInput, 2182 NULL, 2183 i_APCI3XXX_InsnBitsDigitalInput, 2184 NULL, 2185 i_APCI3XXX_InsnWriteDigitalOutput, 2186 i_APCI3XXX_InsnBitsDigitalOutput, 2187 i_APCI3XXX_InsnReadDigitalOutput, 2188 NULL, 2189 NULL, 2190 NULL, 2191 NULL, 2192 i_APCI3XXX_InsnConfigInitTTLIO, 2193 i_APCI3XXX_InsnBitsTTLIO, 2194 i_APCI3XXX_InsnReadTTLIO, 2195 i_APCI3XXX_InsnWriteTTLIO}, 2196 2197 {"apci3116-8-4", 2198 PCI_VENDOR_ID_ADDIDATA, 2199 0x3023, 2200 256, 2201 256, 2202 256, 2203 256, 2204 ADDIDATA_NO_EEPROM, 2205 ADDIDATA_9054, 2206 8, 2207 4, 2208 8, 2209 4, 2210 65535, 2211 4095, 2212 &range_apci3XXX_ai, 2213 &range_apci3XXX_ao, 2214 4, 2215 4, 2216 1, 2217 24, 2218 &range_apci3XXX_ttl, 2219 0, 2220 0, 2221 6, 2222 5000, 2223 0, 2224 v_APCI3XXX_Interrupt, 2225 i_APCI3XXX_Reset, 2226 i_APCI3XXX_InsnConfigAnalogInput, 2227 i_APCI3XXX_InsnReadAnalogInput, 2228 NULL, 2229 NULL, 2230 NULL, 2231 NULL, 2232 NULL, 2233 NULL, 2234 i_APCI3XXX_InsnWriteAnalogOutput, 2235 NULL, 2236 NULL, 2237 i_APCI3XXX_InsnReadDigitalInput, 2238 NULL, 2239 i_APCI3XXX_InsnBitsDigitalInput, 2240 NULL, 2241 i_APCI3XXX_InsnWriteDigitalOutput, 2242 i_APCI3XXX_InsnBitsDigitalOutput, 2243 i_APCI3XXX_InsnReadDigitalOutput, 2244 NULL, 2245 NULL, 2246 NULL, 2247 NULL, 2248 i_APCI3XXX_InsnConfigInitTTLIO, 2249 i_APCI3XXX_InsnBitsTTLIO, 2250 i_APCI3XXX_InsnReadTTLIO, 2251 i_APCI3XXX_InsnWriteTTLIO}, 2252 2253 {"apci3003", 2254 PCI_VENDOR_ID_ADDIDATA, 2255 0x300B, 2256 256, 2257 256, 2258 256, 2259 256, 2260 ADDIDATA_NO_EEPROM, 2261 ADDIDATA_9054, 2262 0, 2263 4, 2264 4, 2265 0, 2266 65535, 2267 0, 2268 &range_apci3XXX_ai, 2269 NULL, 2270 4, 2271 4, 2272 1, 2273 0, 2274 NULL, 2275 0, 2276 0, 2277 7, 2278 2500, 2279 0, 2280 v_APCI3XXX_Interrupt, 2281 i_APCI3XXX_Reset, 2282 i_APCI3XXX_InsnConfigAnalogInput, 2283 i_APCI3XXX_InsnReadAnalogInput, 2284 NULL, 2285 NULL, 2286 NULL, 2287 NULL, 2288 NULL, 2289 NULL, 2290 NULL, 2291 NULL, 2292 NULL, 2293 i_APCI3XXX_InsnReadDigitalInput, 2294 NULL, 2295 i_APCI3XXX_InsnBitsDigitalInput, 2296 NULL, 2297 i_APCI3XXX_InsnWriteDigitalOutput, 2298 i_APCI3XXX_InsnBitsDigitalOutput, 2299 i_APCI3XXX_InsnReadDigitalOutput, 2300 NULL, 2301 NULL, 2302 NULL, 2303 NULL, 2304 NULL, 2305 NULL, 2306 NULL}, 2307 2308 {"apci3002-16", 2309 PCI_VENDOR_ID_ADDIDATA, 2310 0x3002, 2311 256, 2312 256, 2313 256, 2314 256, 2315 ADDIDATA_NO_EEPROM, 2316 ADDIDATA_9054, 2317 0, 2318 16, 2319 16, 2320 0, 2321 65535, 2322 0, 2323 &range_apci3XXX_ai, 2324 NULL, 2325 4, 2326 4, 2327 1, 2328 0, 2329 NULL, 2330 0, 2331 0, 2332 6, 2333 5000, 2334 0, 2335 v_APCI3XXX_Interrupt, 2336 i_APCI3XXX_Reset, 2337 i_APCI3XXX_InsnConfigAnalogInput, 2338 i_APCI3XXX_InsnReadAnalogInput, 2339 NULL, 2340 NULL, 2341 NULL, 2342 NULL, 2343 NULL, 2344 NULL, 2345 NULL, 2346 NULL, 2347 NULL, 2348 i_APCI3XXX_InsnReadDigitalInput, 2349 NULL, 2350 i_APCI3XXX_InsnBitsDigitalInput, 2351 NULL, 2352 i_APCI3XXX_InsnWriteDigitalOutput, 2353 i_APCI3XXX_InsnBitsDigitalOutput, 2354 i_APCI3XXX_InsnReadDigitalOutput, 2355 NULL, 2356 NULL, 2357 NULL, 2358 NULL, 2359 NULL, 2360 NULL, 2361 NULL}, 2362 2363 {"apci3002-8", 2364 PCI_VENDOR_ID_ADDIDATA, 2365 0x3003, 2366 256, 2367 256, 2368 256, 2369 256, 2370 ADDIDATA_NO_EEPROM, 2371 ADDIDATA_9054, 2372 0, 2373 8, 2374 8, 2375 0, 2376 65535, 2377 0, 2378 &range_apci3XXX_ai, 2379 NULL, 2380 4, 2381 4, 2382 1, 2383 0, 2384 NULL, 2385 0, 2386 0, 2387 6, 2388 5000, 2389 0, 2390 v_APCI3XXX_Interrupt, 2391 i_APCI3XXX_Reset, 2392 i_APCI3XXX_InsnConfigAnalogInput, 2393 i_APCI3XXX_InsnReadAnalogInput, 2394 NULL, 2395 NULL, 2396 NULL, 2397 NULL, 2398 NULL, 2399 NULL, 2400 NULL, 2401 NULL, 2402 NULL, 2403 i_APCI3XXX_InsnReadDigitalInput, 2404 NULL, 2405 i_APCI3XXX_InsnBitsDigitalInput, 2406 NULL, 2407 i_APCI3XXX_InsnWriteDigitalOutput, 2408 i_APCI3XXX_InsnBitsDigitalOutput, 2409 i_APCI3XXX_InsnReadDigitalOutput, 2410 NULL, 2411 NULL, 2412 NULL, 2413 NULL, 2414 NULL, 2415 NULL, 2416 NULL}, 2417 2418 {"apci3002-4", 2419 PCI_VENDOR_ID_ADDIDATA, 2420 0x3004, 2421 256, 2422 256, 2423 256, 2424 256, 2425 ADDIDATA_NO_EEPROM, 2426 ADDIDATA_9054, 2427 0, 2428 4, 2429 4, 2430 0, 2431 65535, 2432 0, 2433 &range_apci3XXX_ai, 2434 NULL, 2435 4, 2436 4, 2437 1, 2438 0, 2439 NULL, 2440 0, 2441 0, 2442 6, 2443 5000, 2444 0, 2445 v_APCI3XXX_Interrupt, 2446 i_APCI3XXX_Reset, 2447 i_APCI3XXX_InsnConfigAnalogInput, 2448 i_APCI3XXX_InsnReadAnalogInput, 2449 NULL, 2450 NULL, 2451 NULL, 2452 NULL, 2453 NULL, 2454 NULL, 2455 NULL, 2456 NULL, 2457 NULL, 2458 i_APCI3XXX_InsnReadDigitalInput, 2459 NULL, 2460 i_APCI3XXX_InsnBitsDigitalInput, 2461 NULL, 2462 i_APCI3XXX_InsnWriteDigitalOutput, 2463 i_APCI3XXX_InsnBitsDigitalOutput, 2464 i_APCI3XXX_InsnReadDigitalOutput, 2465 NULL, 2466 NULL, 2467 NULL, 2468 NULL, 2469 NULL, 2470 NULL, 2471 NULL}, 2472 2473 {"apci3500", 2474 PCI_VENDOR_ID_ADDIDATA, 2475 0x3024, 2476 256, 2477 256, 2478 256, 2479 256, 2480 ADDIDATA_NO_EEPROM, 2481 ADDIDATA_9054, 2482 0, 2483 0, 2484 0, 2485 4, 2486 0, 2487 4095, 2488 NULL, 2489 &range_apci3XXX_ao, 2490 0, 2491 0, 2492 0, 2493 24, 2494 &range_apci3XXX_ttl, 2495 0, 2496 0, 2497 0, 2498 0, 2499 0, 2500 v_APCI3XXX_Interrupt, 2501 i_APCI3XXX_Reset, 2502 NULL, 2503 NULL, 2504 NULL, 2505 NULL, 2506 NULL, 2507 NULL, 2508 NULL, 2509 NULL, 2510 i_APCI3XXX_InsnWriteAnalogOutput, 2511 NULL, 2512 NULL, 2513 NULL, 2514 NULL, 2515 NULL, 2516 NULL, 2517 NULL, 2518 NULL, 2519 NULL, 2520 NULL, 2521 NULL, 2522 NULL, 2523 NULL, 2524 i_APCI3XXX_InsnConfigInitTTLIO, 2525 i_APCI3XXX_InsnBitsTTLIO, 2526 i_APCI3XXX_InsnReadTTLIO, 2527 i_APCI3XXX_InsnWriteTTLIO}, 2528#endif 2529}; 2530 2531#define n_boardtypes (sizeof(boardtypes)/sizeof(struct addi_board)) 2532 2533static struct comedi_driver driver_addi = { 2534 .driver_name = ADDIDATA_DRIVER_NAME, 2535 .module = THIS_MODULE, 2536 .attach = i_ADDI_Attach, 2537 .detach = i_ADDI_Detach, 2538 .num_names = n_boardtypes, 2539 .board_name = &boardtypes[0].pc_DriverName, 2540 .offset = sizeof(struct addi_board), 2541}; 2542 2543static int __devinit driver_addi_pci_probe(struct pci_dev *dev, 2544 const struct pci_device_id *ent) 2545{ 2546 return comedi_pci_auto_config(dev, driver_addi.driver_name); 2547} 2548 2549static void __devexit driver_addi_pci_remove(struct pci_dev *dev) 2550{ 2551 comedi_pci_auto_unconfig(dev); 2552} 2553 2554static struct pci_driver driver_addi_pci_driver = { 2555 .id_table = addi_apci_tbl, 2556 .probe = &driver_addi_pci_probe, 2557 .remove = __devexit_p(&driver_addi_pci_remove) 2558}; 2559 2560static int __init driver_addi_init_module(void) 2561{ 2562 int retval; 2563 2564 retval = comedi_driver_register(&driver_addi); 2565 if (retval < 0) 2566 return retval; 2567 2568 driver_addi_pci_driver.name = (char *)driver_addi.driver_name; 2569 return pci_register_driver(&driver_addi_pci_driver); 2570} 2571 2572static void __exit driver_addi_cleanup_module(void) 2573{ 2574 pci_unregister_driver(&driver_addi_pci_driver); 2575 comedi_driver_unregister(&driver_addi); 2576} 2577 2578module_init(driver_addi_init_module); 2579module_exit(driver_addi_cleanup_module); 2580 2581/* 2582+----------------------------------------------------------------------------+ 2583| Function name :static int i_ADDI_Attach(struct comedi_device *dev, | 2584| struct comedi_devconfig *it) | 2585| | 2586+----------------------------------------------------------------------------+ 2587| Task :Detects the card. | 2588| Configure the driver for a particular board. | 2589| This function does all the initializations and memory | 2590| allocation of data structures for the driver. | 2591+----------------------------------------------------------------------------+ 2592| Input Parameters :struct comedi_device *dev | 2593| struct comedi_devconfig *it | 2594| | 2595+----------------------------------------------------------------------------+ 2596| Return Value : 0 | 2597| | 2598+----------------------------------------------------------------------------+ 2599*/ 2600 2601static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it) 2602{ 2603 struct comedi_subdevice *s; 2604 int ret, pages, i, n_subdevices; 2605 unsigned int dw_Dummy; 2606 resource_size_t io_addr[5]; 2607 unsigned int irq; 2608 resource_size_t iobase_a, iobase_main, iobase_addon, iobase_reserved; 2609 struct pcilst_struct *card = NULL; 2610 unsigned char pci_bus, pci_slot, pci_func; 2611 int i_Dma = 0; 2612 2613 ret = alloc_private(dev, sizeof(struct addi_private)); 2614 if (ret < 0) 2615 return -ENOMEM; 2616 2617 if (!pci_list_builded) { 2618 v_pci_card_list_init(this_board->i_VendorId, 1); /* 1 for displaying the list.. */ 2619 pci_list_builded = 1; 2620 } 2621 /* printk("comedi%d: "ADDIDATA_DRIVER_NAME": board=%s",dev->minor,this_board->pc_DriverName); */ 2622 2623 if ((this_board->i_Dma) && (it->options[2] == 0)) { 2624 i_Dma = 1; 2625 } 2626 2627 card = ptr_select_and_alloc_pci_card(this_board->i_VendorId, 2628 this_board->i_DeviceId, 2629 it->options[0], 2630 it->options[1], i_Dma); 2631 2632 if (card == NULL) 2633 return -EIO; 2634 2635 devpriv->allocated = 1; 2636 2637 if ((i_pci_card_data(card, &pci_bus, &pci_slot, &pci_func, &io_addr[0], 2638 &irq)) < 0) { 2639 i_pci_card_free(card); 2640 printk(" - Can't get AMCC data!\n"); 2641 return -EIO; 2642 } 2643 2644 iobase_a = io_addr[0]; 2645 iobase_main = io_addr[1]; 2646 iobase_addon = io_addr[2]; 2647 iobase_reserved = io_addr[3]; 2648 printk("\nBus %d: Slot %d: Funct%d\nBase0: 0x%8llx\nBase1: 0x%8llx\nBase2: 0x%8llx\nBase3: 0x%8llx\n", pci_bus, pci_slot, pci_func, (unsigned long long)io_addr[0], (unsigned long long)io_addr[1], (unsigned long long)io_addr[2], (unsigned long long)io_addr[3]); 2649 2650 if ((this_board->pc_EepromChip == NULL) 2651 || (strcmp(this_board->pc_EepromChip, ADDIDATA_9054) != 0)) { 2652 /************************************/ 2653 /* Test if more that 1 address used */ 2654 /************************************/ 2655 2656 if (this_board->i_IorangeBase1 != 0) { 2657 dev->iobase = (unsigned long)iobase_main; /* DAQ base address... */ 2658 } else { 2659 dev->iobase = (unsigned long)iobase_a; /* DAQ base address... */ 2660 } 2661 2662 dev->board_name = this_board->pc_DriverName; 2663 devpriv->amcc = card; 2664 devpriv->iobase = (int) dev->iobase; 2665 devpriv->i_IobaseAmcc = (int) iobase_a; /* AMCC base address... */ 2666 devpriv->i_IobaseAddon = (int) iobase_addon; /* ADD ON base address.... */ 2667 devpriv->i_IobaseReserved = (int) iobase_reserved; 2668 } else { 2669 dev->board_name = this_board->pc_DriverName; 2670 dev->iobase = (unsigned long)io_addr[2]; 2671 devpriv->amcc = card; 2672 devpriv->iobase = (int) io_addr[2]; 2673 devpriv->i_IobaseReserved = (int) io_addr[3]; 2674 printk("\nioremap begin"); 2675 devpriv->dw_AiBase = ioremap(io_addr[3], 2676 this_board->i_IorangeBase3); 2677 printk("\nioremap end"); 2678 } 2679 2680 /* Initialize parameters that can be overridden in EEPROM */ 2681 devpriv->s_EeParameters.i_NbrAiChannel = this_board->i_NbrAiChannel; 2682 devpriv->s_EeParameters.i_NbrAoChannel = this_board->i_NbrAoChannel; 2683 devpriv->s_EeParameters.i_AiMaxdata = this_board->i_AiMaxdata; 2684 devpriv->s_EeParameters.i_AoMaxdata = this_board->i_AoMaxdata; 2685 devpriv->s_EeParameters.i_NbrDiChannel = this_board->i_NbrDiChannel; 2686 devpriv->s_EeParameters.i_NbrDoChannel = this_board->i_NbrDoChannel; 2687 devpriv->s_EeParameters.i_DoMaxdata = this_board->i_DoMaxdata; 2688 devpriv->s_EeParameters.i_Dma = this_board->i_Dma; 2689 devpriv->s_EeParameters.i_Timer = this_board->i_Timer; 2690 devpriv->s_EeParameters.ui_MinAcquisitiontimeNs = 2691 this_board->ui_MinAcquisitiontimeNs; 2692 devpriv->s_EeParameters.ui_MinDelaytimeNs = 2693 this_board->ui_MinDelaytimeNs; 2694 2695 /* ## */ 2696 2697 if (irq > 0) { 2698 if (request_irq(irq, v_ADDI_Interrupt, IRQF_SHARED, 2699 this_board->pc_DriverName, dev) < 0) { 2700 printk(", unable to allocate IRQ %u, DISABLING IT", 2701 irq); 2702 irq = 0; /* Can't use IRQ */ 2703 } else { 2704 printk("\nirq=%u", irq); 2705 } 2706 } else { 2707 printk(", IRQ disabled"); 2708 } 2709 2710 printk("\nOption %d %d %d\n", it->options[0], it->options[1], 2711 it->options[2]); 2712 dev->irq = irq; 2713 2714 /* Read eepeom and fill addi_board Structure */ 2715 2716 if (this_board->i_PCIEeprom) { 2717 printk("\nPCI Eeprom used"); 2718 if (!(strcmp(this_board->pc_EepromChip, "S5920"))) { 2719 /* Set 3 wait stait */ 2720 if (!(strcmp(this_board->pc_DriverName, "apci035"))) { 2721 outl(0x80808082, devpriv->i_IobaseAmcc + 0x60); 2722 } else { 2723 outl(0x83838383, devpriv->i_IobaseAmcc + 0x60); 2724 } 2725 /* Enable the interrupt for the controller */ 2726 dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38); 2727 outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38); 2728 printk("\nEnable the interrupt for the controller"); 2729 } 2730 printk("\nRead Eeprom"); 2731 i_EepromReadMainHeader(io_addr[0], this_board->pc_EepromChip, 2732 dev); 2733 } else { 2734 printk("\nPCI Eeprom unused"); 2735 } 2736 2737 if (it->options[2] > 0) { 2738 devpriv->us_UseDma = ADDI_DISABLE; 2739 } else { 2740 devpriv->us_UseDma = ADDI_ENABLE; 2741 } 2742 2743 if (devpriv->s_EeParameters.i_Dma) { 2744 printk("\nDMA used"); 2745 if (devpriv->us_UseDma == ADDI_ENABLE) { 2746 /* alloc DMA buffers */ 2747 devpriv->b_DmaDoubleBuffer = 0; 2748 for (i = 0; i < 2; i++) { 2749 for (pages = 4; pages >= 0; pages--) { 2750 devpriv->ul_DmaBufferVirtual[i] = 2751 (void *) __get_free_pages(GFP_KERNEL, pages); 2752 2753 if (devpriv->ul_DmaBufferVirtual[i]) 2754 break; 2755 } 2756 if (devpriv->ul_DmaBufferVirtual[i]) { 2757 devpriv->ui_DmaBufferPages[i] = pages; 2758 devpriv->ui_DmaBufferSize[i] = 2759 PAGE_SIZE * pages; 2760 devpriv->ui_DmaBufferSamples[i] = 2761 devpriv-> 2762 ui_DmaBufferSize[i] >> 1; 2763 devpriv->ul_DmaBufferHw[i] = 2764 virt_to_bus((void *)devpriv-> 2765 ul_DmaBufferVirtual[i]); 2766 } 2767 } 2768 if (!devpriv->ul_DmaBufferVirtual[0]) { 2769 printk 2770 (", Can't allocate DMA buffer, DMA disabled!"); 2771 devpriv->us_UseDma = ADDI_DISABLE; 2772 } 2773 2774 if (devpriv->ul_DmaBufferVirtual[1]) { 2775 devpriv->b_DmaDoubleBuffer = 1; 2776 } 2777 } 2778 2779 if ((devpriv->us_UseDma == ADDI_ENABLE)) { 2780 printk("\nDMA ENABLED\n"); 2781 } else { 2782 printk("\nDMA DISABLED\n"); 2783 } 2784 } 2785 2786 if (!strcmp(this_board->pc_DriverName, "apci1710")) { 2787#ifdef CONFIG_APCI_1710 2788 i_ADDI_AttachPCI1710(dev); 2789 2790 /* save base address */ 2791 devpriv->s_BoardInfos.ui_Address = io_addr[2]; 2792#endif 2793 } else { 2794 /* Update-0.7.57->0.7.68dev->n_subdevices = 7; */ 2795 n_subdevices = 7; 2796 ret = alloc_subdevices(dev, n_subdevices); 2797 if (ret < 0) 2798 return ret; 2799 2800 /* Allocate and Initialise AI Subdevice Structures */ 2801 s = dev->subdevices + 0; 2802 if ((devpriv->s_EeParameters.i_NbrAiChannel) 2803 || (this_board->i_NbrAiChannelDiff)) { 2804 dev->read_subdev = s; 2805 s->type = COMEDI_SUBD_AI; 2806 s->subdev_flags = 2807 SDF_READABLE | SDF_COMMON | SDF_GROUND 2808 | SDF_DIFF; 2809 if (devpriv->s_EeParameters.i_NbrAiChannel) { 2810 s->n_chan = 2811 devpriv->s_EeParameters.i_NbrAiChannel; 2812 devpriv->b_SingelDiff = 0; 2813 } else { 2814 s->n_chan = this_board->i_NbrAiChannelDiff; 2815 devpriv->b_SingelDiff = 1; 2816 } 2817 s->maxdata = devpriv->s_EeParameters.i_AiMaxdata; 2818 s->len_chanlist = this_board->i_AiChannelList; 2819 s->range_table = this_board->pr_AiRangelist; 2820 2821 /* Set the initialisation flag */ 2822 devpriv->b_AiInitialisation = 1; 2823 2824 s->insn_config = 2825 this_board->i_hwdrv_InsnConfigAnalogInput; 2826 s->insn_read = this_board->i_hwdrv_InsnReadAnalogInput; 2827 s->insn_write = 2828 this_board->i_hwdrv_InsnWriteAnalogInput; 2829 s->insn_bits = this_board->i_hwdrv_InsnBitsAnalogInput; 2830 s->do_cmdtest = 2831 this_board->i_hwdrv_CommandTestAnalogInput; 2832 s->do_cmd = this_board->i_hwdrv_CommandAnalogInput; 2833 s->cancel = this_board->i_hwdrv_CancelAnalogInput; 2834 2835 } else { 2836 s->type = COMEDI_SUBD_UNUSED; 2837 } 2838 2839 /* Allocate and Initialise AO Subdevice Structures */ 2840 s = dev->subdevices + 1; 2841 if (devpriv->s_EeParameters.i_NbrAoChannel) { 2842 s->type = COMEDI_SUBD_AO; 2843 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 2844 s->n_chan = devpriv->s_EeParameters.i_NbrAoChannel; 2845 s->maxdata = devpriv->s_EeParameters.i_AoMaxdata; 2846 s->len_chanlist = 2847 devpriv->s_EeParameters.i_NbrAoChannel; 2848 s->range_table = this_board->pr_AoRangelist; 2849 s->insn_config = 2850 this_board->i_hwdrv_InsnConfigAnalogOutput; 2851 s->insn_write = 2852 this_board->i_hwdrv_InsnWriteAnalogOutput; 2853 } else { 2854 s->type = COMEDI_SUBD_UNUSED; 2855 } 2856 /* Allocate and Initialise DI Subdevice Structures */ 2857 s = dev->subdevices + 2; 2858 if (devpriv->s_EeParameters.i_NbrDiChannel) { 2859 s->type = COMEDI_SUBD_DI; 2860 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON; 2861 s->n_chan = devpriv->s_EeParameters.i_NbrDiChannel; 2862 s->maxdata = 1; 2863 s->len_chanlist = 2864 devpriv->s_EeParameters.i_NbrDiChannel; 2865 s->range_table = &range_digital; 2866 s->io_bits = 0; /* all bits input */ 2867 s->insn_config = 2868 this_board->i_hwdrv_InsnConfigDigitalInput; 2869 s->insn_read = this_board->i_hwdrv_InsnReadDigitalInput; 2870 s->insn_write = 2871 this_board->i_hwdrv_InsnWriteDigitalInput; 2872 s->insn_bits = this_board->i_hwdrv_InsnBitsDigitalInput; 2873 } else { 2874 s->type = COMEDI_SUBD_UNUSED; 2875 } 2876 /* Allocate and Initialise DO Subdevice Structures */ 2877 s = dev->subdevices + 3; 2878 if (devpriv->s_EeParameters.i_NbrDoChannel) { 2879 s->type = COMEDI_SUBD_DO; 2880 s->subdev_flags = 2881 SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 2882 s->n_chan = devpriv->s_EeParameters.i_NbrDoChannel; 2883 s->maxdata = devpriv->s_EeParameters.i_DoMaxdata; 2884 s->len_chanlist = 2885 devpriv->s_EeParameters.i_NbrDoChannel; 2886 s->range_table = &range_digital; 2887 s->io_bits = 0xf; /* all bits output */ 2888 2889 s->insn_config = this_board->i_hwdrv_InsnConfigDigitalOutput; /* for digital output memory.. */ 2890 s->insn_write = 2891 this_board->i_hwdrv_InsnWriteDigitalOutput; 2892 s->insn_bits = 2893 this_board->i_hwdrv_InsnBitsDigitalOutput; 2894 s->insn_read = 2895 this_board->i_hwdrv_InsnReadDigitalOutput; 2896 } else { 2897 s->type = COMEDI_SUBD_UNUSED; 2898 } 2899 2900 /* Allocate and Initialise Timer Subdevice Structures */ 2901 s = dev->subdevices + 4; 2902 if (devpriv->s_EeParameters.i_Timer) { 2903 s->type = COMEDI_SUBD_TIMER; 2904 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 2905 s->n_chan = 1; 2906 s->maxdata = 0; 2907 s->len_chanlist = 1; 2908 s->range_table = &range_digital; 2909 2910 s->insn_write = this_board->i_hwdrv_InsnWriteTimer; 2911 s->insn_read = this_board->i_hwdrv_InsnReadTimer; 2912 s->insn_config = this_board->i_hwdrv_InsnConfigTimer; 2913 s->insn_bits = this_board->i_hwdrv_InsnBitsTimer; 2914 } else { 2915 s->type = COMEDI_SUBD_UNUSED; 2916 } 2917 2918 /* Allocate and Initialise TTL */ 2919 s = dev->subdevices + 5; 2920 if (this_board->i_NbrTTLChannel) { 2921 s->type = COMEDI_SUBD_TTLIO; 2922 s->subdev_flags = 2923 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON; 2924 s->n_chan = this_board->i_NbrTTLChannel; 2925 s->maxdata = 1; 2926 s->io_bits = 0; /* all bits input */ 2927 s->len_chanlist = this_board->i_NbrTTLChannel; 2928 s->range_table = &range_digital; 2929 s->insn_config = this_board->i_hwdr_ConfigInitTTLIO; 2930 s->insn_bits = this_board->i_hwdr_ReadTTLIOBits; 2931 s->insn_read = this_board->i_hwdr_ReadTTLIOAllPortValue; 2932 s->insn_write = this_board->i_hwdr_WriteTTLIOChlOnOff; 2933 } else { 2934 s->type = COMEDI_SUBD_UNUSED; 2935 } 2936 2937 /* EEPROM */ 2938 s = dev->subdevices + 6; 2939 if (this_board->i_PCIEeprom) { 2940 s->type = COMEDI_SUBD_MEMORY; 2941 s->subdev_flags = SDF_READABLE | SDF_INTERNAL; 2942 s->n_chan = 256; 2943 s->maxdata = 0xffff; 2944 s->insn_read = i_ADDIDATA_InsnReadEeprom; 2945 } else { 2946 s->type = COMEDI_SUBD_UNUSED; 2947 } 2948 } 2949 2950 printk("\ni_ADDI_Attach end\n"); 2951 i_ADDI_Reset(dev); 2952 devpriv->b_ValidDriver = 1; 2953 return 0; 2954} 2955 2956/* 2957+----------------------------------------------------------------------------+ 2958| Function name : static int i_ADDI_Detach(struct comedi_device *dev) | 2959| | 2960| | 2961+----------------------------------------------------------------------------+ 2962| Task : Deallocates resources of the addi_common driver | 2963| Free the DMA buffers, unregister irq. | 2964| | 2965+----------------------------------------------------------------------------+ 2966| Input Parameters : struct comedi_device *dev | 2967| | 2968| | 2969+----------------------------------------------------------------------------+ 2970| Return Value : 0 | 2971| | 2972+----------------------------------------------------------------------------+ 2973*/ 2974 2975static int i_ADDI_Detach(struct comedi_device *dev) 2976{ 2977 2978 if (dev->private) { 2979 if (devpriv->b_ValidDriver) { 2980 i_ADDI_Reset(dev); 2981 } 2982 2983 if (dev->irq) { 2984 free_irq(dev->irq, dev); 2985 } 2986 2987 if ((this_board->pc_EepromChip == NULL) 2988 || (strcmp(this_board->pc_EepromChip, 2989 ADDIDATA_9054) != 0)) { 2990 if (devpriv->allocated) { 2991 i_pci_card_free(devpriv->amcc); 2992 } 2993 2994 if (devpriv->ul_DmaBufferVirtual[0]) { 2995 free_pages((unsigned long)devpriv-> 2996 ul_DmaBufferVirtual[0], 2997 devpriv->ui_DmaBufferPages[0]); 2998 } 2999 3000 if (devpriv->ul_DmaBufferVirtual[1]) { 3001 free_pages((unsigned long)devpriv-> 3002 ul_DmaBufferVirtual[1], 3003 devpriv->ui_DmaBufferPages[1]); 3004 } 3005 } else { 3006 iounmap(devpriv->dw_AiBase); 3007 3008 if (devpriv->allocated) { 3009 i_pci_card_free(devpriv->amcc); 3010 } 3011 } 3012 3013 if (pci_list_builded) { 3014 /* v_pci_card_list_cleanup(PCI_VENDOR_ID_AMCC); */ 3015 v_pci_card_list_cleanup(this_board->i_VendorId); 3016 pci_list_builded = 0; 3017 } 3018 } 3019 3020 return 0; 3021} 3022 3023/* 3024+----------------------------------------------------------------------------+ 3025| Function name : static int i_ADDI_Reset(struct comedi_device *dev) | 3026| | 3027+----------------------------------------------------------------------------+ 3028| Task : Disables all interrupts, Resets digital output to low, | 3029| Set all analog output to low | 3030| | 3031+----------------------------------------------------------------------------+ 3032| Input Parameters : struct comedi_device *dev | 3033| | 3034| | 3035+----------------------------------------------------------------------------+ 3036| Return Value : 0 | 3037| | 3038+----------------------------------------------------------------------------+ 3039*/ 3040 3041static int i_ADDI_Reset(struct comedi_device *dev) 3042{ 3043 3044 this_board->i_hwdrv_Reset(dev); 3045 return 0; 3046} 3047 3048/* Interrupt function */ 3049/* 3050+----------------------------------------------------------------------------+ 3051| Function name : | 3052|static void v_ADDI_Interrupt(int irq, void *d) | 3053| | 3054+----------------------------------------------------------------------------+ 3055| Task : Registerd interrupt routine | 3056| | 3057+----------------------------------------------------------------------------+ 3058| Input Parameters : int irq | 3059| | 3060| | 3061+----------------------------------------------------------------------------+ 3062| Return Value : | 3063| | 3064+----------------------------------------------------------------------------+ 3065*/ 3066 3067static irqreturn_t v_ADDI_Interrupt(int irq, void *d) 3068{ 3069 struct comedi_device *dev = d; 3070 this_board->v_hwdrv_Interrupt(irq, d); 3071 return IRQ_RETVAL(1); 3072} 3073 3074/* EEPROM Read Function */ 3075/* 3076+----------------------------------------------------------------------------+ 3077| Function name : | 3078|INT i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev,struct comedi_subdevice *s, 3079 struct comedi_insn *insn,unsigned int *data) 3080| | 3081+----------------------------------------------------------------------------+ 3082| Task : Read 256 words from EEPROM | 3083| | 3084+----------------------------------------------------------------------------+ 3085| Input Parameters :(struct comedi_device *dev,struct comedi_subdevice *s, 3086 struct comedi_insn *insn,unsigned int *data) | 3087| | 3088| | 3089+----------------------------------------------------------------------------+ 3090| Return Value : | 3091| | 3092+----------------------------------------------------------------------------+ 3093*/ 3094 3095static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev, struct comedi_subdevice *s, 3096 struct comedi_insn *insn, unsigned int *data) 3097{ 3098 unsigned short w_Data; 3099 unsigned short w_Address; 3100 w_Address = CR_CHAN(insn->chanspec); /* address to be read as 0,1,2,3...255 */ 3101 3102 w_Data = w_EepromReadWord(devpriv->i_IobaseAmcc, 3103 this_board->pc_EepromChip, 0x100 + (2 * w_Address)); 3104 data[0] = w_Data; 3105 /* multiplied by 2 bcozinput will be like 0,1,2...255 */ 3106 return insn->n; 3107 3108} 3109