addi_apci_3xxx.c revision dcc8adb28638c0c09b29a551f3745f7182b1a04b
1#include <linux/pci.h> 2 3#include "../comedidev.h" 4#include "comedi_fc.h" 5#include "amcc_s5933.h" 6 7#include "addi-data/addi_common.h" 8 9#include "addi-data/addi_eeprom.c" 10#include "addi-data/hwdrv_apci3xxx.c" 11#include "addi-data/addi_common.c" 12 13enum apci3xxx_boardid { 14 BOARD_APCI3000_16, 15 BOARD_APCI3000_8, 16 BOARD_APCI3000_4, 17 BOARD_APCI3006_16, 18 BOARD_APCI3006_8, 19 BOARD_APCI3006_4, 20 BOARD_APCI3010_16, 21 BOARD_APCI3010_8, 22 BOARD_APCI3010_4, 23 BOARD_APCI3016_16, 24 BOARD_APCI3016_8, 25 BOARD_APCI3016_4, 26 BOARD_APCI3100_16_4, 27 BOARD_APCI3100_8_4, 28 BOARD_APCI3106_16_4, 29 BOARD_APCI3106_8_4, 30 BOARD_APCI3110_16_4, 31 BOARD_APCI3110_8_4, 32 BOARD_APCI3116_16_4, 33 BOARD_APCI3116_8_4, 34 BOARD_APCI3003, 35 BOARD_APCI3002_16, 36 BOARD_APCI3002_8, 37 BOARD_APCI3002_4, 38 BOARD_APCI3500, 39}; 40 41static const struct addi_board apci3xxx_boardtypes[] = { 42 [BOARD_APCI3000_16] = { 43 .pc_DriverName = "apci3000-16", 44 .i_IorangeBase0 = 256, 45 .i_IorangeBase1 = 256, 46 .i_IorangeBase2 = 256, 47 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 48 .pc_EepromChip = ADDIDATA_9054, 49 .i_NbrAiChannel = 16, 50 .i_NbrAiChannelDiff = 8, 51 .i_AiChannelList = 16, 52 .i_AiMaxdata = 4095, 53 .pr_AiRangelist = &range_apci3XXX_ai, 54 .i_NbrTTLChannel = 24, 55 .b_AvailableConvertUnit = 6, 56 .ui_MinAcquisitiontimeNs = 10000, 57 .interrupt = v_APCI3XXX_Interrupt, 58 .reset = i_APCI3XXX_Reset, 59 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 60 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 61 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 62 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 63 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 64 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 65 }, 66 [BOARD_APCI3000_8] = { 67 .pc_DriverName = "apci3000-8", 68 .i_IorangeBase0 = 256, 69 .i_IorangeBase1 = 256, 70 .i_IorangeBase2 = 256, 71 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 72 .pc_EepromChip = ADDIDATA_9054, 73 .i_NbrAiChannel = 8, 74 .i_NbrAiChannelDiff = 4, 75 .i_AiChannelList = 8, 76 .i_AiMaxdata = 4095, 77 .pr_AiRangelist = &range_apci3XXX_ai, 78 .i_NbrTTLChannel = 24, 79 .b_AvailableConvertUnit = 6, 80 .ui_MinAcquisitiontimeNs = 10000, 81 .interrupt = v_APCI3XXX_Interrupt, 82 .reset = i_APCI3XXX_Reset, 83 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 84 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 85 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 86 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 87 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 88 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 89 }, 90 [BOARD_APCI3000_4] = { 91 .pc_DriverName = "apci3000-4", 92 .i_IorangeBase0 = 256, 93 .i_IorangeBase1 = 256, 94 .i_IorangeBase2 = 256, 95 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 96 .pc_EepromChip = ADDIDATA_9054, 97 .i_NbrAiChannel = 4, 98 .i_NbrAiChannelDiff = 2, 99 .i_AiChannelList = 4, 100 .i_AiMaxdata = 4095, 101 .pr_AiRangelist = &range_apci3XXX_ai, 102 .i_NbrTTLChannel = 24, 103 .b_AvailableConvertUnit = 6, 104 .ui_MinAcquisitiontimeNs = 10000, 105 .interrupt = v_APCI3XXX_Interrupt, 106 .reset = i_APCI3XXX_Reset, 107 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 108 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 109 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 110 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 111 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 112 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 113 }, 114 [BOARD_APCI3006_16] = { 115 .pc_DriverName = "apci3006-16", 116 .i_IorangeBase0 = 256, 117 .i_IorangeBase1 = 256, 118 .i_IorangeBase2 = 256, 119 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 120 .pc_EepromChip = ADDIDATA_9054, 121 .i_NbrAiChannel = 16, 122 .i_NbrAiChannelDiff = 8, 123 .i_AiChannelList = 16, 124 .i_AiMaxdata = 65535, 125 .pr_AiRangelist = &range_apci3XXX_ai, 126 .i_NbrTTLChannel = 24, 127 .b_AvailableConvertUnit = 6, 128 .ui_MinAcquisitiontimeNs = 10000, 129 .interrupt = v_APCI3XXX_Interrupt, 130 .reset = i_APCI3XXX_Reset, 131 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 132 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 133 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 134 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 135 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 136 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 137 }, 138 [BOARD_APCI3006_8] = { 139 .pc_DriverName = "apci3006-8", 140 .i_IorangeBase0 = 256, 141 .i_IorangeBase1 = 256, 142 .i_IorangeBase2 = 256, 143 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 144 .pc_EepromChip = ADDIDATA_9054, 145 .i_NbrAiChannel = 8, 146 .i_NbrAiChannelDiff = 4, 147 .i_AiChannelList = 8, 148 .i_AiMaxdata = 65535, 149 .pr_AiRangelist = &range_apci3XXX_ai, 150 .i_NbrTTLChannel = 24, 151 .b_AvailableConvertUnit = 6, 152 .ui_MinAcquisitiontimeNs = 10000, 153 .interrupt = v_APCI3XXX_Interrupt, 154 .reset = i_APCI3XXX_Reset, 155 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 156 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 157 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 158 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 159 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 160 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 161 }, 162 [BOARD_APCI3006_4] = { 163 .pc_DriverName = "apci3006-4", 164 .i_IorangeBase0 = 256, 165 .i_IorangeBase1 = 256, 166 .i_IorangeBase2 = 256, 167 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 168 .pc_EepromChip = ADDIDATA_9054, 169 .i_NbrAiChannel = 4, 170 .i_NbrAiChannelDiff = 2, 171 .i_AiChannelList = 4, 172 .i_AiMaxdata = 65535, 173 .pr_AiRangelist = &range_apci3XXX_ai, 174 .i_NbrTTLChannel = 24, 175 .b_AvailableConvertUnit = 6, 176 .ui_MinAcquisitiontimeNs = 10000, 177 .interrupt = v_APCI3XXX_Interrupt, 178 .reset = i_APCI3XXX_Reset, 179 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 180 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 181 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 182 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 183 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 184 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 185 }, 186 [BOARD_APCI3010_16] = { 187 .pc_DriverName = "apci3010-16", 188 .i_IorangeBase0 = 256, 189 .i_IorangeBase1 = 256, 190 .i_IorangeBase2 = 256, 191 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 192 .pc_EepromChip = ADDIDATA_9054, 193 .i_NbrAiChannel = 16, 194 .i_NbrAiChannelDiff = 8, 195 .i_AiChannelList = 16, 196 .i_AiMaxdata = 4095, 197 .pr_AiRangelist = &range_apci3XXX_ai, 198 .i_NbrDiChannel = 4, 199 .i_NbrDoChannel = 4, 200 .i_DoMaxdata = 1, 201 .i_NbrTTLChannel = 24, 202 .b_AvailableConvertUnit = 6, 203 .ui_MinAcquisitiontimeNs = 5000, 204 .interrupt = v_APCI3XXX_Interrupt, 205 .reset = i_APCI3XXX_Reset, 206 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 207 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 208 .di_bits = apci3xxx_di_insn_bits, 209 .do_bits = apci3xxx_do_insn_bits, 210 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 211 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 212 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 213 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 214 }, 215 [BOARD_APCI3010_8] = { 216 .pc_DriverName = "apci3010-8", 217 .i_IorangeBase0 = 256, 218 .i_IorangeBase1 = 256, 219 .i_IorangeBase2 = 256, 220 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 221 .pc_EepromChip = ADDIDATA_9054, 222 .i_NbrAiChannel = 8, 223 .i_NbrAiChannelDiff = 4, 224 .i_AiChannelList = 8, 225 .i_AiMaxdata = 4095, 226 .pr_AiRangelist = &range_apci3XXX_ai, 227 .i_NbrDiChannel = 4, 228 .i_NbrDoChannel = 4, 229 .i_DoMaxdata = 1, 230 .i_NbrTTLChannel = 24, 231 .b_AvailableConvertUnit = 6, 232 .ui_MinAcquisitiontimeNs = 5000, 233 .interrupt = v_APCI3XXX_Interrupt, 234 .reset = i_APCI3XXX_Reset, 235 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 236 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 237 .di_bits = apci3xxx_di_insn_bits, 238 .do_bits = apci3xxx_do_insn_bits, 239 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 240 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 241 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 242 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 243 }, 244 [BOARD_APCI3010_4] = { 245 .pc_DriverName = "apci3010-4", 246 .i_IorangeBase0 = 256, 247 .i_IorangeBase1 = 256, 248 .i_IorangeBase2 = 256, 249 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 250 .pc_EepromChip = ADDIDATA_9054, 251 .i_NbrAiChannel = 4, 252 .i_NbrAiChannelDiff = 2, 253 .i_AiChannelList = 4, 254 .i_AiMaxdata = 4095, 255 .pr_AiRangelist = &range_apci3XXX_ai, 256 .i_NbrDiChannel = 4, 257 .i_NbrDoChannel = 4, 258 .i_DoMaxdata = 1, 259 .i_NbrTTLChannel = 24, 260 .b_AvailableConvertUnit = 6, 261 .ui_MinAcquisitiontimeNs = 5000, 262 .interrupt = v_APCI3XXX_Interrupt, 263 .reset = i_APCI3XXX_Reset, 264 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 265 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 266 .di_bits = apci3xxx_di_insn_bits, 267 .do_bits = apci3xxx_do_insn_bits, 268 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 269 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 270 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 271 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 272 }, 273 [BOARD_APCI3016_16] = { 274 .pc_DriverName = "apci3016-16", 275 .i_IorangeBase0 = 256, 276 .i_IorangeBase1 = 256, 277 .i_IorangeBase2 = 256, 278 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 279 .pc_EepromChip = ADDIDATA_9054, 280 .i_NbrAiChannel = 16, 281 .i_NbrAiChannelDiff = 8, 282 .i_AiChannelList = 16, 283 .i_AiMaxdata = 65535, 284 .pr_AiRangelist = &range_apci3XXX_ai, 285 .i_NbrDiChannel = 4, 286 .i_NbrDoChannel = 4, 287 .i_DoMaxdata = 1, 288 .i_NbrTTLChannel = 24, 289 .b_AvailableConvertUnit = 6, 290 .ui_MinAcquisitiontimeNs = 5000, 291 .interrupt = v_APCI3XXX_Interrupt, 292 .reset = i_APCI3XXX_Reset, 293 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 294 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 295 .di_bits = apci3xxx_di_insn_bits, 296 .do_bits = apci3xxx_do_insn_bits, 297 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 298 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 299 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 300 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 301 }, 302 [BOARD_APCI3016_8] = { 303 .pc_DriverName = "apci3016-8", 304 .i_IorangeBase0 = 256, 305 .i_IorangeBase1 = 256, 306 .i_IorangeBase2 = 256, 307 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 308 .pc_EepromChip = ADDIDATA_9054, 309 .i_NbrAiChannel = 8, 310 .i_NbrAiChannelDiff = 4, 311 .i_AiChannelList = 8, 312 .i_AiMaxdata = 65535, 313 .pr_AiRangelist = &range_apci3XXX_ai, 314 .i_NbrDiChannel = 4, 315 .i_NbrDoChannel = 4, 316 .i_DoMaxdata = 1, 317 .i_NbrTTLChannel = 24, 318 .b_AvailableConvertUnit = 6, 319 .ui_MinAcquisitiontimeNs = 5000, 320 .interrupt = v_APCI3XXX_Interrupt, 321 .reset = i_APCI3XXX_Reset, 322 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 323 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 324 .di_bits = apci3xxx_di_insn_bits, 325 .do_bits = apci3xxx_do_insn_bits, 326 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 327 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 328 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 329 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 330 }, 331 [BOARD_APCI3016_4] = { 332 .pc_DriverName = "apci3016-4", 333 .i_IorangeBase0 = 256, 334 .i_IorangeBase1 = 256, 335 .i_IorangeBase2 = 256, 336 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 337 .pc_EepromChip = ADDIDATA_9054, 338 .i_NbrAiChannel = 4, 339 .i_NbrAiChannelDiff = 2, 340 .i_AiChannelList = 4, 341 .i_AiMaxdata = 65535, 342 .pr_AiRangelist = &range_apci3XXX_ai, 343 .i_NbrDiChannel = 4, 344 .i_NbrDoChannel = 4, 345 .i_DoMaxdata = 1, 346 .i_NbrTTLChannel = 24, 347 .b_AvailableConvertUnit = 6, 348 .ui_MinAcquisitiontimeNs = 5000, 349 .interrupt = v_APCI3XXX_Interrupt, 350 .reset = i_APCI3XXX_Reset, 351 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 352 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 353 .di_bits = apci3xxx_di_insn_bits, 354 .do_bits = apci3xxx_do_insn_bits, 355 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 356 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 357 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 358 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 359 }, 360 [BOARD_APCI3100_16_4] = { 361 .pc_DriverName = "apci3100-16-4", 362 .i_IorangeBase0 = 256, 363 .i_IorangeBase1 = 256, 364 .i_IorangeBase2 = 256, 365 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 366 .pc_EepromChip = ADDIDATA_9054, 367 .i_NbrAiChannel = 16, 368 .i_NbrAiChannelDiff = 8, 369 .i_AiChannelList = 16, 370 .i_NbrAoChannel = 4, 371 .i_AiMaxdata = 4095, 372 .i_AoMaxdata = 4095, 373 .pr_AiRangelist = &range_apci3XXX_ai, 374 .pr_AoRangelist = &range_apci3XXX_ao, 375 .i_NbrTTLChannel = 24, 376 .b_AvailableConvertUnit = 6, 377 .ui_MinAcquisitiontimeNs = 10000, 378 .interrupt = v_APCI3XXX_Interrupt, 379 .reset = i_APCI3XXX_Reset, 380 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 381 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 382 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput, 383 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 384 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 385 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 386 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 387 }, 388 [BOARD_APCI3100_8_4] = { 389 .pc_DriverName = "apci3100-8-4", 390 .i_IorangeBase0 = 256, 391 .i_IorangeBase1 = 256, 392 .i_IorangeBase2 = 256, 393 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 394 .pc_EepromChip = ADDIDATA_9054, 395 .i_NbrAiChannel = 8, 396 .i_NbrAiChannelDiff = 4, 397 .i_AiChannelList = 8, 398 .i_NbrAoChannel = 4, 399 .i_AiMaxdata = 4095, 400 .i_AoMaxdata = 4095, 401 .pr_AiRangelist = &range_apci3XXX_ai, 402 .pr_AoRangelist = &range_apci3XXX_ao, 403 .i_NbrTTLChannel = 24, 404 .b_AvailableConvertUnit = 6, 405 .ui_MinAcquisitiontimeNs = 10000, 406 .interrupt = v_APCI3XXX_Interrupt, 407 .reset = i_APCI3XXX_Reset, 408 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 409 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 410 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput, 411 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 412 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 413 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 414 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 415 }, 416 [BOARD_APCI3106_16_4] = { 417 .pc_DriverName = "apci3106-16-4", 418 .i_IorangeBase0 = 256, 419 .i_IorangeBase1 = 256, 420 .i_IorangeBase2 = 256, 421 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 422 .pc_EepromChip = ADDIDATA_9054, 423 .i_NbrAiChannel = 16, 424 .i_NbrAiChannelDiff = 8, 425 .i_AiChannelList = 16, 426 .i_NbrAoChannel = 4, 427 .i_AiMaxdata = 65535, 428 .i_AoMaxdata = 4095, 429 .pr_AiRangelist = &range_apci3XXX_ai, 430 .pr_AoRangelist = &range_apci3XXX_ao, 431 .i_NbrTTLChannel = 24, 432 .b_AvailableConvertUnit = 6, 433 .ui_MinAcquisitiontimeNs = 10000, 434 .interrupt = v_APCI3XXX_Interrupt, 435 .reset = i_APCI3XXX_Reset, 436 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 437 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 438 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput, 439 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 440 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 441 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 442 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 443 }, 444 [BOARD_APCI3106_8_4] = { 445 .pc_DriverName = "apci3106-8-4", 446 .i_IorangeBase0 = 256, 447 .i_IorangeBase1 = 256, 448 .i_IorangeBase2 = 256, 449 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 450 .pc_EepromChip = ADDIDATA_9054, 451 .i_NbrAiChannel = 8, 452 .i_NbrAiChannelDiff = 4, 453 .i_AiChannelList = 8, 454 .i_NbrAoChannel = 4, 455 .i_AiMaxdata = 65535, 456 .i_AoMaxdata = 4095, 457 .pr_AiRangelist = &range_apci3XXX_ai, 458 .pr_AoRangelist = &range_apci3XXX_ao, 459 .i_NbrTTLChannel = 24, 460 .b_AvailableConvertUnit = 6, 461 .ui_MinAcquisitiontimeNs = 10000, 462 .interrupt = v_APCI3XXX_Interrupt, 463 .reset = i_APCI3XXX_Reset, 464 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 465 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 466 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput, 467 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 468 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 469 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 470 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 471 }, 472 [BOARD_APCI3110_16_4] = { 473 .pc_DriverName = "apci3110-16-4", 474 .i_IorangeBase0 = 256, 475 .i_IorangeBase1 = 256, 476 .i_IorangeBase2 = 256, 477 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 478 .pc_EepromChip = ADDIDATA_9054, 479 .i_NbrAiChannel = 16, 480 .i_NbrAiChannelDiff = 8, 481 .i_AiChannelList = 16, 482 .i_NbrAoChannel = 4, 483 .i_AiMaxdata = 4095, 484 .i_AoMaxdata = 4095, 485 .pr_AiRangelist = &range_apci3XXX_ai, 486 .pr_AoRangelist = &range_apci3XXX_ao, 487 .i_NbrDiChannel = 4, 488 .i_NbrDoChannel = 4, 489 .i_DoMaxdata = 1, 490 .i_NbrTTLChannel = 24, 491 .b_AvailableConvertUnit = 6, 492 .ui_MinAcquisitiontimeNs = 5000, 493 .interrupt = v_APCI3XXX_Interrupt, 494 .reset = i_APCI3XXX_Reset, 495 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 496 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 497 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput, 498 .di_bits = apci3xxx_di_insn_bits, 499 .do_bits = apci3xxx_do_insn_bits, 500 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 501 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 502 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 503 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 504 }, 505 [BOARD_APCI3110_8_4] = { 506 .pc_DriverName = "apci3110-8-4", 507 .i_IorangeBase0 = 256, 508 .i_IorangeBase1 = 256, 509 .i_IorangeBase2 = 256, 510 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 511 .pc_EepromChip = ADDIDATA_9054, 512 .i_NbrAiChannel = 8, 513 .i_NbrAiChannelDiff = 4, 514 .i_AiChannelList = 8, 515 .i_NbrAoChannel = 4, 516 .i_AiMaxdata = 4095, 517 .i_AoMaxdata = 4095, 518 .pr_AiRangelist = &range_apci3XXX_ai, 519 .pr_AoRangelist = &range_apci3XXX_ao, 520 .i_NbrDiChannel = 4, 521 .i_NbrDoChannel = 4, 522 .i_DoMaxdata = 1, 523 .i_NbrTTLChannel = 24, 524 .b_AvailableConvertUnit = 6, 525 .ui_MinAcquisitiontimeNs = 5000, 526 .interrupt = v_APCI3XXX_Interrupt, 527 .reset = i_APCI3XXX_Reset, 528 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 529 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 530 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput, 531 .di_bits = apci3xxx_di_insn_bits, 532 .do_bits = apci3xxx_do_insn_bits, 533 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 534 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 535 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 536 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 537 }, 538 [BOARD_APCI3116_16_4] = { 539 .pc_DriverName = "apci3116-16-4", 540 .i_IorangeBase0 = 256, 541 .i_IorangeBase1 = 256, 542 .i_IorangeBase2 = 256, 543 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 544 .pc_EepromChip = ADDIDATA_9054, 545 .i_NbrAiChannel = 16, 546 .i_NbrAiChannelDiff = 8, 547 .i_AiChannelList = 16, 548 .i_NbrAoChannel = 4, 549 .i_AiMaxdata = 65535, 550 .i_AoMaxdata = 4095, 551 .pr_AiRangelist = &range_apci3XXX_ai, 552 .pr_AoRangelist = &range_apci3XXX_ao, 553 .i_NbrDiChannel = 4, 554 .i_NbrDoChannel = 4, 555 .i_DoMaxdata = 1, 556 .i_NbrTTLChannel = 24, 557 .b_AvailableConvertUnit = 6, 558 .ui_MinAcquisitiontimeNs = 5000, 559 .interrupt = v_APCI3XXX_Interrupt, 560 .reset = i_APCI3XXX_Reset, 561 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 562 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 563 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput, 564 .di_bits = apci3xxx_di_insn_bits, 565 .do_bits = apci3xxx_do_insn_bits, 566 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 567 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 568 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 569 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 570 }, 571 [BOARD_APCI3116_8_4] = { 572 .pc_DriverName = "apci3116-8-4", 573 .i_IorangeBase0 = 256, 574 .i_IorangeBase1 = 256, 575 .i_IorangeBase2 = 256, 576 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 577 .pc_EepromChip = ADDIDATA_9054, 578 .i_NbrAiChannel = 8, 579 .i_NbrAiChannelDiff = 4, 580 .i_AiChannelList = 8, 581 .i_NbrAoChannel = 4, 582 .i_AiMaxdata = 65535, 583 .i_AoMaxdata = 4095, 584 .pr_AiRangelist = &range_apci3XXX_ai, 585 .pr_AoRangelist = &range_apci3XXX_ao, 586 .i_NbrDiChannel = 4, 587 .i_NbrDoChannel = 4, 588 .i_DoMaxdata = 1, 589 .i_NbrTTLChannel = 24, 590 .b_AvailableConvertUnit = 6, 591 .ui_MinAcquisitiontimeNs = 5000, 592 .interrupt = v_APCI3XXX_Interrupt, 593 .reset = i_APCI3XXX_Reset, 594 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 595 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 596 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput, 597 .di_bits = apci3xxx_di_insn_bits, 598 .do_bits = apci3xxx_do_insn_bits, 599 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 600 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 601 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 602 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 603 }, 604 [BOARD_APCI3003] = { 605 .pc_DriverName = "apci3003", 606 .i_IorangeBase0 = 256, 607 .i_IorangeBase1 = 256, 608 .i_IorangeBase2 = 256, 609 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 610 .pc_EepromChip = ADDIDATA_9054, 611 .i_NbrAiChannelDiff = 4, 612 .i_AiChannelList = 4, 613 .i_AiMaxdata = 65535, 614 .pr_AiRangelist = &range_apci3XXX_ai, 615 .i_NbrDiChannel = 4, 616 .i_NbrDoChannel = 4, 617 .i_DoMaxdata = 1, 618 .b_AvailableConvertUnit = 7, 619 .ui_MinAcquisitiontimeNs = 2500, 620 .interrupt = v_APCI3XXX_Interrupt, 621 .reset = i_APCI3XXX_Reset, 622 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 623 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 624 .di_bits = apci3xxx_di_insn_bits, 625 .do_bits = apci3xxx_do_insn_bits, 626 }, 627 [BOARD_APCI3002_16] = { 628 .pc_DriverName = "apci3002-16", 629 .i_IorangeBase0 = 256, 630 .i_IorangeBase1 = 256, 631 .i_IorangeBase2 = 256, 632 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 633 .pc_EepromChip = ADDIDATA_9054, 634 .i_NbrAiChannelDiff = 16, 635 .i_AiChannelList = 16, 636 .i_AiMaxdata = 65535, 637 .pr_AiRangelist = &range_apci3XXX_ai, 638 .i_NbrDiChannel = 4, 639 .i_NbrDoChannel = 4, 640 .i_DoMaxdata = 1, 641 .b_AvailableConvertUnit = 6, 642 .ui_MinAcquisitiontimeNs = 5000, 643 .interrupt = v_APCI3XXX_Interrupt, 644 .reset = i_APCI3XXX_Reset, 645 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 646 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 647 .di_bits = apci3xxx_di_insn_bits, 648 .do_bits = apci3xxx_do_insn_bits, 649 }, 650 [BOARD_APCI3002_8] = { 651 .pc_DriverName = "apci3002-8", 652 .i_IorangeBase0 = 256, 653 .i_IorangeBase1 = 256, 654 .i_IorangeBase2 = 256, 655 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 656 .pc_EepromChip = ADDIDATA_9054, 657 .i_NbrAiChannelDiff = 8, 658 .i_AiChannelList = 8, 659 .i_AiMaxdata = 65535, 660 .pr_AiRangelist = &range_apci3XXX_ai, 661 .i_NbrDiChannel = 4, 662 .i_NbrDoChannel = 4, 663 .i_DoMaxdata = 1, 664 .b_AvailableConvertUnit = 6, 665 .ui_MinAcquisitiontimeNs = 5000, 666 .interrupt = v_APCI3XXX_Interrupt, 667 .reset = i_APCI3XXX_Reset, 668 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 669 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 670 .di_bits = apci3xxx_di_insn_bits, 671 .do_bits = apci3xxx_do_insn_bits, 672 }, 673 [BOARD_APCI3002_4] = { 674 .pc_DriverName = "apci3002-4", 675 .i_IorangeBase0 = 256, 676 .i_IorangeBase1 = 256, 677 .i_IorangeBase2 = 256, 678 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 679 .pc_EepromChip = ADDIDATA_9054, 680 .i_NbrAiChannelDiff = 4, 681 .i_AiChannelList = 4, 682 .i_AiMaxdata = 65535, 683 .pr_AiRangelist = &range_apci3XXX_ai, 684 .i_NbrDiChannel = 4, 685 .i_NbrDoChannel = 4, 686 .i_DoMaxdata = 1, 687 .b_AvailableConvertUnit = 6, 688 .ui_MinAcquisitiontimeNs = 5000, 689 .interrupt = v_APCI3XXX_Interrupt, 690 .reset = i_APCI3XXX_Reset, 691 .ai_config = i_APCI3XXX_InsnConfigAnalogInput, 692 .ai_read = i_APCI3XXX_InsnReadAnalogInput, 693 .di_bits = apci3xxx_di_insn_bits, 694 .do_bits = apci3xxx_do_insn_bits, 695 }, 696 [BOARD_APCI3500] = { 697 .pc_DriverName = "apci3500", 698 .i_IorangeBase0 = 256, 699 .i_IorangeBase1 = 256, 700 .i_IorangeBase2 = 256, 701 .i_PCIEeprom = ADDIDATA_NO_EEPROM, 702 .pc_EepromChip = ADDIDATA_9054, 703 .i_NbrAoChannel = 4, 704 .i_AoMaxdata = 4095, 705 .pr_AoRangelist = &range_apci3XXX_ao, 706 .i_NbrTTLChannel = 24, 707 .interrupt = v_APCI3XXX_Interrupt, 708 .reset = i_APCI3XXX_Reset, 709 .ao_write = i_APCI3XXX_InsnWriteAnalogOutput, 710 .ttl_config = i_APCI3XXX_InsnConfigInitTTLIO, 711 .ttl_bits = i_APCI3XXX_InsnBitsTTLIO, 712 .ttl_read = i_APCI3XXX_InsnReadTTLIO, 713 .ttl_write = i_APCI3XXX_InsnWriteTTLIO, 714 }, 715}; 716 717static int apci3xxx_auto_attach(struct comedi_device *dev, 718 unsigned long context) 719{ 720 const struct addi_board *board = NULL; 721 722 if (context < ARRAY_SIZE(apci3xxx_boardtypes)) 723 board = &apci3xxx_boardtypes[context]; 724 if (!board) 725 return -ENODEV; 726 dev->board_ptr = board; 727 728 return addi_auto_attach(dev, context); 729} 730 731static struct comedi_driver apci3xxx_driver = { 732 .driver_name = "addi_apci_3xxx", 733 .module = THIS_MODULE, 734 .auto_attach = apci3xxx_auto_attach, 735 .detach = i_ADDI_Detach, 736}; 737 738static int apci3xxx_pci_probe(struct pci_dev *dev, 739 const struct pci_device_id *id) 740{ 741 return comedi_pci_auto_config(dev, &apci3xxx_driver, id->driver_data); 742} 743 744static DEFINE_PCI_DEVICE_TABLE(apci3xxx_pci_table) = { 745 { PCI_VDEVICE(ADDIDATA, 0x3010), BOARD_APCI3000_16 }, 746 { PCI_VDEVICE(ADDIDATA, 0x300f), BOARD_APCI3000_8 }, 747 { PCI_VDEVICE(ADDIDATA, 0x300e), BOARD_APCI3000_4 }, 748 { PCI_VDEVICE(ADDIDATA, 0x3013), BOARD_APCI3006_16 }, 749 { PCI_VDEVICE(ADDIDATA, 0x3014), BOARD_APCI3006_8 }, 750 { PCI_VDEVICE(ADDIDATA, 0x3015), BOARD_APCI3006_4 }, 751 { PCI_VDEVICE(ADDIDATA, 0x3016), BOARD_APCI3010_16 }, 752 { PCI_VDEVICE(ADDIDATA, 0x3017), BOARD_APCI3010_8 }, 753 { PCI_VDEVICE(ADDIDATA, 0x3018), BOARD_APCI3010_4 }, 754 { PCI_VDEVICE(ADDIDATA, 0x3019), BOARD_APCI3016_16 }, 755 { PCI_VDEVICE(ADDIDATA, 0x301a), BOARD_APCI3016_8 }, 756 { PCI_VDEVICE(ADDIDATA, 0x301b), BOARD_APCI3016_4 }, 757 { PCI_VDEVICE(ADDIDATA, 0x301c), BOARD_APCI3100_16_4 }, 758 { PCI_VDEVICE(ADDIDATA, 0x301d), BOARD_APCI3100_8_4 }, 759 { PCI_VDEVICE(ADDIDATA, 0x301e), BOARD_APCI3106_16_4 }, 760 { PCI_VDEVICE(ADDIDATA, 0x301f), BOARD_APCI3106_8_4 }, 761 { PCI_VDEVICE(ADDIDATA, 0x3020), BOARD_APCI3110_16_4 }, 762 { PCI_VDEVICE(ADDIDATA, 0x3021), BOARD_APCI3110_8_4 }, 763 { PCI_VDEVICE(ADDIDATA, 0x3022), BOARD_APCI3116_16_4 }, 764 { PCI_VDEVICE(ADDIDATA, 0x3023), BOARD_APCI3116_8_4 }, 765 { PCI_VDEVICE(ADDIDATA, 0x300B), BOARD_APCI3003 }, 766 { PCI_VDEVICE(ADDIDATA, 0x3002), BOARD_APCI3002_16 }, 767 { PCI_VDEVICE(ADDIDATA, 0x3003), BOARD_APCI3002_8 }, 768 { PCI_VDEVICE(ADDIDATA, 0x3004), BOARD_APCI3002_4 }, 769 { PCI_VDEVICE(ADDIDATA, 0x3024), BOARD_APCI3500 }, 770 { 0 } 771}; 772MODULE_DEVICE_TABLE(pci, apci3xxx_pci_table); 773 774static struct pci_driver apci3xxx_pci_driver = { 775 .name = "addi_apci_3xxx", 776 .id_table = apci3xxx_pci_table, 777 .probe = apci3xxx_pci_probe, 778 .remove = comedi_pci_auto_unconfig, 779}; 780module_comedi_pci_driver(apci3xxx_driver, apci3xxx_pci_driver); 781 782MODULE_AUTHOR("Comedi http://www.comedi.org"); 783MODULE_DESCRIPTION("Comedi low-level driver"); 784MODULE_LICENSE("GPL"); 785