2 comedi/drivers/ni_660x.c
3 Hardware driver for NI 660x devices
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 Description: National Instruments 660x counter/timer boards
24 [National Instruments] PCI-6601 (ni_660x), PCI-6602, PXI-6602,
26 Author: J.P. Mellor <jpmellor@rose-hulman.edu>,
27 Herman.Bruyninckx@mech.kuleuven.ac.be,
28 Wim.Meeussen@mech.kuleuven.ac.be,
29 Klaas.Gadeyne@mech.kuleuven.ac.be,
30 Frank Mori Hess <fmhess@users.sourceforge.net>
31 Updated: Thu Oct 18 12:56:06 EDT 2007
34 Encoders work. PulseGeneration (both single pulse and pulse train)
35 works. Buffered commands work for input but not output.
38 DAQ 660x Register-Level Programmer Manual (NI 370505A-01)
39 DAQ 6601/6602 User Manual (NI 322137B-01)
43 #include <linux/interrupt.h>
44 #include "../comedidev.h"
48 enum ni_660x_constants {
49 min_counter_pfi_chan = 8,
50 max_dio_pfi_chan = 31,
54 #define NUM_PFI_CHANNELS 40
55 /* really there are only up to 3 dma channels, but the register layout allows
57 #define MAX_DMA_CHANNEL 4
59 /* See Register-Level Programmer Manual page 3.1 */
60 enum NI_660x_Register {
61 G0InterruptAcknowledge,
63 G1InterruptAcknowledge,
76 G01JointStatus1Register,
80 G01JointStatus2Register,
84 G0InputSelectRegister,
85 G1InputSelectRegister,
86 G0AutoincrementRegister,
87 G1AutoincrementRegister,
88 G01JointResetRegister,
91 G0CountingModeRegister,
92 G1CountingModeRegister,
99 G2InterruptAcknowledge,
101 G3InterruptAcknowledge,
111 G23JointStatus1Register,
114 G23JointStatus2Register,
118 G2InputSelectRegister,
119 G3InputSelectRegister,
120 G2AutoincrementRegister,
121 G3AutoincrementRegister,
122 G23JointResetRegister,
125 G2CountingModeRegister,
126 G3CountingModeRegister,
127 G3SecondGateRegister,
128 G2SecondGateRegister,
136 GlobalInterruptStatusRegister,
138 GlobalInterruptConfigRegister,
162 static inline unsigned IOConfigReg(unsigned pfi_channel)
164 unsigned reg = IOConfigReg0_1 + pfi_channel / 2;
165 BUG_ON(reg > IOConfigReg38_39);
169 enum ni_660x_register_width {
175 enum ni_660x_register_direction {
181 enum ni_660x_pfi_output_select {
182 pfi_output_select_high_Z = 0,
183 pfi_output_select_counter = 1,
184 pfi_output_select_do = 2,
185 num_pfi_output_selects
188 enum ni_660x_subdevices {
189 NI_660X_DIO_SUBDEV = 1,
190 NI_660X_GPCT_SUBDEV_0 = 2
192 static inline unsigned NI_660X_GPCT_SUBDEV(unsigned index)
194 return NI_660X_GPCT_SUBDEV_0 + index;
197 struct NI_660xRegisterData {
199 const char *name; /* Register Name */
200 int offset; /* Offset from base address from GPCT chip */
201 enum ni_660x_register_direction direction;
202 enum ni_660x_register_width size; /* 1 byte, 2 bytes, or 4 bytes */
205 static const struct NI_660xRegisterData registerData[NumRegisters] = {
206 {"G0 Interrupt Acknowledge", 0x004, NI_660x_WRITE, DATA_2B},
207 {"G0 Status Register", 0x004, NI_660x_READ, DATA_2B},
208 {"G1 Interrupt Acknowledge", 0x006, NI_660x_WRITE, DATA_2B},
209 {"G1 Status Register", 0x006, NI_660x_READ, DATA_2B},
210 {"G01 Status Register ", 0x008, NI_660x_READ, DATA_2B},
211 {"G0 Command Register", 0x00C, NI_660x_WRITE, DATA_2B},
212 {"STC DIO Parallel Input", 0x00E, NI_660x_READ, DATA_2B},
213 {"G1 Command Register", 0x00E, NI_660x_WRITE, DATA_2B},
214 {"G0 HW Save Register", 0x010, NI_660x_READ, DATA_4B},
215 {"G1 HW Save Register", 0x014, NI_660x_READ, DATA_4B},
216 {"STC DIO Output", 0x014, NI_660x_WRITE, DATA_2B},
217 {"STC DIO Control", 0x016, NI_660x_WRITE, DATA_2B},
218 {"G0 SW Save Register", 0x018, NI_660x_READ, DATA_4B},
219 {"G1 SW Save Register", 0x01C, NI_660x_READ, DATA_4B},
220 {"G0 Mode Register", 0x034, NI_660x_WRITE, DATA_2B},
221 {"G01 Joint Status 1 Register", 0x036, NI_660x_READ, DATA_2B},
222 {"G1 Mode Register", 0x036, NI_660x_WRITE, DATA_2B},
223 {"STC DIO Serial Input", 0x038, NI_660x_READ, DATA_2B},
224 {"G0 Load A Register", 0x038, NI_660x_WRITE, DATA_4B},
225 {"G01 Joint Status 2 Register", 0x03A, NI_660x_READ, DATA_2B},
226 {"G0 Load B Register", 0x03C, NI_660x_WRITE, DATA_4B},
227 {"G1 Load A Register", 0x040, NI_660x_WRITE, DATA_4B},
228 {"G1 Load B Register", 0x044, NI_660x_WRITE, DATA_4B},
229 {"G0 Input Select Register", 0x048, NI_660x_WRITE, DATA_2B},
230 {"G1 Input Select Register", 0x04A, NI_660x_WRITE, DATA_2B},
231 {"G0 Autoincrement Register", 0x088, NI_660x_WRITE, DATA_2B},
232 {"G1 Autoincrement Register", 0x08A, NI_660x_WRITE, DATA_2B},
233 {"G01 Joint Reset Register", 0x090, NI_660x_WRITE, DATA_2B},
234 {"G0 Interrupt Enable", 0x092, NI_660x_WRITE, DATA_2B},
235 {"G1 Interrupt Enable", 0x096, NI_660x_WRITE, DATA_2B},
236 {"G0 Counting Mode Register", 0x0B0, NI_660x_WRITE, DATA_2B},
237 {"G1 Counting Mode Register", 0x0B2, NI_660x_WRITE, DATA_2B},
238 {"G0 Second Gate Register", 0x0B4, NI_660x_WRITE, DATA_2B},
239 {"G1 Second Gate Register", 0x0B6, NI_660x_WRITE, DATA_2B},
240 {"G0 DMA Config Register", 0x0B8, NI_660x_WRITE, DATA_2B},
241 {"G0 DMA Status Register", 0x0B8, NI_660x_READ, DATA_2B},
242 {"G1 DMA Config Register", 0x0BA, NI_660x_WRITE, DATA_2B},
243 {"G1 DMA Status Register", 0x0BA, NI_660x_READ, DATA_2B},
244 {"G2 Interrupt Acknowledge", 0x104, NI_660x_WRITE, DATA_2B},
245 {"G2 Status Register", 0x104, NI_660x_READ, DATA_2B},
246 {"G3 Interrupt Acknowledge", 0x106, NI_660x_WRITE, DATA_2B},
247 {"G3 Status Register", 0x106, NI_660x_READ, DATA_2B},
248 {"G23 Status Register", 0x108, NI_660x_READ, DATA_2B},
249 {"G2 Command Register", 0x10C, NI_660x_WRITE, DATA_2B},
250 {"G3 Command Register", 0x10E, NI_660x_WRITE, DATA_2B},
251 {"G2 HW Save Register", 0x110, NI_660x_READ, DATA_4B},
252 {"G3 HW Save Register", 0x114, NI_660x_READ, DATA_4B},
253 {"G2 SW Save Register", 0x118, NI_660x_READ, DATA_4B},
254 {"G3 SW Save Register", 0x11C, NI_660x_READ, DATA_4B},
255 {"G2 Mode Register", 0x134, NI_660x_WRITE, DATA_2B},
256 {"G23 Joint Status 1 Register", 0x136, NI_660x_READ, DATA_2B},
257 {"G3 Mode Register", 0x136, NI_660x_WRITE, DATA_2B},
258 {"G2 Load A Register", 0x138, NI_660x_WRITE, DATA_4B},
259 {"G23 Joint Status 2 Register", 0x13A, NI_660x_READ, DATA_2B},
260 {"G2 Load B Register", 0x13C, NI_660x_WRITE, DATA_4B},
261 {"G3 Load A Register", 0x140, NI_660x_WRITE, DATA_4B},
262 {"G3 Load B Register", 0x144, NI_660x_WRITE, DATA_4B},
263 {"G2 Input Select Register", 0x148, NI_660x_WRITE, DATA_2B},
264 {"G3 Input Select Register", 0x14A, NI_660x_WRITE, DATA_2B},
265 {"G2 Autoincrement Register", 0x188, NI_660x_WRITE, DATA_2B},
266 {"G3 Autoincrement Register", 0x18A, NI_660x_WRITE, DATA_2B},
267 {"G23 Joint Reset Register", 0x190, NI_660x_WRITE, DATA_2B},
268 {"G2 Interrupt Enable", 0x192, NI_660x_WRITE, DATA_2B},
269 {"G3 Interrupt Enable", 0x196, NI_660x_WRITE, DATA_2B},
270 {"G2 Counting Mode Register", 0x1B0, NI_660x_WRITE, DATA_2B},
271 {"G3 Counting Mode Register", 0x1B2, NI_660x_WRITE, DATA_2B},
272 {"G3 Second Gate Register", 0x1B6, NI_660x_WRITE, DATA_2B},
273 {"G2 Second Gate Register", 0x1B4, NI_660x_WRITE, DATA_2B},
274 {"G2 DMA Config Register", 0x1B8, NI_660x_WRITE, DATA_2B},
275 {"G2 DMA Status Register", 0x1B8, NI_660x_READ, DATA_2B},
276 {"G3 DMA Config Register", 0x1BA, NI_660x_WRITE, DATA_2B},
277 {"G3 DMA Status Register", 0x1BA, NI_660x_READ, DATA_2B},
278 {"32 bit Digital Input", 0x414, NI_660x_READ, DATA_4B},
279 {"32 bit Digital Output", 0x510, NI_660x_WRITE, DATA_4B},
280 {"Clock Config Register", 0x73C, NI_660x_WRITE, DATA_4B},
281 {"Global Interrupt Status Register", 0x754, NI_660x_READ, DATA_4B},
282 {"DMA Configuration Register", 0x76C, NI_660x_WRITE, DATA_4B},
283 {"Global Interrupt Config Register", 0x770, NI_660x_WRITE, DATA_4B},
284 {"IO Config Register 0-1", 0x77C, NI_660x_READ_WRITE, DATA_2B},
285 {"IO Config Register 2-3", 0x77E, NI_660x_READ_WRITE, DATA_2B},
286 {"IO Config Register 4-5", 0x780, NI_660x_READ_WRITE, DATA_2B},
287 {"IO Config Register 6-7", 0x782, NI_660x_READ_WRITE, DATA_2B},
288 {"IO Config Register 8-9", 0x784, NI_660x_READ_WRITE, DATA_2B},
289 {"IO Config Register 10-11", 0x786, NI_660x_READ_WRITE, DATA_2B},
290 {"IO Config Register 12-13", 0x788, NI_660x_READ_WRITE, DATA_2B},
291 {"IO Config Register 14-15", 0x78A, NI_660x_READ_WRITE, DATA_2B},
292 {"IO Config Register 16-17", 0x78C, NI_660x_READ_WRITE, DATA_2B},
293 {"IO Config Register 18-19", 0x78E, NI_660x_READ_WRITE, DATA_2B},
294 {"IO Config Register 20-21", 0x790, NI_660x_READ_WRITE, DATA_2B},
295 {"IO Config Register 22-23", 0x792, NI_660x_READ_WRITE, DATA_2B},
296 {"IO Config Register 24-25", 0x794, NI_660x_READ_WRITE, DATA_2B},
297 {"IO Config Register 26-27", 0x796, NI_660x_READ_WRITE, DATA_2B},
298 {"IO Config Register 28-29", 0x798, NI_660x_READ_WRITE, DATA_2B},
299 {"IO Config Register 30-31", 0x79A, NI_660x_READ_WRITE, DATA_2B},
300 {"IO Config Register 32-33", 0x79C, NI_660x_READ_WRITE, DATA_2B},
301 {"IO Config Register 34-35", 0x79E, NI_660x_READ_WRITE, DATA_2B},
302 {"IO Config Register 36-37", 0x7A0, NI_660x_READ_WRITE, DATA_2B},
303 {"IO Config Register 38-39", 0x7A2, NI_660x_READ_WRITE, DATA_2B}
306 /* kind of ENABLE for the second counter */
307 enum clock_config_register_bits {
308 CounterSwap = 0x1 << 21
312 static inline unsigned ioconfig_bitshift(unsigned pfi_channel)
320 static inline unsigned pfi_output_select_mask(unsigned pfi_channel)
322 return 0x3 << ioconfig_bitshift(pfi_channel);
325 static inline unsigned pfi_output_select_bits(unsigned pfi_channel,
326 unsigned output_select)
328 return (output_select & 0x3) << ioconfig_bitshift(pfi_channel);
331 static inline unsigned pfi_input_select_mask(unsigned pfi_channel)
333 return 0x7 << (4 + ioconfig_bitshift(pfi_channel));
336 static inline unsigned pfi_input_select_bits(unsigned pfi_channel,
337 unsigned input_select)
339 return (input_select & 0x7) << (4 + ioconfig_bitshift(pfi_channel));
342 /* dma configuration register bits */
343 static inline unsigned dma_select_mask(unsigned dma_channel)
345 BUG_ON(dma_channel >= MAX_DMA_CHANNEL);
346 return 0x1f << (8 * dma_channel);
350 dma_selection_none = 0x1f,
352 static inline unsigned dma_selection_counter(unsigned counter_index)
354 BUG_ON(counter_index >= counters_per_chip);
355 return counter_index;
358 static inline unsigned dma_select_bits(unsigned dma_channel, unsigned selection)
360 BUG_ON(dma_channel >= MAX_DMA_CHANNEL);
361 return (selection << (8 * dma_channel)) & dma_select_mask(dma_channel);
364 static inline unsigned dma_reset_bit(unsigned dma_channel)
366 BUG_ON(dma_channel >= MAX_DMA_CHANNEL);
367 return 0x80 << (8 * dma_channel);
370 enum global_interrupt_status_register_bits {
371 Counter_0_Int_Bit = 0x100,
372 Counter_1_Int_Bit = 0x200,
373 Counter_2_Int_Bit = 0x400,
374 Counter_3_Int_Bit = 0x800,
375 Cascade_Int_Bit = 0x20000000,
376 Global_Int_Bit = 0x80000000
379 enum global_interrupt_config_register_bits {
380 Cascade_Int_Enable_Bit = 0x20000000,
381 Global_Int_Polarity_Bit = 0x40000000,
382 Global_Int_Enable_Bit = 0x80000000
385 /* Offset of the GPCT chips from the base-address of the card */
386 /* First chip is at base-address + 0x00, etc. */
387 static const unsigned GPCT_OFFSET[2] = { 0x0, 0x800 };
389 /* Board description*/
390 struct ni_660x_board {
391 unsigned short dev_id; /* `lspci` will show you this */
393 unsigned n_chips; /* total number of TIO chips */
396 static const struct ni_660x_board ni_660x_boards[] = {
419 #define NI_660X_MAX_NUM_CHIPS 2
420 #define NI_660X_MAX_NUM_COUNTERS (NI_660X_MAX_NUM_CHIPS * counters_per_chip)
422 struct ni_660x_private {
423 struct mite_struct *mite;
424 struct ni_gpct_device *counter_dev;
425 uint64_t pfi_direction_bits;
426 struct mite_dma_descriptor_ring
427 *mite_rings[NI_660X_MAX_NUM_CHIPS][counters_per_chip];
428 spinlock_t mite_channel_lock;
429 /* interrupt_lock prevents races between interrupt and comedi_poll */
430 spinlock_t interrupt_lock;
431 unsigned dma_configuration_soft_copies[NI_660X_MAX_NUM_CHIPS];
432 spinlock_t soft_reg_copy_lock;
433 unsigned short pfi_output_selects[NUM_PFI_CHANNELS];
436 /* initialized in ni_660x_attach_pci() */
437 static inline const struct ni_660x_board *board(struct comedi_device *dev)
439 return dev->board_ptr;
442 static inline unsigned ni_660x_num_counters(struct comedi_device *dev)
444 return board(dev)->n_chips * counters_per_chip;
447 static enum NI_660x_Register ni_gpct_to_660x_register(enum ni_gpct_register reg)
449 enum NI_660x_Register ni_660x_register;
451 case NITIO_G0_Autoincrement_Reg:
452 ni_660x_register = G0AutoincrementRegister;
454 case NITIO_G1_Autoincrement_Reg:
455 ni_660x_register = G1AutoincrementRegister;
457 case NITIO_G2_Autoincrement_Reg:
458 ni_660x_register = G2AutoincrementRegister;
460 case NITIO_G3_Autoincrement_Reg:
461 ni_660x_register = G3AutoincrementRegister;
463 case NITIO_G0_Command_Reg:
464 ni_660x_register = G0CommandRegister;
466 case NITIO_G1_Command_Reg:
467 ni_660x_register = G1CommandRegister;
469 case NITIO_G2_Command_Reg:
470 ni_660x_register = G2CommandRegister;
472 case NITIO_G3_Command_Reg:
473 ni_660x_register = G3CommandRegister;
475 case NITIO_G0_HW_Save_Reg:
476 ni_660x_register = G0HWSaveRegister;
478 case NITIO_G1_HW_Save_Reg:
479 ni_660x_register = G1HWSaveRegister;
481 case NITIO_G2_HW_Save_Reg:
482 ni_660x_register = G2HWSaveRegister;
484 case NITIO_G3_HW_Save_Reg:
485 ni_660x_register = G3HWSaveRegister;
487 case NITIO_G0_SW_Save_Reg:
488 ni_660x_register = G0SWSaveRegister;
490 case NITIO_G1_SW_Save_Reg:
491 ni_660x_register = G1SWSaveRegister;
493 case NITIO_G2_SW_Save_Reg:
494 ni_660x_register = G2SWSaveRegister;
496 case NITIO_G3_SW_Save_Reg:
497 ni_660x_register = G3SWSaveRegister;
499 case NITIO_G0_Mode_Reg:
500 ni_660x_register = G0ModeRegister;
502 case NITIO_G1_Mode_Reg:
503 ni_660x_register = G1ModeRegister;
505 case NITIO_G2_Mode_Reg:
506 ni_660x_register = G2ModeRegister;
508 case NITIO_G3_Mode_Reg:
509 ni_660x_register = G3ModeRegister;
511 case NITIO_G0_LoadA_Reg:
512 ni_660x_register = G0LoadARegister;
514 case NITIO_G1_LoadA_Reg:
515 ni_660x_register = G1LoadARegister;
517 case NITIO_G2_LoadA_Reg:
518 ni_660x_register = G2LoadARegister;
520 case NITIO_G3_LoadA_Reg:
521 ni_660x_register = G3LoadARegister;
523 case NITIO_G0_LoadB_Reg:
524 ni_660x_register = G0LoadBRegister;
526 case NITIO_G1_LoadB_Reg:
527 ni_660x_register = G1LoadBRegister;
529 case NITIO_G2_LoadB_Reg:
530 ni_660x_register = G2LoadBRegister;
532 case NITIO_G3_LoadB_Reg:
533 ni_660x_register = G3LoadBRegister;
535 case NITIO_G0_Input_Select_Reg:
536 ni_660x_register = G0InputSelectRegister;
538 case NITIO_G1_Input_Select_Reg:
539 ni_660x_register = G1InputSelectRegister;
541 case NITIO_G2_Input_Select_Reg:
542 ni_660x_register = G2InputSelectRegister;
544 case NITIO_G3_Input_Select_Reg:
545 ni_660x_register = G3InputSelectRegister;
547 case NITIO_G01_Status_Reg:
548 ni_660x_register = G01StatusRegister;
550 case NITIO_G23_Status_Reg:
551 ni_660x_register = G23StatusRegister;
553 case NITIO_G01_Joint_Reset_Reg:
554 ni_660x_register = G01JointResetRegister;
556 case NITIO_G23_Joint_Reset_Reg:
557 ni_660x_register = G23JointResetRegister;
559 case NITIO_G01_Joint_Status1_Reg:
560 ni_660x_register = G01JointStatus1Register;
562 case NITIO_G23_Joint_Status1_Reg:
563 ni_660x_register = G23JointStatus1Register;
565 case NITIO_G01_Joint_Status2_Reg:
566 ni_660x_register = G01JointStatus2Register;
568 case NITIO_G23_Joint_Status2_Reg:
569 ni_660x_register = G23JointStatus2Register;
571 case NITIO_G0_Counting_Mode_Reg:
572 ni_660x_register = G0CountingModeRegister;
574 case NITIO_G1_Counting_Mode_Reg:
575 ni_660x_register = G1CountingModeRegister;
577 case NITIO_G2_Counting_Mode_Reg:
578 ni_660x_register = G2CountingModeRegister;
580 case NITIO_G3_Counting_Mode_Reg:
581 ni_660x_register = G3CountingModeRegister;
583 case NITIO_G0_Second_Gate_Reg:
584 ni_660x_register = G0SecondGateRegister;
586 case NITIO_G1_Second_Gate_Reg:
587 ni_660x_register = G1SecondGateRegister;
589 case NITIO_G2_Second_Gate_Reg:
590 ni_660x_register = G2SecondGateRegister;
592 case NITIO_G3_Second_Gate_Reg:
593 ni_660x_register = G3SecondGateRegister;
595 case NITIO_G0_DMA_Config_Reg:
596 ni_660x_register = G0DMAConfigRegister;
598 case NITIO_G0_DMA_Status_Reg:
599 ni_660x_register = G0DMAStatusRegister;
601 case NITIO_G1_DMA_Config_Reg:
602 ni_660x_register = G1DMAConfigRegister;
604 case NITIO_G1_DMA_Status_Reg:
605 ni_660x_register = G1DMAStatusRegister;
607 case NITIO_G2_DMA_Config_Reg:
608 ni_660x_register = G2DMAConfigRegister;
610 case NITIO_G2_DMA_Status_Reg:
611 ni_660x_register = G2DMAStatusRegister;
613 case NITIO_G3_DMA_Config_Reg:
614 ni_660x_register = G3DMAConfigRegister;
616 case NITIO_G3_DMA_Status_Reg:
617 ni_660x_register = G3DMAStatusRegister;
619 case NITIO_G0_Interrupt_Acknowledge_Reg:
620 ni_660x_register = G0InterruptAcknowledge;
622 case NITIO_G1_Interrupt_Acknowledge_Reg:
623 ni_660x_register = G1InterruptAcknowledge;
625 case NITIO_G2_Interrupt_Acknowledge_Reg:
626 ni_660x_register = G2InterruptAcknowledge;
628 case NITIO_G3_Interrupt_Acknowledge_Reg:
629 ni_660x_register = G3InterruptAcknowledge;
631 case NITIO_G0_Status_Reg:
632 ni_660x_register = G0StatusRegister;
634 case NITIO_G1_Status_Reg:
635 ni_660x_register = G1StatusRegister;
637 case NITIO_G2_Status_Reg:
638 ni_660x_register = G2StatusRegister;
640 case NITIO_G3_Status_Reg:
641 ni_660x_register = G3StatusRegister;
643 case NITIO_G0_Interrupt_Enable_Reg:
644 ni_660x_register = G0InterruptEnable;
646 case NITIO_G1_Interrupt_Enable_Reg:
647 ni_660x_register = G1InterruptEnable;
649 case NITIO_G2_Interrupt_Enable_Reg:
650 ni_660x_register = G2InterruptEnable;
652 case NITIO_G3_Interrupt_Enable_Reg:
653 ni_660x_register = G3InterruptEnable;
660 return ni_660x_register;
663 static inline void ni_660x_write_register(struct comedi_device *dev,
664 unsigned chip_index, unsigned bits,
665 enum NI_660x_Register reg)
667 struct ni_660x_private *devpriv = dev->private;
668 void __iomem *write_address =
669 devpriv->mite->daq_io_addr + GPCT_OFFSET[chip_index] +
670 registerData[reg].offset;
672 switch (registerData[reg].size) {
674 writew(bits, write_address);
677 writel(bits, write_address);
685 static inline unsigned ni_660x_read_register(struct comedi_device *dev,
687 enum NI_660x_Register reg)
689 struct ni_660x_private *devpriv = dev->private;
690 void __iomem *read_address =
691 devpriv->mite->daq_io_addr + GPCT_OFFSET[chip_index] +
692 registerData[reg].offset;
694 switch (registerData[reg].size) {
696 return readw(read_address);
699 return readl(read_address);
708 static void ni_gpct_write_register(struct ni_gpct *counter, unsigned bits,
709 enum ni_gpct_register reg)
711 struct comedi_device *dev = counter->counter_dev->dev;
712 enum NI_660x_Register ni_660x_register = ni_gpct_to_660x_register(reg);
713 ni_660x_write_register(dev, counter->chip_index, bits,
717 static unsigned ni_gpct_read_register(struct ni_gpct *counter,
718 enum ni_gpct_register reg)
720 struct comedi_device *dev = counter->counter_dev->dev;
721 enum NI_660x_Register ni_660x_register = ni_gpct_to_660x_register(reg);
722 return ni_660x_read_register(dev, counter->chip_index,
726 static inline struct mite_dma_descriptor_ring *mite_ring(struct ni_660x_private
731 return priv->mite_rings[counter->chip_index][counter->counter_index];
734 static inline void ni_660x_set_dma_channel(struct comedi_device *dev,
735 unsigned mite_channel,
736 struct ni_gpct *counter)
738 struct ni_660x_private *devpriv = dev->private;
741 spin_lock_irqsave(&devpriv->soft_reg_copy_lock, flags);
742 devpriv->dma_configuration_soft_copies[counter->chip_index] &=
743 ~dma_select_mask(mite_channel);
744 devpriv->dma_configuration_soft_copies[counter->chip_index] |=
745 dma_select_bits(mite_channel,
746 dma_selection_counter(counter->counter_index));
747 ni_660x_write_register(dev, counter->chip_index,
748 devpriv->dma_configuration_soft_copies
749 [counter->chip_index] |
750 dma_reset_bit(mite_channel), DMAConfigRegister);
752 spin_unlock_irqrestore(&devpriv->soft_reg_copy_lock, flags);
755 static inline void ni_660x_unset_dma_channel(struct comedi_device *dev,
756 unsigned mite_channel,
757 struct ni_gpct *counter)
759 struct ni_660x_private *devpriv = dev->private;
762 spin_lock_irqsave(&devpriv->soft_reg_copy_lock, flags);
763 devpriv->dma_configuration_soft_copies[counter->chip_index] &=
764 ~dma_select_mask(mite_channel);
765 devpriv->dma_configuration_soft_copies[counter->chip_index] |=
766 dma_select_bits(mite_channel, dma_selection_none);
767 ni_660x_write_register(dev, counter->chip_index,
768 devpriv->dma_configuration_soft_copies
769 [counter->chip_index], DMAConfigRegister);
771 spin_unlock_irqrestore(&devpriv->soft_reg_copy_lock, flags);
774 static int ni_660x_request_mite_channel(struct comedi_device *dev,
775 struct ni_gpct *counter,
776 enum comedi_io_direction direction)
778 struct ni_660x_private *devpriv = dev->private;
780 struct mite_channel *mite_chan;
782 spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
783 BUG_ON(counter->mite_chan);
784 mite_chan = mite_request_channel(devpriv->mite,
785 mite_ring(devpriv, counter));
786 if (mite_chan == NULL) {
787 spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
789 "failed to reserve mite dma channel for counter.");
792 mite_chan->dir = direction;
793 ni_tio_set_mite_channel(counter, mite_chan);
794 ni_660x_set_dma_channel(dev, mite_chan->channel, counter);
795 spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
799 static void ni_660x_release_mite_channel(struct comedi_device *dev,
800 struct ni_gpct *counter)
802 struct ni_660x_private *devpriv = dev->private;
805 spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
806 if (counter->mite_chan) {
807 struct mite_channel *mite_chan = counter->mite_chan;
809 ni_660x_unset_dma_channel(dev, mite_chan->channel, counter);
810 ni_tio_set_mite_channel(counter, NULL);
811 mite_release_channel(mite_chan);
813 spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
816 static int ni_660x_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
820 struct ni_gpct *counter = subdev_to_counter(s);
821 /* const struct comedi_cmd *cmd = &s->async->cmd; */
823 retval = ni_660x_request_mite_channel(dev, counter, COMEDI_INPUT);
826 "no dma channel available for use by counter");
829 ni_tio_acknowledge_and_confirm(counter, NULL, NULL, NULL, NULL);
830 retval = ni_tio_cmd(counter, s->async);
835 static int ni_660x_cmdtest(struct comedi_device *dev,
836 struct comedi_subdevice *s, struct comedi_cmd *cmd)
838 struct ni_gpct *counter = subdev_to_counter(s);
840 return ni_tio_cmdtest(counter, cmd);
843 static int ni_660x_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
845 struct ni_gpct *counter = subdev_to_counter(s);
848 retval = ni_tio_cancel(counter);
849 ni_660x_release_mite_channel(dev, counter);
853 static void set_tio_counterswap(struct comedi_device *dev, int chipset)
855 /* See P. 3.5 of the Register-Level Programming manual. The
856 CounterSwap bit has to be set on the second chip, otherwise
857 it will try to use the same pins as the first chip.
860 ni_660x_write_register(dev, chipset, CounterSwap,
861 ClockConfigRegister);
863 ni_660x_write_register(dev, chipset, 0, ClockConfigRegister);
866 static void ni_660x_handle_gpct_interrupt(struct comedi_device *dev,
867 struct comedi_subdevice *s)
869 ni_tio_handle_interrupt(subdev_to_counter(s), s);
870 if (s->async->events) {
871 if (s->async->events & (COMEDI_CB_EOA | COMEDI_CB_ERROR |
872 COMEDI_CB_OVERFLOW)) {
873 ni_660x_cancel(dev, s);
875 comedi_event(dev, s);
879 static irqreturn_t ni_660x_interrupt(int irq, void *d)
881 struct comedi_device *dev = d;
882 struct ni_660x_private *devpriv = dev->private;
883 struct comedi_subdevice *s;
887 if (dev->attached == 0)
889 /* lock to avoid race with comedi_poll */
890 spin_lock_irqsave(&devpriv->interrupt_lock, flags);
892 for (i = 0; i < ni_660x_num_counters(dev); ++i) {
893 s = &dev->subdevices[NI_660X_GPCT_SUBDEV(i)];
894 ni_660x_handle_gpct_interrupt(dev, s);
896 spin_unlock_irqrestore(&devpriv->interrupt_lock, flags);
900 static int ni_660x_input_poll(struct comedi_device *dev,
901 struct comedi_subdevice *s)
903 struct ni_660x_private *devpriv = dev->private;
906 /* lock to avoid race with comedi_poll */
907 spin_lock_irqsave(&devpriv->interrupt_lock, flags);
908 mite_sync_input_dma(subdev_to_counter(s)->mite_chan, s->async);
909 spin_unlock_irqrestore(&devpriv->interrupt_lock, flags);
910 return comedi_buf_read_n_available(s->async);
913 static int ni_660x_buf_change(struct comedi_device *dev,
914 struct comedi_subdevice *s,
915 unsigned long new_size)
917 struct ni_660x_private *devpriv = dev->private;
920 ret = mite_buf_change(mite_ring(devpriv, subdev_to_counter(s)),
928 static int ni_660x_allocate_private(struct comedi_device *dev)
930 struct ni_660x_private *devpriv;
933 devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
936 dev->private = devpriv;
938 spin_lock_init(&devpriv->mite_channel_lock);
939 spin_lock_init(&devpriv->interrupt_lock);
940 spin_lock_init(&devpriv->soft_reg_copy_lock);
941 for (i = 0; i < NUM_PFI_CHANNELS; ++i)
942 devpriv->pfi_output_selects[i] = pfi_output_select_counter;
947 static int ni_660x_alloc_mite_rings(struct comedi_device *dev)
949 struct ni_660x_private *devpriv = dev->private;
953 for (i = 0; i < board(dev)->n_chips; ++i) {
954 for (j = 0; j < counters_per_chip; ++j) {
955 devpriv->mite_rings[i][j] =
956 mite_alloc_ring(devpriv->mite);
957 if (devpriv->mite_rings[i][j] == NULL)
964 static void ni_660x_free_mite_rings(struct comedi_device *dev)
966 struct ni_660x_private *devpriv = dev->private;
970 for (i = 0; i < board(dev)->n_chips; ++i) {
971 for (j = 0; j < counters_per_chip; ++j)
972 mite_free_ring(devpriv->mite_rings[i][j]);
976 static const struct ni_660x_board *
977 ni_660x_find_boardinfo(struct pci_dev *pcidev)
979 unsigned int dev_id = pcidev->device;
982 for (n = 0; n < ARRAY_SIZE(ni_660x_boards); n++) {
983 const struct ni_660x_board *board = &ni_660x_boards[n];
984 if (board->dev_id == dev_id)
991 ni_660x_GPCT_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
992 struct comedi_insn *insn, unsigned int *data)
994 return ni_tio_rinsn(subdev_to_counter(s), insn, data);
997 static void init_tio_chip(struct comedi_device *dev, int chipset)
999 struct ni_660x_private *devpriv = dev->private;
1002 /* init dma configuration register */
1003 devpriv->dma_configuration_soft_copies[chipset] = 0;
1004 for (i = 0; i < MAX_DMA_CHANNEL; ++i) {
1005 devpriv->dma_configuration_soft_copies[chipset] |=
1006 dma_select_bits(i, dma_selection_none) & dma_select_mask(i);
1008 ni_660x_write_register(dev, chipset,
1009 devpriv->dma_configuration_soft_copies[chipset],
1011 for (i = 0; i < NUM_PFI_CHANNELS; ++i)
1012 ni_660x_write_register(dev, chipset, 0, IOConfigReg(i));
1016 ni_660x_GPCT_insn_config(struct comedi_device *dev, struct comedi_subdevice *s,
1017 struct comedi_insn *insn, unsigned int *data)
1019 return ni_tio_insn_config(subdev_to_counter(s), insn, data);
1022 static int ni_660x_GPCT_winsn(struct comedi_device *dev,
1023 struct comedi_subdevice *s,
1024 struct comedi_insn *insn, unsigned int *data)
1026 return ni_tio_winsn(subdev_to_counter(s), insn, data);
1029 static int ni_660x_dio_insn_bits(struct comedi_device *dev,
1030 struct comedi_subdevice *s,
1031 struct comedi_insn *insn, unsigned int *data)
1033 unsigned base_bitfield_channel = CR_CHAN(insn->chanspec);
1035 /* Check if we have to write some bits */
1037 s->state &= ~(data[0] << base_bitfield_channel);
1038 s->state |= (data[0] & data[1]) << base_bitfield_channel;
1039 /* Write out the new digital output lines */
1040 ni_660x_write_register(dev, 0, s->state, DIO32Output);
1042 /* on return, data[1] contains the value of the digital
1043 * input and output lines. */
1045 (ni_660x_read_register(dev, 0,
1046 DIO32Input) >> base_bitfield_channel);
1050 static void ni_660x_select_pfi_output(struct comedi_device *dev,
1051 unsigned pfi_channel,
1052 unsigned output_select)
1054 static const unsigned counter_4_7_first_pfi = 8;
1055 static const unsigned counter_4_7_last_pfi = 23;
1056 unsigned active_chipset = 0;
1057 unsigned idle_chipset = 0;
1058 unsigned active_bits;
1061 if (board(dev)->n_chips > 1) {
1062 if (output_select == pfi_output_select_counter &&
1063 pfi_channel >= counter_4_7_first_pfi &&
1064 pfi_channel <= counter_4_7_last_pfi) {
1073 if (idle_chipset != active_chipset) {
1075 ni_660x_read_register(dev, idle_chipset,
1076 IOConfigReg(pfi_channel));
1077 idle_bits &= ~pfi_output_select_mask(pfi_channel);
1079 pfi_output_select_bits(pfi_channel,
1080 pfi_output_select_high_Z);
1081 ni_660x_write_register(dev, idle_chipset, idle_bits,
1082 IOConfigReg(pfi_channel));
1086 ni_660x_read_register(dev, active_chipset,
1087 IOConfigReg(pfi_channel));
1088 active_bits &= ~pfi_output_select_mask(pfi_channel);
1089 active_bits |= pfi_output_select_bits(pfi_channel, output_select);
1090 ni_660x_write_register(dev, active_chipset, active_bits,
1091 IOConfigReg(pfi_channel));
1094 static int ni_660x_set_pfi_routing(struct comedi_device *dev, unsigned chan,
1097 struct ni_660x_private *devpriv = dev->private;
1099 if (source > num_pfi_output_selects)
1101 if (source == pfi_output_select_high_Z)
1103 if (chan < min_counter_pfi_chan) {
1104 if (source == pfi_output_select_counter)
1106 } else if (chan > max_dio_pfi_chan) {
1107 if (source == pfi_output_select_do)
1110 BUG_ON(chan >= NUM_PFI_CHANNELS);
1112 devpriv->pfi_output_selects[chan] = source;
1113 if (devpriv->pfi_direction_bits & (((uint64_t) 1) << chan))
1114 ni_660x_select_pfi_output(dev, chan,
1115 devpriv->pfi_output_selects[chan]);
1119 static unsigned ni_660x_get_pfi_routing(struct comedi_device *dev,
1122 struct ni_660x_private *devpriv = dev->private;
1124 BUG_ON(chan >= NUM_PFI_CHANNELS);
1125 return devpriv->pfi_output_selects[chan];
1128 static void ni660x_config_filter(struct comedi_device *dev,
1129 unsigned pfi_channel,
1130 enum ni_gpct_filter_select filter)
1132 unsigned bits = ni_660x_read_register(dev, 0, IOConfigReg(pfi_channel));
1133 bits &= ~pfi_input_select_mask(pfi_channel);
1134 bits |= pfi_input_select_bits(pfi_channel, filter);
1135 ni_660x_write_register(dev, 0, bits, IOConfigReg(pfi_channel));
1138 static int ni_660x_dio_insn_config(struct comedi_device *dev,
1139 struct comedi_subdevice *s,
1140 struct comedi_insn *insn, unsigned int *data)
1142 struct ni_660x_private *devpriv = dev->private;
1143 int chan = CR_CHAN(insn->chanspec);
1145 /* The input or output configuration of each digital line is
1146 * configured by a special insn_config instruction. chanspec
1147 * contains the channel to be changed, and data[0] contains the
1148 * value COMEDI_INPUT or COMEDI_OUTPUT. */
1151 case INSN_CONFIG_DIO_OUTPUT:
1152 devpriv->pfi_direction_bits |= ((uint64_t) 1) << chan;
1153 ni_660x_select_pfi_output(dev, chan,
1154 devpriv->pfi_output_selects[chan]);
1156 case INSN_CONFIG_DIO_INPUT:
1157 devpriv->pfi_direction_bits &= ~(((uint64_t) 1) << chan);
1158 ni_660x_select_pfi_output(dev, chan, pfi_output_select_high_Z);
1160 case INSN_CONFIG_DIO_QUERY:
1162 (devpriv->pfi_direction_bits &
1163 (((uint64_t) 1) << chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
1165 case INSN_CONFIG_SET_ROUTING:
1166 return ni_660x_set_pfi_routing(dev, chan, data[1]);
1168 case INSN_CONFIG_GET_ROUTING:
1169 data[1] = ni_660x_get_pfi_routing(dev, chan);
1171 case INSN_CONFIG_FILTER:
1172 ni660x_config_filter(dev, chan, data[1]);
1181 static int __devinit ni_660x_attach_pci(struct comedi_device *dev,
1182 struct pci_dev *pcidev)
1184 struct ni_660x_private *devpriv;
1185 struct comedi_subdevice *s;
1188 unsigned global_interrupt_config_bits;
1190 ret = ni_660x_allocate_private(dev);
1193 devpriv = dev->private;
1195 dev->board_ptr = ni_660x_find_boardinfo(pcidev);
1196 if (!dev->board_ptr)
1198 devpriv->mite = mite_alloc(pcidev);
1202 dev->board_name = board(dev)->name;
1204 ret = mite_setup2(devpriv->mite, 1);
1206 dev_warn(dev->class_dev, "error setting up mite\n");
1210 ret = ni_660x_alloc_mite_rings(dev);
1214 ret = comedi_alloc_subdevices(dev, 2 + NI_660X_MAX_NUM_COUNTERS);
1218 s = &dev->subdevices[0];
1219 /* Old GENERAL-PURPOSE COUNTER/TIME (GPCT) subdevice, no longer used */
1220 s->type = COMEDI_SUBD_UNUSED;
1222 s = &dev->subdevices[NI_660X_DIO_SUBDEV];
1223 /* DIGITAL I/O SUBDEVICE */
1224 s->type = COMEDI_SUBD_DIO;
1225 s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
1226 s->n_chan = NUM_PFI_CHANNELS;
1228 s->range_table = &range_digital;
1229 s->insn_bits = ni_660x_dio_insn_bits;
1230 s->insn_config = ni_660x_dio_insn_config;
1231 s->io_bits = 0; /* all bits default to input */
1232 /* we use the ioconfig registers to control dio direction, so zero
1233 output enables in stc dio control reg */
1234 ni_660x_write_register(dev, 0, 0, STCDIOControl);
1236 devpriv->counter_dev = ni_gpct_device_construct(dev,
1237 &ni_gpct_write_register,
1238 &ni_gpct_read_register,
1239 ni_gpct_variant_660x,
1240 ni_660x_num_counters
1242 if (devpriv->counter_dev == NULL)
1244 for (i = 0; i < NI_660X_MAX_NUM_COUNTERS; ++i) {
1245 s = &dev->subdevices[NI_660X_GPCT_SUBDEV(i)];
1246 if (i < ni_660x_num_counters(dev)) {
1247 s->type = COMEDI_SUBD_COUNTER;
1249 SDF_READABLE | SDF_WRITABLE | SDF_LSAMPL |
1250 SDF_CMD_READ /* | SDF_CMD_WRITE */ ;
1252 s->maxdata = 0xffffffff;
1253 s->insn_read = ni_660x_GPCT_rinsn;
1254 s->insn_write = ni_660x_GPCT_winsn;
1255 s->insn_config = ni_660x_GPCT_insn_config;
1256 s->do_cmd = &ni_660x_cmd;
1257 s->len_chanlist = 1;
1258 s->do_cmdtest = &ni_660x_cmdtest;
1259 s->cancel = &ni_660x_cancel;
1260 s->poll = &ni_660x_input_poll;
1261 s->async_dma_dir = DMA_BIDIRECTIONAL;
1262 s->buf_change = &ni_660x_buf_change;
1263 s->private = &devpriv->counter_dev->counters[i];
1265 devpriv->counter_dev->counters[i].chip_index =
1266 i / counters_per_chip;
1267 devpriv->counter_dev->counters[i].counter_index =
1268 i % counters_per_chip;
1270 s->type = COMEDI_SUBD_UNUSED;
1273 for (i = 0; i < board(dev)->n_chips; ++i)
1274 init_tio_chip(dev, i);
1276 for (i = 0; i < ni_660x_num_counters(dev); ++i)
1277 ni_tio_init_counter(&devpriv->counter_dev->counters[i]);
1279 for (i = 0; i < NUM_PFI_CHANNELS; ++i) {
1280 if (i < min_counter_pfi_chan)
1281 ni_660x_set_pfi_routing(dev, i, pfi_output_select_do);
1283 ni_660x_set_pfi_routing(dev, i,
1284 pfi_output_select_counter);
1285 ni_660x_select_pfi_output(dev, i, pfi_output_select_high_Z);
1287 /* to be safe, set counterswap bits on tio chips after all the counter
1288 outputs have been set to high impedance mode */
1289 for (i = 0; i < board(dev)->n_chips; ++i)
1290 set_tio_counterswap(dev, i);
1292 ret = request_irq(mite_irq(devpriv->mite), ni_660x_interrupt,
1293 IRQF_SHARED, "ni_660x", dev);
1295 dev_warn(dev->class_dev, " irq not available\n");
1298 dev->irq = mite_irq(devpriv->mite);
1299 global_interrupt_config_bits = Global_Int_Enable_Bit;
1300 if (board(dev)->n_chips > 1)
1301 global_interrupt_config_bits |= Cascade_Int_Enable_Bit;
1302 ni_660x_write_register(dev, 0, global_interrupt_config_bits,
1303 GlobalInterruptConfigRegister);
1304 dev_info(dev->class_dev, "ni_660x: %s attached\n", dev->board_name);
1308 static void ni_660x_detach(struct comedi_device *dev)
1310 struct ni_660x_private *devpriv = dev->private;
1313 free_irq(dev->irq, dev);
1315 if (devpriv->counter_dev)
1316 ni_gpct_device_destroy(devpriv->counter_dev);
1317 if (devpriv->mite) {
1318 ni_660x_free_mite_rings(dev);
1319 mite_unsetup(devpriv->mite);
1320 mite_free(devpriv->mite);
1325 static struct comedi_driver ni_660x_driver = {
1326 .driver_name = "ni_660x",
1327 .module = THIS_MODULE,
1328 .attach_pci = ni_660x_attach_pci,
1329 .detach = ni_660x_detach,
1332 static int __devinit ni_660x_pci_probe(struct pci_dev *dev,
1333 const struct pci_device_id *ent)
1335 return comedi_pci_auto_config(dev, &ni_660x_driver);
1338 static void __devexit ni_660x_pci_remove(struct pci_dev *dev)
1340 comedi_pci_auto_unconfig(dev);
1343 static DEFINE_PCI_DEVICE_TABLE(ni_660x_pci_table) = {
1344 {PCI_DEVICE(PCI_VENDOR_ID_NI, 0x2c60)},
1345 {PCI_DEVICE(PCI_VENDOR_ID_NI, 0x1310)},
1346 {PCI_DEVICE(PCI_VENDOR_ID_NI, 0x1360)},
1347 {PCI_DEVICE(PCI_VENDOR_ID_NI, 0x2cc0)},
1350 MODULE_DEVICE_TABLE(pci, ni_660x_pci_table);
1352 static struct pci_driver ni_660x_pci_driver = {
1354 .id_table = ni_660x_pci_table,
1355 .probe = ni_660x_pci_probe,
1356 .remove = __devexit_p(ni_660x_pci_remove),
1358 module_comedi_pci_driver(ni_660x_driver, ni_660x_pci_driver);
1360 MODULE_AUTHOR("Comedi http://www.comedi.org");
1361 MODULE_DESCRIPTION("Comedi low-level driver");
1362 MODULE_LICENSE("GPL");