2 comedi/drivers/ni_mio_common.c
3 Hardware driver for DAQ-STC based boards
5 COMEDI - Linux Control and Measurement Device Interface
6 Copyright (C) 1997-2001 David A. Schleef <ds@schleef.org>
7 Copyright (C) 2002, 2003 Frank Mori Hess <fmhess@users.sourceforge.net
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 This file is meant to be included by another file, e.g.,
27 ni_atmio.c or ni_pcimio.c.
29 Interrupt support originally added by Truxton Fulton
32 References (from ftp://ftp.natinst.com/support/manuals):
34 340747b.pdf AT-MIO E series Register Level Programmer Manual
35 341079b.pdf PCI E Series RLPM
36 340934b.pdf DAQ-STC reference manual
37 67xx and 611x registers (from http://www.ni.com/pdf/daq/us)
40 Other possibly relevant info:
42 320517c.pdf User manual (obsolete)
43 320517f.pdf User manual (new)
45 320906c.pdf maximum signal ratings
47 321791a.pdf discontinuation of at-mio-16e-10 rev. c
48 321808a.pdf about at-mio-16e-10 rev P
49 321837a.pdf discontinuation of at-mio-16de-10 rev d
50 321838a.pdf about at-mio-16de-10 rev N
54 - the interrupt routine needs to be cleaned up
56 2006-02-07: S-Series PCI-6143: Support has been added but is not
57 fully tested as yet. Terry Barnaby, BEAM Ltd.
60 //#define DEBUG_INTERRUPT
61 //#define DEBUG_STATUS_A
62 //#define DEBUG_STATUS_B
66 #include "comedi_fc.h"
69 #define MDPRINTK(format,args...)
73 #define NI_TIMEOUT 1000
74 static const unsigned old_RTSI_clock_channel = 7;
76 /* Note: this table must match the ai_gain_* definitions */
77 static short ni_gainlkup[][16]={
79 { 0, 1, 2, 3, 4, 5, 6, 7, 0x100, 0x101, 0x102, 0x103, 0x104, 0x105,
82 { 1, 2, 4, 7, 0x101, 0x102, 0x104, 0x107 },
84 { 1, 2, 3, 4, 5, 6, 7, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106,
89 { 0x00a, 0x00b, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006 },
93 { 1, 2, 3, 4, 5, 6, 7},
95 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
98 static comedi_lrange range_ni_E_ai={ 16, {
104 RANGE( -0.25, 0.25 ),
106 RANGE( -0.05, 0.05 ),
116 static comedi_lrange range_ni_E_ai_limited={ 8, {
126 static comedi_lrange range_ni_E_ai_limited14={ 14, {
142 static comedi_lrange range_ni_E_ai_bipolar4={ 4, {
146 RANGE( -0.05, 0.05 ),
148 static comedi_lrange range_ni_E_ai_611x={ 8, {
158 static comedi_lrange range_ni_M_ai_622x={ 4, {
164 static comedi_lrange range_ni_M_ai_628x={ 7, {
173 static comedi_lrange range_ni_S_ai_6143 = { 1, {
176 static comedi_lrange range_ni_E_ao_ext = { 4, {
183 static comedi_lrange *ni_range_lkup[]={
185 &range_ni_E_ai_limited,
186 &range_ni_E_ai_limited14,
187 &range_ni_E_ai_bipolar4,
196 static int ni_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
197 comedi_insn *insn,lsampl_t *data);
198 static int ni_dio_insn_bits(comedi_device *dev,comedi_subdevice *s,
199 comedi_insn *insn,lsampl_t *data);
201 static int ni_serial_insn_config(comedi_device *dev,comedi_subdevice *s,
202 comedi_insn *insn,lsampl_t *data);
203 static int ni_serial_hw_readwrite8(comedi_device *dev,comedi_subdevice *s,
204 unsigned char data_out, unsigned char *data_in);
205 static int ni_serial_sw_readwrite8(comedi_device *dev,comedi_subdevice *s,
206 unsigned char data_out, unsigned char *data_in);
208 static int ni_calib_insn_read(comedi_device *dev,comedi_subdevice *s,
209 comedi_insn *insn,lsampl_t *data);
210 static int ni_calib_insn_write(comedi_device *dev,comedi_subdevice *s,
211 comedi_insn *insn,lsampl_t *data);
213 static int ni_eeprom_insn_read(comedi_device *dev,comedi_subdevice *s,
214 comedi_insn *insn,lsampl_t *data);
215 static int ni_m_series_eeprom_insn_read(comedi_device *dev,comedi_subdevice *s,
216 comedi_insn *insn,lsampl_t *data);
218 static int ni_pfi_insn_bits(comedi_device *dev,comedi_subdevice *s,
219 comedi_insn *insn,lsampl_t *data);
220 static int ni_pfi_insn_config(comedi_device *dev,comedi_subdevice *s,
221 comedi_insn *insn,lsampl_t *data);
222 static unsigned ni_old_get_pfi_routing(comedi_device *dev, unsigned chan);
224 static void ni_rtsi_init(comedi_device *dev);
225 static int ni_rtsi_insn_bits(comedi_device *dev,comedi_subdevice *s,
226 comedi_insn *insn,lsampl_t *data);
227 static int ni_rtsi_insn_config(comedi_device *dev,comedi_subdevice *s,
228 comedi_insn *insn,lsampl_t *data);
230 static void caldac_setup(comedi_device *dev,comedi_subdevice *s);
231 static int ni_read_eeprom(comedi_device *dev,int addr);
233 #ifdef DEBUG_STATUS_A
234 static void ni_mio_print_status_a(int status);
236 #define ni_mio_print_status_a(a)
238 #ifdef DEBUG_STATUS_B
239 static void ni_mio_print_status_b(int status);
241 #define ni_mio_print_status_b(a)
244 static int ni_ai_reset(comedi_device *dev,comedi_subdevice *s);
246 static void ni_handle_fifo_half_full(comedi_device *dev);
247 static int ni_ao_fifo_half_empty(comedi_device *dev,comedi_subdevice *s);
249 static void ni_handle_fifo_dregs(comedi_device *dev);
250 static int ni_ai_inttrig(comedi_device *dev,comedi_subdevice *s,
251 unsigned int trignum);
252 static void ni_load_channelgain_list(comedi_device *dev,unsigned int n_chan,
254 static void shutdown_ai_command( comedi_device *dev );
256 static int ni_ao_inttrig(comedi_device *dev,comedi_subdevice *s,
257 unsigned int trignum);
259 static int ni_ao_reset(comedi_device *dev,comedi_subdevice *s);
261 static int ni_8255_callback(int dir,int port,int data,unsigned long arg);
263 static int ni_ns_to_timer(comedi_device *dev, int *nanosec, int round_mode);
266 /*GPCT function def's*/
267 static int GPCT_G_Watch(comedi_device *dev, int chan);
269 static void GPCT_Reset(comedi_device *dev, int chan);
270 static void GPCT_Gen_Cont_Pulse(comedi_device *dev, int chan, unsigned int length);
271 static void GPCT_Gen_Single_Pulse(comedi_device *dev, int chan, unsigned int length);
272 static void GPCT_Period_Meas(comedi_device *dev, int chan);
273 static void GPCT_Pulse_Width_Meas(comedi_device *dev, int chan);
274 static void GPCT_Event_Counting(comedi_device *dev,int chan);
275 static int GPCT_Set_Direction(comedi_device *dev,int chan,int direction);
276 static int GPCT_Set_Gate(comedi_device *dev,int chan ,int gate);
277 static int GPCT_Set_Source(comedi_device *dev,int chan ,int source);
279 static int ni_gpct_insn_write(comedi_device *dev,comedi_subdevice *s,
280 comedi_insn *insn,lsampl_t *data);
281 static int ni_gpct_insn_read(comedi_device *dev,comedi_subdevice *s,
282 comedi_insn *insn,lsampl_t *data);
283 static int ni_gpct_insn_config(comedi_device *dev,comedi_subdevice *s,
284 comedi_insn *insn,lsampl_t *data);
286 static int init_cs5529(comedi_device *dev);
287 static int cs5529_do_conversion(comedi_device *dev, unsigned short *data);
288 static int cs5529_ai_insn_read(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data);
289 static unsigned int cs5529_config_read(comedi_device *dev, unsigned int reg_select_bits);
290 static void cs5529_config_write(comedi_device *dev, unsigned int value, unsigned int reg_select_bits);
292 static int ni_m_series_pwm_config(comedi_device *dev, comedi_subdevice *s,
293 comedi_insn *insn,lsampl_t *data);
294 static int ni_6143_pwm_config(comedi_device *dev, comedi_subdevice *s,
295 comedi_insn *insn, lsampl_t *data);
297 static int ni_set_master_clock(comedi_device *dev, unsigned source, unsigned period_ns);
302 AIMODE_HALF_FULL = 1,
307 #define SERIAL_DISABLED 0
308 #define SERIAL_600NS 600
309 #define SERIAL_1_2US 1200
310 #define SERIAL_10US 10000
312 static const int num_adc_stages_611x = 3;
314 static void handle_a_interrupt(comedi_device *dev,unsigned short status,
315 unsigned int m_status);
316 static void handle_b_interrupt(comedi_device *dev,unsigned short status,
317 unsigned int m_status);
318 static void get_last_sample_611x( comedi_device *dev );
319 static void get_last_sample_6143( comedi_device *dev );
321 //static void mite_handle_interrupt(comedi_device *dev,unsigned int status);
322 static int ni_ai_drain_dma(comedi_device *dev );
325 static void ni_flush_ai_fifo(comedi_device *dev){
326 if(boardtype.reg_type == ni_reg_6143){
327 // Flush the 6143 data FIFO
328 ni_writel(0x10, AIFIFO_Control_6143); // Flush fifo
329 ni_writel(0x00, AIFIFO_Control_6143); // Flush fifo
330 while(ni_readl(AIFIFO_Status_6143) & 0x10); // Wait for complete
333 devpriv->stc_writew(dev, 1,ADC_FIFO_Clear);
337 static void win_out2(comedi_device *dev, uint32_t data, int reg)
339 devpriv->stc_writew(dev, data >> 16, reg);
340 devpriv->stc_writew(dev, data & 0xffff, reg + 1);
343 #define ao_win_out(data,addr) ni_ao_win_outw(dev,data,addr)
344 static inline void ni_ao_win_outw( comedi_device *dev, uint16_t data, int addr )
348 comedi_spin_lock_irqsave(&devpriv->window_lock,flags);
349 ni_writew(addr,AO_Window_Address_611x);
350 ni_writew(data,AO_Window_Data_611x);
351 comedi_spin_unlock_irqrestore(&devpriv->window_lock,flags);
354 static inline void ni_ao_win_outl(comedi_device *dev, uint32_t data, int addr)
358 comedi_spin_lock_irqsave(&devpriv->window_lock,flags);
359 ni_writew(addr,AO_Window_Address_611x);
360 ni_writel(data,AO_Window_Data_611x);
361 comedi_spin_unlock_irqrestore(&devpriv->window_lock,flags);
364 static inline unsigned short ni_ao_win_inw( comedi_device *dev, int addr )
369 comedi_spin_lock_irqsave(&devpriv->window_lock,flags);
370 ni_writew(addr, AO_Window_Address_611x);
371 data = ni_readw(AO_Window_Data_611x);
372 comedi_spin_unlock_irqrestore(&devpriv->window_lock,flags);
376 /* ni_set_bits( ) allows different parts of the ni_mio_common driver to
377 * share registers (such as Interrupt_A_Register) without interfering with
380 * NOTE: the switch/case statements are optimized out for a constant argument
381 * so this is actually quite fast--- If you must wrap another function around this
382 * make it inline to avoid a large speed penalty.
384 * value should only be 1 or 0.
386 static inline void ni_set_bits(comedi_device *dev, int reg, int bits, int value)
390 comedi_spin_lock_irqsave( &devpriv->window_lock, flags );
392 case Interrupt_A_Enable_Register:
394 devpriv->int_a_enable_reg |= bits;
396 devpriv->int_a_enable_reg &= ~bits;
397 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
398 devpriv->stc_writew(dev, devpriv->int_a_enable_reg,Interrupt_A_Enable_Register);
400 case Interrupt_B_Enable_Register:
402 devpriv->int_b_enable_reg |= bits;
404 devpriv->int_b_enable_reg &= ~bits;
405 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
406 devpriv->stc_writew(dev, devpriv->int_b_enable_reg,Interrupt_B_Enable_Register);
408 case IO_Bidirection_Pin_Register:
410 devpriv->io_bidirection_pin_reg |= bits;
412 devpriv->io_bidirection_pin_reg &= ~bits;
413 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
414 devpriv->stc_writew(dev, devpriv->io_bidirection_pin_reg,IO_Bidirection_Pin_Register);
417 rt_printk("Warning ni_set_bits() called with invalid arguments\n");
418 rt_printk("reg is %d\n",reg);
419 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
425 static irqreturn_t ni_E_interrupt(int irq,void *d,struct pt_regs * regs)
427 comedi_device *dev=d;
428 unsigned short a_status;
429 unsigned short b_status;
430 unsigned int m0_status;
431 unsigned int m1_status;
434 struct mite_struct *mite = devpriv->mite;
437 if(dev->attached == 0) return IRQ_NONE;
438 // lock to avoid race with comedi_poll
439 comedi_spin_lock_irqsave(&dev->spinlock, flags);
440 a_status=devpriv->stc_readw(dev, AI_Status_1_Register);
441 b_status=devpriv->stc_readw(dev, AO_Status_1_Register);
443 m0_status=readl(mite->mite_io_addr + MITE_CHSR(AI_DMA_CHAN));
444 m1_status=readl(mite->mite_io_addr + MITE_CHSR(AO_DMA_CHAN));
450 if(a_status&Interrupt_A_St || m0_status & CHSR_INT )
451 handle_a_interrupt(dev, a_status, m0_status);
452 if(b_status&Interrupt_B_St || m1_status & CHSR_INT )
453 handle_b_interrupt(dev, b_status, m1_status);
454 comedi_spin_unlock_irqrestore(&dev->spinlock, flags);
459 static void ni_sync_ai_dma(struct mite_struct *mite, comedi_device *dev)
462 comedi_subdevice *s = dev->subdevices + 0;
463 comedi_async *async = s->async;
464 unsigned int nbytes, old_alloc_count;
465 unsigned int bytes_per_scan = bytes_per_sample(s) * async->cmd.chanlist_len;
467 old_alloc_count = async->buf_write_alloc_count;
468 // write alloc as much as we can
469 comedi_buf_write_alloc(s->async, s->async->prealloc_bufsz);
471 nbytes = mite_bytes_written_to_memory_lb(mite, AI_DMA_CHAN);
473 if( (int)(mite_bytes_written_to_memory_ub(mite, AI_DMA_CHAN) - old_alloc_count) > 0 ){
474 rt_printk("ni_mio_common: DMA overwrite of free area\n");
476 async->events |= COMEDI_CB_OVERFLOW;
480 count = nbytes - async->buf_write_count;
482 /* it's possible count will be negative due to
483 * conservative value returned by mite_bytes_transferred */
486 comedi_buf_write_free(async, count);
488 async->scan_progress += count;
489 if( async->scan_progress >= bytes_per_scan )
491 async->scan_progress %= bytes_per_scan;
492 async->events |= COMEDI_CB_EOS;
494 async->events |= COMEDI_CB_BLOCK;
497 static void mite_handle_b_linkc(struct mite_struct *mite, comedi_device *dev)
500 comedi_subdevice *s = dev->subdevices + 1;
501 comedi_async *async = s->async;
502 u32 nbytes_ub, nbytes_lb;
503 unsigned int new_write_count;
504 u32 stop_count = async->cmd.stop_arg * sizeof(sampl_t);
506 writel(CHOR_CLRLC, mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
508 new_write_count = async->buf_write_count;
510 nbytes_lb = mite_bytes_read_from_memory_lb(mite, AO_DMA_CHAN);
511 if(async->cmd.stop_src == TRIG_COUNT &&
512 (int) (nbytes_lb - stop_count) > 0)
513 nbytes_lb = stop_count;
515 nbytes_ub = mite_bytes_read_from_memory_ub(mite, AO_DMA_CHAN);
516 if(async->cmd.stop_src == TRIG_COUNT &&
517 (int) (nbytes_ub - stop_count) > 0)
518 nbytes_ub = stop_count;
519 if((int)(nbytes_ub - devpriv->last_buf_write_count) > 0){
520 rt_printk("ni_mio_common: DMA underrun\n");
522 async->events |= COMEDI_CB_OVERFLOW;
526 devpriv->last_buf_write_count = new_write_count;
528 count = nbytes_lb - async->buf_read_count;
532 comedi_buf_read_free(async, count);
534 async->events |= COMEDI_CB_BLOCK;
536 // #define DEBUG_DMA_TIMING
537 static int ni_ao_wait_for_dma_load( comedi_device *dev )
539 static const int timeout = 10000;
541 #ifdef DEBUG_DMA_TIMING
542 struct timeval start;
543 do_gettimeofday(&start);
545 for(i = 0; i < timeout; i++)
547 unsigned short b_status;
549 b_status = devpriv->stc_readw(dev, AO_Status_1_Register);
550 if( b_status & AO_FIFO_Half_Full_St )
552 /* if we poll too often, the pci bus activity seems
553 to slow the dma transfer down */
556 #ifdef DEBUG_DMA_TIMING
557 rt_printk("looped %i times waiting for ao fifo load.\n", i);
559 do_gettimeofday(&now);
560 unsigned elapsed_usec = 1000000 * (now.tv_sec - start.tv_sec) + now.tv_usec - start.tv_usec;
561 rt_printk("total elapsed usec=%i\n", elapsed_usec);
562 do_gettimeofday(&start);
564 for(i = 0; i < 100; ++i)
566 // devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
567 b_status = devpriv->stc_readw(dev, AO_Status_1_Register);
569 do_gettimeofday(&now);
570 elapsed_usec = 1000000 * (now.tv_sec - start.tv_sec) + now.tv_usec - start.tv_usec;
571 rt_printk("usec to do 100 word xfers=%i\n", elapsed_usec);
575 comedi_error(dev, "timed out waiting for dma load");
582 static void ni_handle_eos(comedi_device *dev, comedi_subdevice *s)
584 if(devpriv->aimode == AIMODE_SCAN)
587 static const int timeout = 10;
590 for(i = 0; i < timeout; i++)
592 ni_sync_ai_dma(devpriv->mite, dev);
593 if((s->async->events & COMEDI_CB_EOS)) break;
597 ni_handle_fifo_dregs(dev);
598 s->async->events |= COMEDI_CB_EOS;
601 /* handle special case of single scan using AI_End_On_End_Of_Scan */
602 if((devpriv->ai_cmd2 & AI_End_On_End_Of_Scan)){
603 shutdown_ai_command( dev );
608 static void shutdown_ai_command( comedi_device *dev )
610 comedi_subdevice *s = dev->subdevices + 0;
613 ni_ai_drain_dma( dev );
614 mite_dma_disarm(devpriv->mite, AI_DMA_CHAN);
616 ni_handle_fifo_dregs(dev);
617 get_last_sample_611x(dev);
618 get_last_sample_6143(dev);
620 ni_set_bits(dev, Interrupt_A_Enable_Register,
621 AI_SC_TC_Interrupt_Enable | AI_START1_Interrupt_Enable|
622 AI_START2_Interrupt_Enable| AI_START_Interrupt_Enable|
623 AI_STOP_Interrupt_Enable| AI_Error_Interrupt_Enable|
624 AI_FIFO_Interrupt_Enable,0);
626 s->async->events |= COMEDI_CB_EOA;
629 static void handle_a_interrupt(comedi_device *dev,unsigned short status,
630 unsigned int m_status)
632 comedi_subdevice *s=dev->subdevices+0;
633 unsigned short ack=0;
635 s->async->events = 0;
637 #ifdef DEBUG_INTERRUPT
638 rt_printk("ni_mio_common: interrupt: a_status=%04x m0_status=%08x\n",
640 ni_mio_print_status_a(status);
645 /* Currently, mite.c requires us to handle LINKC and DONE */
646 if(m_status & CHSR_LINKC){
647 writel(CHOR_CLRLC, devpriv->mite->mite_io_addr + MITE_CHOR(AI_DMA_CHAN));
648 ni_sync_ai_dma(devpriv->mite, dev);
651 if(m_status & CHSR_DONE){
652 writel(CHOR_CLRDONE, devpriv->mite->mite_io_addr + MITE_CHOR(AI_DMA_CHAN));
655 if(m_status & ~(CHSR_INT | CHSR_LINKC | CHSR_DONE | CHSR_MRDY | CHSR_DRDY | CHSR_DRQ1 | CHSR_DRQ0 | CHSR_ERROR | CHSR_SABORT | CHSR_XFERR | CHSR_LxERR_mask)){
656 rt_printk("unknown mite interrupt, ack! (m_status=%08x)\n", m_status);
657 //mite_print_chsr(m_status);
658 mite_dma_disarm(devpriv->mite, AI_DMA_CHAN );
659 writel(CHOR_DMARESET, devpriv->mite->mite_io_addr + MITE_CHOR(AI_DMA_CHAN));
660 //disable_irq(dev->irq);
664 /* test for all uncommon interrupt events at the same time */
665 if(status&(AI_Overrun_St|AI_Overflow_St|AI_SC_TC_Error_St|AI_SC_TC_St|AI_START1_St)){
667 rt_printk("ni_mio_common: a_status=0xffff. Card removed?\n");
668 /* we probably aren't even running a command now,
669 * so it's a good idea to be careful. */
670 if(s->subdev_flags&SDF_RUNNING){
671 s->async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
672 //comedi_event(dev,s,s->async->events);
676 if(status&(AI_Overrun_St|AI_Overflow_St|AI_SC_TC_Error_St)){
677 rt_printk("ni_mio_common: ai error a_status=%04x\n",
679 ni_mio_print_status_a(status);
681 ni_ai_reset(dev,dev->subdevices);
684 shutdown_ai_command( dev );
686 s->async->events |= COMEDI_CB_ERROR;
687 if(status & (AI_Overrun_St | AI_Overflow_St))
688 s->async->events |= COMEDI_CB_OVERFLOW;
690 comedi_event(dev,s,s->async->events);
694 if(status&AI_SC_TC_St){
695 #ifdef DEBUG_INTERRUPT
696 rt_printk("ni_mio_common: SC_TC interrupt\n");
698 if(!devpriv->ai_continuous){
699 shutdown_ai_command( dev );
701 ack|=AI_SC_TC_Interrupt_Ack;
703 if(status&AI_START1_St){
704 ack|=AI_START1_Interrupt_Ack;
708 if(status&AI_FIFO_Half_Full_St){
710 static const int timeout = 10;
711 /* pcmcia cards (at least 6036) seem to stop producing interrupts if we
712 *fail to get the fifo less than half full, so loop to be sure.*/
713 for(i = 0; i < timeout; ++i)
715 ni_handle_fifo_half_full(dev);
716 if((devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Half_Full_St) == 0)
722 if( (status & AI_STOP_St) ){
723 ni_handle_eos(dev, s);
724 /* we need to ack the START, also */
725 ack |= AI_STOP_Interrupt_Ack|AI_START_Interrupt_Ack;
728 if(devpriv->aimode==AIMODE_SAMPLE){
729 ni_handle_fifo_dregs(dev);
731 //s->async->events |= COMEDI_CB_SAMPLE;
734 if(ack) devpriv->stc_writew(dev, ack,Interrupt_A_Ack_Register);
736 comedi_event(dev,s,s->async->events);
738 #ifdef DEBUG_INTERRUPT
739 status=devpriv->stc_readw(dev, AI_Status_1_Register);
740 if(status&Interrupt_A_St){
741 rt_printk("handle_a_interrupt: didn't clear interrupt? status=0x%x\n", status);
746 static void handle_b_interrupt(comedi_device *dev,unsigned short b_status, unsigned int m_status)
748 comedi_subdevice *s=dev->subdevices+1;
749 //unsigned short ack=0;
750 #ifdef DEBUG_INTERRUPT
751 rt_printk("ni_mio_common: interrupt: b_status=%04x m1_status=%08x\n",
753 ni_mio_print_status_b(b_status);
758 /* Currently, mite.c requires us to handle LINKC and DONE */
759 if(m_status & CHSR_LINKC){
760 mite_handle_b_linkc(devpriv->mite, dev);
763 if(m_status & CHSR_DONE){
764 writel(CHOR_CLRDONE, devpriv->mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
767 if(m_status & ~(CHSR_INT | CHSR_LINKC | CHSR_DONE | CHSR_MRDY | CHSR_DRDY | CHSR_DRQ1 | CHSR_DRQ0 | CHSR_ERROR | CHSR_SABORT | CHSR_XFERR | CHSR_LxERR_mask)){
768 rt_printk("unknown mite interrupt, ack! (m_status=%08x)\n", m_status);
769 //mite_print_chsr(m_status);
770 mite_dma_disarm(devpriv->mite, AO_DMA_CHAN );
771 writel(CHOR_DMARESET, devpriv->mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
775 if(b_status==0xffff)return;
776 if(b_status&AO_Overrun_St){
777 rt_printk("ni_mio_common: AO FIFO underrun status=0x%04x status2=0x%04x\n",b_status,devpriv->stc_readw(dev, AO_Status_2_Register));
779 s->async->events |= COMEDI_CB_OVERFLOW;
782 if(b_status&AO_BC_TC_St){
783 MDPRINTK("ni_mio_common: AO BC_TC status=0x%04x status2=0x%04x\n",b_status,devpriv->stc_readw(dev, AO_Status_2_Register));
785 s->async->events |= COMEDI_CB_EOA;
789 if(b_status&AO_FIFO_Request_St){
792 ret = ni_ao_fifo_half_empty(dev,s);
794 rt_printk("ni_mio_common: AO buffer underrun\n");
795 ni_set_bits(dev, Interrupt_B_Enable_Register,
796 AO_FIFO_Interrupt_Enable|AO_Error_Interrupt_Enable, 0);
797 s->async->events |= COMEDI_CB_OVERFLOW;
802 b_status=devpriv->stc_readw(dev, AO_Status_1_Register);
803 if(b_status&Interrupt_B_St){
804 if(b_status&AO_FIFO_Request_St){
805 rt_printk("ni_mio_common: AO buffer underrun\n");
807 rt_printk("Ack! didn't clear AO interrupt. b_status=0x%04x\n",b_status);
808 ni_set_bits(dev,Interrupt_B_Enable_Register,~0,0);
810 s->async->events |= COMEDI_CB_OVERFLOW;
813 comedi_event(dev,s,s->async->events);
816 #ifdef DEBUG_STATUS_A
817 static char *status_a_strings[]={
818 "passthru0","fifo","G0_gate","G0_TC",
819 "stop","start","sc_tc","start1",
820 "start2","sc_tc_error","overflow","overrun",
821 "fifo_empty","fifo_half_full","fifo_full","interrupt_a"
824 static void ni_mio_print_status_a(int status)
828 rt_printk("A status:");
831 rt_printk(" %s",status_a_strings[i]);
838 #ifdef DEBUG_STATUS_B
839 static char *status_b_strings[]={
840 "passthru1","fifo","G1_gate","G1_TC",
841 "UI2_TC","UPDATE","UC_TC","BC_TC",
842 "start1","overrun","start","bc_tc_error",
843 "fifo_empty","fifo_half_full","fifo_full","interrupt_b"
846 static void ni_mio_print_status_b(int status)
850 rt_printk("B status:");
853 rt_printk(" %s",status_b_strings[i]);
862 static void ni_ao_fifo_load(comedi_device *dev,comedi_subdevice *s, int n)
864 comedi_async *async = s->async;
865 comedi_cmd *cmd = &async->cmd;
873 chan = async->cur_chan;
875 err &= comedi_buf_get(async, &d);
878 range = CR_RANGE(cmd->chanlist[chan]);
880 if(boardtype.reg_type & ni_reg_6xxx_mask)
882 packed_data = d & 0xffff;
883 /* 6711 only has 16 bit wide ao fifo */
884 if(boardtype.reg_type != ni_reg_6711)
886 err &= comedi_buf_get(async, &d);
890 packed_data |= ( d << 16 ) & 0xffff0000;
892 ni_writel( packed_data, DAC_FIFO_Data_611x );
894 ni_writew(d, DAC_FIFO_Data);
897 chan %= cmd->chanlist_len;
899 async->cur_chan = chan;
901 async->events |= COMEDI_CB_OVERFLOW;
906 * There's a small problem if the FIFO gets really low and we
907 * don't have the data to fill it. Basically, if after we fill
908 * the FIFO with all the data available, the FIFO is _still_
909 * less than half full, we never clear the interrupt. If the
910 * IRQ is in edge mode, we never get another interrupt, because
911 * this one wasn't cleared. If in level mode, we get flooded
912 * with interrupts that we can't fulfill, because nothing ever
913 * gets put into the buffer.
915 * This kind of situation is recoverable, but it is easier to
916 * just pretend we had a FIFO underrun, since there is a good
917 * chance it will happen anyway. This is _not_ the case for
918 * RT code, as RT code might purposely be running close to the
919 * metal. Needs to be fixed eventually.
921 static int ni_ao_fifo_half_empty(comedi_device *dev,comedi_subdevice *s)
925 n = comedi_buf_read_n_available(s);
927 s->async->events |= COMEDI_CB_OVERFLOW;
931 n /= sizeof(sampl_t);
932 if(n > boardtype.ao_fifo_depth / 2)
933 n = boardtype.ao_fifo_depth / 2;
935 ni_ao_fifo_load(dev,s,n);
937 s->async->events |= COMEDI_CB_BLOCK;
942 static int ni_ao_prep_fifo(comedi_device *dev,comedi_subdevice *s)
947 devpriv->stc_writew(dev, 1,DAC_FIFO_Clear);
948 if(boardtype.reg_type & ni_reg_6xxx_mask)
949 ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x);
952 n = comedi_buf_read_n_available(s);
955 n /= sizeof(sampl_t);
956 if(n > boardtype.ao_fifo_depth)
957 n = boardtype.ao_fifo_depth;
959 ni_ao_fifo_load(dev,s,n);
964 static void ni_ai_fifo_read(comedi_device *dev,comedi_subdevice *s,
967 comedi_async *async = s->async;
970 if(boardtype.reg_type == ni_reg_611x){
974 for( i = 0; i < n / 2; i++ ){
975 dl=ni_readl(ADC_FIFO_Data_611x);
976 /* This may get the hi/lo data in the wrong order */
977 data[0] = (dl>>16) & 0xffff;
978 data[1] = dl & 0xffff;
979 cfc_write_array_to_buffer(s, data, sizeof(data));
981 /* Check if there's a single sample stuck in the FIFO */
983 dl=ni_readl(ADC_FIFO_Data_611x);
984 data[0] = dl & 0xffff;
985 cfc_write_to_buffer(s, data[0]);
987 } else if(boardtype.reg_type == ni_reg_6143){
991 // This just reads the FIFO assuming the data is present, no checks on the FIFO status are performed
992 for(i = 0; i < n / 2; i++){
993 dl = ni_readl(AIFIFO_Data_6143);
995 data[0] = (dl >> 16) & 0xffff;
996 data[1] = dl & 0xffff;
997 cfc_write_array_to_buffer(s, data, sizeof(data));
1000 /* Assume there is a single sample stuck in the FIFO */
1001 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
1002 dl = ni_readl(AIFIFO_Data_6143);
1003 data[0] = (dl >> 16) & 0xffff;
1004 cfc_write_to_buffer(s, data[0]);
1007 if( n > sizeof(devpriv->ai_fifo_buffer) / sizeof(devpriv->ai_fifo_buffer[0]))
1009 comedi_error( dev, "bug! ai_fifo_buffer too small" );
1010 async->events |= COMEDI_CB_ERROR;
1013 for(i = 0; i < n; i++){
1014 devpriv->ai_fifo_buffer[i] = ni_readw(ADC_FIFO_Data_Register);
1016 cfc_write_array_to_buffer( s, devpriv->ai_fifo_buffer,
1017 n * sizeof(devpriv->ai_fifo_buffer[0]) );
1021 static void ni_handle_fifo_half_full(comedi_device *dev)
1024 comedi_subdevice *s=dev->subdevices+0;
1026 n=boardtype.ai_fifo_depth/2;
1028 ni_ai_fifo_read(dev,s,n);
1033 static int ni_ai_drain_dma(comedi_device *dev )
1035 struct mite_struct *mite = devpriv->mite;
1037 static const int timeout = 10000;
1039 for( i = 0; i < timeout; i++ )
1041 if((devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St) &&
1042 mite_bytes_in_transit(mite, AI_DMA_CHAN) == 0)
1048 rt_printk("ni_mio_common: wait for dma drain timed out\n");
1049 rt_printk("mite_bytes_in_transit=%i, AI_Status1_Register=0x%x\n",
1050 mite_bytes_in_transit(mite, AI_DMA_CHAN), devpriv->stc_readw(dev, AI_Status_1_Register));
1054 ni_sync_ai_dma( mite, dev );
1062 static void ni_handle_fifo_dregs(comedi_device *dev)
1064 comedi_subdevice *s=dev->subdevices+0;
1070 if(boardtype.reg_type == ni_reg_611x){
1071 while((devpriv->stc_readw(dev, AI_Status_1_Register)&AI_FIFO_Empty_St) == 0){
1072 dl=ni_readl(ADC_FIFO_Data_611x);
1074 /* This may get the hi/lo data in the wrong order */
1076 data[1] = (dl&0xffff);
1077 cfc_write_array_to_buffer(s, data, sizeof(data));
1079 }else if(boardtype.reg_type == ni_reg_6143){
1081 while(ni_readl(AIFIFO_Status_6143) & 0x04){
1082 dl = ni_readl(AIFIFO_Data_6143);
1084 /* This may get the hi/lo data in the wrong order */
1085 data[0] = (dl >> 16);
1086 data[1] = (dl & 0xffff);
1087 cfc_write_array_to_buffer(s, data, sizeof(data));
1090 // Check if stranded sample is present
1091 if(ni_readl(AIFIFO_Status_6143) & 0x01){
1092 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
1093 dl = ni_readl(AIFIFO_Data_6143);
1094 data[0] = (dl >> 16) & 0xffff;
1095 cfc_write_to_buffer(s, data[0]);
1099 fifo_empty = devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St;
1100 while(fifo_empty == 0)
1102 for(i = 0; i < sizeof(devpriv->ai_fifo_buffer) / sizeof(devpriv->ai_fifo_buffer[0]); i++)
1104 fifo_empty = devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St;
1105 if(fifo_empty) break;
1106 devpriv->ai_fifo_buffer[i] = ni_readw(ADC_FIFO_Data_Register);
1108 cfc_write_array_to_buffer( s, devpriv->ai_fifo_buffer,
1109 i * sizeof(devpriv->ai_fifo_buffer[0]) );
1114 static void get_last_sample_611x( comedi_device *dev )
1116 comedi_subdevice *s=dev->subdevices+0;
1120 if(boardtype.reg_type != ni_reg_611x) return;
1122 /* Check if there's a single sample stuck in the FIFO */
1123 if(ni_readb(XXX_Status)&0x80){
1124 dl=ni_readl(ADC_FIFO_Data_611x);
1126 cfc_write_to_buffer(s, data);
1130 static void get_last_sample_6143(comedi_device* dev)
1132 comedi_subdevice* s = dev->subdevices + 0;
1136 if(boardtype.reg_type != ni_reg_6143) return;
1138 /* Check if there's a single sample stuck in the FIFO */
1139 if(ni_readl(AIFIFO_Status_6143) & 0x01){
1140 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
1141 dl = ni_readl(AIFIFO_Data_6143);
1143 /* This may get the hi/lo data in the wrong order */
1144 data = (dl >> 16) & 0xffff;
1145 cfc_write_to_buffer(s, data);
1149 static void ni_ai_munge(comedi_device *dev, comedi_subdevice *s,
1150 void *data, unsigned int num_bytes, unsigned int chan_index )
1152 comedi_async *async = s->async;
1154 unsigned int length = num_bytes / bytes_per_sample(s);
1155 sampl_t *array = data;
1156 lsampl_t *larray = data;
1157 for(i = 0; i < length; i++)
1160 if(s->subdev_flags & SDF_LSAMPL)
1161 larray[i] = le32_to_cpu(larray[i]);
1163 array[i] = le16_to_cpu(array[i]);
1165 if(s->subdev_flags & SDF_LSAMPL)
1166 larray[i] += devpriv->ai_offset[chan_index];
1168 array[i] += devpriv->ai_offset[chan_index];
1170 chan_index %= async->cmd.chanlist_len;
1176 static void ni_ai_setup_MITE_dma(comedi_device *dev,comedi_cmd *cmd)
1178 struct mite_struct *mite = devpriv->mite;
1179 struct mite_channel *mite_chan = &mite->channels[ AI_DMA_CHAN ];
1180 comedi_subdevice *s = dev->subdevices + 0;
1182 /* write alloc the entire buffer */
1183 comedi_buf_write_alloc(s->async, s->async->prealloc_bufsz);
1185 mite_chan->current_link = 0;
1186 mite_chan->dir = COMEDI_INPUT;
1187 switch(boardtype.reg_type)
1191 mite_prep_dma(mite, AI_DMA_CHAN, 32, 16);
1193 case ni_reg_m_series:
1194 if(boardtype.adbits > 16)
1195 mite_prep_dma(mite, AI_DMA_CHAN, 32, 32);
1197 mite_prep_dma(mite, AI_DMA_CHAN, 16, 16); //guess
1200 mite_prep_dma(mite, AI_DMA_CHAN, 16, 16);
1204 mite_dma_arm(mite, AI_DMA_CHAN);
1207 static void ni_ao_setup_MITE_dma(comedi_device *dev,comedi_cmd *cmd)
1209 struct mite_struct *mite = devpriv->mite;
1210 struct mite_channel *mite_chan = &mite->channels[ AO_DMA_CHAN ];
1211 comedi_subdevice *s = dev->subdevices + 1;
1213 devpriv->last_buf_write_count = s->async->buf_write_count;
1215 mite_chan->current_link = 0;
1216 mite_chan->dir = COMEDI_OUTPUT;
1217 if(boardtype.reg_type & (ni_reg_611x | ni_reg_6713))
1218 mite_prep_dma(mite, AO_DMA_CHAN, 32, 32);
1220 mite_prep_dma(mite, AO_DMA_CHAN, 16, 16);
1223 mite_dma_arm(mite, AO_DMA_CHAN);
1229 used for both cancel ioctl and board initialization
1231 this is pretty harsh for a cancel, but it works...
1234 static int ni_ai_reset(comedi_device *dev,comedi_subdevice *s)
1237 mite_dma_disarm(devpriv->mite, AI_DMA_CHAN);
1239 /* ai configuration */
1240 devpriv->stc_writew(dev, AI_Configuration_Start | AI_Reset, Joint_Reset_Register);
1242 ni_set_bits(dev, Interrupt_A_Enable_Register,
1243 AI_SC_TC_Interrupt_Enable | AI_START1_Interrupt_Enable|
1244 AI_START2_Interrupt_Enable| AI_START_Interrupt_Enable|
1245 AI_STOP_Interrupt_Enable| AI_Error_Interrupt_Enable|
1246 AI_FIFO_Interrupt_Enable,0);
1248 ni_flush_ai_fifo(dev);
1250 if(boardtype.reg_type != ni_reg_6143)
1251 ni_writeb(0, Misc_Command);
1253 devpriv->stc_writew(dev, AI_Disarm, AI_Command_1_Register); /* reset pulses */
1254 devpriv->stc_writew(dev, AI_Start_Stop | AI_Mode_1_Reserved /*| AI_Trigger_Once */,
1255 AI_Mode_1_Register);
1256 devpriv->stc_writew(dev, 0x0000,AI_Mode_2_Register);
1257 /* generate FIFO interrupts on non-empty */
1258 devpriv->stc_writew(dev, (0<<6)|0x0000,AI_Mode_3_Register);
1259 if(boardtype.reg_type == ni_reg_611x){
1260 devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1262 AI_LOCALMUX_CLK_Pulse_Width, AI_Personal_Register);
1263 devpriv->stc_writew(dev, AI_SCAN_IN_PROG_Output_Select(3) |
1264 AI_EXTMUX_CLK_Output_Select(0) |
1265 AI_LOCALMUX_CLK_Output_Select(2) |
1266 AI_SC_TC_Output_Select(3) |
1267 AI_CONVERT_Output_Select(3),AI_Output_Control_Register);
1268 }else if(boardtype.reg_type == ni_reg_6143){
1269 devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1271 AI_LOCALMUX_CLK_Pulse_Width, AI_Personal_Register);
1272 devpriv->stc_writew(dev, AI_SCAN_IN_PROG_Output_Select(3) |
1273 AI_EXTMUX_CLK_Output_Select(0) |
1274 AI_LOCALMUX_CLK_Output_Select(2) |
1275 AI_SC_TC_Output_Select(3) |
1276 AI_CONVERT_Output_Select(2),AI_Output_Control_Register);
1278 devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1280 AI_CONVERT_Pulse_Width |
1281 AI_LOCALMUX_CLK_Pulse_Width, AI_Personal_Register);
1282 devpriv->stc_writew(dev, AI_SCAN_IN_PROG_Output_Select(3) |
1283 AI_EXTMUX_CLK_Output_Select(0) |
1284 AI_LOCALMUX_CLK_Output_Select(2) |
1285 AI_SC_TC_Output_Select(3) |
1286 AI_CONVERT_Output_Select(2),AI_Output_Control_Register);
1288 /* the following registers should not be changed, because there
1289 * are no backup registers in devpriv. If you want to change
1290 * any of these, add a backup register and other appropriate code:
1291 * AI_Mode_1_Register
1292 * AI_Mode_3_Register
1293 * AI_Personal_Register
1294 * AI_Output_Control_Register
1296 devpriv->stc_writew(dev, AI_SC_TC_Error_Confirm | AI_START_Interrupt_Ack |
1297 AI_START2_Interrupt_Ack | AI_START1_Interrupt_Ack |
1298 AI_SC_TC_Interrupt_Ack | AI_Error_Interrupt_Ack |
1299 AI_STOP_Interrupt_Ack, Interrupt_A_Ack_Register); /* clear interrupts */
1301 devpriv->stc_writew(dev, AI_Configuration_End,Joint_Reset_Register);
1306 static int ni_ai_poll(comedi_device *dev,comedi_subdevice *s)
1308 unsigned long flags = 0;
1311 // lock to avoid race with interrupt handler
1312 if(in_interrupt() == 0)
1313 comedi_spin_lock_irqsave(&dev->spinlock, flags);
1315 ni_handle_fifo_dregs(dev);
1317 ni_sync_ai_dma(devpriv->mite, dev);
1319 count = s->async->buf_write_count - s->async->buf_read_count;
1320 if(in_interrupt() == 0)
1321 comedi_spin_unlock_irqrestore(&dev->spinlock, flags);
1327 static int ni_ai_insn_read(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data)
1330 const unsigned int mask = (1 << boardtype.adbits) - 1;
1335 ni_load_channelgain_list(dev,1,&insn->chanspec);
1337 ni_flush_ai_fifo(dev);
1339 signbits=devpriv->ai_offset[0];
1340 if(boardtype.reg_type == ni_reg_611x){
1341 for(n=0; n < num_adc_stages_611x; n++){
1342 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1345 for(n=0; n<insn->n; n++){
1346 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1347 /* The 611x has screwy 32-bit FIFOs. */
1349 for(i=0; i<NI_TIMEOUT; i++){
1350 if(ni_readb(XXX_Status)&0x80)
1352 d = ( ni_readl(ADC_FIFO_Data_611x) >> 16 ) & 0xffff;
1355 if(!(devpriv->stc_readw(dev, AI_Status_1_Register)&AI_FIFO_Empty_St))
1357 d = ni_readl(ADC_FIFO_Data_611x) & 0xffff;
1362 rt_printk("ni_mio_common: timeout in 611x ni_ai_insn_read\n");
1368 }else if(boardtype.reg_type == ni_reg_6143){
1369 for(n = 0; n < insn->n; n++){
1370 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1372 /* The 6143 has 32-bit FIFOs. You need to strobe a bit to move a single 16bit stranded sample into the FIFO */
1374 for(i = 0; i < NI_TIMEOUT; i++){
1375 if(ni_readl(AIFIFO_Status_6143) & 0x01)
1377 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
1378 dl = ni_readl(AIFIFO_Data_6143);
1382 if(i == NI_TIMEOUT){
1383 rt_printk("ni_mio_common: timeout in 6143 ni_ai_insn_read\n");
1386 data[n] = (((dl >> 16) & 0xFFFF) + signbits) & 0xFFFF;
1389 for(n=0;n<insn->n;n++){
1390 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1391 for(i=0;i<NI_TIMEOUT;i++){
1392 if(!(devpriv->stc_readw(dev, AI_Status_1_Register)&AI_FIFO_Empty_St))
1396 rt_printk("ni_mio_common: timeout in ni_ai_insn_read\n");
1399 if(boardtype.reg_type == ni_reg_m_series)
1401 data[n] = ni_readl(M_Offset_AI_FIFO_Data) & mask;
1404 d = ni_readw(ADC_FIFO_Data_Register);
1405 d += signbits; /* subtle: needs to be short addition */
1413 void ni_prime_channelgain_list(comedi_device *dev)
1416 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1417 for(i = 0; i < NI_TIMEOUT; ++i)
1419 if(!(devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St))
1421 devpriv->stc_writew(dev, 1, ADC_FIFO_Clear);
1426 rt_printk("ni_mio_common: timeout loading channel/gain list\n");
1429 static void ni_m_series_load_channelgain_list(comedi_device *dev,unsigned int n_chan,
1432 unsigned int chan, range, aref;
1434 unsigned config_bits = 0;
1436 unsigned int dither;
1437 unsigned range_code;
1439 devpriv->stc_writew(dev, 1, Configuration_Memory_Clear);
1441 // offset = 1 << (boardtype.adbits - 1);
1442 if((list[0] & CR_ALT_SOURCE))
1444 chan = CR_CHAN(list[0]);
1445 range = CR_RANGE(list[0]);
1446 range_code = ni_gainlkup[boardtype.gainlkup][range];
1447 dither = ((list[0] & CR_ALT_FILTER) != 0);
1448 unsigned bypass_bits = MSeries_AI_Bypass_Config_FIFO_Bit;
1449 bypass_bits |= chan;
1450 bypass_bits |= (devpriv->ai_calib_source) & (MSeries_AI_Bypass_Cal_Sel_Pos_Mask |
1451 MSeries_AI_Bypass_Cal_Sel_Neg_Mask | MSeries_AI_Bypass_Mode_Mux_Mask |
1452 MSeries_AO_Bypass_AO_Cal_Sel_Mask);
1453 bypass_bits |= MSeries_AI_Bypass_Gain_Bits(range_code);
1455 bypass_bits |= MSeries_AI_Bypass_Dither_Bit;
1456 // don't use 2's complement encoding
1457 bypass_bits |= MSeries_AI_Bypass_Polarity_Bit;
1458 ni_writel(bypass_bits, M_Offset_AI_Config_FIFO_Bypass);
1461 ni_writel(0, M_Offset_AI_Config_FIFO_Bypass);
1464 for(i = 0; i < n_chan; i++)
1466 chan = CR_CHAN(list[i]);
1467 aref = CR_AREF(list[i]);
1468 range = CR_RANGE(list[i]);
1469 dither = ((list[i] & CR_ALT_FILTER) != 0);
1471 range_code = ni_gainlkup[boardtype.gainlkup][range];
1472 devpriv->ai_offset[i] = offset;
1477 config_bits |= MSeries_AI_Config_Channel_Type_Differential_Bits;
1480 config_bits |= MSeries_AI_Config_Channel_Type_Common_Ref_Bits;
1483 config_bits |= MSeries_AI_Config_Channel_Type_Ground_Ref_Bits;
1488 config_bits |= MSeries_AI_Config_Channel_Bits(chan);
1489 config_bits |= MSeries_AI_Config_Bank_Bits(chan);
1490 config_bits |= MSeries_AI_Config_Gain_Bits(range_code);
1491 if(i == n_chan - 1) config_bits |= MSeries_AI_Config_Last_Channel_Bit;
1492 if(dither) config_bits |= MSeries_AI_Config_Dither_Bit;
1493 // don't use 2's complement encoding
1494 config_bits |= MSeries_AI_Config_Polarity_Bit;
1495 ni_writew(config_bits, M_Offset_AI_Config_FIFO_Data);
1497 ni_prime_channelgain_list(dev);
1501 * Notes on the 6110 and 6111:
1502 * These boards a slightly different than the rest of the series, since
1503 * they have multiple A/D converters.
1504 * From the driver side, the configuration memory is a
1506 * Configuration Memory Low:
1508 * bit 8: unipolar/bipolar (should be 0 for bipolar)
1509 * bits 0-3: gain. This is 4 bits instead of 3 for the other boards
1510 * 1001 gain=0.1 (+/- 50)
1519 * Configuration Memory High:
1520 * bits 12-14: Channel Type
1521 * 001 for differential
1522 * 000 for calibration
1523 * bit 11: coupling (this is not currently handled)
1527 * valid channels are 0-3
1529 static void ni_load_channelgain_list(comedi_device *dev,unsigned int n_chan,
1532 unsigned int chan,range,aref;
1536 unsigned int dither;
1538 if(boardtype.reg_type == ni_reg_m_series)
1540 ni_m_series_load_channelgain_list(dev, n_chan, list);
1543 if(n_chan == 1 && (boardtype.reg_type != ni_reg_611x) && (boardtype.reg_type != ni_reg_6143)){
1544 if(devpriv->changain_state && devpriv->changain_spec==list[0]){
1548 devpriv->changain_state=1;
1549 devpriv->changain_spec=list[0];
1551 devpriv->changain_state=0;
1554 devpriv->stc_writew(dev, 1,Configuration_Memory_Clear);
1556 // Set up Calibration mode if required
1557 if(boardtype.reg_type == ni_reg_6143){
1558 if((list[0] & CR_ALT_SOURCE) && !devpriv->ai_calib_source_enabled){
1559 // Strobe Relay enable bit
1560 ni_writew(devpriv->ai_calib_source | Calibration_Channel_6143_RelayOn, Calibration_Channel_6143);
1561 ni_writew(devpriv->ai_calib_source, Calibration_Channel_6143);
1562 devpriv->ai_calib_source_enabled = 1;
1563 msleep_interruptible(100); // Allow relays to change
1565 else if(!(list[0] & CR_ALT_SOURCE) && devpriv->ai_calib_source_enabled){
1566 // Strobe Relay disable bit
1567 ni_writew(devpriv->ai_calib_source | Calibration_Channel_6143_RelayOff, Calibration_Channel_6143);
1568 ni_writew(devpriv->ai_calib_source, Calibration_Channel_6143);
1569 devpriv->ai_calib_source_enabled = 0;
1570 msleep_interruptible(100); // Allow relays to change
1574 offset=1<<(boardtype.adbits-1);
1575 for(i=0;i<n_chan;i++){
1576 if((boardtype.reg_type != ni_reg_6143) && (list[i] & CR_ALT_SOURCE)){
1577 chan=devpriv->ai_calib_source;
1579 chan=CR_CHAN(list[i]);
1581 aref=CR_AREF(list[i]);
1582 range=CR_RANGE(list[i]);
1583 dither=((list[i]&CR_ALT_FILTER)!=0);
1585 /* fix the external/internal range differences */
1586 range = ni_gainlkup[boardtype.gainlkup][range];
1587 if(boardtype.reg_type == ni_reg_611x)
1588 devpriv->ai_offset[i] = offset;
1590 devpriv->ai_offset[i] = (range&0x100)?0:offset;
1593 if( ( list[i] & CR_ALT_SOURCE ) )
1595 if(boardtype.reg_type == ni_reg_611x)
1596 ni_writew(CR_CHAN(list[i])&0x0003, Calibration_Channel_Select_611x);
1599 if(boardtype.reg_type == ni_reg_611x)
1601 else if(boardtype.reg_type == ni_reg_6143)
1606 hi |= AI_DIFFERENTIAL;
1618 hi |= AI_CONFIG_CHANNEL( chan );
1620 ni_writew(hi,Configuration_Memory_High);
1622 if(boardtype.reg_type != ni_reg_6143){
1624 if(i == n_chan - 1) lo |= AI_LAST_CHANNEL;
1625 if( dither ) lo |= AI_DITHER;
1627 ni_writew(lo,Configuration_Memory_Low);
1631 /* prime the channel/gain list */
1632 if((boardtype.reg_type != ni_reg_611x) && (boardtype.reg_type != ni_reg_6143)){
1633 ni_prime_channelgain_list(dev);
1637 static int ni_ns_to_timer(comedi_device *dev, int *nanosec, int round_mode)
1642 case TRIG_ROUND_NEAREST:
1644 divider = (*nanosec + devpriv->clock_ns / 2) / devpriv->clock_ns;
1646 case TRIG_ROUND_DOWN:
1647 divider = (*nanosec) / devpriv->clock_ns;
1650 divider=(*nanosec + devpriv->clock_ns - 1) / devpriv->clock_ns;
1654 *nanosec = devpriv->clock_ns * divider;
1658 static int ni_ai_cmdtest(comedi_device *dev,comedi_subdevice *s,comedi_cmd *cmd)
1664 /* step 1: make sure trigger sources are trivially valid */
1667 cmd->start_src &= TRIG_NOW|TRIG_INT|TRIG_EXT;
1668 if(!cmd->start_src || tmp!=cmd->start_src)err++;
1670 tmp=cmd->scan_begin_src;
1671 cmd->scan_begin_src &= TRIG_TIMER|TRIG_EXT;
1672 if(!cmd->scan_begin_src || tmp!=cmd->scan_begin_src)err++;
1674 tmp=cmd->convert_src;
1675 sources = TRIG_TIMER | TRIG_EXT;
1676 if((boardtype.reg_type == ni_reg_611x) || (boardtype.reg_type == ni_reg_6143)) sources |= TRIG_NOW;
1677 cmd->convert_src &= sources;
1678 if(!cmd->convert_src || tmp!=cmd->convert_src)err++;
1680 tmp=cmd->scan_end_src;
1681 cmd->scan_end_src &= TRIG_COUNT;
1682 if(!cmd->scan_end_src || tmp!=cmd->scan_end_src)err++;
1685 cmd->stop_src &= TRIG_COUNT|TRIG_NONE;
1686 if(!cmd->stop_src || tmp!=cmd->stop_src)err++;
1690 /* step 2: make sure trigger sources are unique and mutually compatible */
1692 /* note that mutual compatiblity is not an issue here */
1693 if(cmd->start_src!=TRIG_NOW &&
1694 cmd->start_src!=TRIG_INT &&
1695 cmd->start_src!=TRIG_EXT)err++;
1696 if(cmd->scan_begin_src!=TRIG_TIMER &&
1697 cmd->scan_begin_src!=TRIG_EXT &&
1698 cmd->scan_begin_src!=TRIG_OTHER)err++;
1699 if(cmd->convert_src!=TRIG_TIMER &&
1700 cmd->convert_src!=TRIG_EXT &&
1701 cmd->convert_src!=TRIG_NOW)err++;
1702 if(cmd->stop_src!=TRIG_COUNT &&
1703 cmd->stop_src!=TRIG_NONE)err++;
1707 /* step 3: make sure arguments are trivially compatible */
1709 if(cmd->start_src==TRIG_EXT){
1710 /* external trigger */
1711 unsigned int tmp = CR_CHAN(cmd->start_arg);
1713 if(tmp > 16) tmp = 16;
1714 tmp |= (cmd->start_arg & (CR_INVERT | CR_EDGE));
1715 if(cmd->start_arg != tmp){
1716 cmd->start_arg = tmp;
1720 if(cmd->start_arg!=0){
1721 /* true for both TRIG_NOW and TRIG_INT */
1726 if(cmd->scan_begin_src==TRIG_TIMER){
1727 if(cmd->scan_begin_arg<boardtype.ai_speed){
1728 cmd->scan_begin_arg=boardtype.ai_speed;
1731 if(cmd->scan_begin_arg > devpriv->clock_ns * 0xffffff){
1732 cmd->scan_begin_arg = devpriv->clock_ns * 0xffffff;
1735 }else if(cmd->scan_begin_src==TRIG_EXT){
1736 /* external trigger */
1737 unsigned int tmp = CR_CHAN(cmd->scan_begin_arg);
1740 tmp |= (cmd->scan_begin_arg & (CR_INVERT | CR_EDGE));
1741 if(cmd->scan_begin_arg!=tmp){
1742 cmd->scan_begin_arg = tmp;
1745 }else{ /* TRIG_OTHER */
1746 if(cmd->scan_begin_arg){
1747 cmd->scan_begin_arg=0;
1751 if(cmd->convert_src==TRIG_TIMER){
1752 if((boardtype.reg_type == ni_reg_611x) || (boardtype.reg_type == ni_reg_6143)){
1753 if(cmd->convert_arg != 0){
1754 cmd->convert_arg = 0;
1758 if(cmd->convert_arg<boardtype.ai_speed){
1759 cmd->convert_arg=boardtype.ai_speed;
1762 if(cmd->convert_arg>devpriv->clock_ns*0xffff){
1763 cmd->convert_arg=devpriv->clock_ns*0xffff;
1767 }else if(cmd->convert_src == TRIG_EXT){
1768 /* external trigger */
1769 unsigned int tmp = CR_CHAN(cmd->convert_arg);
1772 tmp |= (cmd->convert_arg&(CR_ALT_FILTER|CR_INVERT));
1773 if(cmd->convert_arg!=tmp){
1774 cmd->convert_arg = tmp;
1777 }else if(cmd->convert_src == TRIG_NOW){
1778 if(cmd->convert_arg != 0){
1779 cmd->convert_arg = 0;
1784 if(cmd->scan_end_arg!=cmd->chanlist_len){
1785 cmd->scan_end_arg=cmd->chanlist_len;
1788 if(cmd->stop_src==TRIG_COUNT){
1789 unsigned int max_count = 0x01000000;
1791 if(boardtype.reg_type == ni_reg_611x )
1792 max_count -= num_adc_stages_611x;
1793 if(cmd->stop_arg > max_count){
1794 cmd->stop_arg = max_count;
1797 if(cmd->stop_arg < 1){
1803 if(cmd->stop_arg!=0){
1811 /* step 4: fix up any arguments */
1813 if(cmd->scan_begin_src==TRIG_TIMER){
1814 tmp=cmd->scan_begin_arg;
1815 ni_ns_to_timer(dev, &cmd->scan_begin_arg, cmd->flags&TRIG_ROUND_MASK);
1816 if(tmp!=cmd->scan_begin_arg)err++;
1818 if(cmd->convert_src==TRIG_TIMER){
1819 if((boardtype.reg_type != ni_reg_611x) && (boardtype.reg_type != ni_reg_6143)){
1820 tmp=cmd->convert_arg;
1821 ni_ns_to_timer(dev, &cmd->convert_arg, cmd->flags&TRIG_ROUND_MASK);
1822 if(tmp!=cmd->convert_arg)err++;
1823 if(cmd->scan_begin_src==TRIG_TIMER &&
1824 cmd->scan_begin_arg<cmd->convert_arg*cmd->scan_end_arg){
1825 cmd->scan_begin_arg=cmd->convert_arg*cmd->scan_end_arg;
1836 static int ni_ai_cmd(comedi_device *dev,comedi_subdevice *s)
1838 comedi_cmd *cmd=&s->async->cmd;
1840 int mode1=0; /* mode1 is needed for both stop and convert */
1842 int start_stop_select=0;
1843 unsigned int stop_count;
1844 int interrupt_a_enable=0;
1846 MDPRINTK("ni_ai_cmd\n");
1849 comedi_error(dev, "cannot run command without an irq");
1852 ni_flush_ai_fifo(dev);
1854 ni_load_channelgain_list(dev,cmd->chanlist_len,cmd->chanlist);
1856 /* start configuration */
1857 devpriv->stc_writew(dev, AI_Configuration_Start,Joint_Reset_Register);
1859 /* disable analog triggering for now, since it
1860 * interferes with the use of pfi0 */
1861 devpriv->an_trig_etc_reg &= ~Analog_Trigger_Enable;
1862 devpriv->stc_writew(dev, devpriv->an_trig_etc_reg, Analog_Trigger_Etc_Register);
1864 switch(cmd->start_src){
1867 devpriv->stc_writew(dev, AI_START2_Select(0)|
1868 AI_START1_Sync|AI_START1_Edge|AI_START1_Select(0),
1869 AI_Trigger_Select_Register);
1873 int chan = CR_CHAN(cmd->start_arg);
1874 unsigned int bits = AI_START2_Select(0)|
1876 AI_START1_Select(chan + 1);
1878 if(cmd->start_arg & CR_INVERT)
1879 bits |= AI_START1_Polarity;
1880 if(cmd->start_arg & CR_EDGE)
1881 bits |= AI_START1_Edge;
1882 devpriv->stc_writew(dev, bits, AI_Trigger_Select_Register);
1887 mode2 &= ~AI_Pre_Trigger;
1888 mode2 &= ~AI_SC_Initial_Load_Source;
1889 mode2 &= ~AI_SC_Reload_Mode;
1890 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
1892 if(cmd->chanlist_len == 1 || (boardtype.reg_type == ni_reg_611x) || (boardtype.reg_type == ni_reg_6143)){
1893 start_stop_select |= AI_STOP_Polarity;
1894 start_stop_select |= AI_STOP_Select( 31 ); // logic low
1895 start_stop_select |= AI_STOP_Sync;
1898 start_stop_select |= AI_STOP_Select(19); // ai configuration memory
1900 devpriv->stc_writew(dev, start_stop_select, AI_START_STOP_Select_Register);
1902 devpriv->ai_cmd2 = 0;
1903 switch(cmd->stop_src){
1905 stop_count = cmd->stop_arg - 1;
1907 if(boardtype.reg_type == ni_reg_611x){
1908 // have to take 3 stage adc pipeline into account
1909 stop_count += num_adc_stages_611x;
1911 /* stage number of scans */
1912 devpriv->stc_writel(dev, stop_count, AI_SC_Load_A_Registers);
1914 mode1 |= AI_Start_Stop | AI_Mode_1_Reserved | AI_Trigger_Once;
1915 devpriv->stc_writew(dev, mode1,AI_Mode_1_Register);
1916 /* load SC (Scan Count) */
1917 devpriv->stc_writew(dev, AI_SC_Load,AI_Command_1_Register);
1919 devpriv->ai_continuous = 0;
1920 if( stop_count == 0 ){
1921 devpriv->ai_cmd2 |= AI_End_On_End_Of_Scan;
1922 interrupt_a_enable |= AI_STOP_Interrupt_Enable;
1923 // this is required to get the last sample for chanlist_len > 1, not sure why
1924 if(cmd->chanlist_len > 1)
1925 start_stop_select |= AI_STOP_Polarity | AI_STOP_Edge;
1929 /* stage number of scans */
1930 devpriv->stc_writel(dev, 0,AI_SC_Load_A_Registers);
1932 mode1 |= AI_Start_Stop | AI_Mode_1_Reserved | AI_Continuous;
1933 devpriv->stc_writew(dev, mode1,AI_Mode_1_Register);
1935 /* load SC (Scan Count) */
1936 devpriv->stc_writew(dev, AI_SC_Load,AI_Command_1_Register);
1938 devpriv->ai_continuous = 1;
1943 switch(cmd->scan_begin_src){
1946 stop bits for non 611x boards
1947 AI_SI_Special_Trigger_Delay=0
1949 AI_START_STOP_Select_Register:
1950 AI_START_Polarity=0 (?) rising edge
1951 AI_START_Edge=1 edge triggered
1953 AI_START_Select=0 SI_TC
1954 AI_STOP_Polarity=0 rising edge
1955 AI_STOP_Edge=0 level
1957 AI_STOP_Select=19 external pin (configuration mem)
1959 start_stop_select |= AI_START_Edge | AI_START_Sync;
1960 devpriv->stc_writew(dev, start_stop_select, AI_START_STOP_Select_Register);
1962 mode2 |= AI_SI_Reload_Mode(0);
1963 /* AI_SI_Initial_Load_Source=A */
1964 mode2 &= ~AI_SI_Initial_Load_Source;
1965 //mode2 |= AI_SC_Reload_Mode;
1966 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
1969 timer = ni_ns_to_timer(dev, &cmd->scan_begin_arg, TRIG_ROUND_NEAREST);
1970 devpriv->stc_writel(dev, timer,AI_SI_Load_A_Registers);
1971 devpriv->stc_writew(dev, AI_SI_Load,AI_Command_1_Register);
1974 if( cmd->scan_begin_arg & CR_EDGE )
1975 start_stop_select |= AI_START_Edge;
1976 /* AI_START_Polarity==1 is falling edge */
1977 if( cmd->scan_begin_arg & CR_INVERT )
1978 start_stop_select |= AI_START_Polarity;
1979 if( cmd->scan_begin_src != cmd->convert_src ||
1980 ( cmd->scan_begin_arg & ~CR_EDGE ) != ( cmd->convert_arg & ~CR_EDGE ) )
1981 start_stop_select |= AI_START_Sync;
1982 start_stop_select |= AI_START_Select(1 + CR_CHAN(cmd->scan_begin_arg));
1983 devpriv->stc_writew(dev, start_stop_select, AI_START_STOP_Select_Register);
1987 switch(cmd->convert_src){
1990 if( cmd->convert_arg == 0 || cmd->convert_src == TRIG_NOW )
1993 timer = ni_ns_to_timer(dev, &cmd->convert_arg, TRIG_ROUND_NEAREST);
1994 devpriv->stc_writew(dev, 1,AI_SI2_Load_A_Register); /* 0,0 does not work. */
1995 devpriv->stc_writew(dev, timer,AI_SI2_Load_B_Register);
1997 /* AI_SI2_Reload_Mode = alternate */
1998 /* AI_SI2_Initial_Load_Source = A */
1999 mode2 &= ~AI_SI2_Initial_Load_Source;
2000 mode2 |= AI_SI2_Reload_Mode;
2001 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
2004 devpriv->stc_writew(dev, AI_SI2_Load,AI_Command_1_Register);
2006 mode2 |= AI_SI2_Reload_Mode; // alternate
2007 mode2 |= AI_SI2_Initial_Load_Source; // B
2009 devpriv->stc_writew(dev, mode2,AI_Mode_2_Register);
2012 mode1 |= AI_CONVERT_Source_Select(1+cmd->convert_arg);
2013 if( ( cmd->convert_arg & CR_INVERT ) == 0 )
2014 mode1 |= AI_CONVERT_Source_Polarity;
2015 devpriv->stc_writew(dev, mode1,AI_Mode_1_Register);
2017 mode2 |= AI_Start_Stop_Gate_Enable | AI_SC_Gate_Enable;
2018 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
2025 /* interrupt on FIFO, errors, SC_TC */
2026 interrupt_a_enable |= AI_Error_Interrupt_Enable|
2027 AI_SC_TC_Interrupt_Enable;
2030 interrupt_a_enable|=AI_FIFO_Interrupt_Enable;
2033 if(cmd->flags & TRIG_WAKE_EOS || (devpriv->ai_cmd2 & AI_End_On_End_Of_Scan)){
2034 /* wake on end-of-scan */
2035 devpriv->aimode=AIMODE_SCAN;
2037 devpriv->aimode=AIMODE_HALF_FULL;
2040 switch(devpriv->aimode){
2041 case AIMODE_HALF_FULL:
2042 /*generate FIFO interrupts and DMA requests on half-full */
2044 devpriv->stc_writew(dev, AI_FIFO_Mode_HF_to_E, AI_Mode_3_Register);
2046 devpriv->stc_writew(dev, AI_FIFO_Mode_HF, AI_Mode_3_Register);
2050 /*generate FIFO interrupts on non-empty */
2051 devpriv->stc_writew(dev, AI_FIFO_Mode_NE, AI_Mode_3_Register);
2055 devpriv->stc_writew(dev, AI_FIFO_Mode_NE, AI_Mode_3_Register);
2057 devpriv->stc_writew(dev, AI_FIFO_Mode_HF, AI_Mode_3_Register);
2059 interrupt_a_enable |= AI_STOP_Interrupt_Enable;
2065 devpriv->stc_writew(dev, 0x3f80,Interrupt_A_Ack_Register); /* clear interrupts */
2067 ni_set_bits(dev, Interrupt_A_Enable_Register, interrupt_a_enable, 1);
2069 MDPRINTK("Interrupt_A_Enable_Register = 0x%04x\n",devpriv->int_a_enable_reg);
2071 /* interrupt on nothing */
2072 ni_set_bits(dev, Interrupt_A_Enable_Register, ~0, 0);
2074 /* XXX start polling if necessary */
2075 MDPRINTK("interrupting on nothing\n");
2078 /* end configuration */
2079 devpriv->stc_writew(dev, AI_Configuration_End,Joint_Reset_Register);
2081 switch(cmd->scan_begin_src){
2083 devpriv->stc_writew(dev, AI_SI2_Arm | AI_SI_Arm | AI_DIV_Arm | AI_SC_Arm,
2084 AI_Command_1_Register);
2087 /* XXX AI_SI_Arm? */
2088 devpriv->stc_writew(dev, AI_SI2_Arm | AI_SI_Arm | AI_DIV_Arm | AI_SC_Arm,
2089 AI_Command_1_Register);
2094 ni_ai_setup_MITE_dma(dev,cmd);
2095 //mite_dump_regs(devpriv->mite);
2098 switch(cmd->start_src){
2100 /* AI_START1_Pulse */
2101 devpriv->stc_writew(dev, AI_START1_Pulse | devpriv->ai_cmd2, AI_Command_2_Register );
2102 s->async->inttrig=NULL;
2105 s->async->inttrig=NULL;
2108 s->async->inttrig=ni_ai_inttrig;
2112 MDPRINTK("exit ni_ai_cmd\n");
2117 static int ni_ai_inttrig(comedi_device *dev,comedi_subdevice *s,
2118 unsigned int trignum)
2120 if(trignum!=0)return -EINVAL;
2122 devpriv->stc_writew(dev, AI_START1_Pulse | devpriv->ai_cmd2, AI_Command_2_Register );
2123 s->async->inttrig=NULL;
2128 static int ni_ai_config_analog_trig(comedi_device *dev,comedi_subdevice *s,
2129 comedi_insn *insn, lsampl_t *data);
2131 static int ni_ai_insn_config(comedi_device *dev,comedi_subdevice *s,
2132 comedi_insn *insn, lsampl_t *data)
2134 if(insn->n<1)return -EINVAL;
2137 case INSN_CONFIG_ANALOG_TRIG:
2138 return ni_ai_config_analog_trig(dev,s,insn,data);
2139 case INSN_CONFIG_ALT_SOURCE:
2140 if(boardtype.reg_type == ni_reg_m_series)
2142 if(data[1] & ~(MSeries_AI_Bypass_Cal_Sel_Pos_Mask |
2143 MSeries_AI_Bypass_Cal_Sel_Neg_Mask | MSeries_AI_Bypass_Mode_Mux_Mask |
2144 MSeries_AO_Bypass_AO_Cal_Sel_Mask))
2148 devpriv->ai_calib_source = data[1];
2149 } else if(boardtype.reg_type == ni_reg_6143)
2151 unsigned int calib_source;
2153 calib_source = data[1] & 0xf;
2156 if(calib_source > 0xF)
2159 devpriv->ai_calib_source = calib_source;
2160 ni_writew(calib_source, Calibration_Channel_6143);
2163 unsigned int calib_source;
2164 unsigned int calib_source_adjust;
2166 calib_source = data[1] & 0xf;
2167 calib_source_adjust = ( data[1] >> 4 ) & 0xff;
2169 if(calib_source >= 8)
2171 devpriv->ai_calib_source = calib_source;
2172 if(boardtype.reg_type == ni_reg_611x){
2173 ni_writeb( calib_source_adjust, Cal_Gain_Select_611x );
2184 static int ni_ai_config_analog_trig(comedi_device *dev,comedi_subdevice *s,
2185 comedi_insn *insn, lsampl_t *data)
2187 unsigned int a,b,modebits;
2191 * data[2] is analog line
2192 * data[3] is set level
2193 * data[4] is reset level */
2194 if(!boardtype.has_analog_trig)return -EINVAL;
2195 if((data[1]&0xffff0000) != COMEDI_EV_SCAN_BEGIN){
2196 data[1]&= (COMEDI_EV_SCAN_BEGIN | 0xffff);
2199 if(data[2]>=boardtype.n_adchan){
2200 data[2]=boardtype.n_adchan-1;
2203 if(data[3]>255){ /* a */
2207 if(data[4]>255){ /* b */
2218 * high mode 00 00 01 10
2219 * low mode 00 00 10 01
2221 * hysteresis low mode 10 00 00 01
2222 * hysteresis high mode 01 00 00 10
2223 * middle mode 10 01 01 10
2228 modebits=data[1]&0xff;
2230 /* two level mode */
2235 modebits=((data[1]&0xf)<<4)|((data[1]&0xf0)>>4);
2237 devpriv->atrig_low = a;
2238 devpriv->atrig_high = b;
2240 case 0x81: /* low hysteresis mode */
2241 devpriv->atrig_mode = 6;
2243 case 0x42: /* high hysteresis mode */
2244 devpriv->atrig_mode = 3;
2246 case 0x96: /* middle window mode */
2247 devpriv->atrig_mode = 2;
2254 /* one level mode */
2260 case 0x06: /* high window mode */
2261 devpriv->atrig_high = a;
2262 devpriv->atrig_mode = 0;
2264 case 0x09: /* low window mode */
2265 devpriv->atrig_low = a;
2266 devpriv->atrig_mode = 1;
2273 if(err)return -EAGAIN;
2277 /* munge data from unsigned to 2's complement for analog output bipolar modes */
2278 static void ni_ao_munge(comedi_device *dev, comedi_subdevice *s,
2279 void *data, unsigned int num_bytes, unsigned int chan_index )
2281 comedi_async *async = s->async;
2284 unsigned int offset;
2285 unsigned int length = num_bytes / sizeof( sampl_t );
2286 sampl_t *array = data;
2288 offset = 1 << (boardtype.aobits - 1);
2289 for(i = 0; i < length; i++)
2291 range = CR_RANGE( async->cmd.chanlist[ chan_index ] );
2292 if(boardtype.ao_unipolar == 0 || (range & 1) == 0 )
2295 array[i] = cpu_to_le16( array[i] );
2298 chan_index %= async->cmd.chanlist_len;
2302 static int ni_m_series_ao_config_chanlist(comedi_device *dev, comedi_subdevice *s,
2303 unsigned int chanspec[], unsigned int n_chans, int timed)
2311 for(i = 0; i < boardtype.n_aochan; ++i)
2313 ni_writeb(0xf, M_Offset_AO_Waveform_Order(i));
2315 for(i=0;i<n_chans;i++)
2317 chan = CR_CHAN(chanspec[i]);
2318 range = CR_RANGE(chanspec[i]);
2319 comedi_krange *krange = s->range_table->range + range;
2322 switch(krange->max - krange->min)
2325 conf |= MSeries_AO_DAC_Reference_10V_Internal_Bits;
2326 ni_writeb(0, M_Offset_AO_Reference_Attenuation(chan));
2329 conf |= MSeries_AO_DAC_Reference_5V_Internal_Bits;
2330 ni_writeb(0, M_Offset_AO_Reference_Attenuation(chan));
2333 conf |= MSeries_AO_DAC_Reference_10V_Internal_Bits;
2334 ni_writeb(MSeries_Attenuate_x5_Bit, M_Offset_AO_Reference_Attenuation(chan));
2337 conf |= MSeries_AO_DAC_Reference_5V_Internal_Bits;
2338 ni_writeb(MSeries_Attenuate_x5_Bit, M_Offset_AO_Reference_Attenuation(chan));
2341 rt_printk("%s: bug! unhandled ao reference voltage\n", __FUNCTION__);
2344 switch(krange->max + krange->min)
2347 conf |= MSeries_AO_DAC_Offset_0V_Bits;
2350 conf |= MSeries_AO_DAC_Offset_5V_Bits;
2353 rt_printk("%s: bug! unhandled ao offset voltage\n", __FUNCTION__);
2356 if(timed) conf |= MSeries_AO_Update_Timed_Bit;
2357 ni_writeb(conf, M_Offset_AO_Config_Bank(chan));
2358 devpriv->ao_conf[chan] = conf;
2359 ni_writeb(i, M_Offset_AO_Waveform_Order(chan));
2364 static int ni_old_ao_config_chanlist(comedi_device *dev, comedi_subdevice *s,
2365 unsigned int chanspec[], unsigned int n_chans)
2373 for(i=0;i<n_chans;i++)
2375 chan = CR_CHAN(chanspec[i]);
2376 range = CR_RANGE(chanspec[i]);
2377 conf = AO_Channel(chan);
2379 if(boardtype.ao_unipolar){
2382 invert = (1<<(boardtype.aobits-1));
2390 invert = (1<<(boardtype.aobits-1));
2393 /* not all boards can deglitch, but this shouldn't hurt */
2394 if(chanspec[i] & CR_DEGLITCH)
2395 conf |= AO_Deglitch;
2397 /* analog reference */
2398 /* AREF_OTHER connects AO ground to AI ground, i think */
2399 conf |= (CR_AREF(chanspec[i])==AREF_OTHER)? AO_Ground_Ref : 0;
2401 ni_writew(conf,AO_Configuration);
2402 devpriv->ao_conf[chan] = conf;
2407 static int ni_ao_config_chanlist(comedi_device *dev, comedi_subdevice *s,
2408 unsigned int chanspec[], unsigned int n_chans, int timed)
2410 if(boardtype.reg_type == ni_reg_m_series)
2411 return ni_m_series_ao_config_chanlist(dev, s, chanspec, n_chans, timed);
2413 return ni_old_ao_config_chanlist(dev, s, chanspec, n_chans);
2415 static int ni_ao_insn_read(comedi_device *dev,comedi_subdevice *s,
2416 comedi_insn *insn,lsampl_t *data)
2418 data[0] = devpriv->ao[CR_CHAN(insn->chanspec)];
2423 static int ni_ao_insn_write(comedi_device *dev,comedi_subdevice *s,
2424 comedi_insn *insn,lsampl_t *data)
2426 unsigned int chan = CR_CHAN(insn->chanspec);
2427 unsigned int invert;
2429 invert = ni_ao_config_chanlist(dev,s,&insn->chanspec, 1, 0);
2431 devpriv->ao[chan] = data[0];
2433 if(boardtype.reg_type == ni_reg_m_series)
2435 ni_writew(data[0], M_Offset_DAC_Direct_Data(chan));
2438 ni_writew(data[0] ^ invert,(chan)? DAC1_Direct_Data : DAC0_Direct_Data);
2443 static int ni_ao_insn_write_671x(comedi_device *dev,comedi_subdevice *s,
2444 comedi_insn *insn,lsampl_t *data)
2446 unsigned int chan = CR_CHAN(insn->chanspec);
2447 unsigned int invert;
2449 ao_win_out(1 << chan, AO_Immediate_671x);
2450 invert = 1 << (boardtype.aobits - 1);
2452 ni_ao_config_chanlist(dev,s,&insn->chanspec, 1, 0);
2454 devpriv->ao[chan] = data[0];
2455 ao_win_out(data[0] ^ invert, DACx_Direct_Data_671x(chan));
2460 static int ni_ao_inttrig(comedi_device *dev,comedi_subdevice *s,
2461 unsigned int trignum)
2464 int interrupt_b_bits;
2466 static const int timeout = 1000;
2468 if(trignum!=0)return -EINVAL;
2470 ni_set_bits(dev, Interrupt_B_Enable_Register, AO_FIFO_Interrupt_Enable | AO_Error_Interrupt_Enable, 0);
2471 interrupt_b_bits = AO_Error_Interrupt_Enable;
2473 devpriv->stc_writew(dev, 1, DAC_FIFO_Clear);
2474 if(boardtype.reg_type & ni_reg_6xxx_mask)
2475 ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x);
2476 ni_ao_setup_MITE_dma(dev, &s->async->cmd);
2477 ret = ni_ao_wait_for_dma_load(dev);
2478 if(ret < 0) return ret;
2481 ret = ni_ao_prep_fifo(dev,s);
2482 if(ret==0)return -EPIPE;
2484 interrupt_b_bits |= AO_FIFO_Interrupt_Enable;
2487 devpriv->stc_writew(dev, devpriv->ao_mode3|AO_Not_An_UPDATE,AO_Mode_3_Register);
2488 devpriv->stc_writew(dev, devpriv->ao_mode3,AO_Mode_3_Register);
2489 /* wait for DACs to be loaded */
2490 for(i = 0; i < timeout; i++)
2493 if((devpriv->stc_readw(dev, Joint_Status_2_Register) & AO_TMRDACWRs_In_Progress_St) == 0)
2498 comedi_error(dev, "timed out waiting for AO_TMRDACWRs_In_Progress_St to clear");
2501 // stc manual says we are need to clear error interrupt after AO_TMRDACWRs_In_Progress_St clears
2502 devpriv->stc_writew(dev, AO_Error_Interrupt_Ack, Interrupt_B_Ack_Register);
2504 ni_set_bits(dev, Interrupt_B_Enable_Register, interrupt_b_bits, 1);
2506 devpriv->stc_writew(dev, devpriv->ao_cmd1|AO_UI_Arm|AO_UC_Arm|AO_BC_Arm|AO_DAC1_Update_Mode|AO_DAC0_Update_Mode,
2507 AO_Command_1_Register);
2509 devpriv->stc_writew(dev, devpriv->ao_cmd2|AO_START1_Pulse,AO_Command_2_Register);
2511 s->async->inttrig=NULL;
2516 static int ni_ao_cmd(comedi_device *dev,comedi_subdevice *s)
2518 comedi_cmd *cmd = &s->async->cmd;
2525 comedi_error(dev, "cannot run command without an irq");
2528 trigvar = ni_ns_to_timer(dev, &cmd->scan_begin_arg, TRIG_ROUND_NEAREST);
2530 devpriv->stc_writew(dev, AO_Configuration_Start,Joint_Reset_Register);
2532 devpriv->stc_writew(dev, AO_Disarm,AO_Command_1_Register);
2534 if(boardtype.reg_type & ni_reg_6xxx_mask)
2536 ao_win_out(CLEAR_WG, AO_Misc_611x);
2539 for(i = 0; i < cmd->chanlist_len; i++)
2543 chan = CR_CHAN(cmd->chanlist[i]);
2545 ao_win_out(chan, AO_Waveform_Generation_611x);
2547 ao_win_out(bits, AO_Timed_611x);
2550 ni_ao_config_chanlist(dev, s, cmd->chanlist, cmd->chanlist_len, 1);
2552 if(cmd->stop_src==TRIG_NONE){
2553 devpriv->ao_mode1|=AO_Continuous;
2554 devpriv->ao_mode1&=~AO_Trigger_Once;
2556 devpriv->ao_mode1&=~AO_Continuous;
2557 devpriv->ao_mode1|=AO_Trigger_Once;
2559 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2560 devpriv->ao_trigger_select&=~(AO_START1_Polarity|AO_START1_Select(-1));
2561 devpriv->ao_trigger_select|=AO_START1_Edge|AO_START1_Sync;
2562 devpriv->stc_writew(dev, devpriv->ao_trigger_select,AO_Trigger_Select_Register);
2563 devpriv->ao_mode3&=~AO_Trigger_Length;
2564 devpriv->stc_writew(dev, devpriv->ao_mode3,AO_Mode_3_Register);
2566 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2567 devpriv->ao_mode2&=~AO_BC_Initial_Load_Source;
2568 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2569 if(cmd->stop_src==TRIG_NONE){
2570 devpriv->stc_writel(dev, 0xffffff,AO_BC_Load_A_Register);
2572 devpriv->stc_writel(dev, 0,AO_BC_Load_A_Register);
2574 devpriv->stc_writew(dev, AO_BC_Load,AO_Command_1_Register);
2575 devpriv->ao_mode2&=~AO_UC_Initial_Load_Source;
2576 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2577 switch(cmd->stop_src){
2579 devpriv->stc_writel(dev, cmd->stop_arg,AO_UC_Load_A_Register);
2580 devpriv->stc_writew(dev, AO_UC_Load,AO_Command_1_Register);
2581 devpriv->stc_writel(dev, cmd->stop_arg - 1,AO_UC_Load_A_Register);
2584 devpriv->stc_writel(dev, 0xffffff,AO_UC_Load_A_Register);
2585 devpriv->stc_writew(dev, AO_UC_Load,AO_Command_1_Register);
2586 devpriv->stc_writel(dev, 0xffffff,AO_UC_Load_A_Register);
2589 devpriv->stc_writel(dev, 0,AO_UC_Load_A_Register);
2590 devpriv->stc_writew(dev, AO_UC_Load,AO_Command_1_Register);
2591 devpriv->stc_writel(dev, cmd->stop_arg,AO_UC_Load_A_Register);
2594 devpriv->ao_cmd2&=~AO_BC_Gate_Enable;
2595 devpriv->stc_writew(dev, devpriv->ao_cmd2,AO_Command_2_Register);
2596 devpriv->ao_mode1&=~(AO_UI_Source_Select(0x1f)|AO_UI_Source_Polarity);
2597 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2598 devpriv->ao_mode2&=~(AO_UI_Reload_Mode(3)|AO_UI_Initial_Load_Source);
2599 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2600 devpriv->stc_writel(dev, 1,AO_UI_Load_A_Register);
2601 devpriv->stc_writew(dev, AO_UI_Load,AO_Command_1_Register);
2602 devpriv->stc_writel(dev, trigvar,AO_UI_Load_A_Register);
2604 if((boardtype.reg_type & ni_reg_6xxx_mask) == 0){
2605 if(cmd->scan_end_arg>1){
2606 devpriv->ao_mode1|=AO_Multiple_Channels;
2607 devpriv->stc_writew(dev, AO_Number_Of_Channels(cmd->scan_end_arg-1)|
2608 AO_UPDATE_Output_Select(1),
2609 AO_Output_Control_Register);
2611 devpriv->ao_mode1&=~AO_Multiple_Channels;
2612 unsigned bits = AO_UPDATE_Output_Select(1);
2613 if(boardtype.reg_type == ni_reg_m_series)
2614 bits |= AO_Number_Of_Channels(0);
2616 bits |= AO_Number_Of_Channels(CR_CHAN(cmd->chanlist[0]));
2617 devpriv->stc_writew(dev, bits, AO_Output_Control_Register);
2619 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2622 devpriv->stc_writew(dev, AO_DAC0_Update_Mode|AO_DAC1_Update_Mode,AO_Command_1_Register);
2624 devpriv->ao_mode3|=AO_Stop_On_Overrun_Error;
2625 devpriv->stc_writew(dev, devpriv->ao_mode3,AO_Mode_3_Register);
2627 devpriv->ao_mode2 &= ~AO_FIFO_Mode_Mask;
2629 devpriv->ao_mode2 |= AO_FIFO_Mode_HF_to_F;
2631 devpriv->ao_mode2 |= AO_FIFO_Mode_HF;
2633 devpriv->ao_mode2 &= ~AO_FIFO_Retransmit_Enable;
2634 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2636 bits = AO_BC_Source_Select | AO_UPDATE_Pulse_Width |
2637 AO_TMRDACWR_Pulse_Width;
2638 if( boardtype.ao_fifo_depth )
2639 bits |= AO_FIFO_Enable;
2641 bits |= AO_DMA_PIO_Control;
2642 if(boardtype.reg_type == ni_reg_m_series)
2643 bits |= AO_Number_Of_DAC_Packages/* | AO_Multiple_DACS_Per_Package*/;
2644 devpriv->stc_writew(dev, bits, AO_Personal_Register);
2645 // enable sending of ao dma requests
2646 devpriv->stc_writew(dev, AO_AOFREQ_Enable, AO_Start_Select_Register);
2648 devpriv->stc_writew(dev, AO_Configuration_End,Joint_Reset_Register);
2650 if(cmd->stop_src==TRIG_COUNT) {
2651 devpriv->stc_writew(dev, AO_BC_TC_Interrupt_Ack,Interrupt_B_Ack_Register);
2652 ni_set_bits(dev, Interrupt_B_Enable_Register,
2653 AO_BC_TC_Interrupt_Enable, 1);
2656 s->async->inttrig=ni_ao_inttrig;
2661 static int ni_ao_cmdtest(comedi_device *dev,comedi_subdevice *s,comedi_cmd *cmd)
2666 /* step 1: make sure trigger sources are trivially valid */
2669 cmd->start_src &= TRIG_INT;
2670 if(!cmd->start_src || tmp!=cmd->start_src)err++;
2672 tmp=cmd->scan_begin_src;
2673 cmd->scan_begin_src &= TRIG_TIMER;
2674 if(!cmd->scan_begin_src || tmp!=cmd->scan_begin_src)err++;
2676 tmp=cmd->convert_src;
2677 cmd->convert_src &= TRIG_NOW;
2678 if(!cmd->convert_src || tmp!=cmd->convert_src)err++;
2680 tmp=cmd->scan_end_src;
2681 cmd->scan_end_src &= TRIG_COUNT;
2682 if(!cmd->scan_end_src || tmp!=cmd->scan_end_src)err++;
2685 cmd->stop_src &= TRIG_COUNT|TRIG_NONE;
2686 if(!cmd->stop_src || tmp!=cmd->stop_src)err++;
2690 /* step 2: make sure trigger sources are unique and mutually compatible */
2692 if(cmd->stop_src!=TRIG_COUNT &&
2693 cmd->stop_src!=TRIG_NONE)err++;
2697 /* step 3: make sure arguments are trivially compatible */
2699 if(cmd->start_arg!=0){
2704 /* XXX need ao_speed */
2705 if(cmd->scan_begin_arg<boardtype.ao_speed){
2706 cmd->scan_begin_arg=boardtype.ao_speed;
2710 if(cmd->scan_begin_arg>devpriv->clock_ns*0xffffff){ /* XXX check */
2711 cmd->scan_begin_arg=devpriv->clock_ns*0xffffff;
2714 if(cmd->convert_arg!=0){
2718 if(cmd->scan_end_arg!=cmd->chanlist_len){
2719 cmd->scan_end_arg=cmd->chanlist_len;
2722 if(cmd->stop_src==TRIG_COUNT){ /* XXX check */
2723 if(cmd->stop_arg>0x00ffffff){
2724 cmd->stop_arg=0x00ffffff;
2729 if(cmd->stop_arg!=0){
2737 /* step 4: fix up any arguments */
2739 tmp = cmd->scan_begin_arg;
2740 ni_ns_to_timer(dev, &cmd->scan_begin_arg, cmd->flags&TRIG_ROUND_MASK);
2741 if(tmp!=cmd->scan_begin_arg)err++;
2745 /* step 5: fix up chanlist */
2753 static int ni_ao_reset(comedi_device *dev,comedi_subdevice *s)
2755 //devpriv->ao0p=0x0000;
2756 //ni_writew(devpriv->ao0p,AO_Configuration);
2758 //devpriv->ao1p=AO_Channel(1);
2759 //ni_writew(devpriv->ao1p,AO_Configuration);
2762 mite_dma_disarm(devpriv->mite, AO_DMA_CHAN);
2763 writel(CHOR_DMARESET | CHOR_FRESET, devpriv->mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
2766 devpriv->stc_writew(dev, AO_Configuration_Start,Joint_Reset_Register);
2767 devpriv->stc_writew(dev, AO_Disarm,AO_Command_1_Register);
2768 ni_set_bits(dev,Interrupt_B_Enable_Register,~0,0);
2769 devpriv->stc_writew(dev, AO_BC_Source_Select, AO_Personal_Register);
2770 devpriv->stc_writew(dev, 0x3f98,Interrupt_B_Ack_Register);
2771 devpriv->stc_writew(dev, AO_BC_Source_Select | AO_UPDATE_Pulse_Width |
2772 AO_TMRDACWR_Pulse_Width, AO_Personal_Register);
2773 devpriv->stc_writew(dev, 0,AO_Output_Control_Register);
2774 devpriv->stc_writew(dev, 0,AO_Start_Select_Register);
2776 devpriv->stc_writew(dev, devpriv->ao_cmd1,AO_Command_1_Register);
2778 devpriv->ao_mode1=0;
2779 devpriv->ao_mode2=0;
2780 if(boardtype.reg_type == ni_reg_m_series)
2781 devpriv->ao_mode3 = AO_Last_Gate_Disable;
2783 devpriv->ao_mode3 = 0;
2784 devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
2785 devpriv->ao_trigger_select=0;
2786 if(boardtype.reg_type & ni_reg_6xxx_mask){
2787 ao_win_out(0x3, AO_Immediate_671x);
2788 ao_win_out(CLEAR_WG, AO_Misc_611x);
2790 devpriv->stc_writew(dev, AO_Configuration_End, Joint_Reset_Register);
2795 static int ni_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
2796 comedi_insn *insn,lsampl_t *data)
2799 rt_printk("ni_dio_insn_config() chan=%d io=%d\n",
2800 CR_CHAN(insn->chanspec),data[0]);
2803 case INSN_CONFIG_DIO_OUTPUT:
2804 s->io_bits |= 1<<CR_CHAN(insn->chanspec);
2806 case INSN_CONFIG_DIO_INPUT:
2807 s->io_bits &= ~(1<<CR_CHAN(insn->chanspec));
2809 case INSN_CONFIG_DIO_QUERY:
2810 data[1] = (s->io_bits & (1<<CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT : COMEDI_INPUT;
2817 devpriv->dio_control &= ~DIO_Pins_Dir_Mask;
2818 devpriv->dio_control |= DIO_Pins_Dir(s->io_bits);
2819 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
2824 static int ni_dio_insn_bits(comedi_device *dev,comedi_subdevice *s,
2825 comedi_insn *insn,lsampl_t *data)
2828 rt_printk("ni_dio_insn_bits() mask=0x%x bits=0x%x\n",data[0],data[1]);
2830 if(insn->n!=2)return -EINVAL;
2832 /* Perform check to make sure we're not using the
2833 serial part of the dio */
2834 if((data[0] & (DIO_SDIN | DIO_SDOUT)) && devpriv->serial_interval_ns)
2837 s->state &= ~data[0];
2838 s->state |= (data[0]&data[1]);
2839 devpriv->dio_output &= ~DIO_Parallel_Data_Mask;
2840 devpriv->dio_output |= DIO_Parallel_Data_Out(s->state);
2841 devpriv->stc_writew(dev, devpriv->dio_output,DIO_Output_Register);
2843 data[1] = devpriv->stc_readw(dev, DIO_Parallel_Input_Register);
2848 static int ni_m_series_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
2849 comedi_insn *insn, lsampl_t *data)
2852 rt_printk("ni_m_series_dio_insn_config() chan=%d io=%d\n",
2853 CR_CHAN(insn->chanspec), data[0]);
2857 case INSN_CONFIG_DIO_OUTPUT:
2858 s->io_bits |= 1 << CR_CHAN(insn->chanspec);
2860 case INSN_CONFIG_DIO_INPUT:
2861 s->io_bits &= ~(1 << CR_CHAN(insn->chanspec));
2863 case INSN_CONFIG_DIO_QUERY:
2864 data[1] = (s->io_bits & (1<<CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT : COMEDI_INPUT;
2871 ni_writel(s->io_bits, M_Offset_DIO_Direction);
2876 static int ni_m_series_dio_insn_bits(comedi_device *dev,comedi_subdevice *s,
2877 comedi_insn *insn, lsampl_t *data)
2880 rt_printk("ni_m_series_dio_insn_bits() mask=0x%x bits=0x%x\n",data[0],data[1]);
2882 if(insn->n!=2)return -EINVAL;
2884 s->state &= ~data[0];
2885 s->state |= (data[0] & data[1]);
2886 ni_writel(s->state, M_Offset_Static_Digital_Output);
2888 data[1] = ni_readl(M_Offset_Static_Digital_Input);
2893 static int ni_serial_insn_config(comedi_device *dev,comedi_subdevice *s,
2894 comedi_insn *insn,lsampl_t *data)
2897 unsigned char byte_out, byte_in;
2899 if(insn->n!=2)return -EINVAL;
2902 case INSN_CONFIG_SERIAL_CLOCK:
2905 rt_printk("SPI serial clock Config cd\n", data[1]);
2907 devpriv->serial_hw_mode = 1;
2908 devpriv->dio_control |= DIO_HW_Serial_Enable;
2910 if(data[1] == SERIAL_DISABLED) {
2911 devpriv->serial_hw_mode = 0;
2912 devpriv->dio_control &= ~(DIO_HW_Serial_Enable |
2913 DIO_Software_Serial_Control);
2914 data[1] = SERIAL_DISABLED;
2915 devpriv->serial_interval_ns = data[1];
2917 else if(data[1] <= SERIAL_600NS) {
2918 /* Warning: this clock speed is too fast to reliably
2920 devpriv->dio_control &= ~DIO_HW_Serial_Timebase;
2921 devpriv->clock_and_fout |= Slow_Internal_Timebase;
2922 devpriv->clock_and_fout &= ~DIO_Serial_Out_Divide_By_2;
2923 data[1] = SERIAL_600NS;
2924 devpriv->serial_interval_ns = data[1];
2926 else if(data[1] <= SERIAL_1_2US) {
2927 devpriv->dio_control &= ~DIO_HW_Serial_Timebase;
2928 devpriv->clock_and_fout |= Slow_Internal_Timebase |
2929 DIO_Serial_Out_Divide_By_2;
2930 data[1] = SERIAL_1_2US;
2931 devpriv->serial_interval_ns = data[1];
2933 else if(data[1] <= SERIAL_10US) {
2934 devpriv->dio_control |= DIO_HW_Serial_Timebase;
2935 devpriv->clock_and_fout |= Slow_Internal_Timebase |
2936 DIO_Serial_Out_Divide_By_2;
2937 /* Note: DIO_Serial_Out_Divide_By_2 only affects
2938 600ns/1.2us. If you turn divide_by_2 off with the
2939 slow clock, you will still get 10us, except then
2940 all your delays are wrong. */
2941 data[1] = SERIAL_10US;
2942 devpriv->serial_interval_ns = data[1];
2945 devpriv->dio_control &= ~(DIO_HW_Serial_Enable |
2946 DIO_Software_Serial_Control);
2947 devpriv->serial_hw_mode = 0;
2948 data[1] = (data[1] / 1000) * 1000;
2949 devpriv->serial_interval_ns = data[1];
2952 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
2953 devpriv->stc_writew(dev, devpriv->clock_and_fout,Clock_and_FOUT_Register);
2958 case INSN_CONFIG_BIDIRECTIONAL_DATA:
2960 if(devpriv->serial_interval_ns == 0) {
2964 byte_out = data[1] & 0xFF;
2966 if(devpriv->serial_hw_mode) {
2967 err = ni_serial_hw_readwrite8(dev,s,byte_out,&byte_in);
2968 } else if(devpriv->serial_interval_ns > 0) {
2969 err = ni_serial_sw_readwrite8(dev,s,byte_out,&byte_in);
2971 rt_printk("ni_serial_insn_config: serial disabled!\n");
2974 if(err < 0) return err;
2975 data[1] = byte_in & 0xFF;
2985 static int ni_serial_hw_readwrite8(comedi_device *dev,comedi_subdevice *s,
2986 unsigned char data_out,
2987 unsigned char *data_in)
2989 unsigned int status1;
2990 int err = 0, count = 20;
2993 rt_printk("ni_serial_hw_readwrite8: outputting 0x%x\n", data_out);
2996 devpriv->dio_output &= ~DIO_Serial_Data_Mask;
2997 devpriv->dio_output |= DIO_Serial_Data_Out(data_out);
2998 devpriv->stc_writew(dev, devpriv->dio_output,DIO_Output_Register);
3000 status1 = devpriv->stc_readw(dev, Joint_Status_1_Register);
3001 if(status1 & DIO_Serial_IO_In_Progress_St) {
3006 devpriv->dio_control |= DIO_HW_Serial_Start;
3007 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
3008 devpriv->dio_control &= ~DIO_HW_Serial_Start;
3010 /* Wait until STC says we're done, but don't loop infinitely. */
3011 while((status1 = devpriv->stc_readw(dev, Joint_Status_1_Register)) & DIO_Serial_IO_In_Progress_St) {
3012 /* Delay one bit per loop */
3013 comedi_udelay((devpriv->serial_interval_ns + 999) / 1000);
3015 rt_printk("ni_serial_hw_readwrite8: SPI serial I/O didn't finish in time!\n");
3021 /* Delay for last bit. This delay is absolutely necessary, because
3022 DIO_Serial_IO_In_Progress_St goes high one bit too early. */
3023 comedi_udelay((devpriv->serial_interval_ns + 999) / 1000);
3025 if(data_in != NULL) {
3026 *data_in = devpriv->stc_readw(dev, DIO_Serial_Input_Register);
3028 rt_printk("ni_serial_hw_readwrite8: inputted 0x%x\n", *data_in);
3033 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
3038 static int ni_serial_sw_readwrite8(comedi_device *dev,comedi_subdevice *s,
3039 unsigned char data_out,
3040 unsigned char *data_in)
3042 unsigned char mask, input = 0;
3045 rt_printk("ni_serial_sw_readwrite8: outputting 0x%x\n", data_out);
3048 /* Wait for one bit before transfer */
3049 comedi_udelay((devpriv->serial_interval_ns + 999) / 1000);
3051 for(mask = 0x80; mask; mask >>= 1) {
3052 /* Output current bit; note that we cannot touch s->state
3053 because it is a per-subdevice field, and serial is
3054 a separate subdevice from DIO. */
3055 devpriv->dio_output &= ~DIO_SDOUT;
3056 if(data_out & mask) {
3057 devpriv->dio_output |= DIO_SDOUT;
3059 devpriv->stc_writew(dev, devpriv->dio_output,DIO_Output_Register);
3061 /* Assert SDCLK (active low, inverted), wait for half of
3062 the delay, deassert SDCLK, and wait for the other half. */
3063 devpriv->dio_control |= DIO_Software_Serial_Control;
3064 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
3066 comedi_udelay((devpriv->serial_interval_ns + 999) / 2000);
3068 devpriv->dio_control &= ~DIO_Software_Serial_Control;
3069 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
3071 comedi_udelay((devpriv->serial_interval_ns + 999) / 2000);
3073 /* Input current bit */
3074 if(devpriv->stc_readw(dev, DIO_Parallel_Input_Register) & DIO_SDIN) {
3075 /* rt_printk("DIO_P_I_R: 0x%x\n", devpriv->stc_readw(dev, DIO_Parallel_Input_Register)); */
3080 rt_printk("ni_serial_sw_readwrite8: inputted 0x%x\n", input);
3082 if(data_in) *data_in = input;
3087 static void mio_common_detach(comedi_device *dev)
3089 if(dev->subdevices && boardtype.has_8255)
3090 subdev_8255_cleanup(dev,dev->subdevices+3);
3093 static void init_ao_67xx(comedi_device *dev, comedi_subdevice *s)
3097 for(i = 0; i < s->n_chan; i++)
3098 ni_ao_win_outw(dev, AO_Channel(i) | 0x0, AO_Configuration_2_67xx);
3101 static int ni_alloc_private(comedi_device *dev)
3105 ret = alloc_private(dev, sizeof(ni_private));
3106 if(ret < 0) return ret;
3108 spin_lock_init(&devpriv->window_lock);
3113 static int ni_E_init(comedi_device *dev,comedi_devconfig *it)
3115 comedi_subdevice *s;
3118 if(boardtype.n_aochan > MAX_N_AO_CHAN)
3120 printk("bug! boardtype.n_aochan > MAX_N_AO_CHAN\n");
3124 if(alloc_subdevices(dev, 11) < 0)
3127 /* analog input subdevice */
3129 s=dev->subdevices+0;
3131 if(boardtype.n_adchan){
3132 s->type=COMEDI_SUBD_AI;
3133 s->subdev_flags=SDF_READABLE | SDF_DIFF | SDF_DITHER;
3134 if(boardtype.reg_type != ni_reg_611x)
3135 s->subdev_flags |= SDF_GROUND | SDF_COMMON | SDF_OTHER;
3136 if(boardtype.adbits > 16)
3137 s->subdev_flags |= SDF_LSAMPL;
3138 if(boardtype.reg_type == ni_reg_m_series)
3139 s->subdev_flags |= SDF_SOFT_CALIBRATED;
3140 s->n_chan=boardtype.n_adchan;
3141 s->len_chanlist=512;
3142 s->maxdata=(1<<boardtype.adbits)-1;
3143 s->range_table=ni_range_lkup[boardtype.gainlkup];
3144 s->insn_read=ni_ai_insn_read;
3145 s->insn_config=ni_ai_insn_config;
3146 s->do_cmdtest=ni_ai_cmdtest;
3147 s->do_cmd=ni_ai_cmd;
3148 s->cancel=ni_ai_reset;
3150 s->munge=ni_ai_munge;
3152 s->type=COMEDI_SUBD_UNUSED;
3155 /* analog output subdevice */
3157 s=dev->subdevices+1;
3158 if(boardtype.n_aochan){
3159 dev->write_subdev=s;
3160 s->type=COMEDI_SUBD_AO;
3161 s->subdev_flags=SDF_WRITABLE|SDF_DEGLITCH|SDF_GROUND;
3162 if(boardtype.reg_type == ni_reg_m_series)
3163 s->subdev_flags |= SDF_SOFT_CALIBRATED;
3164 s->n_chan=boardtype.n_aochan;
3165 s->maxdata=(1<<boardtype.aobits)-1;
3166 s->range_table = boardtype.ao_range_table;
3167 s->insn_read=ni_ao_insn_read;
3168 if(boardtype.reg_type & ni_reg_6xxx_mask){
3169 s->insn_write=ni_ao_insn_write_671x;
3171 s->insn_write=ni_ao_insn_write;
3174 if(boardtype.n_aochan){
3176 if(boardtype.ao_fifo_depth){
3178 s->do_cmd=ni_ao_cmd;
3179 s->do_cmdtest=ni_ao_cmdtest;
3180 s->len_chanlist = boardtype.n_aochan;
3181 if(boardtype.reg_type != ni_reg_m_series)
3182 s->munge=ni_ao_munge;
3184 s->cancel=ni_ao_reset;
3186 s->type=COMEDI_SUBD_UNUSED;
3188 if((boardtype.reg_type & ni_reg_67xx_mask))
3189 init_ao_67xx(dev, s);
3191 /* digital i/o subdevice */
3193 s=dev->subdevices+2;
3194 s->type=COMEDI_SUBD_DIO;
3195 s->subdev_flags=SDF_WRITABLE|SDF_READABLE;
3197 s->io_bits=0; /* all bits input */
3198 s->range_table=&range_digital;
3199 if(boardtype.reg_type == ni_reg_m_series)
3202 s->insn_bits = ni_m_series_dio_insn_bits;
3203 s->insn_config=ni_m_series_dio_insn_config;
3204 ni_writel(s->io_bits, M_Offset_DIO_Direction);
3208 s->insn_bits=ni_dio_insn_bits;
3209 s->insn_config=ni_dio_insn_config;
3210 devpriv->dio_control = DIO_Pins_Dir(s->io_bits);
3211 ni_writew(devpriv->dio_control, DIO_Control_Register);
3215 s=dev->subdevices+3;
3216 if(boardtype.has_8255){
3217 subdev_8255_init(dev,s,ni_8255_callback,(unsigned long)dev);
3219 s->type=COMEDI_SUBD_UNUSED;
3222 /* general purpose counter/timer device */
3223 s=dev->subdevices+4;
3224 s->type=COMEDI_SUBD_COUNTER;
3225 s->subdev_flags=SDF_READABLE|SDF_WRITABLE;
3226 s->insn_read= ni_gpct_insn_read;
3227 s->insn_write= ni_gpct_insn_write;
3228 s->insn_config=ni_gpct_insn_config;
3231 devpriv->an_trig_etc_reg = 0;
3235 /* calibration subdevice -- ai and ao */
3236 s=dev->subdevices+5;
3237 s->type=COMEDI_SUBD_CALIB;
3238 if(boardtype.reg_type == ni_reg_m_series)
3240 // internal PWM analog output used for AI nonlinearity calibration
3241 s->subdev_flags = SDF_INTERNAL;
3242 s->insn_config = &ni_m_series_pwm_config;
3245 ni_writel(0x0, M_Offset_Cal_PWM);
3246 } else if(boardtype.reg_type == ni_reg_6143)
3248 // internal PWM analog output used for AI nonlinearity calibration
3249 s->subdev_flags = SDF_INTERNAL;
3250 s->insn_config = &ni_6143_pwm_config;
3255 s->subdev_flags = SDF_WRITABLE | SDF_INTERNAL;
3256 s->insn_read = &ni_calib_insn_read;
3257 s->insn_write = &ni_calib_insn_write;
3258 caldac_setup(dev, s);
3262 s=dev->subdevices+6;
3263 s->type=COMEDI_SUBD_MEMORY;
3264 s->subdev_flags=SDF_READABLE|SDF_INTERNAL;
3266 if(boardtype.reg_type == ni_reg_m_series)
3268 s->n_chan = M_SERIES_EEPROM_SIZE;
3269 s->insn_read = &ni_m_series_eeprom_insn_read;
3273 s->insn_read = &ni_eeprom_insn_read;
3276 s=dev->subdevices + 7;
3277 s->type = COMEDI_SUBD_DIO;
3278 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3279 if(boardtype.reg_type == ni_reg_m_series)
3282 ni_writew(s->state, M_Offset_PFI_DO);
3284 for(i = 0; i < NUM_PFI_OUTPUT_SELECT_REGS; ++i)
3286 ni_writew(devpriv->pfi_output_select_reg[i], M_Offset_PFI_Output_Select(i + 1));
3293 s->insn_bits = ni_pfi_insn_bits;
3294 s->insn_config = ni_pfi_insn_config;
3295 ni_set_bits(dev, IO_Bidirection_Pin_Register, ~0, 0);
3297 /* cs5529 calibration adc */
3298 s = dev->subdevices + 8;
3299 if(boardtype.reg_type & ni_reg_67xx_mask)
3301 s->type = COMEDI_SUBD_AI;
3302 s->subdev_flags = SDF_READABLE | SDF_DIFF | SDF_INTERNAL;
3303 // one channel for each analog output channel
3304 s->n_chan = boardtype.n_aochan;
3305 s->maxdata = (1 << 16) - 1;
3306 s->range_table = &range_unknown; /* XXX */
3307 s->insn_read=cs5529_ai_insn_read;
3308 s->insn_config=NULL;
3312 s->type=COMEDI_SUBD_UNUSED;
3316 s=dev->subdevices+9;
3317 s->type=COMEDI_SUBD_SERIAL;
3318 s->subdev_flags=SDF_READABLE|SDF_WRITABLE|SDF_INTERNAL;
3321 s->insn_config = ni_serial_insn_config;
3322 devpriv->serial_interval_ns = 0;
3323 devpriv->serial_hw_mode = 0;
3326 s=dev->subdevices + 10;
3327 s->type = COMEDI_SUBD_DIO;
3328 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3331 s->insn_bits = ni_rtsi_insn_bits;
3332 s->insn_config = ni_rtsi_insn_config;
3335 /* ai configuration */
3336 ni_ai_reset(dev,dev->subdevices+0);
3337 if((boardtype.reg_type & ni_reg_6xxx_mask) == 0){
3338 // BEAM is this needed for PCI-6143 ??
3339 devpriv->clock_and_fout =
3340 Slow_Internal_Time_Divide_By_2 |
3341 Slow_Internal_Timebase |
3342 Clock_To_Board_Divide_By_2 |
3344 AI_Output_Divide_By_2 |
3345 AO_Output_Divide_By_2;
3347 devpriv->clock_and_fout =
3348 Slow_Internal_Time_Divide_By_2 |
3349 Slow_Internal_Timebase |
3350 Clock_To_Board_Divide_By_2 |
3353 devpriv->stc_writew(dev, devpriv->clock_and_fout, Clock_and_FOUT_Register);
3355 /* analog output configuration */
3356 ni_ao_reset(dev,dev->subdevices + 1);
3359 devpriv->stc_writew(dev, (IRQ_POLARITY?Interrupt_Output_Polarity:0) |
3360 (Interrupt_Output_On_3_Pins&0) |
3361 Interrupt_A_Enable |
3362 Interrupt_B_Enable |
3363 Interrupt_A_Output_Select(interrupt_pin(dev->irq)) |
3364 Interrupt_B_Output_Select(interrupt_pin(dev->irq)),
3365 Interrupt_Control_Register
3370 /* tell the STC which dma channels to use for AI and AO */
3371 bits = 1 << ( AI_DMA_CHAN );
3372 bits |= 1 << ( AO_DMA_CHAN + 4 );
3373 ni_writeb( bits, AI_AO_Select);
3374 /* tell the STC which dma channels to use for
3375 * General purpose counters 0 and 1 */
3376 bits = 1 << ( GPC0_DMA_CHAN );
3377 bits |= 1 << ( GPC1_DMA_CHAN + 4 );
3378 ni_writeb( bits, G0_G1_Select);
3380 if(boardtype.reg_type & ni_reg_6xxx_mask)
3382 ni_writeb( 0, Magic_611x );
3383 }else if(boardtype.reg_type == ni_reg_m_series)
3386 for(channel = 0; channel < boardtype.n_aochan; ++channel)
3388 ni_writeb(0xf, M_Offset_AO_Waveform_Order(channel));
3389 ni_writeb(0x0, M_Offset_AO_Reference_Attenuation(channel));
3391 ni_writeb(0x0, M_Offset_AO_Calibration);
3400 static int ni_8255_callback(int dir,int port,int data,unsigned long arg)
3402 comedi_device *dev=(comedi_device *)arg;
3405 ni_writeb(data,Port_A+2*port);
3408 return ni_readb(Port_A+2*port);
3413 presents the EEPROM as a subdevice
3416 static int ni_eeprom_insn_read(comedi_device *dev,comedi_subdevice *s,
3417 comedi_insn *insn,lsampl_t *data)
3419 data[0]=ni_read_eeprom(dev,CR_CHAN(insn->chanspec));
3425 reads bytes out of eeprom
3428 static int ni_read_eeprom(comedi_device *dev,int addr)
3433 bitstring=0x0300|((addr&0x100)<<3)|(addr&0xff);
3434 ni_writeb(0x04,Serial_Command);
3435 for(bit=0x8000;bit;bit>>=1){
3436 ni_writeb(0x04|((bit&bitstring)?0x02:0),Serial_Command);
3437 ni_writeb(0x05|((bit&bitstring)?0x02:0),Serial_Command);
3440 for(bit=0x80;bit;bit>>=1){
3441 ni_writeb(0x04,Serial_Command);
3442 ni_writeb(0x05,Serial_Command);
3443 bitstring|=((ni_readb(XXX_Status)&PROMOUT)?bit:0);
3445 ni_writeb(0x00,Serial_Command);
3450 static int ni_m_series_eeprom_insn_read(comedi_device *dev,comedi_subdevice *s,
3451 comedi_insn *insn,lsampl_t *data)
3453 data[0] = devpriv->eeprom_buffer[CR_CHAN(insn->chanspec)];
3458 static int ni_get_pwm_config(comedi_device *dev, lsampl_t *data)
3460 data[1] = devpriv->pwm_up_count * devpriv->clock_ns;
3461 data[2] = devpriv->pwm_down_count * devpriv->clock_ns;
3465 static int ni_m_series_pwm_config(comedi_device *dev, comedi_subdevice *s,
3466 comedi_insn *insn, lsampl_t *data)
3468 unsigned up_count, down_count;
3471 case INSN_CONFIG_PWM_OUTPUT:
3474 case TRIG_ROUND_NEAREST:
3475 up_count = (data[2] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3477 case TRIG_ROUND_DOWN:
3478 up_count = data[2] / devpriv->clock_ns;
3481 up_count = (data[2] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3489 case TRIG_ROUND_NEAREST:
3490 down_count = (data[4] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3492 case TRIG_ROUND_DOWN:
3493 down_count = data[4] / devpriv->clock_ns;
3496 down_count = (data[4] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3502 if(up_count * devpriv->clock_ns != data[2] ||
3503 down_count * devpriv->clock_ns != data[4])
3505 data[2] = up_count * devpriv->clock_ns;
3506 data[4] = down_count * devpriv->clock_ns;
3509 ni_writel(MSeries_Cal_PWM_High_Time_Bits(up_count) | MSeries_Cal_PWM_Low_Time_Bits(down_count), M_Offset_Cal_PWM);
3510 devpriv->pwm_up_count = up_count;
3511 devpriv->pwm_down_count = down_count;
3514 case INSN_CONFIG_GET_PWM_OUTPUT:
3515 return ni_get_pwm_config(dev, data);
3524 static int ni_6143_pwm_config(comedi_device *dev, comedi_subdevice *s,
3525 comedi_insn *insn, lsampl_t *data)
3527 unsigned up_count, down_count;
3530 case INSN_CONFIG_PWM_OUTPUT:
3533 case TRIG_ROUND_NEAREST:
3534 up_count = (data[2] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3536 case TRIG_ROUND_DOWN:
3537 up_count = data[2] / devpriv->clock_ns;
3540 up_count = (data[2] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3548 case TRIG_ROUND_NEAREST:
3549 down_count = (data[4] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3551 case TRIG_ROUND_DOWN:
3552 down_count = data[4] / devpriv->clock_ns;
3555 down_count = (data[4] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3561 if(up_count * devpriv->clock_ns != data[2] ||
3562 down_count * devpriv->clock_ns != data[4])
3564 data[2] = up_count * devpriv->clock_ns;
3565 data[4] = down_count * devpriv->clock_ns;
3568 ni_writel(up_count, Calibration_HighTime_6143);
3569 devpriv->pwm_up_count = up_count;
3570 ni_writel(down_count, Calibration_LowTime_6143);
3571 devpriv->pwm_down_count = down_count;
3574 case INSN_CONFIG_GET_PWM_OUTPUT:
3575 return ni_get_pwm_config(dev, data);
3583 static void ni_write_caldac(comedi_device *dev,int addr,int val);
3585 calibration subdevice
3587 static int ni_calib_insn_write(comedi_device *dev,comedi_subdevice *s,
3588 comedi_insn *insn,lsampl_t *data)
3590 ni_write_caldac(dev,CR_CHAN(insn->chanspec),data[0]);
3595 static int ni_calib_insn_read(comedi_device *dev,comedi_subdevice *s,
3596 comedi_insn *insn,lsampl_t *data)
3598 data[0] = devpriv->caldacs[CR_CHAN(insn->chanspec)];
3603 static int pack_mb88341(int addr,int val,int *bitstring);
3604 static int pack_dac8800(int addr,int val,int *bitstring);
3605 static int pack_dac8043(int addr,int val,int *bitstring);
3606 static int pack_ad8522(int addr,int val,int *bitstring);
3607 static int pack_ad8804(int addr,int val,int *bitstring);
3608 static int pack_ad8842(int addr,int val,int *bitstring);
3610 struct caldac_struct{
3613 int (*packbits)(int,int,int *);
3616 static struct caldac_struct caldacs[] = {
3617 [mb88341] = { 12, 8, pack_mb88341 },
3618 [dac8800] = { 8, 8, pack_dac8800 },
3619 [dac8043] = { 1, 12, pack_dac8043 },
3620 [ad8522] = { 2, 12, pack_ad8522 },
3621 [ad8804] = { 12, 8, pack_ad8804 },
3622 [ad8842] = { 8, 8, pack_ad8842 },
3623 [ad8804_debug] = { 16, 8, pack_ad8804 },
3626 static void caldac_setup(comedi_device *dev,comedi_subdevice *s)
3636 type = boardtype.caldac[0];
3637 if(type==caldac_none)return;
3638 n_bits=caldacs[type].n_bits;
3640 type = boardtype.caldac[i];
3641 if(type==caldac_none)break;
3642 if(caldacs[type].n_bits!=n_bits)diffbits=1;
3643 n_chans+=caldacs[type].n_chans;
3650 if(n_chans>MAX_N_CALDACS){
3651 printk("BUG! MAX_N_CALDACS too small\n");
3653 s->maxdata_list=devpriv->caldac_maxdata_list;
3655 for(i=0;i<n_dacs;i++){
3656 type = boardtype.caldac[i];
3657 for(j=0;j<caldacs[type].n_chans;j++){
3658 s->maxdata_list[chan]=
3659 (1<<caldacs[type].n_bits)-1;
3664 for( chan = 0; chan < s->n_chan; chan++ )
3665 ni_write_caldac( dev, i, s->maxdata_list[ i ] / 2 );
3667 type = boardtype.caldac[0];
3668 s->maxdata=(1<<caldacs[type].n_bits)-1;
3670 for( chan = 0; chan < s->n_chan; chan++ )
3671 ni_write_caldac( dev, i, s->maxdata / 2 );
3675 static void ni_write_caldac(comedi_device *dev,int addr,int val)
3677 unsigned int loadbit=0,bits=0,bit,bitstring=0;
3681 //printk("ni_write_caldac: chan=%d val=%d\n",addr,val);
3682 if( devpriv->caldacs[ addr ] == val ) return;
3683 devpriv->caldacs[ addr ] = val;
3686 type = boardtype.caldac[i];
3687 if(type==caldac_none)break;
3688 if(addr<caldacs[type].n_chans){
3689 bits=caldacs[type].packbits(addr,val,&bitstring);
3690 loadbit=SerDacLd(i);
3691 //printk("caldac: using i=%d addr=%d %x\n",i,addr,bitstring);
3694 addr-=caldacs[type].n_chans;
3697 for(bit=1<<(bits-1);bit;bit>>=1){
3698 ni_writeb(((bit&bitstring)?0x02:0),Serial_Command);
3700 ni_writeb(1|((bit&bitstring)?0x02:0),Serial_Command);
3703 ni_writeb(loadbit,Serial_Command);
3705 ni_writeb(0,Serial_Command);
3710 static int pack_mb88341(int addr,int val,int *bitstring)
3714 Note that address bits are reversed. Thanks to
3715 Ingo Keen for noticing this.
3717 Note also that the 88341 expects address values from
3718 1-12, whereas we use channel numbers 0-11. The NI
3719 docs use 1-12, also, so be careful here.
3722 *bitstring=((addr&0x1)<<11) |
3730 static int pack_dac8800(int addr,int val,int *bitstring)
3732 *bitstring=((addr&0x7)<<8)|(val&0xff);
3736 static int pack_dac8043(int addr,int val,int *bitstring)
3738 *bitstring=val&0xfff;
3742 static int pack_ad8522(int addr,int val,int *bitstring)
3744 *bitstring=(val&0xfff)|(addr ? 0xc000:0xa000);
3748 static int pack_ad8804(int addr,int val,int *bitstring)
3750 *bitstring=((addr&0xf)<<8) | (val&0xff);
3754 static int pack_ad8842(int addr,int val,int *bitstring)
3756 *bitstring=((addr+1)<<8) | (val&0xff);
3766 * General Purpose Counter/Timer section
3771 * Low level stuff...Each STC counter has two 24 bit load registers
3772 * (A&B). Just make it easier to access them.
3774 * These are inlined _only_ because they are used once in subsequent
3775 * code. Otherwise they should not be inlined.
3777 static inline void GPCT_Load_A(comedi_device *dev, int chan, unsigned int value)
3779 devpriv->stc_writel(dev, value & 0x00ffffff, G_Load_A_Register(chan));
3782 static inline void GPCT_Load_B(comedi_device *dev, int chan, unsigned int value)
3784 devpriv->stc_writel(dev, value & 0x00ffffff, G_Load_B_Register(chan));
3787 /* Load a value into the counter, using register A as the intermediate step.
3788 * You might use GPCT_Load_Using_A to load a 0x000000 into a counter
3791 static void GPCT_Load_Using_A(comedi_device *dev, int chan, unsigned int value)
3793 devpriv->gpct_mode[chan] &= (~G_Load_Source_Select);
3794 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
3795 GPCT_Load_A(dev,chan,value);
3796 devpriv->stc_writew(dev, devpriv->gpct_command[chan]|G_Load,G_Command_Register(chan));
3800 * Read the GPCTs current value.
3802 static int GPCT_G_Watch(comedi_device *dev, int chan)
3804 unsigned int hi1,hi2,lo;
3806 devpriv->gpct_command[chan] &= ~G_Save_Trace;
3807 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
3809 devpriv->gpct_command[chan] |= G_Save_Trace;
3810 devpriv->stc_writew(dev, devpriv->gpct_command[chan], G_Command_Register(chan));
3812 /* This procedure is used because the two registers cannot
3813 * be read atomically. */
3815 hi1 = devpriv->stc_readw(dev, G_Save_Register_High(chan));
3816 lo = devpriv->stc_readw(dev, G_Save_Register_Low(chan));
3817 hi2 = devpriv->stc_readw(dev, G_Save_Register_High(chan));
3820 return (hi1<<16)|lo;
3824 static int GPCT_Disarm(comedi_device *dev, int chan)
3826 devpriv->stc_writew(dev, devpriv->gpct_command[chan] | G_Disarm,G_Command_Register(chan));
3831 static int GPCT_Arm(comedi_device *dev, int chan)
3833 devpriv->stc_writew(dev, devpriv->gpct_command[chan] | G_Arm,G_Command_Register(chan));
3834 /* If the counter is doing pulse width measurement, then make
3835 sure that the counter did not start counting right away. This would
3836 indicate that we started acquiring the pulse after it had already
3837 started and our measurement would be inaccurate */
3838 if(devpriv->gpct_cur_operation[chan] == GPCT_SINGLE_PW){
3841 g_status=devpriv->stc_readw(dev, G_Status_Register);
3844 //TIM 5/2/01 possible error with very short pulses
3845 if((G0_Counting_St & g_status)|| !(G0_Armed_St&g_status)) {
3846 //error: we missed the beginning of the pulse
3847 return -EINVAL; //there is probably a more accurate error code...
3850 if((G1_Counting_St & g_status)|| !(G1_Armed_St&g_status)) {
3851 //error: we missed the beginning of the pulse
3859 static int GPCT_Set_Source(comedi_device *dev,int chan ,int source)
3861 //printk("GPCT_Set_Source...");
3862 devpriv->gpct_input_select[chan] &= ~G_Source_Select(0x1f);//reset gate to 0
3864 case GPCT_INT_CLOCK:
3865 devpriv->gpct_input_select[chan] |= G_Source_Select(0);//INT_TIMEBASE
3869 devpriv->gpct_input_select[chan] |= G_Source_Select(9);//PFI8
3871 devpriv->gpct_input_select[chan] |= G_Source_Select(4);//PFI3
3876 devpriv->stc_writew(dev, devpriv->gpct_input_select[chan], G_Input_Select_Register(chan));
3877 //printk("exit GPCT_Set_Source\n");
3881 static int GPCT_Set_Gate(comedi_device *dev,int chan ,int gate)
3883 //printk("GPCT_Set_Gate...");
3884 devpriv->gpct_input_select[chan] &= ~G_Gate_Select(0x1f);//reset gate to 0
3887 devpriv->gpct_input_select[chan] |= G_Gate_Select(31);//Low
3888 devpriv->gpct_mode[chan] |= G_Gate_Polarity;
3891 devpriv->gpct_mode[chan] &= ~G_Gate_Polarity;
3893 devpriv->gpct_input_select[chan] |= G_Gate_Select(10);//PFI9
3895 devpriv->gpct_input_select[chan] |= G_Gate_Select(5);//PFI4
3901 devpriv->stc_writew(dev, devpriv->gpct_input_select[chan], G_Input_Select_Register(chan));
3902 devpriv->stc_writew(dev, devpriv->gpct_mode[chan], G_Mode_Register(chan));
3903 //printk("exit GPCT_Set_Gate\n");
3907 static int GPCT_Set_Direction(comedi_device *dev,int chan,int direction)
3909 //printk("GPCT_Set_Direction...");
3911 devpriv->gpct_command[chan] &= ~G_Up_Down(0x3);
3912 switch (direction) {
3914 devpriv->gpct_command[chan] |= G_Up_Down(1);
3917 devpriv->gpct_command[chan] |= G_Up_Down(0);
3920 devpriv->gpct_command[chan] |= G_Up_Down(2);
3923 rt_printk("Error direction=0x%08x..",direction);
3926 devpriv->stc_writew(dev, devpriv->gpct_command[chan], G_Command_Register(chan));
3927 //TIM 4/23/01 devpriv->stc_writew(dev, devpriv->gpct_mode[chan], G_Mode_Register(chan));
3928 //printk("exit GPCT_Set_Direction\n");
3932 static void GPCT_Event_Counting(comedi_device *dev,int chan)
3935 //NOTE: possible residual bits from multibit masks can corrupt
3936 //If you config for several measurements between Resets, watch out!
3938 //printk("GPCT_Event_Counting...");
3940 devpriv->gpct_cur_operation[chan] = GPCT_SIMPLE_EVENT;
3943 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
3944 devpriv->gpct_mode[chan] |= G_Gating_Mode(1);
3946 // Trigger_Mode_For_Edge_Gate = 1
3947 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
3948 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);
3950 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
3951 //printk("exit GPCT_Event_Counting\n");
3954 static void GPCT_Period_Meas(comedi_device *dev, int chan)
3956 //printk("GPCT_Period_Meas...");
3958 devpriv->gpct_cur_operation[chan] = GPCT_SINGLE_PERIOD;
3961 //NOTE: possible residual bits from multibit masks can corrupt
3962 //If you config for several measurements between Resets, watch out!
3963 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
3964 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
3967 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
3968 devpriv->gpct_mode[chan] |= G_Output_Mode(3);
3972 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
3973 devpriv->gpct_mode[chan] |= G_Gating_Mode(2);
3975 // Trigger_Mode_For_Edge_Gate=0
3976 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
3977 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(0);
3979 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;
3980 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;
3981 devpriv->gpct_mode[chan] &= ~G_Loading_On_TC;
3982 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
3985 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
3986 devpriv->gpct_mode[chan] |= G_Stop_Mode(0);
3988 // Counting_Once = 2
3989 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
3990 devpriv->gpct_mode[chan] |= G_Counting_Once(2);
3993 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
3994 devpriv->gpct_command[chan] |= G_Up_Down(1);
3996 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
3997 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
3998 //printk("exit GPCT_Period_Meas\n");
4001 static void GPCT_Pulse_Width_Meas(comedi_device *dev, int chan)
4003 //printk("GPCT_Pulse_Width_Meas...");
4005 devpriv->gpct_cur_operation[chan] = GPCT_SINGLE_PW;
4007 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
4008 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
4011 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
4012 devpriv->gpct_mode[chan] |= G_Output_Mode(3);
4015 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
4016 devpriv->gpct_mode[chan] |= G_Gating_Mode(1);//TIM 4/24/01 was 2
4018 // Trigger_Mode_For_Edge_Gate=2
4019 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
4020 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);//TIM 4/24/01 was 0
4023 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;//TIM 4/24/01 was 1
4024 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;//TIM 4/24/01 was 0
4026 devpriv->gpct_mode[chan] &= ~G_Loading_On_TC;
4027 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
4030 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
4031 devpriv->gpct_mode[chan] |= G_Stop_Mode(0);
4033 // Counting_Once = 2
4034 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
4035 devpriv->gpct_mode[chan] |= G_Counting_Once(2);
4038 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
4039 devpriv->gpct_command[chan] |= G_Up_Down(1);
4041 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4042 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
4044 //printk("exit GPCT_Pulse_Width_Meas\n");
4047 /* GPCT_Gen_Single_Pulse() creates pulse of length pulsewidth which starts after the Arm
4048 signal is sent. The pulse is delayed by the value already in the counter. This function could
4049 be modified to send a pulse in response to a trigger event at its gate.*/
4050 static void GPCT_Gen_Single_Pulse(comedi_device *dev, int chan, unsigned int length)
4052 //printk("GPCT_Gen_Cont...");
4054 devpriv->gpct_cur_operation[chan] = GPCT_SINGLE_PULSE_OUT;
4056 // Set length of the pulse
4057 GPCT_Load_B(dev,chan, length-1);
4059 //Load next time using B, This is reset by GPCT_Load_Using_A()
4060 devpriv->gpct_mode[chan] |= G_Load_Source_Select;
4062 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
4063 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
4066 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
4067 devpriv->gpct_mode[chan] |= G_Output_Mode(2); //TIM 4/26/01 was 3
4069 //Gating Mode=0 for untriggered single pulse
4070 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
4071 devpriv->gpct_mode[chan] |= G_Gating_Mode(0); //TIM 4/25/01 was 1
4073 // Trigger_Mode_For_Edge_Gate=0
4074 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
4075 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);
4078 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;
4079 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;
4080 devpriv->gpct_mode[chan] |= G_Loading_On_TC; //TIM 4/25/01
4081 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
4084 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
4085 devpriv->gpct_mode[chan] |= G_Stop_Mode(2); //TIM 4/25/01
4087 // Counting_Once = 2
4088 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
4089 devpriv->gpct_mode[chan] |= G_Counting_Once(1); //TIM 4/25/01
4092 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
4093 devpriv->gpct_command[chan] |= G_Up_Down(0); //TIM 4/25/01 was 1
4095 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4096 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
4098 //printk("exit GPCT_Gen_Cont\n");
4101 static void GPCT_Gen_Cont_Pulse(comedi_device *dev, int chan, unsigned int length)
4103 //printk("GPCT_Gen_Cont...");
4105 devpriv->gpct_cur_operation[chan] = GPCT_CONT_PULSE_OUT;
4107 // Set length of the pulse
4108 GPCT_Load_B(dev,chan, length-1);
4110 //Load next time using B, This is reset by GPCT_Load_Using_A()
4111 devpriv->gpct_mode[chan] |= G_Load_Source_Select;
4113 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
4114 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
4117 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
4118 devpriv->gpct_mode[chan] |= G_Output_Mode(2); //TIM 4/26/01 was 3
4120 //Gating Mode=0 for untriggered single pulse
4121 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
4122 devpriv->gpct_mode[chan] |= G_Gating_Mode(0); //TIM 4/26/01 was 0
4124 // Trigger_Mode_For_Edge_Gate=0
4125 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
4126 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);
4129 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;
4130 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;
4131 devpriv->gpct_mode[chan] |= G_Loading_On_TC;
4132 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
4135 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
4136 devpriv->gpct_mode[chan] |= G_Stop_Mode(0); //TIM 4/26/01
4138 // Counting_Once = 2
4139 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
4140 devpriv->gpct_mode[chan] |= G_Counting_Once(0); //TIM 4/26/01
4143 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
4144 devpriv->gpct_command[chan] |= G_Up_Down(0);
4147 //This seems pretty unsafe since I don't think it is cleared anywhere.
4148 //I don't think this is working
4149 //devpriv->gpct_command[chan] &= ~G_Bank_Switch_Enable;
4150 //devpriv->gpct_command[chan] &= ~G_Bank_Switch_Mode;
4153 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4154 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
4156 //printk("exit GPCT_Gen_Cont\n");
4159 static void GPCT_Reset(comedi_device *dev, int chan)
4163 //printk("GPCT_Reset...");
4164 devpriv->gpct_cur_operation[chan] = GPCT_RESET;
4168 devpriv->stc_writew(dev, G0_Reset,Joint_Reset_Register);
4169 ni_set_bits(dev,Interrupt_A_Enable_Register,G0_TC_Interrupt_Enable, 0);
4170 ni_set_bits(dev,Interrupt_A_Enable_Register,G0_Gate_Interrupt_Enable,0);
4171 temp_ack_reg |= G0_Gate_Error_Confirm;
4172 temp_ack_reg |= G0_TC_Error_Confirm;
4173 temp_ack_reg |= G0_TC_Interrupt_Ack;
4174 temp_ack_reg |= G0_Gate_Interrupt_Ack;
4175 devpriv->stc_writew(dev, temp_ack_reg,Interrupt_A_Ack_Register);
4177 //problem...this interferes with the other ctr...
4178 devpriv->an_trig_etc_reg |= GPFO_0_Output_Enable;
4179 devpriv->stc_writew(dev, devpriv->an_trig_etc_reg, Analog_Trigger_Etc_Register);
4182 devpriv->stc_writew(dev, G1_Reset,Joint_Reset_Register);
4183 ni_set_bits(dev,Interrupt_B_Enable_Register,G1_TC_Interrupt_Enable, 0);
4184 ni_set_bits(dev,Interrupt_B_Enable_Register,G0_Gate_Interrupt_Enable,0);
4185 temp_ack_reg |= G1_Gate_Error_Confirm;
4186 temp_ack_reg |= G1_TC_Error_Confirm;
4187 temp_ack_reg |= G1_TC_Interrupt_Ack;
4188 temp_ack_reg |= G1_Gate_Interrupt_Ack;
4189 devpriv->stc_writew(dev, temp_ack_reg,Interrupt_B_Ack_Register);
4191 devpriv->an_trig_etc_reg |= GPFO_1_Output_Enable;
4192 devpriv->stc_writew(dev, devpriv->an_trig_etc_reg, Analog_Trigger_Etc_Register);
4196 devpriv->gpct_mode[chan] = 0;
4197 devpriv->gpct_input_select[chan] = 0;
4198 devpriv->gpct_command[chan] = 0;
4200 devpriv->gpct_command[chan] |= G_Synchronized_Gate;
4202 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4203 devpriv->stc_writew(dev, devpriv->gpct_input_select[chan],G_Input_Select_Register(chan));
4204 devpriv->stc_writew(dev, 0,G_Autoincrement_Register(chan));
4206 //printk("exit GPCT_Reset\n");
4209 static int ni_gpct_insn_config(comedi_device *dev,comedi_subdevice *s,
4210 comedi_insn *insn,lsampl_t *data)
4213 //printk("data[0] is 0x%08x, data[1] is 0x%08x\n",data[0],data[1]);
4216 if(insn->n!=1)return -EINVAL;
4217 GPCT_Reset(dev,insn->chanspec);
4219 case GPCT_SET_SOURCE:
4220 if(insn->n!=2)return -EINVAL;
4221 retval=GPCT_Set_Source(dev,insn->chanspec,data[1]);
4224 if(insn->n!=2)return -EINVAL;
4225 retval=GPCT_Set_Gate(dev,insn->chanspec,data[1]);
4227 case GPCT_SET_DIRECTION:
4228 if(insn->n!=2) return -EINVAL;
4229 retval=GPCT_Set_Direction(dev,insn->chanspec,data[1]);
4231 case GPCT_GET_INT_CLK_FRQ:
4232 if(insn->n!=2) return -EINVAL;
4233 //There are actually 2 internal clocks on the STC, we always
4234 //use the fast 20MHz one at this time. Tim Ousley 5/1/01
4235 //NOTE: This is not the final interface, ideally the user
4236 //will never need to know the int. clk. freq.
4237 data[1]=50;//50ns = 20MHz = internal timebase of STC
4239 case GPCT_SET_OPERATION:
4240 //TIM 5/1/01 if((insn->n<2)||(insn->n>3))return -EINVAL;
4242 case GPCT_SIMPLE_EVENT:
4243 GPCT_Event_Counting(dev,insn->chanspec);
4245 case GPCT_SINGLE_PERIOD:
4246 GPCT_Period_Meas(dev,insn->chanspec);
4248 case GPCT_SINGLE_PW:
4249 GPCT_Pulse_Width_Meas(dev,insn->chanspec);
4251 case GPCT_SINGLE_PULSE_OUT:
4252 GPCT_Gen_Single_Pulse(dev,insn->chanspec,data[2]);
4254 case GPCT_CONT_PULSE_OUT:
4255 GPCT_Gen_Cont_Pulse(dev,insn->chanspec,data[2]);
4258 rt_printk("unsupported GPCT operation!\n");
4263 if(insn->n!=1)return -EINVAL;
4264 retval=GPCT_Arm(dev,insn->chanspec);
4267 if(insn->n!=1)return -EINVAL;
4268 retval=GPCT_Disarm(dev,insn->chanspec);
4274 //catch any errors from return values
4278 if(data[0]!=GPCT_ARM){
4279 rt_printk("error: retval was %d\n",retval);
4280 rt_printk("data[0] is 0x%08x, data[1] is 0x%08x\n",data[0],data[1]);
4287 static int ni_gpct_insn_read(comedi_device *dev,comedi_subdevice *s,
4288 comedi_insn *insn,lsampl_t *data) {
4290 int chan=insn->chanspec;
4291 int cur_op = devpriv->gpct_cur_operation[chan];
4293 //printk("in ni_gpct_insn_read, n=%d, data[0]=%d\n",insn->chanspec,data[0]);
4294 if(insn->n!=1)return -EINVAL;
4296 data[0] = GPCT_G_Watch(dev,insn->chanspec);
4298 /* for certain modes (period and pulse width measurment), the value
4299 in the counter is not valid until the counter stops. If the value is
4300 invalid, return a 0 */
4301 if((cur_op == GPCT_SINGLE_PERIOD) || (cur_op == GPCT_SINGLE_PW)){
4302 /* is the counter still running? */
4303 if(devpriv->stc_readw(dev, G_Status_Register) & (chan?G1_Counting_St:G0_Counting_St))
4309 static int ni_gpct_insn_write(comedi_device *dev,comedi_subdevice *s,
4310 comedi_insn *insn,lsampl_t *data) {
4312 //printk("in ni_gpct_insn_write");
4313 if(insn->n!=1)return -EINVAL;
4314 GPCT_Load_Using_A(dev,insn->chanspec,data[0]);
4321 * Programmable Function Inputs
4325 static int ni_m_series_set_pfi_routing(comedi_device *dev, unsigned chan, unsigned source)
4327 if((source & 0x1f) != source) return -EINVAL;
4328 const unsigned pfi_reg_index = 1 + chan / 3;
4329 const unsigned array_offset = pfi_reg_index - 1;
4330 devpriv->pfi_output_select_reg[array_offset] &= ~MSeries_PFI_Output_Select_Mask(chan);
4331 devpriv->pfi_output_select_reg[array_offset] |= MSeries_PFI_Output_Select_Bits(chan, source);
4332 ni_writew(devpriv->pfi_output_select_reg[array_offset], M_Offset_PFI_Output_Select(pfi_reg_index));
4336 static int ni_old_set_pfi_routing(comedi_device *dev, unsigned chan, unsigned source)
4338 // pre-m-series boards have fixed signals on pfi pins
4339 if(source != ni_old_get_pfi_routing(dev, chan)) return -EINVAL;
4343 static int ni_set_pfi_routing(comedi_device *dev, unsigned chan, unsigned source)
4345 if(boardtype.reg_type == ni_reg_m_series)
4346 return ni_m_series_set_pfi_routing(dev, chan, source);
4348 return ni_old_set_pfi_routing(dev, chan, source);
4351 static unsigned ni_m_series_get_pfi_routing(comedi_device *dev, unsigned chan)
4353 const unsigned array_offset = chan / 3;
4354 return MSeries_PFI_Output_Select_Source(chan, devpriv->pfi_output_select_reg[array_offset]);
4357 static unsigned ni_old_get_pfi_routing(comedi_device *dev, unsigned chan)
4359 // pre-m-series boards have fixed signals on pfi pins
4363 return NI_PFI_OUTPUT_AI_START1;
4366 return NI_PFI_OUTPUT_AI_START2;
4369 return NI_PFI_OUTPUT_AI_CONVERT;
4372 return NI_PFI_OUTPUT_G_SRC1;
4375 return NI_PFI_OUTPUT_G_GATE1;
4378 return NI_PFI_OUTPUT_AO_UPDATE_N;
4381 return NI_PFI_OUTPUT_AO_START1;
4384 return NI_PFI_OUTPUT_AI_START_PULSE;
4387 return NI_PFI_OUTPUT_G_SRC0;
4390 return NI_PFI_OUTPUT_G_GATE0;
4393 rt_printk("%s: bug, unhandled case in switch.\n", __FUNCTION__);
4399 static unsigned ni_get_pfi_routing(comedi_device *dev, unsigned chan)
4401 if(boardtype.reg_type == ni_reg_m_series)
4402 return ni_m_series_get_pfi_routing(dev, chan);
4404 return ni_old_get_pfi_routing(dev, chan);
4407 static int ni_pfi_insn_bits(comedi_device *dev,comedi_subdevice *s,
4408 comedi_insn *insn,lsampl_t *data)
4410 if(boardtype.reg_type != ni_reg_m_series)
4417 s->state &= ~data[0];
4418 s->state |= (data[0] & data[1]);
4419 ni_writew(s->state, M_Offset_PFI_DO);
4421 data[1] = ni_readw(M_Offset_PFI_DI);
4425 static int ni_pfi_insn_config(comedi_device *dev,comedi_subdevice *s,
4426 comedi_insn *insn,lsampl_t *data)
4430 if(insn->n < 1)return -EINVAL;
4432 chan = CR_CHAN(insn->chanspec);
4436 ni_set_bits(dev, IO_Bidirection_Pin_Register, 1<<chan, 1);
4439 ni_set_bits(dev, IO_Bidirection_Pin_Register, 1<<chan, 0);
4441 case INSN_CONFIG_DIO_QUERY:
4442 data[1] = (devpriv->io_bidirection_pin_reg & (1<<chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
4445 case INSN_CONFIG_SET_ROUTING:
4446 return ni_set_pfi_routing(dev, chan, data[1]);
4448 case INSN_CONFIG_GET_ROUTING:
4449 data[1] = ni_get_pfi_routing(dev, chan);
4461 * NI RTSI Bus Functions
4464 static void ni_rtsi_init(comedi_device *dev)
4466 // Initialises the RTSI bus signal switch to a default state
4468 // Set clock mode to internal
4469 devpriv->clock_and_fout2 = MSeries_RTSI_10MHz_Bit;
4470 if(ni_set_master_clock(dev, NI_MIO_INTERNAL_CLOCK, 0) < 0)
4472 rt_printk("ni_set_master_clock failed, bug?");
4474 // default internal lines routing to RTSI bus lines
4475 devpriv->rtsi_trig_a_output_reg = RTSI_Trig_Output_Bits(0, NI_RTSI_OUTPUT_ADR_START1) |
4476 RTSI_Trig_Output_Bits(1, NI_RTSI_OUTPUT_ADR_START2) |
4477 RTSI_Trig_Output_Bits(2, NI_RTSI_OUTPUT_SCLKG) |
4478 RTSI_Trig_Output_Bits(3, NI_RTSI_OUTPUT_DACUPDN);
4479 devpriv->stc_writew(dev, devpriv->rtsi_trig_a_output_reg,
4480 RTSI_Trig_A_Output_Register);
4481 devpriv->rtsi_trig_b_output_reg = RTSI_Trig_Output_Bits(4, NI_RTSI_OUTPUT_DA_START1) |
4482 RTSI_Trig_Output_Bits(5, NI_RTSI_OUTPUT_G_SRC0) |
4483 RTSI_Trig_Output_Bits(6, NI_RTSI_OUTPUT_G_GATE0);
4484 if(boardtype.reg_type == ni_reg_m_series)
4485 devpriv->rtsi_trig_b_output_reg |= RTSI_Trig_Output_Bits(7, NI_RTSI_OUTPUT_RTSI_OSC);
4486 devpriv->stc_writew(dev, devpriv->rtsi_trig_b_output_reg,
4487 RTSI_Trig_B_Output_Register);
4489 // Sets the source and direction of the 4 on board lines
4490 // devpriv->stc_writew(dev, 0x0000, RTSI_Board_Register);
4493 static int ni_rtsi_insn_bits(comedi_device *dev,comedi_subdevice *s,
4494 comedi_insn *insn,lsampl_t *data)
4496 if(insn->n != 2) return -EINVAL;
4503 /* Find best multiplier/divider to try and get the PLL running at 80 MHz
4504 * given an arbitrary frequency input clock */
4505 static int ni_mseries_get_pll_parameters(unsigned reference_period_ns,
4506 unsigned *freq_divider, unsigned *freq_multiplier, unsigned *actual_period_ns)
4509 unsigned best_div = 1;
4510 static const unsigned max_div = 0x10;
4512 unsigned best_mult = 1;
4513 static const unsigned max_mult = 0x100;
4514 static const unsigned pico_per_nano = 1000;
4516 const unsigned reference_picosec = reference_period_ns * pico_per_nano;
4517 /* m-series wants the phased-locked loop to output 80MHz, which is divided by 4 to
4518 * 20 MHz for most timing clocks */
4519 static const unsigned target_picosec = 12500;
4520 int best_period_picosec = 0;
4521 for(div = 1; div <= max_div; ++div)
4523 for(mult = 1; mult <= max_mult; ++mult)
4525 unsigned new_period_ps = (reference_picosec * div) / mult;
4526 if(abs(new_period_ps - target_picosec) < abs(best_period_picosec - target_picosec))
4528 best_period_picosec = new_period_ps;
4534 if(best_period_picosec == 0)
4536 rt_printk("%s: bug, failed to find pll parameters\n", __FUNCTION__);
4539 *freq_divider = best_div;
4540 *freq_multiplier = best_mult;
4541 static const unsigned fudge_factor_80_to_20Mhz = 4;
4542 *actual_period_ns = (best_period_picosec * fudge_factor_80_to_20Mhz + (pico_per_nano / 2)) / pico_per_nano;
4546 static inline unsigned num_configurable_rtsi_channels(comedi_device *dev)
4548 if(boardtype.reg_type == ni_reg_m_series) return 8;
4552 static int ni_mseries_set_pll_master_clock(comedi_device *dev, unsigned source, unsigned period_ns)
4554 if(source == NI_MIO_PLL_PXI10_CLOCK) period_ns = 100;
4555 // these limits are somewhat arbitrary, but NI advertises 1 to 20MHz range so we'll use that
4556 static const unsigned min_period_ns = 50;
4557 static const unsigned max_period_ns = 1000;
4558 if(period_ns < min_period_ns || period_ns > max_period_ns)
4560 rt_printk("%s: you must specify an input clock frequency between %i and %i nanosec "
4561 "for the phased-lock loop.\n", __FUNCTION__, min_period_ns, max_period_ns);
4564 devpriv->rtsi_trig_direction_reg &= ~Use_RTSI_Clock_Bit;
4565 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4566 unsigned pll_control_bits = MSeries_PLL_Enable_Bit | MSeries_PLL_VCO_Mode_75_150MHz_Bits;
4567 devpriv->clock_and_fout2 |= MSeries_Timebase1_Select_Bit;
4568 devpriv->clock_and_fout2 &= ~MSeries_PLL_In_Source_Select_Mask;
4570 unsigned freq_divider;
4571 unsigned freq_multiplier;
4574 case NI_MIO_PLL_PXI_STAR_TRIGGER_CLOCK:
4575 devpriv->clock_and_fout2 |= MSeries_PLL_In_Source_Select_Star_Trigger_Bits;
4576 retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
4577 &freq_multiplier, &devpriv->clock_ns);
4578 if(retval < 0) return retval;
4580 case NI_MIO_PLL_PXI10_CLOCK:
4581 /* pxi clock is 10MHz */
4582 devpriv->clock_and_fout2 |= MSeries_PLL_In_Source_Select_PXI_Clock10;
4583 retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
4584 &freq_multiplier, &devpriv->clock_ns);
4585 if(retval < 0) return retval;
4589 unsigned rtsi_channel;
4590 static const unsigned max_rtsi_channel = 7;
4591 for(rtsi_channel = 0; rtsi_channel <= max_rtsi_channel; ++rtsi_channel)
4593 if(source == NI_MIO_PLL_RTSI_CLOCK(rtsi_channel))
4595 devpriv->clock_and_fout2 |= MSeries_PLL_In_Source_Select_RTSI_Bits(rtsi_channel);
4599 if(rtsi_channel > max_rtsi_channel) return -EINVAL;
4600 retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
4601 &freq_multiplier, &devpriv->clock_ns);
4602 if(retval < 0) return retval;
4606 ni_writew(devpriv->clock_and_fout2, M_Offset_Clock_and_Fout2);
4607 pll_control_bits |= MSeries_PLL_Divisor_Bits(freq_divider) | MSeries_PLL_Multiplier_Bits(freq_multiplier);
4608 // rt_printk("using divider=%i, multiplier=%i for PLL. pll_control_bits = 0x%x\n", freq_divider, freq_multiplier, pll_control_bits);
4609 // rt_printk("clock_ns=%d\n", devpriv->clock_ns);
4610 ni_writew(pll_control_bits, M_Offset_PLL_Control);
4611 devpriv->clock_source = source;
4613 static const unsigned timeout = 1000;
4614 /* it seems to typically take a few hundred microseconds for PLL to lock */
4615 for(i = 0; i < timeout; ++i)
4617 if(ni_readw(M_Offset_PLL_Status) & MSeries_PLL_Locked_Bit)
4625 rt_printk("%s: timed out waiting for PLL to lock to reference clock source %i with period %i ns.\n",
4626 __FUNCTION__, source, period_ns);
4632 static int ni_set_master_clock(comedi_device *dev, unsigned source, unsigned period_ns)
4634 if(source == NI_MIO_INTERNAL_CLOCK)
4636 devpriv->rtsi_trig_direction_reg &= ~Use_RTSI_Clock_Bit;
4637 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4638 devpriv->clock_ns = 50;
4639 if(boardtype.reg_type == ni_reg_m_series)
4641 devpriv->clock_and_fout2 &= ~(MSeries_Timebase1_Select_Bit | MSeries_Timebase3_Select_Bit);
4642 ni_writew(devpriv->clock_and_fout2, M_Offset_Clock_and_Fout2);
4643 ni_writew(0, M_Offset_PLL_Control);
4645 devpriv->clock_source = source;
4648 if(boardtype.reg_type == ni_reg_m_series)
4650 return ni_mseries_set_pll_master_clock(dev, source, period_ns);
4653 if(source == NI_MIO_RTSI_CLOCK)
4655 devpriv->rtsi_trig_direction_reg |= Use_RTSI_Clock_Bit;
4656 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4657 if(devpriv->clock_ns == 0)
4659 rt_printk("%s: we don't handle an unspecified clock period correctly yet, returning error.\n",
4664 devpriv->clock_ns = period_ns;
4666 devpriv->clock_source = source;
4674 static int ni_valid_rtsi_output_source(comedi_device *dev, unsigned chan, unsigned source)
4676 if(chan >= num_configurable_rtsi_channels(dev))
4678 if(chan == old_RTSI_clock_channel)
4680 if(source == NI_RTSI_OUTPUT_RTSI_OSC) return 1;
4683 rt_printk("%s: invalid source for channel=%i, channel %i is always the RTSI clock for pre-m-series boards.\n",
4684 __FUNCTION__, chan, old_RTSI_clock_channel);
4692 case NI_RTSI_OUTPUT_ADR_START1:
4693 case NI_RTSI_OUTPUT_ADR_START2:
4694 case NI_RTSI_OUTPUT_SCLKG:
4695 case NI_RTSI_OUTPUT_DACUPDN:
4696 case NI_RTSI_OUTPUT_DA_START1:
4697 case NI_RTSI_OUTPUT_G_SRC0:
4698 case NI_RTSI_OUTPUT_G_GATE0:
4699 case NI_RTSI_OUTPUT_RGOUT0:
4700 case NI_RTSI_OUTPUT_RTSI_BRD_0:
4703 case NI_RTSI_OUTPUT_RTSI_OSC:
4704 if(boardtype.reg_type == ni_reg_m_series)
4714 static int ni_set_rtsi_routing(comedi_device *dev, unsigned chan, unsigned source)
4716 if(ni_valid_rtsi_output_source(dev, chan, source) == 0) return -EINVAL;
4719 devpriv->rtsi_trig_a_output_reg &= ~RTSI_Trig_Output_Mask(chan);
4720 devpriv->rtsi_trig_a_output_reg |= RTSI_Trig_Output_Bits(chan, source);
4721 devpriv->stc_writew(dev, devpriv->rtsi_trig_a_output_reg,
4722 RTSI_Trig_A_Output_Register);
4725 devpriv->rtsi_trig_b_output_reg &= ~RTSI_Trig_Output_Mask(chan);
4726 devpriv->rtsi_trig_b_output_reg |= RTSI_Trig_Output_Bits(chan, source);
4727 devpriv->stc_writew(dev, devpriv->rtsi_trig_b_output_reg,
4728 RTSI_Trig_B_Output_Register);
4733 static unsigned ni_get_rtsi_routing(comedi_device *dev, unsigned chan)
4737 return RTSI_Trig_Output_Source(chan, devpriv->rtsi_trig_a_output_reg);
4738 }else if(chan < num_configurable_rtsi_channels(dev))
4740 return RTSI_Trig_Output_Source(chan, devpriv->rtsi_trig_b_output_reg);
4743 if(chan == old_RTSI_clock_channel)
4744 return NI_RTSI_OUTPUT_RTSI_OSC;
4745 rt_printk("%s: bug! should never get here?\n", __FUNCTION__);
4750 static int ni_rtsi_insn_config(comedi_device *dev,comedi_subdevice *s,
4751 comedi_insn *insn,lsampl_t *data)
4753 unsigned int chan = CR_CHAN(insn->chanspec);
4755 case INSN_CONFIG_DIO_OUTPUT:
4756 if(chan < num_configurable_rtsi_channels(dev))
4758 devpriv->rtsi_trig_direction_reg |= RTSI_Output_Bit(chan, boardtype.reg_type == ni_reg_m_series);
4759 }else if(chan == old_RTSI_clock_channel)
4761 devpriv->rtsi_trig_direction_reg |= Drive_RTSI_Clock_Bit;
4763 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4765 case INSN_CONFIG_DIO_INPUT:
4766 if(chan < num_configurable_rtsi_channels(dev))
4768 devpriv->rtsi_trig_direction_reg &= ~RTSI_Output_Bit(chan, boardtype.reg_type == ni_reg_m_series);
4769 }else if(chan == old_RTSI_clock_channel)
4771 devpriv->rtsi_trig_direction_reg &= ~Drive_RTSI_Clock_Bit;
4773 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4775 case INSN_CONFIG_DIO_QUERY:
4776 if(chan < num_configurable_rtsi_channels(dev))
4778 data[1] = (devpriv->rtsi_trig_direction_reg & RTSI_Output_Bit(chan, boardtype.reg_type == ni_reg_m_series)) ?
4779 INSN_CONFIG_DIO_OUTPUT : INSN_CONFIG_DIO_INPUT;
4780 }else if(chan == old_RTSI_clock_channel)
4782 data[1] = (devpriv->rtsi_trig_direction_reg & Drive_RTSI_Clock_Bit) ? INSN_CONFIG_DIO_OUTPUT : INSN_CONFIG_DIO_INPUT;
4786 case INSN_CONFIG_SET_CLOCK_SRC:
4787 return ni_set_master_clock(dev, data[1], data[2]);
4789 case INSN_CONFIG_GET_CLOCK_SRC:
4790 data[1] = devpriv->clock_source;
4791 data[2] = devpriv->clock_ns;
4794 case INSN_CONFIG_SET_ROUTING:
4795 return ni_set_rtsi_routing(dev, chan, data[1]);
4797 case INSN_CONFIG_GET_ROUTING:
4798 data[1] = ni_get_rtsi_routing(dev, chan);
4808 static int cs5529_wait_for_idle(comedi_device *dev)
4810 unsigned short status;
4811 const int timeout = HZ;
4814 for(i = 0; i < timeout; i++)
4816 status = ni_ao_win_inw(dev, CAL_ADC_Status_67xx);
4817 if((status & CSS_ADC_BUSY) == 0)
4821 set_current_state(TASK_INTERRUPTIBLE);
4822 if(schedule_timeout(1))
4827 //printk("looped %i times waiting for idle\n", i);
4830 rt_printk("%s: %s: timeout\n", __FILE__, __FUNCTION__);
4836 static void cs5529_command(comedi_device *dev, unsigned short value)
4838 static const int timeout = 100;
4841 ni_ao_win_outw(dev, value, CAL_ADC_Command_67xx);
4842 /* give time for command to start being serially clocked into cs5529.
4843 * this insures that the CSS_ADC_BUSY bit will get properly
4844 * set before we exit this function.
4846 for(i = 0; i < timeout; i++)
4848 if((ni_ao_win_inw(dev, CAL_ADC_Status_67xx) & CSS_ADC_BUSY))
4852 //printk("looped %i times writing command to cs5529\n", i);
4855 comedi_error(dev, "possible problem - never saw adc go busy?");
4859 /* write to cs5529 register */
4860 static void cs5529_config_write(comedi_device *dev, unsigned int value, unsigned int reg_select_bits)
4862 ni_ao_win_outw(dev, ((value >> 16) & 0xff), CAL_ADC_Config_Data_High_Word_67xx);
4863 ni_ao_win_outw(dev, (value & 0xffff), CAL_ADC_Config_Data_Low_Word_67xx);
4864 reg_select_bits &= CSCMD_REGISTER_SELECT_MASK;
4865 cs5529_command(dev, CSCMD_COMMAND | reg_select_bits);
4866 if(cs5529_wait_for_idle(dev))
4867 comedi_error(dev, "time or signal in cs5529_config_write()");
4870 /* read from cs5529 register */
4871 static unsigned int cs5529_config_read(comedi_device *dev, unsigned int reg_select_bits)
4875 reg_select_bits &= CSCMD_REGISTER_SELECT_MASK;
4876 cs5529_command(dev, CSCMD_COMMAND | CSCMD_READ | reg_select_bits);
4877 if(cs5529_wait_for_idle(dev))
4878 comedi_error(dev, "timeout or signal in cs5529_config_read()");
4879 value = (ni_ao_win_inw(dev, CAL_ADC_Config_Data_High_Word_67xx) << 16) & 0xff0000;
4880 value |= ni_ao_win_inw(dev, CAL_ADC_Config_Data_Low_Word_67xx) & 0xffff;
4884 static int cs5529_do_conversion(comedi_device *dev, unsigned short *data)
4887 unsigned short status;
4889 cs5529_command(dev, CSCMD_COMMAND | CSCMD_SINGLE_CONVERSION);
4890 retval = cs5529_wait_for_idle(dev);
4893 comedi_error(dev, "timeout or signal in cs5529_do_conversion()");
4896 status = ni_ao_win_inw(dev, CAL_ADC_Status_67xx);
4897 if(status & CSS_OSC_DETECT)
4899 rt_printk("ni_mio_common: cs5529 conversion error, status CSS_OSC_DETECT\n");
4902 if(status & CSS_OVERRANGE)
4904 rt_printk("ni_mio_common: cs5529 conversion error, overrange (ignoring)\n");
4908 *data = ni_ao_win_inw(dev, CAL_ADC_Data_67xx);
4909 /* cs5529 returns 16 bit signed data in bipolar mode */
4915 static int cs5529_ai_insn_read(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data)
4918 unsigned short sample;
4919 unsigned int channel_select;
4920 const unsigned int INTERNAL_REF = 0x1000;
4922 /* Set calibration adc source. Docs lie, reference select bits 8 to 11
4923 * do nothing. bit 12 seems to chooses internal reference voltage, bit
4924 * 13 causes the adc input to go overrange (maybe reads external reference?) */
4925 if(insn->chanspec & CR_ALT_SOURCE)
4926 channel_select = INTERNAL_REF;
4928 channel_select = CR_CHAN(insn->chanspec);
4929 ni_ao_win_outw(dev, channel_select, AO_Calibration_Channel_Select_67xx);
4931 for(n = 0; n < insn->n; n++)
4933 retval = cs5529_do_conversion(dev, &sample);
4934 if(retval < 0) return retval;
4940 static int init_cs5529(comedi_device *dev)
4942 unsigned int config_bits = CSCFG_PORT_MODE | CSCFG_WORD_RATE_2180_CYCLES;
4945 /* do self-calibration */
4946 cs5529_config_write(dev, config_bits | CSCFG_SELF_CAL_OFFSET_GAIN, CSCMD_CONFIG_REGISTER);
4947 /* need to force a conversion for calibration to run */
4948 cs5529_do_conversion(dev, NULL);
4950 /* force gain calibration to 1 */
4951 cs5529_config_write(dev, 0x400000, CSCMD_GAIN_REGISTER);
4952 cs5529_config_write(dev, config_bits | CSCFG_SELF_CAL_OFFSET, CSCMD_CONFIG_REGISTER);
4953 if(cs5529_wait_for_idle(dev))
4954 comedi_error(dev, "timeout or signal in init_cs5529()\n");
4958 rt_printk("config: 0x%x\n", cs5529_config_read(dev, CSCMD_CONFIG_REGISTER));
4959 rt_printk("gain: 0x%x\n", cs5529_config_read(dev, CSCMD_GAIN_REGISTER));
4960 rt_printk("offset: 0x%x\n", cs5529_config_read(dev, CSCMD_OFFSET_REGISTER));