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.
18 * Description: National Instruments 660x counter/timer boards
19 * Devices: [National Instruments] PCI-6601 (ni_660x), PCI-6602, PXI-6602,
21 * Author: J.P. Mellor <jpmellor@rose-hulman.edu>,
22 * Herman.Bruyninckx@mech.kuleuven.ac.be,
23 * Wim.Meeussen@mech.kuleuven.ac.be,
24 * Klaas.Gadeyne@mech.kuleuven.ac.be,
25 * Frank Mori Hess <fmhess@users.sourceforge.net>
26 * Updated: Fri, 15 Mar 2013 10:47:56 +0000
27 * Status: experimental
29 * Encoders work. PulseGeneration (both single pulse and pulse train)
30 * works. Buffered commands work for input but not output.
33 * DAQ 660x Register-Level Programmer Manual (NI 370505A-01)
34 * DAQ 6601/6602 User Manual (NI 322137B-01)
37 #include <linux/module.h>
38 #include <linux/interrupt.h>
40 #include "../comedi_pci.h"
45 enum ni_660x_constants
{
46 min_counter_pfi_chan
= 8,
47 max_dio_pfi_chan
= 31,
51 #define NUM_PFI_CHANNELS 40
52 /* really there are only up to 3 dma channels, but the register layout allows
54 #define MAX_DMA_CHANNEL 4
56 /* See Register-Level Programmer Manual page 3.1 */
57 enum ni_660x_register
{
64 NI660X_STC_DIO_PARALLEL_INPUT
,
68 NI660X_STC_DIO_OUTPUT
,
69 NI660X_STC_DIO_CONTROL
,
75 NI660X_STC_DIO_SERIAL_INPUT
,
127 NI660X_G2_DMA_STATUS
,
129 NI660X_G3_DMA_STATUS
,
133 NI660X_GLOBAL_INT_STATUS
,
135 NI660X_GLOBAL_INT_CFG
,
159 static inline unsigned IOConfigReg(unsigned pfi_channel
)
161 unsigned reg
= NI660X_IO_CFG_0_1
+ pfi_channel
/ 2;
163 BUG_ON(reg
> NI660X_IO_CFG_38_39
);
167 enum ni_660x_register_width
{
173 enum ni_660x_register_direction
{
179 enum ni_660x_pfi_output_select
{
180 pfi_output_select_high_Z
= 0,
181 pfi_output_select_counter
= 1,
182 pfi_output_select_do
= 2,
183 num_pfi_output_selects
186 enum ni_660x_subdevices
{
187 NI_660X_DIO_SUBDEV
= 1,
188 NI_660X_GPCT_SUBDEV_0
= 2
190 static inline unsigned NI_660X_GPCT_SUBDEV(unsigned index
)
192 return NI_660X_GPCT_SUBDEV_0
+ index
;
195 struct NI_660xRegisterData
{
196 const char *name
; /* Register Name */
197 int offset
; /* Offset from base address from GPCT chip */
198 enum ni_660x_register_direction direction
;
199 enum ni_660x_register_width size
; /* 1 byte, 2 bytes, or 4 bytes */
202 static const struct NI_660xRegisterData registerData
[NI660X_NUM_REGS
] = {
203 {"G0 Interrupt Acknowledge", 0x004, NI_660x_WRITE
, DATA_2B
},
204 {"G0 Status Register", 0x004, NI_660x_READ
, DATA_2B
},
205 {"G1 Interrupt Acknowledge", 0x006, NI_660x_WRITE
, DATA_2B
},
206 {"G1 Status Register", 0x006, NI_660x_READ
, DATA_2B
},
207 {"G01 Status Register ", 0x008, NI_660x_READ
, DATA_2B
},
208 {"G0 Command Register", 0x00C, NI_660x_WRITE
, DATA_2B
},
209 {"STC DIO Parallel Input", 0x00E, NI_660x_READ
, DATA_2B
},
210 {"G1 Command Register", 0x00E, NI_660x_WRITE
, DATA_2B
},
211 {"G0 HW Save Register", 0x010, NI_660x_READ
, DATA_4B
},
212 {"G1 HW Save Register", 0x014, NI_660x_READ
, DATA_4B
},
213 {"STC DIO Output", 0x014, NI_660x_WRITE
, DATA_2B
},
214 {"STC DIO Control", 0x016, NI_660x_WRITE
, DATA_2B
},
215 {"G0 SW Save Register", 0x018, NI_660x_READ
, DATA_4B
},
216 {"G1 SW Save Register", 0x01C, NI_660x_READ
, DATA_4B
},
217 {"G0 Mode Register", 0x034, NI_660x_WRITE
, DATA_2B
},
218 {"G01 Joint Status 1 Register", 0x036, NI_660x_READ
, DATA_2B
},
219 {"G1 Mode Register", 0x036, NI_660x_WRITE
, DATA_2B
},
220 {"STC DIO Serial Input", 0x038, NI_660x_READ
, DATA_2B
},
221 {"G0 Load A Register", 0x038, NI_660x_WRITE
, DATA_4B
},
222 {"G01 Joint Status 2 Register", 0x03A, NI_660x_READ
, DATA_2B
},
223 {"G0 Load B Register", 0x03C, NI_660x_WRITE
, DATA_4B
},
224 {"G1 Load A Register", 0x040, NI_660x_WRITE
, DATA_4B
},
225 {"G1 Load B Register", 0x044, NI_660x_WRITE
, DATA_4B
},
226 {"G0 Input Select Register", 0x048, NI_660x_WRITE
, DATA_2B
},
227 {"G1 Input Select Register", 0x04A, NI_660x_WRITE
, DATA_2B
},
228 {"G0 Autoincrement Register", 0x088, NI_660x_WRITE
, DATA_2B
},
229 {"G1 Autoincrement Register", 0x08A, NI_660x_WRITE
, DATA_2B
},
230 {"G01 Joint Reset Register", 0x090, NI_660x_WRITE
, DATA_2B
},
231 {"G0 Interrupt Enable", 0x092, NI_660x_WRITE
, DATA_2B
},
232 {"G1 Interrupt Enable", 0x096, NI_660x_WRITE
, DATA_2B
},
233 {"G0 Counting Mode Register", 0x0B0, NI_660x_WRITE
, DATA_2B
},
234 {"G1 Counting Mode Register", 0x0B2, NI_660x_WRITE
, DATA_2B
},
235 {"G0 Second Gate Register", 0x0B4, NI_660x_WRITE
, DATA_2B
},
236 {"G1 Second Gate Register", 0x0B6, NI_660x_WRITE
, DATA_2B
},
237 {"G0 DMA Config Register", 0x0B8, NI_660x_WRITE
, DATA_2B
},
238 {"G0 DMA Status Register", 0x0B8, NI_660x_READ
, DATA_2B
},
239 {"G1 DMA Config Register", 0x0BA, NI_660x_WRITE
, DATA_2B
},
240 {"G1 DMA Status Register", 0x0BA, NI_660x_READ
, DATA_2B
},
241 {"G2 Interrupt Acknowledge", 0x104, NI_660x_WRITE
, DATA_2B
},
242 {"G2 Status Register", 0x104, NI_660x_READ
, DATA_2B
},
243 {"G3 Interrupt Acknowledge", 0x106, NI_660x_WRITE
, DATA_2B
},
244 {"G3 Status Register", 0x106, NI_660x_READ
, DATA_2B
},
245 {"G23 Status Register", 0x108, NI_660x_READ
, DATA_2B
},
246 {"G2 Command Register", 0x10C, NI_660x_WRITE
, DATA_2B
},
247 {"G3 Command Register", 0x10E, NI_660x_WRITE
, DATA_2B
},
248 {"G2 HW Save Register", 0x110, NI_660x_READ
, DATA_4B
},
249 {"G3 HW Save Register", 0x114, NI_660x_READ
, DATA_4B
},
250 {"G2 SW Save Register", 0x118, NI_660x_READ
, DATA_4B
},
251 {"G3 SW Save Register", 0x11C, NI_660x_READ
, DATA_4B
},
252 {"G2 Mode Register", 0x134, NI_660x_WRITE
, DATA_2B
},
253 {"G23 Joint Status 1 Register", 0x136, NI_660x_READ
, DATA_2B
},
254 {"G3 Mode Register", 0x136, NI_660x_WRITE
, DATA_2B
},
255 {"G2 Load A Register", 0x138, NI_660x_WRITE
, DATA_4B
},
256 {"G23 Joint Status 2 Register", 0x13A, NI_660x_READ
, DATA_2B
},
257 {"G2 Load B Register", 0x13C, NI_660x_WRITE
, DATA_4B
},
258 {"G3 Load A Register", 0x140, NI_660x_WRITE
, DATA_4B
},
259 {"G3 Load B Register", 0x144, NI_660x_WRITE
, DATA_4B
},
260 {"G2 Input Select Register", 0x148, NI_660x_WRITE
, DATA_2B
},
261 {"G3 Input Select Register", 0x14A, NI_660x_WRITE
, DATA_2B
},
262 {"G2 Autoincrement Register", 0x188, NI_660x_WRITE
, DATA_2B
},
263 {"G3 Autoincrement Register", 0x18A, NI_660x_WRITE
, DATA_2B
},
264 {"G23 Joint Reset Register", 0x190, NI_660x_WRITE
, DATA_2B
},
265 {"G2 Interrupt Enable", 0x192, NI_660x_WRITE
, DATA_2B
},
266 {"G3 Interrupt Enable", 0x196, NI_660x_WRITE
, DATA_2B
},
267 {"G2 Counting Mode Register", 0x1B0, NI_660x_WRITE
, DATA_2B
},
268 {"G3 Counting Mode Register", 0x1B2, NI_660x_WRITE
, DATA_2B
},
269 {"G3 Second Gate Register", 0x1B6, NI_660x_WRITE
, DATA_2B
},
270 {"G2 Second Gate Register", 0x1B4, NI_660x_WRITE
, DATA_2B
},
271 {"G2 DMA Config Register", 0x1B8, NI_660x_WRITE
, DATA_2B
},
272 {"G2 DMA Status Register", 0x1B8, NI_660x_READ
, DATA_2B
},
273 {"G3 DMA Config Register", 0x1BA, NI_660x_WRITE
, DATA_2B
},
274 {"G3 DMA Status Register", 0x1BA, NI_660x_READ
, DATA_2B
},
275 {"32 bit Digital Input", 0x414, NI_660x_READ
, DATA_4B
},
276 {"32 bit Digital Output", 0x510, NI_660x_WRITE
, DATA_4B
},
277 {"Clock Config Register", 0x73C, NI_660x_WRITE
, DATA_4B
},
278 {"Global Interrupt Status Register", 0x754, NI_660x_READ
, DATA_4B
},
279 {"DMA Configuration Register", 0x76C, NI_660x_WRITE
, DATA_4B
},
280 {"Global Interrupt Config Register", 0x770, NI_660x_WRITE
, DATA_4B
},
281 {"IO Config Register 0-1", 0x77C, NI_660x_READ_WRITE
, DATA_2B
},
282 {"IO Config Register 2-3", 0x77E, NI_660x_READ_WRITE
, DATA_2B
},
283 {"IO Config Register 4-5", 0x780, NI_660x_READ_WRITE
, DATA_2B
},
284 {"IO Config Register 6-7", 0x782, NI_660x_READ_WRITE
, DATA_2B
},
285 {"IO Config Register 8-9", 0x784, NI_660x_READ_WRITE
, DATA_2B
},
286 {"IO Config Register 10-11", 0x786, NI_660x_READ_WRITE
, DATA_2B
},
287 {"IO Config Register 12-13", 0x788, NI_660x_READ_WRITE
, DATA_2B
},
288 {"IO Config Register 14-15", 0x78A, NI_660x_READ_WRITE
, DATA_2B
},
289 {"IO Config Register 16-17", 0x78C, NI_660x_READ_WRITE
, DATA_2B
},
290 {"IO Config Register 18-19", 0x78E, NI_660x_READ_WRITE
, DATA_2B
},
291 {"IO Config Register 20-21", 0x790, NI_660x_READ_WRITE
, DATA_2B
},
292 {"IO Config Register 22-23", 0x792, NI_660x_READ_WRITE
, DATA_2B
},
293 {"IO Config Register 24-25", 0x794, NI_660x_READ_WRITE
, DATA_2B
},
294 {"IO Config Register 26-27", 0x796, NI_660x_READ_WRITE
, DATA_2B
},
295 {"IO Config Register 28-29", 0x798, NI_660x_READ_WRITE
, DATA_2B
},
296 {"IO Config Register 30-31", 0x79A, NI_660x_READ_WRITE
, DATA_2B
},
297 {"IO Config Register 32-33", 0x79C, NI_660x_READ_WRITE
, DATA_2B
},
298 {"IO Config Register 34-35", 0x79E, NI_660x_READ_WRITE
, DATA_2B
},
299 {"IO Config Register 36-37", 0x7A0, NI_660x_READ_WRITE
, DATA_2B
},
300 {"IO Config Register 38-39", 0x7A2, NI_660x_READ_WRITE
, DATA_2B
}
303 /* kind of ENABLE for the second counter */
304 enum clock_config_register_bits
{
305 CounterSwap
= 0x1 << 21
309 static inline unsigned ioconfig_bitshift(unsigned pfi_channel
)
311 return (pfi_channel
% 2) ? 0 : 8;
314 static inline unsigned pfi_output_select_mask(unsigned pfi_channel
)
316 return 0x3 << ioconfig_bitshift(pfi_channel
);
319 static inline unsigned pfi_output_select_bits(unsigned pfi_channel
,
320 unsigned output_select
)
322 return (output_select
& 0x3) << ioconfig_bitshift(pfi_channel
);
325 static inline unsigned pfi_input_select_mask(unsigned pfi_channel
)
327 return 0x7 << (4 + ioconfig_bitshift(pfi_channel
));
330 static inline unsigned pfi_input_select_bits(unsigned pfi_channel
,
331 unsigned input_select
)
333 return (input_select
& 0x7) << (4 + ioconfig_bitshift(pfi_channel
));
336 /* dma configuration register bits */
337 static inline unsigned dma_select_mask(unsigned dma_channel
)
339 BUG_ON(dma_channel
>= MAX_DMA_CHANNEL
);
340 return 0x1f << (8 * dma_channel
);
344 dma_selection_none
= 0x1f,
347 static inline unsigned dma_select_bits(unsigned dma_channel
, unsigned selection
)
349 BUG_ON(dma_channel
>= MAX_DMA_CHANNEL
);
350 return (selection
<< (8 * dma_channel
)) & dma_select_mask(dma_channel
);
353 static inline unsigned dma_reset_bit(unsigned dma_channel
)
355 BUG_ON(dma_channel
>= MAX_DMA_CHANNEL
);
356 return 0x80 << (8 * dma_channel
);
359 enum global_interrupt_status_register_bits
{
360 Counter_0_Int_Bit
= 0x100,
361 Counter_1_Int_Bit
= 0x200,
362 Counter_2_Int_Bit
= 0x400,
363 Counter_3_Int_Bit
= 0x800,
364 Cascade_Int_Bit
= 0x20000000,
365 Global_Int_Bit
= 0x80000000
368 enum global_interrupt_config_register_bits
{
369 Cascade_Int_Enable_Bit
= 0x20000000,
370 Global_Int_Polarity_Bit
= 0x40000000,
371 Global_Int_Enable_Bit
= 0x80000000
374 /* Offset of the GPCT chips from the base-address of the card */
375 /* First chip is at base-address + 0x00, etc. */
376 static const unsigned GPCT_OFFSET
[2] = { 0x0, 0x800 };
378 enum ni_660x_boardid
{
386 struct ni_660x_board
{
388 unsigned n_chips
; /* total number of TIO chips */
391 static const struct ni_660x_board ni_660x_boards
[] = {
414 #define NI_660X_MAX_NUM_CHIPS 2
415 #define NI_660X_MAX_NUM_COUNTERS (NI_660X_MAX_NUM_CHIPS * counters_per_chip)
417 struct ni_660x_private
{
418 struct mite_struct
*mite
;
419 struct ni_gpct_device
*counter_dev
;
420 uint64_t pfi_direction_bits
;
421 struct mite_dma_descriptor_ring
422 *mite_rings
[NI_660X_MAX_NUM_CHIPS
][counters_per_chip
];
423 spinlock_t mite_channel_lock
;
424 /* interrupt_lock prevents races between interrupt and comedi_poll */
425 spinlock_t interrupt_lock
;
426 unsigned dma_configuration_soft_copies
[NI_660X_MAX_NUM_CHIPS
];
427 spinlock_t soft_reg_copy_lock
;
428 unsigned short pfi_output_selects
[NUM_PFI_CHANNELS
];
431 static inline unsigned ni_660x_num_counters(struct comedi_device
*dev
)
433 const struct ni_660x_board
*board
= dev
->board_ptr
;
435 return board
->n_chips
* counters_per_chip
;
438 static enum ni_660x_register
ni_gpct_to_660x_register(enum ni_gpct_register reg
)
441 case NITIO_G0_AUTO_INC
:
442 return NI660X_G0_AUTO_INC
;
443 case NITIO_G1_AUTO_INC
:
444 return NI660X_G1_AUTO_INC
;
445 case NITIO_G2_AUTO_INC
:
446 return NI660X_G2_AUTO_INC
;
447 case NITIO_G3_AUTO_INC
:
448 return NI660X_G3_AUTO_INC
;
450 return NI660X_G0_CMD
;
452 return NI660X_G1_CMD
;
454 return NI660X_G2_CMD
;
456 return NI660X_G3_CMD
;
457 case NITIO_G0_HW_SAVE
:
458 return NI660X_G0_HW_SAVE
;
459 case NITIO_G1_HW_SAVE
:
460 return NI660X_G1_HW_SAVE
;
461 case NITIO_G2_HW_SAVE
:
462 return NI660X_G2_HW_SAVE
;
463 case NITIO_G3_HW_SAVE
:
464 return NI660X_G3_HW_SAVE
;
465 case NITIO_G0_SW_SAVE
:
466 return NI660X_G0_SW_SAVE
;
467 case NITIO_G1_SW_SAVE
:
468 return NI660X_G1_SW_SAVE
;
469 case NITIO_G2_SW_SAVE
:
470 return NI660X_G2_SW_SAVE
;
471 case NITIO_G3_SW_SAVE
:
472 return NI660X_G3_SW_SAVE
;
474 return NI660X_G0_MODE
;
476 return NI660X_G1_MODE
;
478 return NI660X_G2_MODE
;
480 return NI660X_G3_MODE
;
482 return NI660X_G0_LOADA
;
484 return NI660X_G1_LOADA
;
486 return NI660X_G2_LOADA
;
488 return NI660X_G3_LOADA
;
490 return NI660X_G0_LOADB
;
492 return NI660X_G1_LOADB
;
494 return NI660X_G2_LOADB
;
496 return NI660X_G3_LOADB
;
497 case NITIO_G0_INPUT_SEL
:
498 return NI660X_G0_INPUT_SEL
;
499 case NITIO_G1_INPUT_SEL
:
500 return NI660X_G1_INPUT_SEL
;
501 case NITIO_G2_INPUT_SEL
:
502 return NI660X_G2_INPUT_SEL
;
503 case NITIO_G3_INPUT_SEL
:
504 return NI660X_G3_INPUT_SEL
;
505 case NITIO_G01_STATUS
:
506 return NI660X_G01_STATUS
;
507 case NITIO_G23_STATUS
:
508 return NI660X_G23_STATUS
;
509 case NITIO_G01_RESET
:
510 return NI660X_G01_RESET
;
511 case NITIO_G23_RESET
:
512 return NI660X_G23_RESET
;
513 case NITIO_G01_STATUS1
:
514 return NI660X_G01_STATUS1
;
515 case NITIO_G23_STATUS1
:
516 return NI660X_G23_STATUS1
;
517 case NITIO_G01_STATUS2
:
518 return NI660X_G01_STATUS2
;
519 case NITIO_G23_STATUS2
:
520 return NI660X_G23_STATUS2
;
521 case NITIO_G0_CNT_MODE
:
522 return NI660X_G0_CNT_MODE
;
523 case NITIO_G1_CNT_MODE
:
524 return NI660X_G1_CNT_MODE
;
525 case NITIO_G2_CNT_MODE
:
526 return NI660X_G2_CNT_MODE
;
527 case NITIO_G3_CNT_MODE
:
528 return NI660X_G3_CNT_MODE
;
530 return NI660X_G0_GATE2
;
532 return NI660X_G1_GATE2
;
534 return NI660X_G2_GATE2
;
536 return NI660X_G3_GATE2
;
537 case NITIO_G0_DMA_CFG
:
538 return NI660X_G0_DMA_CFG
;
539 case NITIO_G0_DMA_STATUS
:
540 return NI660X_G0_DMA_STATUS
;
541 case NITIO_G1_DMA_CFG
:
542 return NI660X_G1_DMA_CFG
;
543 case NITIO_G1_DMA_STATUS
:
544 return NI660X_G1_DMA_STATUS
;
545 case NITIO_G2_DMA_CFG
:
546 return NI660X_G2_DMA_CFG
;
547 case NITIO_G2_DMA_STATUS
:
548 return NI660X_G2_DMA_STATUS
;
549 case NITIO_G3_DMA_CFG
:
550 return NI660X_G3_DMA_CFG
;
551 case NITIO_G3_DMA_STATUS
:
552 return NI660X_G3_DMA_STATUS
;
553 case NITIO_G0_INT_ACK
:
554 return NI660X_G0_INT_ACK
;
555 case NITIO_G1_INT_ACK
:
556 return NI660X_G1_INT_ACK
;
557 case NITIO_G2_INT_ACK
:
558 return NI660X_G2_INT_ACK
;
559 case NITIO_G3_INT_ACK
:
560 return NI660X_G3_INT_ACK
;
561 case NITIO_G0_STATUS
:
562 return NI660X_G0_STATUS
;
563 case NITIO_G1_STATUS
:
564 return NI660X_G1_STATUS
;
565 case NITIO_G2_STATUS
:
566 return NI660X_G2_STATUS
;
567 case NITIO_G3_STATUS
:
568 return NI660X_G3_STATUS
;
569 case NITIO_G0_INT_ENA
:
570 return NI660X_G0_INT_ENA
;
571 case NITIO_G1_INT_ENA
:
572 return NI660X_G1_INT_ENA
;
573 case NITIO_G2_INT_ENA
:
574 return NI660X_G2_INT_ENA
;
575 case NITIO_G3_INT_ENA
:
576 return NI660X_G3_INT_ENA
;
583 static inline void ni_660x_write_register(struct comedi_device
*dev
,
584 unsigned chip
, unsigned bits
,
585 enum ni_660x_register reg
)
587 unsigned int addr
= GPCT_OFFSET
[chip
] + registerData
[reg
].offset
;
589 switch (registerData
[reg
].size
) {
591 writew(bits
, dev
->mmio
+ addr
);
594 writel(bits
, dev
->mmio
+ addr
);
602 static inline unsigned ni_660x_read_register(struct comedi_device
*dev
,
604 enum ni_660x_register reg
)
606 unsigned int addr
= GPCT_OFFSET
[chip
] + registerData
[reg
].offset
;
608 switch (registerData
[reg
].size
) {
610 return readw(dev
->mmio
+ addr
);
612 return readl(dev
->mmio
+ addr
);
620 static void ni_gpct_write_register(struct ni_gpct
*counter
, unsigned bits
,
621 enum ni_gpct_register reg
)
623 struct comedi_device
*dev
= counter
->counter_dev
->dev
;
624 enum ni_660x_register ni_660x_register
= ni_gpct_to_660x_register(reg
);
625 unsigned chip
= counter
->chip_index
;
627 ni_660x_write_register(dev
, chip
, bits
, ni_660x_register
);
630 static unsigned ni_gpct_read_register(struct ni_gpct
*counter
,
631 enum ni_gpct_register reg
)
633 struct comedi_device
*dev
= counter
->counter_dev
->dev
;
634 enum ni_660x_register ni_660x_register
= ni_gpct_to_660x_register(reg
);
635 unsigned chip
= counter
->chip_index
;
637 return ni_660x_read_register(dev
, chip
, ni_660x_register
);
640 static inline struct mite_dma_descriptor_ring
*mite_ring(struct ni_660x_private
645 unsigned chip
= counter
->chip_index
;
647 return priv
->mite_rings
[chip
][counter
->counter_index
];
650 static inline void ni_660x_set_dma_channel(struct comedi_device
*dev
,
651 unsigned mite_channel
,
652 struct ni_gpct
*counter
)
654 struct ni_660x_private
*devpriv
= dev
->private;
655 unsigned chip
= counter
->chip_index
;
658 spin_lock_irqsave(&devpriv
->soft_reg_copy_lock
, flags
);
659 devpriv
->dma_configuration_soft_copies
[chip
] &=
660 ~dma_select_mask(mite_channel
);
661 devpriv
->dma_configuration_soft_copies
[chip
] |=
662 dma_select_bits(mite_channel
, counter
->counter_index
);
663 ni_660x_write_register(dev
, chip
,
664 devpriv
->dma_configuration_soft_copies
[chip
] |
665 dma_reset_bit(mite_channel
), NI660X_DMA_CFG
);
667 spin_unlock_irqrestore(&devpriv
->soft_reg_copy_lock
, flags
);
670 static inline void ni_660x_unset_dma_channel(struct comedi_device
*dev
,
671 unsigned mite_channel
,
672 struct ni_gpct
*counter
)
674 struct ni_660x_private
*devpriv
= dev
->private;
675 unsigned chip
= counter
->chip_index
;
678 spin_lock_irqsave(&devpriv
->soft_reg_copy_lock
, flags
);
679 devpriv
->dma_configuration_soft_copies
[chip
] &=
680 ~dma_select_mask(mite_channel
);
681 devpriv
->dma_configuration_soft_copies
[chip
] |=
682 dma_select_bits(mite_channel
, dma_selection_none
);
683 ni_660x_write_register(dev
, chip
,
684 devpriv
->dma_configuration_soft_copies
[chip
],
687 spin_unlock_irqrestore(&devpriv
->soft_reg_copy_lock
, flags
);
690 static int ni_660x_request_mite_channel(struct comedi_device
*dev
,
691 struct ni_gpct
*counter
,
692 enum comedi_io_direction direction
)
694 struct ni_660x_private
*devpriv
= dev
->private;
696 struct mite_channel
*mite_chan
;
698 spin_lock_irqsave(&devpriv
->mite_channel_lock
, flags
);
699 BUG_ON(counter
->mite_chan
);
700 mite_chan
= mite_request_channel(devpriv
->mite
,
701 mite_ring(devpriv
, counter
));
703 spin_unlock_irqrestore(&devpriv
->mite_channel_lock
, flags
);
704 dev_err(dev
->class_dev
,
705 "failed to reserve mite dma channel for counter\n");
708 mite_chan
->dir
= direction
;
709 ni_tio_set_mite_channel(counter
, mite_chan
);
710 ni_660x_set_dma_channel(dev
, mite_chan
->channel
, counter
);
711 spin_unlock_irqrestore(&devpriv
->mite_channel_lock
, flags
);
715 static void ni_660x_release_mite_channel(struct comedi_device
*dev
,
716 struct ni_gpct
*counter
)
718 struct ni_660x_private
*devpriv
= dev
->private;
721 spin_lock_irqsave(&devpriv
->mite_channel_lock
, flags
);
722 if (counter
->mite_chan
) {
723 struct mite_channel
*mite_chan
= counter
->mite_chan
;
725 ni_660x_unset_dma_channel(dev
, mite_chan
->channel
, counter
);
726 ni_tio_set_mite_channel(counter
, NULL
);
727 mite_release_channel(mite_chan
);
729 spin_unlock_irqrestore(&devpriv
->mite_channel_lock
, flags
);
732 static int ni_660x_cmd(struct comedi_device
*dev
, struct comedi_subdevice
*s
)
734 struct ni_gpct
*counter
= s
->private;
737 retval
= ni_660x_request_mite_channel(dev
, counter
, COMEDI_INPUT
);
739 dev_err(dev
->class_dev
,
740 "no dma channel available for use by counter\n");
743 ni_tio_acknowledge(counter
);
745 return ni_tio_cmd(dev
, s
);
748 static int ni_660x_cancel(struct comedi_device
*dev
, struct comedi_subdevice
*s
)
750 struct ni_gpct
*counter
= s
->private;
753 retval
= ni_tio_cancel(counter
);
754 ni_660x_release_mite_channel(dev
, counter
);
758 static void set_tio_counterswap(struct comedi_device
*dev
, int chip
)
763 * See P. 3.5 of the Register-Level Programming manual.
764 * The CounterSwap bit has to be set on the second chip,
765 * otherwise it will try to use the same pins as the
771 ni_660x_write_register(dev
, chip
, bits
, NI660X_CLK_CFG
);
774 static void ni_660x_handle_gpct_interrupt(struct comedi_device
*dev
,
775 struct comedi_subdevice
*s
)
777 struct ni_gpct
*counter
= s
->private;
779 ni_tio_handle_interrupt(counter
, s
);
780 comedi_handle_events(dev
, s
);
783 static irqreturn_t
ni_660x_interrupt(int irq
, void *d
)
785 struct comedi_device
*dev
= d
;
786 struct ni_660x_private
*devpriv
= dev
->private;
787 struct comedi_subdevice
*s
;
793 /* lock to avoid race with comedi_poll */
794 spin_lock_irqsave(&devpriv
->interrupt_lock
, flags
);
796 for (i
= 0; i
< ni_660x_num_counters(dev
); ++i
) {
797 s
= &dev
->subdevices
[NI_660X_GPCT_SUBDEV(i
)];
798 ni_660x_handle_gpct_interrupt(dev
, s
);
800 spin_unlock_irqrestore(&devpriv
->interrupt_lock
, flags
);
804 static int ni_660x_input_poll(struct comedi_device
*dev
,
805 struct comedi_subdevice
*s
)
807 struct ni_660x_private
*devpriv
= dev
->private;
808 struct ni_gpct
*counter
= s
->private;
811 /* lock to avoid race with comedi_poll */
812 spin_lock_irqsave(&devpriv
->interrupt_lock
, flags
);
813 mite_sync_input_dma(counter
->mite_chan
, s
);
814 spin_unlock_irqrestore(&devpriv
->interrupt_lock
, flags
);
815 return comedi_buf_read_n_available(s
);
818 static int ni_660x_buf_change(struct comedi_device
*dev
,
819 struct comedi_subdevice
*s
)
821 struct ni_660x_private
*devpriv
= dev
->private;
822 struct ni_gpct
*counter
= s
->private;
825 ret
= mite_buf_change(mite_ring(devpriv
, counter
), s
);
832 static int ni_660x_allocate_private(struct comedi_device
*dev
)
834 struct ni_660x_private
*devpriv
;
837 devpriv
= comedi_alloc_devpriv(dev
, sizeof(*devpriv
));
841 spin_lock_init(&devpriv
->mite_channel_lock
);
842 spin_lock_init(&devpriv
->interrupt_lock
);
843 spin_lock_init(&devpriv
->soft_reg_copy_lock
);
844 for (i
= 0; i
< NUM_PFI_CHANNELS
; ++i
)
845 devpriv
->pfi_output_selects
[i
] = pfi_output_select_counter
;
850 static int ni_660x_alloc_mite_rings(struct comedi_device
*dev
)
852 const struct ni_660x_board
*board
= dev
->board_ptr
;
853 struct ni_660x_private
*devpriv
= dev
->private;
857 for (i
= 0; i
< board
->n_chips
; ++i
) {
858 for (j
= 0; j
< counters_per_chip
; ++j
) {
859 devpriv
->mite_rings
[i
][j
] =
860 mite_alloc_ring(devpriv
->mite
);
861 if (!devpriv
->mite_rings
[i
][j
])
868 static void ni_660x_free_mite_rings(struct comedi_device
*dev
)
870 const struct ni_660x_board
*board
= dev
->board_ptr
;
871 struct ni_660x_private
*devpriv
= dev
->private;
875 for (i
= 0; i
< board
->n_chips
; ++i
) {
876 for (j
= 0; j
< counters_per_chip
; ++j
)
877 mite_free_ring(devpriv
->mite_rings
[i
][j
]);
881 static void init_tio_chip(struct comedi_device
*dev
, int chipset
)
883 struct ni_660x_private
*devpriv
= dev
->private;
886 /* init dma configuration register */
887 devpriv
->dma_configuration_soft_copies
[chipset
] = 0;
888 for (i
= 0; i
< MAX_DMA_CHANNEL
; ++i
) {
889 devpriv
->dma_configuration_soft_copies
[chipset
] |=
890 dma_select_bits(i
, dma_selection_none
) & dma_select_mask(i
);
892 ni_660x_write_register(dev
, chipset
,
893 devpriv
->dma_configuration_soft_copies
[chipset
],
895 for (i
= 0; i
< NUM_PFI_CHANNELS
; ++i
)
896 ni_660x_write_register(dev
, chipset
, 0, IOConfigReg(i
));
899 static int ni_660x_dio_insn_bits(struct comedi_device
*dev
,
900 struct comedi_subdevice
*s
,
901 struct comedi_insn
*insn
, unsigned int *data
)
903 unsigned base_bitfield_channel
= CR_CHAN(insn
->chanspec
);
905 /* Check if we have to write some bits */
907 s
->state
&= ~(data
[0] << base_bitfield_channel
);
908 s
->state
|= (data
[0] & data
[1]) << base_bitfield_channel
;
909 /* Write out the new digital output lines */
910 ni_660x_write_register(dev
, 0, s
->state
, NI660X_DIO32_OUTPUT
);
912 /* on return, data[1] contains the value of the digital
913 * input and output lines. */
914 data
[1] = (ni_660x_read_register(dev
, 0, NI660X_DIO32_INPUT
) >>
915 base_bitfield_channel
);
920 static void ni_660x_select_pfi_output(struct comedi_device
*dev
,
921 unsigned pfi_channel
,
922 unsigned output_select
)
924 const struct ni_660x_board
*board
= dev
->board_ptr
;
925 static const unsigned counter_4_7_first_pfi
= 8;
926 static const unsigned counter_4_7_last_pfi
= 23;
927 unsigned active_chipset
= 0;
928 unsigned idle_chipset
= 0;
929 unsigned active_bits
;
932 if (board
->n_chips
> 1) {
933 if (output_select
== pfi_output_select_counter
&&
934 pfi_channel
>= counter_4_7_first_pfi
&&
935 pfi_channel
<= counter_4_7_last_pfi
) {
944 if (idle_chipset
!= active_chipset
) {
946 ni_660x_read_register(dev
, idle_chipset
,
947 IOConfigReg(pfi_channel
));
948 idle_bits
&= ~pfi_output_select_mask(pfi_channel
);
950 pfi_output_select_bits(pfi_channel
,
951 pfi_output_select_high_Z
);
952 ni_660x_write_register(dev
, idle_chipset
, idle_bits
,
953 IOConfigReg(pfi_channel
));
957 ni_660x_read_register(dev
, active_chipset
,
958 IOConfigReg(pfi_channel
));
959 active_bits
&= ~pfi_output_select_mask(pfi_channel
);
960 active_bits
|= pfi_output_select_bits(pfi_channel
, output_select
);
961 ni_660x_write_register(dev
, active_chipset
, active_bits
,
962 IOConfigReg(pfi_channel
));
965 static int ni_660x_set_pfi_routing(struct comedi_device
*dev
, unsigned chan
,
968 struct ni_660x_private
*devpriv
= dev
->private;
970 if (source
> num_pfi_output_selects
)
972 if (source
== pfi_output_select_high_Z
)
974 if (chan
< min_counter_pfi_chan
) {
975 if (source
== pfi_output_select_counter
)
977 } else if (chan
> max_dio_pfi_chan
) {
978 if (source
== pfi_output_select_do
)
982 devpriv
->pfi_output_selects
[chan
] = source
;
983 if (devpriv
->pfi_direction_bits
& (((uint64_t) 1) << chan
))
984 ni_660x_select_pfi_output(dev
, chan
,
985 devpriv
->pfi_output_selects
[chan
]);
989 static int ni_660x_dio_insn_config(struct comedi_device
*dev
,
990 struct comedi_subdevice
*s
,
991 struct comedi_insn
*insn
,
994 struct ni_660x_private
*devpriv
= dev
->private;
995 unsigned int chan
= CR_CHAN(insn
->chanspec
);
996 uint64_t bit
= 1ULL << chan
;
1001 case INSN_CONFIG_DIO_OUTPUT
:
1002 devpriv
->pfi_direction_bits
|= bit
;
1003 ni_660x_select_pfi_output(dev
, chan
,
1004 devpriv
->pfi_output_selects
[chan
]);
1007 case INSN_CONFIG_DIO_INPUT
:
1008 devpriv
->pfi_direction_bits
&= ~bit
;
1009 ni_660x_select_pfi_output(dev
, chan
, pfi_output_select_high_Z
);
1012 case INSN_CONFIG_DIO_QUERY
:
1013 data
[1] = (devpriv
->pfi_direction_bits
& bit
) ? COMEDI_OUTPUT
1017 case INSN_CONFIG_SET_ROUTING
:
1018 ret
= ni_660x_set_pfi_routing(dev
, chan
, data
[1]);
1023 case INSN_CONFIG_GET_ROUTING
:
1024 data
[1] = devpriv
->pfi_output_selects
[chan
];
1027 case INSN_CONFIG_FILTER
:
1028 val
= ni_660x_read_register(dev
, 0, IOConfigReg(chan
));
1029 val
&= ~pfi_input_select_mask(chan
);
1030 val
|= pfi_input_select_bits(chan
, data
[1]);
1031 ni_660x_write_register(dev
, 0, val
, IOConfigReg(chan
));
1041 static int ni_660x_auto_attach(struct comedi_device
*dev
,
1042 unsigned long context
)
1044 struct pci_dev
*pcidev
= comedi_to_pci_dev(dev
);
1045 const struct ni_660x_board
*board
= NULL
;
1046 struct ni_660x_private
*devpriv
;
1047 struct comedi_subdevice
*s
;
1050 unsigned global_interrupt_config_bits
;
1052 if (context
< ARRAY_SIZE(ni_660x_boards
))
1053 board
= &ni_660x_boards
[context
];
1056 dev
->board_ptr
= board
;
1057 dev
->board_name
= board
->name
;
1059 ret
= comedi_pci_enable(dev
);
1063 ret
= ni_660x_allocate_private(dev
);
1066 devpriv
= dev
->private;
1068 devpriv
->mite
= mite_alloc(pcidev
);
1072 ret
= mite_setup2(dev
, devpriv
->mite
, true);
1076 ret
= ni_660x_alloc_mite_rings(dev
);
1080 ret
= comedi_alloc_subdevices(dev
, 2 + NI_660X_MAX_NUM_COUNTERS
);
1084 s
= &dev
->subdevices
[0];
1085 /* Old GENERAL-PURPOSE COUNTER/TIME (GPCT) subdevice, no longer used */
1086 s
->type
= COMEDI_SUBD_UNUSED
;
1088 s
= &dev
->subdevices
[NI_660X_DIO_SUBDEV
];
1089 /* DIGITAL I/O SUBDEVICE */
1090 s
->type
= COMEDI_SUBD_DIO
;
1091 s
->subdev_flags
= SDF_READABLE
| SDF_WRITABLE
;
1092 s
->n_chan
= NUM_PFI_CHANNELS
;
1094 s
->range_table
= &range_digital
;
1095 s
->insn_bits
= ni_660x_dio_insn_bits
;
1096 s
->insn_config
= ni_660x_dio_insn_config
;
1097 /* we use the ioconfig registers to control dio direction, so zero
1098 output enables in stc dio control reg */
1099 ni_660x_write_register(dev
, 0, 0, NI660X_STC_DIO_CONTROL
);
1101 devpriv
->counter_dev
= ni_gpct_device_construct(dev
,
1102 &ni_gpct_write_register
,
1103 &ni_gpct_read_register
,
1104 ni_gpct_variant_660x
,
1105 ni_660x_num_counters
1107 if (!devpriv
->counter_dev
)
1109 for (i
= 0; i
< NI_660X_MAX_NUM_COUNTERS
; ++i
) {
1110 s
= &dev
->subdevices
[NI_660X_GPCT_SUBDEV(i
)];
1111 if (i
< ni_660x_num_counters(dev
)) {
1112 s
->type
= COMEDI_SUBD_COUNTER
;
1113 s
->subdev_flags
= SDF_READABLE
| SDF_WRITABLE
|
1114 SDF_LSAMPL
| SDF_CMD_READ
;
1116 s
->maxdata
= 0xffffffff;
1117 s
->insn_read
= ni_tio_insn_read
;
1118 s
->insn_write
= ni_tio_insn_write
;
1119 s
->insn_config
= ni_tio_insn_config
;
1120 s
->do_cmd
= &ni_660x_cmd
;
1121 s
->len_chanlist
= 1;
1122 s
->do_cmdtest
= ni_tio_cmdtest
;
1123 s
->cancel
= &ni_660x_cancel
;
1124 s
->poll
= &ni_660x_input_poll
;
1125 s
->async_dma_dir
= DMA_BIDIRECTIONAL
;
1126 s
->buf_change
= &ni_660x_buf_change
;
1127 s
->private = &devpriv
->counter_dev
->counters
[i
];
1129 devpriv
->counter_dev
->counters
[i
].chip_index
=
1130 i
/ counters_per_chip
;
1131 devpriv
->counter_dev
->counters
[i
].counter_index
=
1132 i
% counters_per_chip
;
1134 s
->type
= COMEDI_SUBD_UNUSED
;
1137 for (i
= 0; i
< board
->n_chips
; ++i
)
1138 init_tio_chip(dev
, i
);
1140 for (i
= 0; i
< ni_660x_num_counters(dev
); ++i
)
1141 ni_tio_init_counter(&devpriv
->counter_dev
->counters
[i
]);
1143 for (i
= 0; i
< NUM_PFI_CHANNELS
; ++i
) {
1144 if (i
< min_counter_pfi_chan
)
1145 ni_660x_set_pfi_routing(dev
, i
, pfi_output_select_do
);
1147 ni_660x_set_pfi_routing(dev
, i
,
1148 pfi_output_select_counter
);
1149 ni_660x_select_pfi_output(dev
, i
, pfi_output_select_high_Z
);
1151 /* to be safe, set counterswap bits on tio chips after all the counter
1152 outputs have been set to high impedance mode */
1153 for (i
= 0; i
< board
->n_chips
; ++i
)
1154 set_tio_counterswap(dev
, i
);
1156 ret
= request_irq(pcidev
->irq
, ni_660x_interrupt
, IRQF_SHARED
,
1157 dev
->board_name
, dev
);
1159 dev_warn(dev
->class_dev
, " irq not available\n");
1162 dev
->irq
= pcidev
->irq
;
1163 global_interrupt_config_bits
= Global_Int_Enable_Bit
;
1164 if (board
->n_chips
> 1)
1165 global_interrupt_config_bits
|= Cascade_Int_Enable_Bit
;
1166 ni_660x_write_register(dev
, 0, global_interrupt_config_bits
,
1167 NI660X_GLOBAL_INT_CFG
);
1172 static void ni_660x_detach(struct comedi_device
*dev
)
1174 struct ni_660x_private
*devpriv
= dev
->private;
1177 free_irq(dev
->irq
, dev
);
1179 if (devpriv
->counter_dev
)
1180 ni_gpct_device_destroy(devpriv
->counter_dev
);
1181 ni_660x_free_mite_rings(dev
);
1182 mite_detach(devpriv
->mite
);
1186 comedi_pci_disable(dev
);
1189 static struct comedi_driver ni_660x_driver
= {
1190 .driver_name
= "ni_660x",
1191 .module
= THIS_MODULE
,
1192 .auto_attach
= ni_660x_auto_attach
,
1193 .detach
= ni_660x_detach
,
1196 static int ni_660x_pci_probe(struct pci_dev
*dev
,
1197 const struct pci_device_id
*id
)
1199 return comedi_pci_auto_config(dev
, &ni_660x_driver
, id
->driver_data
);
1202 static const struct pci_device_id ni_660x_pci_table
[] = {
1203 { PCI_VDEVICE(NI
, 0x1310), BOARD_PCI6602
},
1204 { PCI_VDEVICE(NI
, 0x1360), BOARD_PXI6602
},
1205 { PCI_VDEVICE(NI
, 0x2c60), BOARD_PCI6601
},
1206 { PCI_VDEVICE(NI
, 0x2cc0), BOARD_PXI6608
},
1207 { PCI_VDEVICE(NI
, 0x1e40), BOARD_PXI6624
},
1210 MODULE_DEVICE_TABLE(pci
, ni_660x_pci_table
);
1212 static struct pci_driver ni_660x_pci_driver
= {
1214 .id_table
= ni_660x_pci_table
,
1215 .probe
= ni_660x_pci_probe
,
1216 .remove
= comedi_pci_auto_unconfig
,
1218 module_comedi_pci_driver(ni_660x_driver
, ni_660x_pci_driver
);
1220 MODULE_AUTHOR("Comedi http://www.comedi.org");
1221 MODULE_DESCRIPTION("Comedi low-level driver");
1222 MODULE_LICENSE("GPL");