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