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