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);
285 static int ni_gpct_cmd(comedi_device *dev,comedi_subdevice *s);
286 static int ni_gpct_cmdtest(comedi_device *dev, comedi_subdevice *s, comedi_cmd *cmd);
287 static int ni_gpct_cancel(comedi_device *dev,comedi_subdevice *s);
289 static int init_cs5529(comedi_device *dev);
290 static int cs5529_do_conversion(comedi_device *dev, unsigned short *data);
291 static int cs5529_ai_insn_read(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data);
292 static unsigned int cs5529_config_read(comedi_device *dev, unsigned int reg_select_bits);
293 static void cs5529_config_write(comedi_device *dev, unsigned int value, unsigned int reg_select_bits);
295 static int ni_m_series_pwm_config(comedi_device *dev, comedi_subdevice *s,
296 comedi_insn *insn,lsampl_t *data);
297 static int ni_6143_pwm_config(comedi_device *dev, comedi_subdevice *s,
298 comedi_insn *insn, lsampl_t *data);
300 static int ni_set_master_clock(comedi_device *dev, unsigned source, unsigned period_ns);
305 AIMODE_HALF_FULL = 1,
310 #define SERIAL_DISABLED 0
311 #define SERIAL_600NS 600
312 #define SERIAL_1_2US 1200
313 #define SERIAL_10US 10000
315 static const int num_adc_stages_611x = 3;
317 static void handle_a_interrupt(comedi_device *dev,unsigned short status,
318 unsigned int m_status);
319 static void handle_b_interrupt(comedi_device *dev,unsigned short status,
320 unsigned int m_status);
321 static void get_last_sample_611x( comedi_device *dev );
322 static void get_last_sample_6143( comedi_device *dev );
324 //static void mite_handle_interrupt(comedi_device *dev,unsigned int status);
325 static int ni_ai_drain_dma(comedi_device *dev );
328 static void ni_flush_ai_fifo(comedi_device *dev){
329 if(boardtype.reg_type == ni_reg_6143){
330 // Flush the 6143 data FIFO
331 ni_writel(0x10, AIFIFO_Control_6143); // Flush fifo
332 ni_writel(0x00, AIFIFO_Control_6143); // Flush fifo
333 while(ni_readl(AIFIFO_Status_6143) & 0x10); // Wait for complete
336 devpriv->stc_writew(dev, 1,ADC_FIFO_Clear);
340 static void win_out2(comedi_device *dev, uint32_t data, int reg)
342 devpriv->stc_writew(dev, data >> 16, reg);
343 devpriv->stc_writew(dev, data & 0xffff, reg + 1);
346 #define ao_win_out(data,addr) ni_ao_win_outw(dev,data,addr)
347 static inline void ni_ao_win_outw( comedi_device *dev, uint16_t data, int addr )
351 comedi_spin_lock_irqsave(&devpriv->window_lock,flags);
352 ni_writew(addr,AO_Window_Address_611x);
353 ni_writew(data,AO_Window_Data_611x);
354 comedi_spin_unlock_irqrestore(&devpriv->window_lock,flags);
357 static inline void ni_ao_win_outl(comedi_device *dev, uint32_t data, int addr)
361 comedi_spin_lock_irqsave(&devpriv->window_lock,flags);
362 ni_writew(addr,AO_Window_Address_611x);
363 ni_writel(data,AO_Window_Data_611x);
364 comedi_spin_unlock_irqrestore(&devpriv->window_lock,flags);
367 static inline unsigned short ni_ao_win_inw( comedi_device *dev, int addr )
372 comedi_spin_lock_irqsave(&devpriv->window_lock,flags);
373 ni_writew(addr, AO_Window_Address_611x);
374 data = ni_readw(AO_Window_Data_611x);
375 comedi_spin_unlock_irqrestore(&devpriv->window_lock,flags);
379 /* ni_set_bits( ) allows different parts of the ni_mio_common driver to
380 * share registers (such as Interrupt_A_Register) without interfering with
383 * NOTE: the switch/case statements are optimized out for a constant argument
384 * so this is actually quite fast--- If you must wrap another function around this
385 * make it inline to avoid a large speed penalty.
387 * value should only be 1 or 0.
389 static inline void ni_set_bits(comedi_device *dev, int reg, int bits, int value)
393 comedi_spin_lock_irqsave( &devpriv->window_lock, flags );
395 case Interrupt_A_Enable_Register:
397 devpriv->int_a_enable_reg |= bits;
399 devpriv->int_a_enable_reg &= ~bits;
400 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
401 devpriv->stc_writew(dev, devpriv->int_a_enable_reg,Interrupt_A_Enable_Register);
403 case Interrupt_B_Enable_Register:
405 devpriv->int_b_enable_reg |= bits;
407 devpriv->int_b_enable_reg &= ~bits;
408 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
409 devpriv->stc_writew(dev, devpriv->int_b_enable_reg,Interrupt_B_Enable_Register);
411 case IO_Bidirection_Pin_Register:
413 devpriv->io_bidirection_pin_reg |= bits;
415 devpriv->io_bidirection_pin_reg &= ~bits;
416 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
417 devpriv->stc_writew(dev, devpriv->io_bidirection_pin_reg,IO_Bidirection_Pin_Register);
420 rt_printk("Warning ni_set_bits() called with invalid arguments\n");
421 rt_printk("reg is %d\n",reg);
422 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
428 static irqreturn_t ni_E_interrupt(int irq,void *d,struct pt_regs * regs)
430 comedi_device *dev=d;
431 unsigned short a_status;
432 unsigned short b_status;
433 unsigned int m0_status;
434 unsigned int m1_status;
437 struct mite_struct *mite = devpriv->mite;
440 if(dev->attached == 0) return IRQ_NONE;
441 // lock to avoid race with comedi_poll
442 comedi_spin_lock_irqsave(&dev->spinlock, flags);
443 a_status=devpriv->stc_readw(dev, AI_Status_1_Register);
444 b_status=devpriv->stc_readw(dev, AO_Status_1_Register);
446 m0_status=readl(mite->mite_io_addr + MITE_CHSR(AI_DMA_CHAN));
447 m1_status=readl(mite->mite_io_addr + MITE_CHSR(AO_DMA_CHAN));
453 if(a_status&Interrupt_A_St || m0_status & CHSR_INT )
454 handle_a_interrupt(dev, a_status, m0_status);
455 if(b_status&Interrupt_B_St || m1_status & CHSR_INT )
456 handle_b_interrupt(dev, b_status, m1_status);
457 comedi_spin_unlock_irqrestore(&dev->spinlock, flags);
462 static void ni_sync_ai_dma(struct mite_struct *mite, comedi_device *dev)
465 comedi_subdevice *s = dev->subdevices + 0;
466 comedi_async *async = s->async;
467 unsigned int nbytes, old_alloc_count;
468 unsigned int bytes_per_scan = bytes_per_sample(s) * async->cmd.chanlist_len;
470 old_alloc_count = async->buf_write_alloc_count;
471 // write alloc as much as we can
472 comedi_buf_write_alloc(s->async, s->async->prealloc_bufsz);
474 nbytes = mite_bytes_written_to_memory_lb(mite, AI_DMA_CHAN);
476 if( (int)(mite_bytes_written_to_memory_ub(mite, AI_DMA_CHAN) - old_alloc_count) > 0 ){
477 rt_printk("ni_mio_common: DMA overwrite of free area\n");
479 async->events |= COMEDI_CB_OVERFLOW;
483 count = nbytes - async->buf_write_count;
485 /* it's possible count will be negative due to
486 * conservative value returned by mite_bytes_transferred */
489 comedi_buf_write_free(async, count);
491 async->scan_progress += count;
492 if( async->scan_progress >= bytes_per_scan )
494 async->scan_progress %= bytes_per_scan;
495 async->events |= COMEDI_CB_EOS;
497 async->events |= COMEDI_CB_BLOCK;
500 static void mite_handle_b_linkc(struct mite_struct *mite, comedi_device *dev)
503 comedi_subdevice *s = dev->subdevices + 1;
504 comedi_async *async = s->async;
505 u32 nbytes_ub, nbytes_lb;
506 unsigned int new_write_count;
507 u32 stop_count = async->cmd.stop_arg * sizeof(sampl_t);
509 writel(CHOR_CLRLC, mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
511 new_write_count = async->buf_write_count;
513 nbytes_lb = mite_bytes_read_from_memory_lb(mite, AO_DMA_CHAN);
514 if(async->cmd.stop_src == TRIG_COUNT &&
515 (int) (nbytes_lb - stop_count) > 0)
516 nbytes_lb = stop_count;
518 nbytes_ub = mite_bytes_read_from_memory_ub(mite, AO_DMA_CHAN);
519 if(async->cmd.stop_src == TRIG_COUNT &&
520 (int) (nbytes_ub - stop_count) > 0)
521 nbytes_ub = stop_count;
522 if((int)(nbytes_ub - devpriv->last_buf_write_count) > 0){
523 rt_printk("ni_mio_common: DMA underrun\n");
525 async->events |= COMEDI_CB_OVERFLOW;
529 devpriv->last_buf_write_count = new_write_count;
531 count = nbytes_lb - async->buf_read_count;
535 comedi_buf_read_free(async, count);
537 async->events |= COMEDI_CB_BLOCK;
539 // #define DEBUG_DMA_TIMING
540 static int ni_ao_wait_for_dma_load( comedi_device *dev )
542 static const int timeout = 10000;
544 #ifdef DEBUG_DMA_TIMING
545 struct timeval start;
546 do_gettimeofday(&start);
548 for(i = 0; i < timeout; i++)
550 unsigned short b_status;
552 b_status = devpriv->stc_readw(dev, AO_Status_1_Register);
553 if( b_status & AO_FIFO_Half_Full_St )
555 /* if we poll too often, the pci bus activity seems
556 to slow the dma transfer down */
559 #ifdef DEBUG_DMA_TIMING
560 rt_printk("looped %i times waiting for ao fifo load.\n", i);
562 do_gettimeofday(&now);
563 unsigned elapsed_usec = 1000000 * (now.tv_sec - start.tv_sec) + now.tv_usec - start.tv_usec;
564 rt_printk("total elapsed usec=%i\n", elapsed_usec);
565 do_gettimeofday(&start);
567 for(i = 0; i < 100; ++i)
569 // devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
570 b_status = devpriv->stc_readw(dev, AO_Status_1_Register);
572 do_gettimeofday(&now);
573 elapsed_usec = 1000000 * (now.tv_sec - start.tv_sec) + now.tv_usec - start.tv_usec;
574 rt_printk("usec to do 100 word xfers=%i\n", elapsed_usec);
578 comedi_error(dev, "timed out waiting for dma load");
585 static void ni_handle_eos(comedi_device *dev, comedi_subdevice *s)
587 if(devpriv->aimode == AIMODE_SCAN)
590 static const int timeout = 10;
593 for(i = 0; i < timeout; i++)
595 ni_sync_ai_dma(devpriv->mite, dev);
596 if((s->async->events & COMEDI_CB_EOS)) break;
600 ni_handle_fifo_dregs(dev);
601 s->async->events |= COMEDI_CB_EOS;
604 /* handle special case of single scan using AI_End_On_End_Of_Scan */
605 if((devpriv->ai_cmd2 & AI_End_On_End_Of_Scan)){
606 shutdown_ai_command( dev );
611 static void shutdown_ai_command( comedi_device *dev )
613 comedi_subdevice *s = dev->subdevices + 0;
616 ni_ai_drain_dma( dev );
617 mite_dma_disarm(devpriv->mite, AI_DMA_CHAN);
619 ni_handle_fifo_dregs(dev);
620 get_last_sample_611x(dev);
621 get_last_sample_6143(dev);
623 ni_set_bits(dev, Interrupt_A_Enable_Register,
624 AI_SC_TC_Interrupt_Enable | AI_START1_Interrupt_Enable|
625 AI_START2_Interrupt_Enable| AI_START_Interrupt_Enable|
626 AI_STOP_Interrupt_Enable| AI_Error_Interrupt_Enable|
627 AI_FIFO_Interrupt_Enable,0);
629 s->async->events |= COMEDI_CB_EOA;
632 static void handle_a_interrupt(comedi_device *dev,unsigned short status,
633 unsigned int m_status)
635 comedi_subdevice *s=dev->subdevices+0;
636 unsigned short ack=0;
638 s->async->events = 0;
640 #ifdef DEBUG_INTERRUPT
641 rt_printk("ni_mio_common: interrupt: a_status=%04x m0_status=%08x\n",
643 ni_mio_print_status_a(status);
648 /* Currently, mite.c requires us to handle LINKC and DONE */
649 if(m_status & CHSR_LINKC){
650 writel(CHOR_CLRLC, devpriv->mite->mite_io_addr + MITE_CHOR(AI_DMA_CHAN));
651 ni_sync_ai_dma(devpriv->mite, dev);
654 if(m_status & CHSR_DONE){
655 writel(CHOR_CLRDONE, devpriv->mite->mite_io_addr + MITE_CHOR(AI_DMA_CHAN));
658 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)){
659 rt_printk("unknown mite interrupt, ack! (m_status=%08x)\n", m_status);
660 //mite_print_chsr(m_status);
661 mite_dma_disarm(devpriv->mite, AI_DMA_CHAN );
662 writel(CHOR_DMARESET, devpriv->mite->mite_io_addr + MITE_CHOR(AI_DMA_CHAN));
663 //disable_irq(dev->irq);
667 /* test for all uncommon interrupt events at the same time */
668 if(status&(AI_Overrun_St|AI_Overflow_St|AI_SC_TC_Error_St|AI_SC_TC_St|AI_START1_St)){
670 rt_printk("ni_mio_common: a_status=0xffff. Card removed?\n");
671 /* we probably aren't even running a command now,
672 * so it's a good idea to be careful. */
673 if(s->subdev_flags&SDF_RUNNING){
674 s->async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
675 //comedi_event(dev,s,s->async->events);
679 if(status&(AI_Overrun_St|AI_Overflow_St|AI_SC_TC_Error_St)){
680 rt_printk("ni_mio_common: ai error a_status=%04x\n",
682 ni_mio_print_status_a(status);
684 ni_ai_reset(dev,dev->subdevices);
687 shutdown_ai_command( dev );
689 s->async->events |= COMEDI_CB_ERROR;
690 if(status & (AI_Overrun_St | AI_Overflow_St))
691 s->async->events |= COMEDI_CB_OVERFLOW;
693 comedi_event(dev,s,s->async->events);
697 if(status&AI_SC_TC_St){
698 #ifdef DEBUG_INTERRUPT
699 rt_printk("ni_mio_common: SC_TC interrupt\n");
701 if(!devpriv->ai_continuous){
702 shutdown_ai_command( dev );
704 ack|=AI_SC_TC_Interrupt_Ack;
706 if(status&AI_START1_St){
707 ack|=AI_START1_Interrupt_Ack;
711 if(status&AI_FIFO_Half_Full_St){
713 static const int timeout = 10;
714 /* pcmcia cards (at least 6036) seem to stop producing interrupts if we
715 *fail to get the fifo less than half full, so loop to be sure.*/
716 for(i = 0; i < timeout; ++i)
718 ni_handle_fifo_half_full(dev);
719 if((devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Half_Full_St) == 0)
725 if( (status & AI_STOP_St) ){
726 ni_handle_eos(dev, s);
727 /* we need to ack the START, also */
728 ack |= AI_STOP_Interrupt_Ack|AI_START_Interrupt_Ack;
731 if(devpriv->aimode==AIMODE_SAMPLE){
732 ni_handle_fifo_dregs(dev);
734 //s->async->events |= COMEDI_CB_SAMPLE;
737 if(ack) devpriv->stc_writew(dev, ack,Interrupt_A_Ack_Register);
739 comedi_event(dev,s,s->async->events);
741 #ifdef DEBUG_INTERRUPT
742 status=devpriv->stc_readw(dev, AI_Status_1_Register);
743 if(status&Interrupt_A_St){
744 rt_printk("handle_a_interrupt: didn't clear interrupt? status=0x%x\n", status);
749 static void handle_b_interrupt(comedi_device *dev,unsigned short b_status, unsigned int m_status)
751 comedi_subdevice *s=dev->subdevices+1;
752 //unsigned short ack=0;
753 #ifdef DEBUG_INTERRUPT
754 rt_printk("ni_mio_common: interrupt: b_status=%04x m1_status=%08x\n",
756 ni_mio_print_status_b(b_status);
761 /* Currently, mite.c requires us to handle LINKC and DONE */
762 if(m_status & CHSR_LINKC){
763 mite_handle_b_linkc(devpriv->mite, dev);
766 if(m_status & CHSR_DONE){
767 writel(CHOR_CLRDONE, devpriv->mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
770 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)){
771 rt_printk("unknown mite interrupt, ack! (m_status=%08x)\n", m_status);
772 //mite_print_chsr(m_status);
773 mite_dma_disarm(devpriv->mite, AO_DMA_CHAN );
774 writel(CHOR_DMARESET, devpriv->mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
778 if(b_status==0xffff)return;
779 if(b_status&AO_Overrun_St){
780 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));
782 s->async->events |= COMEDI_CB_OVERFLOW;
785 if(b_status&AO_BC_TC_St){
786 MDPRINTK("ni_mio_common: AO BC_TC status=0x%04x status2=0x%04x\n",b_status,devpriv->stc_readw(dev, AO_Status_2_Register));
788 s->async->events |= COMEDI_CB_EOA;
792 if(b_status&AO_FIFO_Request_St){
795 ret = ni_ao_fifo_half_empty(dev,s);
797 rt_printk("ni_mio_common: AO buffer underrun\n");
798 ni_set_bits(dev, Interrupt_B_Enable_Register,
799 AO_FIFO_Interrupt_Enable|AO_Error_Interrupt_Enable, 0);
800 s->async->events |= COMEDI_CB_OVERFLOW;
805 b_status=devpriv->stc_readw(dev, AO_Status_1_Register);
806 if(b_status&Interrupt_B_St){
807 if(b_status&AO_FIFO_Request_St){
808 rt_printk("ni_mio_common: AO buffer underrun\n");
810 rt_printk("Ack! didn't clear AO interrupt. b_status=0x%04x\n",b_status);
811 ni_set_bits(dev,Interrupt_B_Enable_Register,~0,0);
813 s->async->events |= COMEDI_CB_OVERFLOW;
816 comedi_event(dev,s,s->async->events);
819 #ifdef DEBUG_STATUS_A
820 static char *status_a_strings[]={
821 "passthru0","fifo","G0_gate","G0_TC",
822 "stop","start","sc_tc","start1",
823 "start2","sc_tc_error","overflow","overrun",
824 "fifo_empty","fifo_half_full","fifo_full","interrupt_a"
827 static void ni_mio_print_status_a(int status)
831 rt_printk("A status:");
834 rt_printk(" %s",status_a_strings[i]);
841 #ifdef DEBUG_STATUS_B
842 static char *status_b_strings[]={
843 "passthru1","fifo","G1_gate","G1_TC",
844 "UI2_TC","UPDATE","UC_TC","BC_TC",
845 "start1","overrun","start","bc_tc_error",
846 "fifo_empty","fifo_half_full","fifo_full","interrupt_b"
849 static void ni_mio_print_status_b(int status)
853 rt_printk("B status:");
856 rt_printk(" %s",status_b_strings[i]);
865 static void ni_ao_fifo_load(comedi_device *dev,comedi_subdevice *s, int n)
867 comedi_async *async = s->async;
868 comedi_cmd *cmd = &async->cmd;
876 chan = async->cur_chan;
878 err &= comedi_buf_get(async, &d);
881 range = CR_RANGE(cmd->chanlist[chan]);
883 if(boardtype.reg_type & ni_reg_6xxx_mask)
885 packed_data = d & 0xffff;
886 /* 6711 only has 16 bit wide ao fifo */
887 if(boardtype.reg_type != ni_reg_6711)
889 err &= comedi_buf_get(async, &d);
893 packed_data |= ( d << 16 ) & 0xffff0000;
895 ni_writel( packed_data, DAC_FIFO_Data_611x );
897 ni_writew(d, DAC_FIFO_Data);
900 chan %= cmd->chanlist_len;
902 async->cur_chan = chan;
904 async->events |= COMEDI_CB_OVERFLOW;
909 * There's a small problem if the FIFO gets really low and we
910 * don't have the data to fill it. Basically, if after we fill
911 * the FIFO with all the data available, the FIFO is _still_
912 * less than half full, we never clear the interrupt. If the
913 * IRQ is in edge mode, we never get another interrupt, because
914 * this one wasn't cleared. If in level mode, we get flooded
915 * with interrupts that we can't fulfill, because nothing ever
916 * gets put into the buffer.
918 * This kind of situation is recoverable, but it is easier to
919 * just pretend we had a FIFO underrun, since there is a good
920 * chance it will happen anyway. This is _not_ the case for
921 * RT code, as RT code might purposely be running close to the
922 * metal. Needs to be fixed eventually.
924 static int ni_ao_fifo_half_empty(comedi_device *dev,comedi_subdevice *s)
928 n = comedi_buf_read_n_available(s);
930 s->async->events |= COMEDI_CB_OVERFLOW;
934 n /= sizeof(sampl_t);
935 if(n > boardtype.ao_fifo_depth / 2)
936 n = boardtype.ao_fifo_depth / 2;
938 ni_ao_fifo_load(dev,s,n);
940 s->async->events |= COMEDI_CB_BLOCK;
945 static int ni_ao_prep_fifo(comedi_device *dev,comedi_subdevice *s)
950 devpriv->stc_writew(dev, 1,DAC_FIFO_Clear);
951 if(boardtype.reg_type & ni_reg_6xxx_mask)
952 ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x);
955 n = comedi_buf_read_n_available(s);
958 n /= sizeof(sampl_t);
959 if(n > boardtype.ao_fifo_depth)
960 n = boardtype.ao_fifo_depth;
962 ni_ao_fifo_load(dev,s,n);
967 static void ni_ai_fifo_read(comedi_device *dev,comedi_subdevice *s,
970 comedi_async *async = s->async;
973 if(boardtype.reg_type == ni_reg_611x){
977 for( i = 0; i < n / 2; i++ ){
978 dl=ni_readl(ADC_FIFO_Data_611x);
979 /* This may get the hi/lo data in the wrong order */
980 data[0] = (dl>>16) & 0xffff;
981 data[1] = dl & 0xffff;
982 cfc_write_array_to_buffer(s, data, sizeof(data));
984 /* Check if there's a single sample stuck in the FIFO */
986 dl=ni_readl(ADC_FIFO_Data_611x);
987 data[0] = dl & 0xffff;
988 cfc_write_to_buffer(s, data[0]);
990 } else if(boardtype.reg_type == ni_reg_6143){
994 // This just reads the FIFO assuming the data is present, no checks on the FIFO status are performed
995 for(i = 0; i < n / 2; i++){
996 dl = ni_readl(AIFIFO_Data_6143);
998 data[0] = (dl >> 16) & 0xffff;
999 data[1] = dl & 0xffff;
1000 cfc_write_array_to_buffer(s, data, sizeof(data));
1003 /* Assume there is a single sample stuck in the FIFO */
1004 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
1005 dl = ni_readl(AIFIFO_Data_6143);
1006 data[0] = (dl >> 16) & 0xffff;
1007 cfc_write_to_buffer(s, data[0]);
1010 if( n > sizeof(devpriv->ai_fifo_buffer) / sizeof(devpriv->ai_fifo_buffer[0]))
1012 comedi_error( dev, "bug! ai_fifo_buffer too small" );
1013 async->events |= COMEDI_CB_ERROR;
1016 for(i = 0; i < n; i++){
1017 devpriv->ai_fifo_buffer[i] = ni_readw(ADC_FIFO_Data_Register);
1019 cfc_write_array_to_buffer( s, devpriv->ai_fifo_buffer,
1020 n * sizeof(devpriv->ai_fifo_buffer[0]) );
1024 static void ni_handle_fifo_half_full(comedi_device *dev)
1027 comedi_subdevice *s=dev->subdevices+0;
1029 n=boardtype.ai_fifo_depth/2;
1031 ni_ai_fifo_read(dev,s,n);
1036 static int ni_ai_drain_dma(comedi_device *dev )
1038 struct mite_struct *mite = devpriv->mite;
1040 static const int timeout = 10000;
1042 for( i = 0; i < timeout; i++ )
1044 if((devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St) &&
1045 mite_bytes_in_transit(mite, AI_DMA_CHAN) == 0)
1051 rt_printk("ni_mio_common: wait for dma drain timed out\n");
1052 rt_printk("mite_bytes_in_transit=%i, AI_Status1_Register=0x%x\n",
1053 mite_bytes_in_transit(mite, AI_DMA_CHAN), devpriv->stc_readw(dev, AI_Status_1_Register));
1057 ni_sync_ai_dma( mite, dev );
1065 static void ni_handle_fifo_dregs(comedi_device *dev)
1067 comedi_subdevice *s=dev->subdevices+0;
1073 if(boardtype.reg_type == ni_reg_611x){
1074 while((devpriv->stc_readw(dev, AI_Status_1_Register)&AI_FIFO_Empty_St) == 0){
1075 dl=ni_readl(ADC_FIFO_Data_611x);
1077 /* This may get the hi/lo data in the wrong order */
1079 data[1] = (dl&0xffff);
1080 cfc_write_array_to_buffer(s, data, sizeof(data));
1082 }else if(boardtype.reg_type == ni_reg_6143){
1084 while(ni_readl(AIFIFO_Status_6143) & 0x04){
1085 dl = ni_readl(AIFIFO_Data_6143);
1087 /* This may get the hi/lo data in the wrong order */
1088 data[0] = (dl >> 16);
1089 data[1] = (dl & 0xffff);
1090 cfc_write_array_to_buffer(s, data, sizeof(data));
1093 // Check if stranded sample is present
1094 if(ni_readl(AIFIFO_Status_6143) & 0x01){
1095 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
1096 dl = ni_readl(AIFIFO_Data_6143);
1097 data[0] = (dl >> 16) & 0xffff;
1098 cfc_write_to_buffer(s, data[0]);
1102 fifo_empty = devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St;
1103 while(fifo_empty == 0)
1105 for(i = 0; i < sizeof(devpriv->ai_fifo_buffer) / sizeof(devpriv->ai_fifo_buffer[0]); i++)
1107 fifo_empty = devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St;
1108 if(fifo_empty) break;
1109 devpriv->ai_fifo_buffer[i] = ni_readw(ADC_FIFO_Data_Register);
1111 cfc_write_array_to_buffer( s, devpriv->ai_fifo_buffer,
1112 i * sizeof(devpriv->ai_fifo_buffer[0]) );
1117 static void get_last_sample_611x( comedi_device *dev )
1119 comedi_subdevice *s=dev->subdevices+0;
1123 if(boardtype.reg_type != ni_reg_611x) return;
1125 /* Check if there's a single sample stuck in the FIFO */
1126 if(ni_readb(XXX_Status)&0x80){
1127 dl=ni_readl(ADC_FIFO_Data_611x);
1129 cfc_write_to_buffer(s, data);
1133 static void get_last_sample_6143(comedi_device* dev)
1135 comedi_subdevice* s = dev->subdevices + 0;
1139 if(boardtype.reg_type != ni_reg_6143) return;
1141 /* Check if there's a single sample stuck in the FIFO */
1142 if(ni_readl(AIFIFO_Status_6143) & 0x01){
1143 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
1144 dl = ni_readl(AIFIFO_Data_6143);
1146 /* This may get the hi/lo data in the wrong order */
1147 data = (dl >> 16) & 0xffff;
1148 cfc_write_to_buffer(s, data);
1152 static void ni_ai_munge(comedi_device *dev, comedi_subdevice *s,
1153 void *data, unsigned int num_bytes, unsigned int chan_index )
1155 comedi_async *async = s->async;
1157 unsigned int length = num_bytes / bytes_per_sample(s);
1158 sampl_t *array = data;
1159 lsampl_t *larray = data;
1160 for(i = 0; i < length; i++)
1163 if(s->subdev_flags & SDF_LSAMPL)
1164 larray[i] = le32_to_cpu(larray[i]);
1166 array[i] = le16_to_cpu(array[i]);
1168 if(s->subdev_flags & SDF_LSAMPL)
1169 larray[i] += devpriv->ai_offset[chan_index];
1171 array[i] += devpriv->ai_offset[chan_index];
1173 chan_index %= async->cmd.chanlist_len;
1179 static void ni_ai_setup_MITE_dma(comedi_device *dev,comedi_cmd *cmd)
1181 struct mite_struct *mite = devpriv->mite;
1182 struct mite_channel *mite_chan = &mite->channels[ AI_DMA_CHAN ];
1183 comedi_subdevice *s = dev->subdevices + 0;
1185 /* write alloc the entire buffer */
1186 comedi_buf_write_alloc(s->async, s->async->prealloc_bufsz);
1188 mite_chan->current_link = 0;
1189 mite_chan->dir = COMEDI_INPUT;
1190 switch(boardtype.reg_type)
1194 mite_prep_dma(mite, AI_DMA_CHAN, 32, 16);
1196 case ni_reg_m_series:
1197 if(boardtype.adbits > 16)
1198 mite_prep_dma(mite, AI_DMA_CHAN, 32, 32);
1200 mite_prep_dma(mite, AI_DMA_CHAN, 16, 16); //guess
1203 mite_prep_dma(mite, AI_DMA_CHAN, 16, 16);
1207 mite_dma_arm(mite, AI_DMA_CHAN);
1210 static void ni_ao_setup_MITE_dma(comedi_device *dev,comedi_cmd *cmd)
1212 struct mite_struct *mite = devpriv->mite;
1213 struct mite_channel *mite_chan = &mite->channels[ AO_DMA_CHAN ];
1214 comedi_subdevice *s = dev->subdevices + 1;
1216 devpriv->last_buf_write_count = s->async->buf_write_count;
1217 mite_chan->current_link = 0;
1218 mite_chan->dir = COMEDI_OUTPUT;
1219 if(boardtype.reg_type & (ni_reg_611x | ni_reg_6713))
1221 mite_prep_dma(mite, AO_DMA_CHAN, 32, 32);
1224 /* doing 32 instead of 16 bit wide transfers from memory
1225 makes the mite do 32 bit pci transfers, doubling pci bandwidth.
1226 However, it causes the sample order to get screwed up so
1227 I'm not going to bother. */
1228 mite_prep_dma(mite, AO_DMA_CHAN, 16, 16);
1231 mite_dma_arm(mite, AO_DMA_CHAN);
1236 void ni_m_series_adc_reset(comedi_device *dev)
1238 ni_writeb(0, M_Offset_Static_AI_Control(0));
1239 ni_writeb(1, M_Offset_Static_AI_Control(0));
1240 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1241 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1242 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1246 used for both cancel ioctl and board initialization
1248 this is pretty harsh for a cancel, but it works...
1251 static int ni_ai_reset(comedi_device *dev,comedi_subdevice *s)
1254 mite_dma_disarm(devpriv->mite, AI_DMA_CHAN);
1256 /* ai configuration */
1257 devpriv->stc_writew(dev, AI_Configuration_Start | AI_Reset, Joint_Reset_Register);
1259 ni_set_bits(dev, Interrupt_A_Enable_Register,
1260 AI_SC_TC_Interrupt_Enable | AI_START1_Interrupt_Enable|
1261 AI_START2_Interrupt_Enable| AI_START_Interrupt_Enable|
1262 AI_STOP_Interrupt_Enable| AI_Error_Interrupt_Enable|
1263 AI_FIFO_Interrupt_Enable,0);
1265 ni_flush_ai_fifo(dev);
1267 if(boardtype.reg_type != ni_reg_6143)
1268 ni_writeb(0, Misc_Command);
1270 devpriv->stc_writew(dev, AI_Disarm, AI_Command_1_Register); /* reset pulses */
1271 devpriv->stc_writew(dev, AI_Start_Stop | AI_Mode_1_Reserved /*| AI_Trigger_Once */,
1272 AI_Mode_1_Register);
1273 devpriv->stc_writew(dev, 0x0000,AI_Mode_2_Register);
1274 /* generate FIFO interrupts on non-empty */
1275 devpriv->stc_writew(dev, (0<<6)|0x0000,AI_Mode_3_Register);
1276 if(boardtype.reg_type == ni_reg_611x){
1277 devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1279 AI_LOCALMUX_CLK_Pulse_Width, AI_Personal_Register);
1280 devpriv->stc_writew(dev, AI_SCAN_IN_PROG_Output_Select(3) |
1281 AI_EXTMUX_CLK_Output_Select(0) |
1282 AI_LOCALMUX_CLK_Output_Select(2) |
1283 AI_SC_TC_Output_Select(3) |
1284 AI_CONVERT_Output_Select(3),AI_Output_Control_Register);
1285 }else if(boardtype.reg_type == ni_reg_6143){
1286 devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1288 AI_LOCALMUX_CLK_Pulse_Width, AI_Personal_Register);
1289 devpriv->stc_writew(dev, AI_SCAN_IN_PROG_Output_Select(3) |
1290 AI_EXTMUX_CLK_Output_Select(0) |
1291 AI_LOCALMUX_CLK_Output_Select(2) |
1292 AI_SC_TC_Output_Select(3) |
1293 AI_CONVERT_Output_Select(2),AI_Output_Control_Register);
1295 devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1297 AI_CONVERT_Pulse_Width |
1298 AI_LOCALMUX_CLK_Pulse_Width, AI_Personal_Register);
1299 devpriv->stc_writew(dev, AI_SCAN_IN_PROG_Output_Select(3) |
1300 AI_EXTMUX_CLK_Output_Select(0) |
1301 AI_LOCALMUX_CLK_Output_Select(2) |
1302 AI_SC_TC_Output_Select(3) |
1303 AI_CONVERT_Output_Select(2),AI_Output_Control_Register);
1305 /* the following registers should not be changed, because there
1306 * are no backup registers in devpriv. If you want to change
1307 * any of these, add a backup register and other appropriate code:
1308 * AI_Mode_1_Register
1309 * AI_Mode_3_Register
1310 * AI_Personal_Register
1311 * AI_Output_Control_Register
1313 devpriv->stc_writew(dev, AI_SC_TC_Error_Confirm | AI_START_Interrupt_Ack |
1314 AI_START2_Interrupt_Ack | AI_START1_Interrupt_Ack |
1315 AI_SC_TC_Interrupt_Ack | AI_Error_Interrupt_Ack |
1316 AI_STOP_Interrupt_Ack, Interrupt_A_Ack_Register); /* clear interrupts */
1318 devpriv->stc_writew(dev, AI_Configuration_End,Joint_Reset_Register);
1323 static int ni_ai_poll(comedi_device *dev,comedi_subdevice *s)
1325 unsigned long flags = 0;
1328 // lock to avoid race with interrupt handler
1329 if(in_interrupt() == 0)
1330 comedi_spin_lock_irqsave(&dev->spinlock, flags);
1332 ni_handle_fifo_dregs(dev);
1334 ni_sync_ai_dma(devpriv->mite, dev);
1336 count = s->async->buf_write_count - s->async->buf_read_count;
1337 if(in_interrupt() == 0)
1338 comedi_spin_unlock_irqrestore(&dev->spinlock, flags);
1344 static int ni_ai_insn_read(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data)
1347 const unsigned int mask = (1 << boardtype.adbits) - 1;
1352 ni_load_channelgain_list(dev,1,&insn->chanspec);
1354 ni_flush_ai_fifo(dev);
1356 signbits=devpriv->ai_offset[0];
1357 if(boardtype.reg_type == ni_reg_611x){
1358 for(n=0; n < num_adc_stages_611x; n++){
1359 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1362 for(n=0; n<insn->n; n++){
1363 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1364 /* The 611x has screwy 32-bit FIFOs. */
1366 for(i=0; i<NI_TIMEOUT; i++){
1367 if(ni_readb(XXX_Status)&0x80)
1369 d = ( ni_readl(ADC_FIFO_Data_611x) >> 16 ) & 0xffff;
1372 if(!(devpriv->stc_readw(dev, AI_Status_1_Register)&AI_FIFO_Empty_St))
1374 d = ni_readl(ADC_FIFO_Data_611x) & 0xffff;
1379 rt_printk("ni_mio_common: timeout in 611x ni_ai_insn_read\n");
1385 }else if(boardtype.reg_type == ni_reg_6143){
1386 for(n = 0; n < insn->n; n++){
1387 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1389 /* The 6143 has 32-bit FIFOs. You need to strobe a bit to move a single 16bit stranded sample into the FIFO */
1391 for(i = 0; i < NI_TIMEOUT; i++){
1392 if(ni_readl(AIFIFO_Status_6143) & 0x01)
1394 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
1395 dl = ni_readl(AIFIFO_Data_6143);
1399 if(i == NI_TIMEOUT){
1400 rt_printk("ni_mio_common: timeout in 6143 ni_ai_insn_read\n");
1403 data[n] = (((dl >> 16) & 0xFFFF) + signbits) & 0xFFFF;
1406 for(n=0;n<insn->n;n++){
1407 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1408 for(i=0;i<NI_TIMEOUT;i++){
1409 if(!(devpriv->stc_readw(dev, AI_Status_1_Register)&AI_FIFO_Empty_St))
1413 rt_printk("ni_mio_common: timeout in ni_ai_insn_read\n");
1416 if(boardtype.reg_type == ni_reg_m_series)
1418 data[n] = ni_readl(M_Offset_AI_FIFO_Data) & mask;
1421 d = ni_readw(ADC_FIFO_Data_Register);
1422 d += signbits; /* subtle: needs to be short addition */
1430 void ni_prime_channelgain_list(comedi_device *dev)
1433 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1434 for(i = 0; i < NI_TIMEOUT; ++i)
1436 if(!(devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St))
1438 devpriv->stc_writew(dev, 1, ADC_FIFO_Clear);
1443 rt_printk("ni_mio_common: timeout loading channel/gain list\n");
1446 static void ni_m_series_load_channelgain_list(comedi_device *dev,unsigned int n_chan,
1449 unsigned int chan, range, aref;
1451 unsigned config_bits = 0;
1453 unsigned int dither;
1454 unsigned range_code;
1456 devpriv->stc_writew(dev, 1, Configuration_Memory_Clear);
1458 // offset = 1 << (boardtype.adbits - 1);
1459 if((list[0] & CR_ALT_SOURCE))
1461 unsigned bypass_bits;
1462 chan = CR_CHAN(list[0]);
1463 range = CR_RANGE(list[0]);
1464 range_code = ni_gainlkup[boardtype.gainlkup][range];
1465 dither = ((list[0] & CR_ALT_FILTER) != 0);
1466 bypass_bits = MSeries_AI_Bypass_Config_FIFO_Bit;
1467 bypass_bits |= chan;
1468 bypass_bits |= (devpriv->ai_calib_source) & (MSeries_AI_Bypass_Cal_Sel_Pos_Mask |
1469 MSeries_AI_Bypass_Cal_Sel_Neg_Mask | MSeries_AI_Bypass_Mode_Mux_Mask |
1470 MSeries_AO_Bypass_AO_Cal_Sel_Mask);
1471 bypass_bits |= MSeries_AI_Bypass_Gain_Bits(range_code);
1473 bypass_bits |= MSeries_AI_Bypass_Dither_Bit;
1474 // don't use 2's complement encoding
1475 bypass_bits |= MSeries_AI_Bypass_Polarity_Bit;
1476 ni_writel(bypass_bits, M_Offset_AI_Config_FIFO_Bypass);
1479 ni_writel(0, M_Offset_AI_Config_FIFO_Bypass);
1482 for(i = 0; i < n_chan; i++)
1484 chan = CR_CHAN(list[i]);
1485 aref = CR_AREF(list[i]);
1486 range = CR_RANGE(list[i]);
1487 dither = ((list[i] & CR_ALT_FILTER) != 0);
1489 range_code = ni_gainlkup[boardtype.gainlkup][range];
1490 devpriv->ai_offset[i] = offset;
1495 config_bits |= MSeries_AI_Config_Channel_Type_Differential_Bits;
1498 config_bits |= MSeries_AI_Config_Channel_Type_Common_Ref_Bits;
1501 config_bits |= MSeries_AI_Config_Channel_Type_Ground_Ref_Bits;
1506 config_bits |= MSeries_AI_Config_Channel_Bits(chan);
1507 config_bits |= MSeries_AI_Config_Bank_Bits(chan);
1508 config_bits |= MSeries_AI_Config_Gain_Bits(range_code);
1509 if(i == n_chan - 1) config_bits |= MSeries_AI_Config_Last_Channel_Bit;
1510 if(dither) config_bits |= MSeries_AI_Config_Dither_Bit;
1511 // don't use 2's complement encoding
1512 config_bits |= MSeries_AI_Config_Polarity_Bit;
1513 ni_writew(config_bits, M_Offset_AI_Config_FIFO_Data);
1515 ni_prime_channelgain_list(dev);
1519 * Notes on the 6110 and 6111:
1520 * These boards a slightly different than the rest of the series, since
1521 * they have multiple A/D converters.
1522 * From the driver side, the configuration memory is a
1524 * Configuration Memory Low:
1526 * bit 8: unipolar/bipolar (should be 0 for bipolar)
1527 * bits 0-3: gain. This is 4 bits instead of 3 for the other boards
1528 * 1001 gain=0.1 (+/- 50)
1537 * Configuration Memory High:
1538 * bits 12-14: Channel Type
1539 * 001 for differential
1540 * 000 for calibration
1541 * bit 11: coupling (this is not currently handled)
1545 * valid channels are 0-3
1547 static void ni_load_channelgain_list(comedi_device *dev,unsigned int n_chan,
1550 unsigned int chan,range,aref;
1554 unsigned int dither;
1556 if(boardtype.reg_type == ni_reg_m_series)
1558 ni_m_series_load_channelgain_list(dev, n_chan, list);
1561 if(n_chan == 1 && (boardtype.reg_type != ni_reg_611x) && (boardtype.reg_type != ni_reg_6143)){
1562 if(devpriv->changain_state && devpriv->changain_spec==list[0]){
1566 devpriv->changain_state=1;
1567 devpriv->changain_spec=list[0];
1569 devpriv->changain_state=0;
1572 devpriv->stc_writew(dev, 1,Configuration_Memory_Clear);
1574 // Set up Calibration mode if required
1575 if(boardtype.reg_type == ni_reg_6143){
1576 if((list[0] & CR_ALT_SOURCE) && !devpriv->ai_calib_source_enabled){
1577 // Strobe Relay enable bit
1578 ni_writew(devpriv->ai_calib_source | Calibration_Channel_6143_RelayOn, Calibration_Channel_6143);
1579 ni_writew(devpriv->ai_calib_source, Calibration_Channel_6143);
1580 devpriv->ai_calib_source_enabled = 1;
1581 msleep_interruptible(100); // Allow relays to change
1583 else if(!(list[0] & CR_ALT_SOURCE) && devpriv->ai_calib_source_enabled){
1584 // Strobe Relay disable bit
1585 ni_writew(devpriv->ai_calib_source | Calibration_Channel_6143_RelayOff, Calibration_Channel_6143);
1586 ni_writew(devpriv->ai_calib_source, Calibration_Channel_6143);
1587 devpriv->ai_calib_source_enabled = 0;
1588 msleep_interruptible(100); // Allow relays to change
1592 offset=1<<(boardtype.adbits-1);
1593 for(i=0;i<n_chan;i++){
1594 if((boardtype.reg_type != ni_reg_6143) && (list[i] & CR_ALT_SOURCE)){
1595 chan=devpriv->ai_calib_source;
1597 chan=CR_CHAN(list[i]);
1599 aref=CR_AREF(list[i]);
1600 range=CR_RANGE(list[i]);
1601 dither=((list[i]&CR_ALT_FILTER)!=0);
1603 /* fix the external/internal range differences */
1604 range = ni_gainlkup[boardtype.gainlkup][range];
1605 if(boardtype.reg_type == ni_reg_611x)
1606 devpriv->ai_offset[i] = offset;
1608 devpriv->ai_offset[i] = (range&0x100)?0:offset;
1611 if( ( list[i] & CR_ALT_SOURCE ) )
1613 if(boardtype.reg_type == ni_reg_611x)
1614 ni_writew(CR_CHAN(list[i])&0x0003, Calibration_Channel_Select_611x);
1617 if(boardtype.reg_type == ni_reg_611x)
1619 else if(boardtype.reg_type == ni_reg_6143)
1624 hi |= AI_DIFFERENTIAL;
1636 hi |= AI_CONFIG_CHANNEL( chan );
1638 ni_writew(hi,Configuration_Memory_High);
1640 if(boardtype.reg_type != ni_reg_6143){
1642 if(i == n_chan - 1) lo |= AI_LAST_CHANNEL;
1643 if( dither ) lo |= AI_DITHER;
1645 ni_writew(lo,Configuration_Memory_Low);
1649 /* prime the channel/gain list */
1650 if((boardtype.reg_type != ni_reg_611x) && (boardtype.reg_type != ni_reg_6143)){
1651 ni_prime_channelgain_list(dev);
1655 static int ni_ns_to_timer(comedi_device *dev, int *nanosec, int round_mode)
1660 case TRIG_ROUND_NEAREST:
1662 divider = (*nanosec + devpriv->clock_ns / 2) / devpriv->clock_ns;
1664 case TRIG_ROUND_DOWN:
1665 divider = (*nanosec) / devpriv->clock_ns;
1668 divider=(*nanosec + devpriv->clock_ns - 1) / devpriv->clock_ns;
1672 *nanosec = devpriv->clock_ns * divider;
1676 static int ni_ai_cmdtest(comedi_device *dev,comedi_subdevice *s,comedi_cmd *cmd)
1682 /* step 1: make sure trigger sources are trivially valid */
1685 cmd->start_src &= TRIG_NOW|TRIG_INT|TRIG_EXT;
1686 if(!cmd->start_src || tmp!=cmd->start_src)err++;
1688 tmp=cmd->scan_begin_src;
1689 cmd->scan_begin_src &= TRIG_TIMER|TRIG_EXT;
1690 if(!cmd->scan_begin_src || tmp!=cmd->scan_begin_src)err++;
1692 tmp=cmd->convert_src;
1693 sources = TRIG_TIMER | TRIG_EXT;
1694 if((boardtype.reg_type == ni_reg_611x) || (boardtype.reg_type == ni_reg_6143)) sources |= TRIG_NOW;
1695 cmd->convert_src &= sources;
1696 if(!cmd->convert_src || tmp!=cmd->convert_src)err++;
1698 tmp=cmd->scan_end_src;
1699 cmd->scan_end_src &= TRIG_COUNT;
1700 if(!cmd->scan_end_src || tmp!=cmd->scan_end_src)err++;
1703 cmd->stop_src &= TRIG_COUNT|TRIG_NONE;
1704 if(!cmd->stop_src || tmp!=cmd->stop_src)err++;
1708 /* step 2: make sure trigger sources are unique and mutually compatible */
1710 /* note that mutual compatiblity is not an issue here */
1711 if(cmd->start_src!=TRIG_NOW &&
1712 cmd->start_src!=TRIG_INT &&
1713 cmd->start_src!=TRIG_EXT)err++;
1714 if(cmd->scan_begin_src!=TRIG_TIMER &&
1715 cmd->scan_begin_src!=TRIG_EXT &&
1716 cmd->scan_begin_src!=TRIG_OTHER)err++;
1717 if(cmd->convert_src!=TRIG_TIMER &&
1718 cmd->convert_src!=TRIG_EXT &&
1719 cmd->convert_src!=TRIG_NOW)err++;
1720 if(cmd->stop_src!=TRIG_COUNT &&
1721 cmd->stop_src!=TRIG_NONE)err++;
1725 /* step 3: make sure arguments are trivially compatible */
1727 if(cmd->start_src==TRIG_EXT){
1728 /* external trigger */
1729 unsigned int tmp = CR_CHAN(cmd->start_arg);
1731 if(tmp > 16) tmp = 16;
1732 tmp |= (cmd->start_arg & (CR_INVERT | CR_EDGE));
1733 if(cmd->start_arg != tmp){
1734 cmd->start_arg = tmp;
1738 if(cmd->start_arg!=0){
1739 /* true for both TRIG_NOW and TRIG_INT */
1744 if(cmd->scan_begin_src==TRIG_TIMER){
1745 if(cmd->scan_begin_arg<boardtype.ai_speed){
1746 cmd->scan_begin_arg=boardtype.ai_speed;
1749 if(cmd->scan_begin_arg > devpriv->clock_ns * 0xffffff){
1750 cmd->scan_begin_arg = devpriv->clock_ns * 0xffffff;
1753 }else if(cmd->scan_begin_src==TRIG_EXT){
1754 /* external trigger */
1755 unsigned int tmp = CR_CHAN(cmd->scan_begin_arg);
1758 tmp |= (cmd->scan_begin_arg & (CR_INVERT | CR_EDGE));
1759 if(cmd->scan_begin_arg!=tmp){
1760 cmd->scan_begin_arg = tmp;
1763 }else{ /* TRIG_OTHER */
1764 if(cmd->scan_begin_arg){
1765 cmd->scan_begin_arg=0;
1769 if(cmd->convert_src==TRIG_TIMER){
1770 if((boardtype.reg_type == ni_reg_611x) || (boardtype.reg_type == ni_reg_6143)){
1771 if(cmd->convert_arg != 0){
1772 cmd->convert_arg = 0;
1776 if(cmd->convert_arg<boardtype.ai_speed){
1777 cmd->convert_arg=boardtype.ai_speed;
1780 if(cmd->convert_arg>devpriv->clock_ns*0xffff){
1781 cmd->convert_arg=devpriv->clock_ns*0xffff;
1785 }else if(cmd->convert_src == TRIG_EXT){
1786 /* external trigger */
1787 unsigned int tmp = CR_CHAN(cmd->convert_arg);
1790 tmp |= (cmd->convert_arg&(CR_ALT_FILTER|CR_INVERT));
1791 if(cmd->convert_arg!=tmp){
1792 cmd->convert_arg = tmp;
1795 }else if(cmd->convert_src == TRIG_NOW){
1796 if(cmd->convert_arg != 0){
1797 cmd->convert_arg = 0;
1802 if(cmd->scan_end_arg!=cmd->chanlist_len){
1803 cmd->scan_end_arg=cmd->chanlist_len;
1806 if(cmd->stop_src==TRIG_COUNT){
1807 unsigned int max_count = 0x01000000;
1809 if(boardtype.reg_type == ni_reg_611x )
1810 max_count -= num_adc_stages_611x;
1811 if(cmd->stop_arg > max_count){
1812 cmd->stop_arg = max_count;
1815 if(cmd->stop_arg < 1){
1821 if(cmd->stop_arg!=0){
1829 /* step 4: fix up any arguments */
1831 if(cmd->scan_begin_src==TRIG_TIMER){
1832 tmp=cmd->scan_begin_arg;
1833 ni_ns_to_timer(dev, &cmd->scan_begin_arg, cmd->flags&TRIG_ROUND_MASK);
1834 if(tmp!=cmd->scan_begin_arg)err++;
1836 if(cmd->convert_src==TRIG_TIMER){
1837 if((boardtype.reg_type != ni_reg_611x) && (boardtype.reg_type != ni_reg_6143)){
1838 tmp=cmd->convert_arg;
1839 ni_ns_to_timer(dev, &cmd->convert_arg, cmd->flags&TRIG_ROUND_MASK);
1840 if(tmp!=cmd->convert_arg)err++;
1841 if(cmd->scan_begin_src==TRIG_TIMER &&
1842 cmd->scan_begin_arg<cmd->convert_arg*cmd->scan_end_arg){
1843 cmd->scan_begin_arg=cmd->convert_arg*cmd->scan_end_arg;
1854 static int ni_ai_cmd(comedi_device *dev,comedi_subdevice *s)
1856 comedi_cmd *cmd=&s->async->cmd;
1858 int mode1=0; /* mode1 is needed for both stop and convert */
1860 int start_stop_select=0;
1861 unsigned int stop_count;
1862 int interrupt_a_enable=0;
1864 MDPRINTK("ni_ai_cmd\n");
1867 comedi_error(dev, "cannot run command without an irq");
1870 ni_flush_ai_fifo(dev);
1872 ni_load_channelgain_list(dev,cmd->chanlist_len,cmd->chanlist);
1874 /* start configuration */
1875 devpriv->stc_writew(dev, AI_Configuration_Start,Joint_Reset_Register);
1877 /* disable analog triggering for now, since it
1878 * interferes with the use of pfi0 */
1879 devpriv->an_trig_etc_reg &= ~Analog_Trigger_Enable;
1880 devpriv->stc_writew(dev, devpriv->an_trig_etc_reg, Analog_Trigger_Etc_Register);
1882 switch(cmd->start_src){
1885 devpriv->stc_writew(dev, AI_START2_Select(0)|
1886 AI_START1_Sync|AI_START1_Edge|AI_START1_Select(0),
1887 AI_Trigger_Select_Register);
1891 int chan = CR_CHAN(cmd->start_arg);
1892 unsigned int bits = AI_START2_Select(0)|
1894 AI_START1_Select(chan + 1);
1896 if(cmd->start_arg & CR_INVERT)
1897 bits |= AI_START1_Polarity;
1898 if(cmd->start_arg & CR_EDGE)
1899 bits |= AI_START1_Edge;
1900 devpriv->stc_writew(dev, bits, AI_Trigger_Select_Register);
1905 mode2 &= ~AI_Pre_Trigger;
1906 mode2 &= ~AI_SC_Initial_Load_Source;
1907 mode2 &= ~AI_SC_Reload_Mode;
1908 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
1910 if(cmd->chanlist_len == 1 || (boardtype.reg_type == ni_reg_611x) || (boardtype.reg_type == ni_reg_6143)){
1911 start_stop_select |= AI_STOP_Polarity;
1912 start_stop_select |= AI_STOP_Select( 31 ); // logic low
1913 start_stop_select |= AI_STOP_Sync;
1916 start_stop_select |= AI_STOP_Select(19); // ai configuration memory
1918 devpriv->stc_writew(dev, start_stop_select, AI_START_STOP_Select_Register);
1920 devpriv->ai_cmd2 = 0;
1921 switch(cmd->stop_src){
1923 stop_count = cmd->stop_arg - 1;
1925 if(boardtype.reg_type == ni_reg_611x){
1926 // have to take 3 stage adc pipeline into account
1927 stop_count += num_adc_stages_611x;
1929 /* stage number of scans */
1930 devpriv->stc_writel(dev, stop_count, AI_SC_Load_A_Registers);
1932 mode1 |= AI_Start_Stop | AI_Mode_1_Reserved | AI_Trigger_Once;
1933 devpriv->stc_writew(dev, mode1,AI_Mode_1_Register);
1934 /* load SC (Scan Count) */
1935 devpriv->stc_writew(dev, AI_SC_Load,AI_Command_1_Register);
1937 devpriv->ai_continuous = 0;
1938 if( stop_count == 0 ){
1939 devpriv->ai_cmd2 |= AI_End_On_End_Of_Scan;
1940 interrupt_a_enable |= AI_STOP_Interrupt_Enable;
1941 // this is required to get the last sample for chanlist_len > 1, not sure why
1942 if(cmd->chanlist_len > 1)
1943 start_stop_select |= AI_STOP_Polarity | AI_STOP_Edge;
1947 /* stage number of scans */
1948 devpriv->stc_writel(dev, 0,AI_SC_Load_A_Registers);
1950 mode1 |= AI_Start_Stop | AI_Mode_1_Reserved | AI_Continuous;
1951 devpriv->stc_writew(dev, mode1,AI_Mode_1_Register);
1953 /* load SC (Scan Count) */
1954 devpriv->stc_writew(dev, AI_SC_Load,AI_Command_1_Register);
1956 devpriv->ai_continuous = 1;
1961 switch(cmd->scan_begin_src){
1964 stop bits for non 611x boards
1965 AI_SI_Special_Trigger_Delay=0
1967 AI_START_STOP_Select_Register:
1968 AI_START_Polarity=0 (?) rising edge
1969 AI_START_Edge=1 edge triggered
1971 AI_START_Select=0 SI_TC
1972 AI_STOP_Polarity=0 rising edge
1973 AI_STOP_Edge=0 level
1975 AI_STOP_Select=19 external pin (configuration mem)
1977 start_stop_select |= AI_START_Edge | AI_START_Sync;
1978 devpriv->stc_writew(dev, start_stop_select, AI_START_STOP_Select_Register);
1980 mode2 |= AI_SI_Reload_Mode(0);
1981 /* AI_SI_Initial_Load_Source=A */
1982 mode2 &= ~AI_SI_Initial_Load_Source;
1983 //mode2 |= AI_SC_Reload_Mode;
1984 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
1987 timer = ni_ns_to_timer(dev, &cmd->scan_begin_arg, TRIG_ROUND_NEAREST);
1988 devpriv->stc_writel(dev, timer,AI_SI_Load_A_Registers);
1989 devpriv->stc_writew(dev, AI_SI_Load,AI_Command_1_Register);
1992 if( cmd->scan_begin_arg & CR_EDGE )
1993 start_stop_select |= AI_START_Edge;
1994 /* AI_START_Polarity==1 is falling edge */
1995 if( cmd->scan_begin_arg & CR_INVERT )
1996 start_stop_select |= AI_START_Polarity;
1997 if( cmd->scan_begin_src != cmd->convert_src ||
1998 ( cmd->scan_begin_arg & ~CR_EDGE ) != ( cmd->convert_arg & ~CR_EDGE ) )
1999 start_stop_select |= AI_START_Sync;
2000 start_stop_select |= AI_START_Select(1 + CR_CHAN(cmd->scan_begin_arg));
2001 devpriv->stc_writew(dev, start_stop_select, AI_START_STOP_Select_Register);
2005 switch(cmd->convert_src){
2008 if( cmd->convert_arg == 0 || cmd->convert_src == TRIG_NOW )
2011 timer = ni_ns_to_timer(dev, &cmd->convert_arg, TRIG_ROUND_NEAREST);
2012 devpriv->stc_writew(dev, 1,AI_SI2_Load_A_Register); /* 0,0 does not work. */
2013 devpriv->stc_writew(dev, timer,AI_SI2_Load_B_Register);
2015 /* AI_SI2_Reload_Mode = alternate */
2016 /* AI_SI2_Initial_Load_Source = A */
2017 mode2 &= ~AI_SI2_Initial_Load_Source;
2018 mode2 |= AI_SI2_Reload_Mode;
2019 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
2022 devpriv->stc_writew(dev, AI_SI2_Load,AI_Command_1_Register);
2024 mode2 |= AI_SI2_Reload_Mode; // alternate
2025 mode2 |= AI_SI2_Initial_Load_Source; // B
2027 devpriv->stc_writew(dev, mode2,AI_Mode_2_Register);
2030 mode1 |= AI_CONVERT_Source_Select(1+cmd->convert_arg);
2031 if( ( cmd->convert_arg & CR_INVERT ) == 0 )
2032 mode1 |= AI_CONVERT_Source_Polarity;
2033 devpriv->stc_writew(dev, mode1,AI_Mode_1_Register);
2035 mode2 |= AI_Start_Stop_Gate_Enable | AI_SC_Gate_Enable;
2036 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
2043 /* interrupt on FIFO, errors, SC_TC */
2044 interrupt_a_enable |= AI_Error_Interrupt_Enable|
2045 AI_SC_TC_Interrupt_Enable;
2048 interrupt_a_enable|=AI_FIFO_Interrupt_Enable;
2051 if(cmd->flags & TRIG_WAKE_EOS || (devpriv->ai_cmd2 & AI_End_On_End_Of_Scan)){
2052 /* wake on end-of-scan */
2053 devpriv->aimode=AIMODE_SCAN;
2055 devpriv->aimode=AIMODE_HALF_FULL;
2058 switch(devpriv->aimode){
2059 case AIMODE_HALF_FULL:
2060 /*generate FIFO interrupts and DMA requests on half-full */
2062 devpriv->stc_writew(dev, AI_FIFO_Mode_HF_to_E, AI_Mode_3_Register);
2064 devpriv->stc_writew(dev, AI_FIFO_Mode_HF, AI_Mode_3_Register);
2068 /*generate FIFO interrupts on non-empty */
2069 devpriv->stc_writew(dev, AI_FIFO_Mode_NE, AI_Mode_3_Register);
2073 devpriv->stc_writew(dev, AI_FIFO_Mode_NE, AI_Mode_3_Register);
2075 devpriv->stc_writew(dev, AI_FIFO_Mode_HF, AI_Mode_3_Register);
2077 interrupt_a_enable |= AI_STOP_Interrupt_Enable;
2083 devpriv->stc_writew(dev, 0x3f80,Interrupt_A_Ack_Register); /* clear interrupts */
2085 ni_set_bits(dev, Interrupt_A_Enable_Register, interrupt_a_enable, 1);
2087 MDPRINTK("Interrupt_A_Enable_Register = 0x%04x\n",devpriv->int_a_enable_reg);
2089 /* interrupt on nothing */
2090 ni_set_bits(dev, Interrupt_A_Enable_Register, ~0, 0);
2092 /* XXX start polling if necessary */
2093 MDPRINTK("interrupting on nothing\n");
2096 /* end configuration */
2097 devpriv->stc_writew(dev, AI_Configuration_End,Joint_Reset_Register);
2099 switch(cmd->scan_begin_src){
2101 devpriv->stc_writew(dev, AI_SI2_Arm | AI_SI_Arm | AI_DIV_Arm | AI_SC_Arm,
2102 AI_Command_1_Register);
2105 /* XXX AI_SI_Arm? */
2106 devpriv->stc_writew(dev, AI_SI2_Arm | AI_SI_Arm | AI_DIV_Arm | AI_SC_Arm,
2107 AI_Command_1_Register);
2112 ni_ai_setup_MITE_dma(dev,cmd);
2113 //mite_dump_regs(devpriv->mite);
2116 switch(cmd->start_src){
2118 /* AI_START1_Pulse */
2119 devpriv->stc_writew(dev, AI_START1_Pulse | devpriv->ai_cmd2, AI_Command_2_Register );
2120 s->async->inttrig=NULL;
2123 s->async->inttrig=NULL;
2126 s->async->inttrig=ni_ai_inttrig;
2130 MDPRINTK("exit ni_ai_cmd\n");
2135 static int ni_ai_inttrig(comedi_device *dev,comedi_subdevice *s,
2136 unsigned int trignum)
2138 if(trignum!=0)return -EINVAL;
2140 devpriv->stc_writew(dev, AI_START1_Pulse | devpriv->ai_cmd2, AI_Command_2_Register );
2141 s->async->inttrig=NULL;
2146 static int ni_ai_config_analog_trig(comedi_device *dev,comedi_subdevice *s,
2147 comedi_insn *insn, lsampl_t *data);
2149 static int ni_ai_insn_config(comedi_device *dev,comedi_subdevice *s,
2150 comedi_insn *insn, lsampl_t *data)
2152 if(insn->n<1)return -EINVAL;
2155 case INSN_CONFIG_ANALOG_TRIG:
2156 return ni_ai_config_analog_trig(dev,s,insn,data);
2157 case INSN_CONFIG_ALT_SOURCE:
2158 if(boardtype.reg_type == ni_reg_m_series)
2160 if(data[1] & ~(MSeries_AI_Bypass_Cal_Sel_Pos_Mask |
2161 MSeries_AI_Bypass_Cal_Sel_Neg_Mask | MSeries_AI_Bypass_Mode_Mux_Mask |
2162 MSeries_AO_Bypass_AO_Cal_Sel_Mask))
2166 devpriv->ai_calib_source = data[1];
2167 } else if(boardtype.reg_type == ni_reg_6143)
2169 unsigned int calib_source;
2171 calib_source = data[1] & 0xf;
2174 if(calib_source > 0xF)
2177 devpriv->ai_calib_source = calib_source;
2178 ni_writew(calib_source, Calibration_Channel_6143);
2181 unsigned int calib_source;
2182 unsigned int calib_source_adjust;
2184 calib_source = data[1] & 0xf;
2185 calib_source_adjust = ( data[1] >> 4 ) & 0xff;
2187 if(calib_source >= 8)
2189 devpriv->ai_calib_source = calib_source;
2190 if(boardtype.reg_type == ni_reg_611x){
2191 ni_writeb( calib_source_adjust, Cal_Gain_Select_611x );
2202 static int ni_ai_config_analog_trig(comedi_device *dev,comedi_subdevice *s,
2203 comedi_insn *insn, lsampl_t *data)
2205 unsigned int a,b,modebits;
2209 * data[2] is analog line
2210 * data[3] is set level
2211 * data[4] is reset level */
2212 if(!boardtype.has_analog_trig)return -EINVAL;
2213 if((data[1]&0xffff0000) != COMEDI_EV_SCAN_BEGIN){
2214 data[1]&= (COMEDI_EV_SCAN_BEGIN | 0xffff);
2217 if(data[2]>=boardtype.n_adchan){
2218 data[2]=boardtype.n_adchan-1;
2221 if(data[3]>255){ /* a */
2225 if(data[4]>255){ /* b */
2236 * high mode 00 00 01 10
2237 * low mode 00 00 10 01
2239 * hysteresis low mode 10 00 00 01
2240 * hysteresis high mode 01 00 00 10
2241 * middle mode 10 01 01 10
2246 modebits=data[1]&0xff;
2248 /* two level mode */
2253 modebits=((data[1]&0xf)<<4)|((data[1]&0xf0)>>4);
2255 devpriv->atrig_low = a;
2256 devpriv->atrig_high = b;
2258 case 0x81: /* low hysteresis mode */
2259 devpriv->atrig_mode = 6;
2261 case 0x42: /* high hysteresis mode */
2262 devpriv->atrig_mode = 3;
2264 case 0x96: /* middle window mode */
2265 devpriv->atrig_mode = 2;
2272 /* one level mode */
2278 case 0x06: /* high window mode */
2279 devpriv->atrig_high = a;
2280 devpriv->atrig_mode = 0;
2282 case 0x09: /* low window mode */
2283 devpriv->atrig_low = a;
2284 devpriv->atrig_mode = 1;
2291 if(err)return -EAGAIN;
2295 /* munge data from unsigned to 2's complement for analog output bipolar modes */
2296 static void ni_ao_munge(comedi_device *dev, comedi_subdevice *s,
2297 void *data, unsigned int num_bytes, unsigned int chan_index )
2299 comedi_async *async = s->async;
2302 unsigned int offset;
2303 unsigned int length = num_bytes / sizeof( sampl_t );
2304 sampl_t *array = data;
2306 offset = 1 << (boardtype.aobits - 1);
2307 for(i = 0; i < length; i++)
2309 range = CR_RANGE( async->cmd.chanlist[ chan_index ] );
2310 if(boardtype.ao_unipolar == 0 || (range & 1) == 0 )
2313 array[i] = cpu_to_le16( array[i] );
2316 chan_index %= async->cmd.chanlist_len;
2320 static int ni_m_series_ao_config_chanlist(comedi_device *dev, comedi_subdevice *s,
2321 unsigned int chanspec[], unsigned int n_chans, int timed)
2329 for(i = 0; i < boardtype.n_aochan; ++i)
2331 ni_writeb(0xf, M_Offset_AO_Waveform_Order(i));
2333 for(i=0;i<n_chans;i++)
2335 comedi_krange *krange;
2336 chan = CR_CHAN(chanspec[i]);
2337 range = CR_RANGE(chanspec[i]);
2338 krange = s->range_table->range + range;
2341 switch(krange->max - krange->min)
2344 conf |= MSeries_AO_DAC_Reference_10V_Internal_Bits;
2345 ni_writeb(0, M_Offset_AO_Reference_Attenuation(chan));
2348 conf |= MSeries_AO_DAC_Reference_5V_Internal_Bits;
2349 ni_writeb(0, M_Offset_AO_Reference_Attenuation(chan));
2352 conf |= MSeries_AO_DAC_Reference_10V_Internal_Bits;
2353 ni_writeb(MSeries_Attenuate_x5_Bit, M_Offset_AO_Reference_Attenuation(chan));
2356 conf |= MSeries_AO_DAC_Reference_5V_Internal_Bits;
2357 ni_writeb(MSeries_Attenuate_x5_Bit, M_Offset_AO_Reference_Attenuation(chan));
2360 rt_printk("%s: bug! unhandled ao reference voltage\n", __FUNCTION__);
2363 switch(krange->max + krange->min)
2366 conf |= MSeries_AO_DAC_Offset_0V_Bits;
2369 conf |= MSeries_AO_DAC_Offset_5V_Bits;
2372 rt_printk("%s: bug! unhandled ao offset voltage\n", __FUNCTION__);
2375 if(timed) conf |= MSeries_AO_Update_Timed_Bit;
2376 ni_writeb(conf, M_Offset_AO_Config_Bank(chan));
2377 devpriv->ao_conf[chan] = conf;
2378 ni_writeb(i, M_Offset_AO_Waveform_Order(chan));
2383 static int ni_old_ao_config_chanlist(comedi_device *dev, comedi_subdevice *s,
2384 unsigned int chanspec[], unsigned int n_chans)
2392 for(i=0;i<n_chans;i++)
2394 chan = CR_CHAN(chanspec[i]);
2395 range = CR_RANGE(chanspec[i]);
2396 conf = AO_Channel(chan);
2398 if(boardtype.ao_unipolar){
2401 invert = (1<<(boardtype.aobits-1));
2409 invert = (1<<(boardtype.aobits-1));
2412 /* not all boards can deglitch, but this shouldn't hurt */
2413 if(chanspec[i] & CR_DEGLITCH)
2414 conf |= AO_Deglitch;
2416 /* analog reference */
2417 /* AREF_OTHER connects AO ground to AI ground, i think */
2418 conf |= (CR_AREF(chanspec[i])==AREF_OTHER)? AO_Ground_Ref : 0;
2420 ni_writew(conf,AO_Configuration);
2421 devpriv->ao_conf[chan] = conf;
2426 static int ni_ao_config_chanlist(comedi_device *dev, comedi_subdevice *s,
2427 unsigned int chanspec[], unsigned int n_chans, int timed)
2429 if(boardtype.reg_type == ni_reg_m_series)
2430 return ni_m_series_ao_config_chanlist(dev, s, chanspec, n_chans, timed);
2432 return ni_old_ao_config_chanlist(dev, s, chanspec, n_chans);
2434 static int ni_ao_insn_read(comedi_device *dev,comedi_subdevice *s,
2435 comedi_insn *insn,lsampl_t *data)
2437 data[0] = devpriv->ao[CR_CHAN(insn->chanspec)];
2442 static int ni_ao_insn_write(comedi_device *dev,comedi_subdevice *s,
2443 comedi_insn *insn,lsampl_t *data)
2445 unsigned int chan = CR_CHAN(insn->chanspec);
2446 unsigned int invert;
2448 invert = ni_ao_config_chanlist(dev,s,&insn->chanspec, 1, 0);
2450 devpriv->ao[chan] = data[0];
2452 if(boardtype.reg_type == ni_reg_m_series)
2454 ni_writew(data[0], M_Offset_DAC_Direct_Data(chan));
2457 ni_writew(data[0] ^ invert,(chan)? DAC1_Direct_Data : DAC0_Direct_Data);
2462 static int ni_ao_insn_write_671x(comedi_device *dev,comedi_subdevice *s,
2463 comedi_insn *insn,lsampl_t *data)
2465 unsigned int chan = CR_CHAN(insn->chanspec);
2466 unsigned int invert;
2468 ao_win_out(1 << chan, AO_Immediate_671x);
2469 invert = 1 << (boardtype.aobits - 1);
2471 ni_ao_config_chanlist(dev,s,&insn->chanspec, 1, 0);
2473 devpriv->ao[chan] = data[0];
2474 ao_win_out(data[0] ^ invert, DACx_Direct_Data_671x(chan));
2479 static int ni_ao_inttrig(comedi_device *dev,comedi_subdevice *s,
2480 unsigned int trignum)
2483 int interrupt_b_bits;
2485 static const int timeout = 1000;
2487 if(trignum!=0)return -EINVAL;
2489 ni_set_bits(dev, Interrupt_B_Enable_Register, AO_FIFO_Interrupt_Enable | AO_Error_Interrupt_Enable, 0);
2490 interrupt_b_bits = AO_Error_Interrupt_Enable;
2492 devpriv->stc_writew(dev, 1, DAC_FIFO_Clear);
2493 if(boardtype.reg_type & ni_reg_6xxx_mask)
2494 ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x);
2495 ni_ao_setup_MITE_dma(dev, &s->async->cmd);
2496 ret = ni_ao_wait_for_dma_load(dev);
2497 if(ret < 0) return ret;
2500 ret = ni_ao_prep_fifo(dev,s);
2501 if(ret==0)return -EPIPE;
2503 interrupt_b_bits |= AO_FIFO_Interrupt_Enable;
2506 devpriv->stc_writew(dev, devpriv->ao_mode3|AO_Not_An_UPDATE,AO_Mode_3_Register);
2507 devpriv->stc_writew(dev, devpriv->ao_mode3,AO_Mode_3_Register);
2508 /* wait for DACs to be loaded */
2509 for(i = 0; i < timeout; i++)
2512 if((devpriv->stc_readw(dev, Joint_Status_2_Register) & AO_TMRDACWRs_In_Progress_St) == 0)
2517 comedi_error(dev, "timed out waiting for AO_TMRDACWRs_In_Progress_St to clear");
2520 // stc manual says we are need to clear error interrupt after AO_TMRDACWRs_In_Progress_St clears
2521 devpriv->stc_writew(dev, AO_Error_Interrupt_Ack, Interrupt_B_Ack_Register);
2523 ni_set_bits(dev, Interrupt_B_Enable_Register, interrupt_b_bits, 1);
2525 devpriv->stc_writew(dev, devpriv->ao_cmd1|AO_UI_Arm|AO_UC_Arm|AO_BC_Arm|AO_DAC1_Update_Mode|AO_DAC0_Update_Mode,
2526 AO_Command_1_Register);
2528 devpriv->stc_writew(dev, devpriv->ao_cmd2|AO_START1_Pulse,AO_Command_2_Register);
2530 s->async->inttrig=NULL;
2535 static int ni_ao_cmd(comedi_device *dev,comedi_subdevice *s)
2537 comedi_cmd *cmd = &s->async->cmd;
2544 comedi_error(dev, "cannot run command without an irq");
2547 trigvar = ni_ns_to_timer(dev, &cmd->scan_begin_arg, TRIG_ROUND_NEAREST);
2549 devpriv->stc_writew(dev, AO_Configuration_Start,Joint_Reset_Register);
2551 devpriv->stc_writew(dev, AO_Disarm,AO_Command_1_Register);
2553 if(boardtype.reg_type & ni_reg_6xxx_mask)
2555 ao_win_out(CLEAR_WG, AO_Misc_611x);
2558 for(i = 0; i < cmd->chanlist_len; i++)
2562 chan = CR_CHAN(cmd->chanlist[i]);
2564 ao_win_out(chan, AO_Waveform_Generation_611x);
2566 ao_win_out(bits, AO_Timed_611x);
2569 ni_ao_config_chanlist(dev, s, cmd->chanlist, cmd->chanlist_len, 1);
2571 if(cmd->stop_src==TRIG_NONE){
2572 devpriv->ao_mode1|=AO_Continuous;
2573 devpriv->ao_mode1&=~AO_Trigger_Once;
2575 devpriv->ao_mode1&=~AO_Continuous;
2576 devpriv->ao_mode1|=AO_Trigger_Once;
2578 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2579 devpriv->ao_trigger_select&=~(AO_START1_Polarity|AO_START1_Select(-1));
2580 devpriv->ao_trigger_select|=AO_START1_Edge|AO_START1_Sync;
2581 devpriv->stc_writew(dev, devpriv->ao_trigger_select,AO_Trigger_Select_Register);
2582 devpriv->ao_mode3&=~AO_Trigger_Length;
2583 devpriv->stc_writew(dev, devpriv->ao_mode3,AO_Mode_3_Register);
2585 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2586 devpriv->ao_mode2&=~AO_BC_Initial_Load_Source;
2587 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2588 if(cmd->stop_src==TRIG_NONE){
2589 devpriv->stc_writel(dev, 0xffffff,AO_BC_Load_A_Register);
2591 devpriv->stc_writel(dev, 0,AO_BC_Load_A_Register);
2593 devpriv->stc_writew(dev, AO_BC_Load,AO_Command_1_Register);
2594 devpriv->ao_mode2&=~AO_UC_Initial_Load_Source;
2595 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2596 switch(cmd->stop_src){
2598 devpriv->stc_writel(dev, cmd->stop_arg,AO_UC_Load_A_Register);
2599 devpriv->stc_writew(dev, AO_UC_Load,AO_Command_1_Register);
2600 devpriv->stc_writel(dev, cmd->stop_arg - 1,AO_UC_Load_A_Register);
2603 devpriv->stc_writel(dev, 0xffffff,AO_UC_Load_A_Register);
2604 devpriv->stc_writew(dev, AO_UC_Load,AO_Command_1_Register);
2605 devpriv->stc_writel(dev, 0xffffff,AO_UC_Load_A_Register);
2608 devpriv->stc_writel(dev, 0,AO_UC_Load_A_Register);
2609 devpriv->stc_writew(dev, AO_UC_Load,AO_Command_1_Register);
2610 devpriv->stc_writel(dev, cmd->stop_arg,AO_UC_Load_A_Register);
2613 devpriv->ao_cmd2&=~AO_BC_Gate_Enable;
2614 devpriv->stc_writew(dev, devpriv->ao_cmd2,AO_Command_2_Register);
2615 devpriv->ao_mode1&=~(AO_UI_Source_Select(0x1f)|AO_UI_Source_Polarity);
2616 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2617 devpriv->ao_mode2&=~(AO_UI_Reload_Mode(3)|AO_UI_Initial_Load_Source);
2618 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2619 devpriv->stc_writel(dev, 1,AO_UI_Load_A_Register);
2620 devpriv->stc_writew(dev, AO_UI_Load,AO_Command_1_Register);
2621 devpriv->stc_writel(dev, trigvar,AO_UI_Load_A_Register);
2623 if((boardtype.reg_type & ni_reg_6xxx_mask) == 0){
2624 if(cmd->scan_end_arg>1){
2625 devpriv->ao_mode1|=AO_Multiple_Channels;
2626 devpriv->stc_writew(dev, AO_Number_Of_Channels(cmd->scan_end_arg-1)|
2627 AO_UPDATE_Output_Select(1),
2628 AO_Output_Control_Register);
2631 devpriv->ao_mode1&=~AO_Multiple_Channels;
2632 bits = AO_UPDATE_Output_Select(1);
2633 if(boardtype.reg_type == ni_reg_m_series)
2634 bits |= AO_Number_Of_Channels(0);
2636 bits |= AO_Number_Of_Channels(CR_CHAN(cmd->chanlist[0]));
2637 devpriv->stc_writew(dev, bits, AO_Output_Control_Register);
2639 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2642 devpriv->stc_writew(dev, AO_DAC0_Update_Mode|AO_DAC1_Update_Mode,AO_Command_1_Register);
2644 devpriv->ao_mode3|=AO_Stop_On_Overrun_Error;
2645 devpriv->stc_writew(dev, devpriv->ao_mode3,AO_Mode_3_Register);
2647 devpriv->ao_mode2 &= ~AO_FIFO_Mode_Mask;
2649 devpriv->ao_mode2 |= AO_FIFO_Mode_HF_to_F;
2651 devpriv->ao_mode2 |= AO_FIFO_Mode_HF;
2653 devpriv->ao_mode2 &= ~AO_FIFO_Retransmit_Enable;
2654 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2656 bits = AO_BC_Source_Select | AO_UPDATE_Pulse_Width |
2657 AO_TMRDACWR_Pulse_Width;
2658 if( boardtype.ao_fifo_depth )
2659 bits |= AO_FIFO_Enable;
2661 bits |= AO_DMA_PIO_Control;
2662 if(boardtype.reg_type == ni_reg_m_series)
2663 bits |= AO_Number_Of_DAC_Packages/* | AO_Multiple_DACS_Per_Package*/;
2664 devpriv->stc_writew(dev, bits, AO_Personal_Register);
2665 // enable sending of ao dma requests
2666 devpriv->stc_writew(dev, AO_AOFREQ_Enable, AO_Start_Select_Register);
2668 devpriv->stc_writew(dev, AO_Configuration_End,Joint_Reset_Register);
2670 if(cmd->stop_src==TRIG_COUNT) {
2671 devpriv->stc_writew(dev, AO_BC_TC_Interrupt_Ack,Interrupt_B_Ack_Register);
2672 ni_set_bits(dev, Interrupt_B_Enable_Register,
2673 AO_BC_TC_Interrupt_Enable, 1);
2676 s->async->inttrig=ni_ao_inttrig;
2681 static int ni_ao_cmdtest(comedi_device *dev,comedi_subdevice *s,comedi_cmd *cmd)
2686 /* step 1: make sure trigger sources are trivially valid */
2689 cmd->start_src &= TRIG_INT;
2690 if(!cmd->start_src || tmp!=cmd->start_src)err++;
2692 tmp=cmd->scan_begin_src;
2693 cmd->scan_begin_src &= TRIG_TIMER;
2694 if(!cmd->scan_begin_src || tmp!=cmd->scan_begin_src)err++;
2696 tmp=cmd->convert_src;
2697 cmd->convert_src &= TRIG_NOW;
2698 if(!cmd->convert_src || tmp!=cmd->convert_src)err++;
2700 tmp=cmd->scan_end_src;
2701 cmd->scan_end_src &= TRIG_COUNT;
2702 if(!cmd->scan_end_src || tmp!=cmd->scan_end_src)err++;
2705 cmd->stop_src &= TRIG_COUNT|TRIG_NONE;
2706 if(!cmd->stop_src || tmp!=cmd->stop_src)err++;
2710 /* step 2: make sure trigger sources are unique and mutually compatible */
2712 if(cmd->stop_src!=TRIG_COUNT &&
2713 cmd->stop_src!=TRIG_NONE)err++;
2717 /* step 3: make sure arguments are trivially compatible */
2719 if(cmd->start_arg!=0){
2724 /* XXX need ao_speed */
2725 if(cmd->scan_begin_arg<boardtype.ao_speed){
2726 cmd->scan_begin_arg=boardtype.ao_speed;
2730 if(cmd->scan_begin_arg>devpriv->clock_ns*0xffffff){ /* XXX check */
2731 cmd->scan_begin_arg=devpriv->clock_ns*0xffffff;
2734 if(cmd->convert_arg!=0){
2738 if(cmd->scan_end_arg!=cmd->chanlist_len){
2739 cmd->scan_end_arg=cmd->chanlist_len;
2742 if(cmd->stop_src==TRIG_COUNT){ /* XXX check */
2743 if(cmd->stop_arg>0x00ffffff){
2744 cmd->stop_arg=0x00ffffff;
2749 if(cmd->stop_arg!=0){
2757 /* step 4: fix up any arguments */
2759 tmp = cmd->scan_begin_arg;
2760 ni_ns_to_timer(dev, &cmd->scan_begin_arg, cmd->flags&TRIG_ROUND_MASK);
2761 if(tmp!=cmd->scan_begin_arg)err++;
2765 /* step 5: fix up chanlist */
2773 static int ni_ao_reset(comedi_device *dev,comedi_subdevice *s)
2775 //devpriv->ao0p=0x0000;
2776 //ni_writew(devpriv->ao0p,AO_Configuration);
2778 //devpriv->ao1p=AO_Channel(1);
2779 //ni_writew(devpriv->ao1p,AO_Configuration);
2782 mite_dma_disarm(devpriv->mite, AO_DMA_CHAN);
2783 writel(CHOR_DMARESET | CHOR_FRESET, devpriv->mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
2786 devpriv->stc_writew(dev, AO_Configuration_Start,Joint_Reset_Register);
2787 devpriv->stc_writew(dev, AO_Disarm,AO_Command_1_Register);
2788 ni_set_bits(dev,Interrupt_B_Enable_Register,~0,0);
2789 devpriv->stc_writew(dev, AO_BC_Source_Select, AO_Personal_Register);
2790 devpriv->stc_writew(dev, 0x3f98,Interrupt_B_Ack_Register);
2791 devpriv->stc_writew(dev, AO_BC_Source_Select | AO_UPDATE_Pulse_Width |
2792 AO_TMRDACWR_Pulse_Width, AO_Personal_Register);
2793 devpriv->stc_writew(dev, 0,AO_Output_Control_Register);
2794 devpriv->stc_writew(dev, 0,AO_Start_Select_Register);
2796 devpriv->stc_writew(dev, devpriv->ao_cmd1,AO_Command_1_Register);
2798 devpriv->stc_writew(dev, devpriv->ao_cmd2, AO_Command_2_Register);
2799 devpriv->ao_mode1=0;
2800 devpriv->stc_writew(dev, devpriv->ao_mode1, AO_Mode_1_Register);
2801 devpriv->ao_mode2=0;
2802 devpriv->stc_writew(dev, devpriv->ao_mode2, AO_Mode_2_Register);
2803 if(boardtype.reg_type == ni_reg_m_series)
2804 devpriv->ao_mode3 = AO_Last_Gate_Disable;
2806 devpriv->ao_mode3 = 0;
2807 devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
2808 devpriv->ao_trigger_select = 0;
2809 devpriv->stc_writew(dev, devpriv->ao_trigger_select,AO_Trigger_Select_Register);
2810 if(boardtype.reg_type & ni_reg_6xxx_mask){
2811 ao_win_out(0x3, AO_Immediate_671x);
2812 ao_win_out(CLEAR_WG, AO_Misc_611x);
2814 devpriv->stc_writew(dev, AO_Configuration_End, Joint_Reset_Register);
2819 static int ni_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
2820 comedi_insn *insn,lsampl_t *data)
2823 rt_printk("ni_dio_insn_config() chan=%d io=%d\n",
2824 CR_CHAN(insn->chanspec),data[0]);
2827 case INSN_CONFIG_DIO_OUTPUT:
2828 s->io_bits |= 1<<CR_CHAN(insn->chanspec);
2830 case INSN_CONFIG_DIO_INPUT:
2831 s->io_bits &= ~(1<<CR_CHAN(insn->chanspec));
2833 case INSN_CONFIG_DIO_QUERY:
2834 data[1] = (s->io_bits & (1<<CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT : COMEDI_INPUT;
2841 devpriv->dio_control &= ~DIO_Pins_Dir_Mask;
2842 devpriv->dio_control |= DIO_Pins_Dir(s->io_bits);
2843 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
2848 static int ni_dio_insn_bits(comedi_device *dev,comedi_subdevice *s,
2849 comedi_insn *insn,lsampl_t *data)
2852 rt_printk("ni_dio_insn_bits() mask=0x%x bits=0x%x\n",data[0],data[1]);
2854 if(insn->n!=2)return -EINVAL;
2856 /* Perform check to make sure we're not using the
2857 serial part of the dio */
2858 if((data[0] & (DIO_SDIN | DIO_SDOUT)) && devpriv->serial_interval_ns)
2861 s->state &= ~data[0];
2862 s->state |= (data[0]&data[1]);
2863 devpriv->dio_output &= ~DIO_Parallel_Data_Mask;
2864 devpriv->dio_output |= DIO_Parallel_Data_Out(s->state);
2865 devpriv->stc_writew(dev, devpriv->dio_output,DIO_Output_Register);
2867 data[1] = devpriv->stc_readw(dev, DIO_Parallel_Input_Register);
2872 static int ni_m_series_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
2873 comedi_insn *insn, lsampl_t *data)
2876 rt_printk("ni_m_series_dio_insn_config() chan=%d io=%d\n",
2877 CR_CHAN(insn->chanspec), data[0]);
2881 case INSN_CONFIG_DIO_OUTPUT:
2882 s->io_bits |= 1 << CR_CHAN(insn->chanspec);
2884 case INSN_CONFIG_DIO_INPUT:
2885 s->io_bits &= ~(1 << CR_CHAN(insn->chanspec));
2887 case INSN_CONFIG_DIO_QUERY:
2888 data[1] = (s->io_bits & (1<<CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT : COMEDI_INPUT;
2895 ni_writel(s->io_bits, M_Offset_DIO_Direction);
2900 static int ni_m_series_dio_insn_bits(comedi_device *dev,comedi_subdevice *s,
2901 comedi_insn *insn, lsampl_t *data)
2904 rt_printk("ni_m_series_dio_insn_bits() mask=0x%x bits=0x%x\n",data[0],data[1]);
2906 if(insn->n!=2)return -EINVAL;
2908 s->state &= ~data[0];
2909 s->state |= (data[0] & data[1]);
2910 ni_writel(s->state, M_Offset_Static_Digital_Output);
2912 data[1] = ni_readl(M_Offset_Static_Digital_Input);
2917 static int ni_serial_insn_config(comedi_device *dev,comedi_subdevice *s,
2918 comedi_insn *insn,lsampl_t *data)
2921 unsigned char byte_out, byte_in;
2923 if(insn->n!=2)return -EINVAL;
2926 case INSN_CONFIG_SERIAL_CLOCK:
2929 rt_printk("SPI serial clock Config cd\n", data[1]);
2931 devpriv->serial_hw_mode = 1;
2932 devpriv->dio_control |= DIO_HW_Serial_Enable;
2934 if(data[1] == SERIAL_DISABLED) {
2935 devpriv->serial_hw_mode = 0;
2936 devpriv->dio_control &= ~(DIO_HW_Serial_Enable |
2937 DIO_Software_Serial_Control);
2938 data[1] = SERIAL_DISABLED;
2939 devpriv->serial_interval_ns = data[1];
2941 else if(data[1] <= SERIAL_600NS) {
2942 /* Warning: this clock speed is too fast to reliably
2944 devpriv->dio_control &= ~DIO_HW_Serial_Timebase;
2945 devpriv->clock_and_fout |= Slow_Internal_Timebase;
2946 devpriv->clock_and_fout &= ~DIO_Serial_Out_Divide_By_2;
2947 data[1] = SERIAL_600NS;
2948 devpriv->serial_interval_ns = data[1];
2950 else if(data[1] <= SERIAL_1_2US) {
2951 devpriv->dio_control &= ~DIO_HW_Serial_Timebase;
2952 devpriv->clock_and_fout |= Slow_Internal_Timebase |
2953 DIO_Serial_Out_Divide_By_2;
2954 data[1] = SERIAL_1_2US;
2955 devpriv->serial_interval_ns = data[1];
2957 else if(data[1] <= SERIAL_10US) {
2958 devpriv->dio_control |= DIO_HW_Serial_Timebase;
2959 devpriv->clock_and_fout |= Slow_Internal_Timebase |
2960 DIO_Serial_Out_Divide_By_2;
2961 /* Note: DIO_Serial_Out_Divide_By_2 only affects
2962 600ns/1.2us. If you turn divide_by_2 off with the
2963 slow clock, you will still get 10us, except then
2964 all your delays are wrong. */
2965 data[1] = SERIAL_10US;
2966 devpriv->serial_interval_ns = data[1];
2969 devpriv->dio_control &= ~(DIO_HW_Serial_Enable |
2970 DIO_Software_Serial_Control);
2971 devpriv->serial_hw_mode = 0;
2972 data[1] = (data[1] / 1000) * 1000;
2973 devpriv->serial_interval_ns = data[1];
2976 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
2977 devpriv->stc_writew(dev, devpriv->clock_and_fout,Clock_and_FOUT_Register);
2982 case INSN_CONFIG_BIDIRECTIONAL_DATA:
2984 if(devpriv->serial_interval_ns == 0) {
2988 byte_out = data[1] & 0xFF;
2990 if(devpriv->serial_hw_mode) {
2991 err = ni_serial_hw_readwrite8(dev,s,byte_out,&byte_in);
2992 } else if(devpriv->serial_interval_ns > 0) {
2993 err = ni_serial_sw_readwrite8(dev,s,byte_out,&byte_in);
2995 rt_printk("ni_serial_insn_config: serial disabled!\n");
2998 if(err < 0) return err;
2999 data[1] = byte_in & 0xFF;
3009 static int ni_serial_hw_readwrite8(comedi_device *dev,comedi_subdevice *s,
3010 unsigned char data_out,
3011 unsigned char *data_in)
3013 unsigned int status1;
3014 int err = 0, count = 20;
3017 rt_printk("ni_serial_hw_readwrite8: outputting 0x%x\n", data_out);
3020 devpriv->dio_output &= ~DIO_Serial_Data_Mask;
3021 devpriv->dio_output |= DIO_Serial_Data_Out(data_out);
3022 devpriv->stc_writew(dev, devpriv->dio_output,DIO_Output_Register);
3024 status1 = devpriv->stc_readw(dev, Joint_Status_1_Register);
3025 if(status1 & DIO_Serial_IO_In_Progress_St) {
3030 devpriv->dio_control |= DIO_HW_Serial_Start;
3031 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
3032 devpriv->dio_control &= ~DIO_HW_Serial_Start;
3034 /* Wait until STC says we're done, but don't loop infinitely. */
3035 while((status1 = devpriv->stc_readw(dev, Joint_Status_1_Register)) & DIO_Serial_IO_In_Progress_St) {
3036 /* Delay one bit per loop */
3037 comedi_udelay((devpriv->serial_interval_ns + 999) / 1000);
3039 rt_printk("ni_serial_hw_readwrite8: SPI serial I/O didn't finish in time!\n");
3045 /* Delay for last bit. This delay is absolutely necessary, because
3046 DIO_Serial_IO_In_Progress_St goes high one bit too early. */
3047 comedi_udelay((devpriv->serial_interval_ns + 999) / 1000);
3049 if(data_in != NULL) {
3050 *data_in = devpriv->stc_readw(dev, DIO_Serial_Input_Register);
3052 rt_printk("ni_serial_hw_readwrite8: inputted 0x%x\n", *data_in);
3057 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
3062 static int ni_serial_sw_readwrite8(comedi_device *dev,comedi_subdevice *s,
3063 unsigned char data_out,
3064 unsigned char *data_in)
3066 unsigned char mask, input = 0;
3069 rt_printk("ni_serial_sw_readwrite8: outputting 0x%x\n", data_out);
3072 /* Wait for one bit before transfer */
3073 comedi_udelay((devpriv->serial_interval_ns + 999) / 1000);
3075 for(mask = 0x80; mask; mask >>= 1) {
3076 /* Output current bit; note that we cannot touch s->state
3077 because it is a per-subdevice field, and serial is
3078 a separate subdevice from DIO. */
3079 devpriv->dio_output &= ~DIO_SDOUT;
3080 if(data_out & mask) {
3081 devpriv->dio_output |= DIO_SDOUT;
3083 devpriv->stc_writew(dev, devpriv->dio_output,DIO_Output_Register);
3085 /* Assert SDCLK (active low, inverted), wait for half of
3086 the delay, deassert SDCLK, and wait for the other half. */
3087 devpriv->dio_control |= DIO_Software_Serial_Control;
3088 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
3090 comedi_udelay((devpriv->serial_interval_ns + 999) / 2000);
3092 devpriv->dio_control &= ~DIO_Software_Serial_Control;
3093 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
3095 comedi_udelay((devpriv->serial_interval_ns + 999) / 2000);
3097 /* Input current bit */
3098 if(devpriv->stc_readw(dev, DIO_Parallel_Input_Register) & DIO_SDIN) {
3099 /* rt_printk("DIO_P_I_R: 0x%x\n", devpriv->stc_readw(dev, DIO_Parallel_Input_Register)); */
3104 rt_printk("ni_serial_sw_readwrite8: inputted 0x%x\n", input);
3106 if(data_in) *data_in = input;
3111 static void mio_common_detach(comedi_device *dev)
3113 if(dev->subdevices && boardtype.has_8255)
3114 subdev_8255_cleanup(dev,dev->subdevices+3);
3117 static void init_ao_67xx(comedi_device *dev, comedi_subdevice *s)
3121 for(i = 0; i < s->n_chan; i++)
3122 ni_ao_win_outw(dev, AO_Channel(i) | 0x0, AO_Configuration_2_67xx);
3125 static int ni_alloc_private(comedi_device *dev)
3129 ret = alloc_private(dev, sizeof(ni_private));
3130 if(ret < 0) return ret;
3132 spin_lock_init(&devpriv->window_lock);
3137 static int ni_E_init(comedi_device *dev,comedi_devconfig *it)
3139 comedi_subdevice *s;
3142 if(boardtype.n_aochan > MAX_N_AO_CHAN)
3144 printk("bug! boardtype.n_aochan > MAX_N_AO_CHAN\n");
3148 if(alloc_subdevices(dev, 11) < 0)
3151 /* analog input subdevice */
3153 s=dev->subdevices+0;
3155 if(boardtype.n_adchan){
3156 s->type=COMEDI_SUBD_AI;
3157 s->subdev_flags=SDF_READABLE | SDF_DIFF | SDF_DITHER | SDF_CMD_READ;
3158 if(boardtype.reg_type != ni_reg_611x)
3159 s->subdev_flags |= SDF_GROUND | SDF_COMMON | SDF_OTHER;
3160 if(boardtype.adbits > 16)
3161 s->subdev_flags |= SDF_LSAMPL;
3162 if(boardtype.reg_type == ni_reg_m_series)
3163 s->subdev_flags |= SDF_SOFT_CALIBRATED;
3164 s->n_chan=boardtype.n_adchan;
3165 s->len_chanlist=512;
3166 s->maxdata=(1<<boardtype.adbits)-1;
3167 s->range_table=ni_range_lkup[boardtype.gainlkup];
3168 s->insn_read=ni_ai_insn_read;
3169 s->insn_config=ni_ai_insn_config;
3170 s->do_cmdtest=ni_ai_cmdtest;
3171 s->do_cmd=ni_ai_cmd;
3172 s->cancel=ni_ai_reset;
3174 s->munge=ni_ai_munge;
3176 s->type=COMEDI_SUBD_UNUSED;
3179 /* analog output subdevice */
3181 s=dev->subdevices+1;
3182 if(boardtype.n_aochan){
3183 s->type=COMEDI_SUBD_AO;
3184 s->subdev_flags=SDF_WRITABLE|SDF_DEGLITCH|SDF_GROUND;
3185 if(boardtype.reg_type == ni_reg_m_series)
3186 s->subdev_flags |= SDF_SOFT_CALIBRATED;
3187 s->n_chan=boardtype.n_aochan;
3188 s->maxdata=(1<<boardtype.aobits)-1;
3189 s->range_table = boardtype.ao_range_table;
3190 s->insn_read=ni_ao_insn_read;
3191 if(boardtype.reg_type & ni_reg_6xxx_mask){
3192 s->insn_write=ni_ao_insn_write_671x;
3194 s->insn_write=ni_ao_insn_write;
3197 if(boardtype.n_aochan){
3199 if(boardtype.ao_fifo_depth){
3201 dev->write_subdev=s;
3202 s->subdev_flags |= SDF_CMD_WRITE;
3203 s->do_cmd=ni_ao_cmd;
3204 s->do_cmdtest=ni_ao_cmdtest;
3205 s->len_chanlist = boardtype.n_aochan;
3206 if(boardtype.reg_type != ni_reg_m_series)
3207 s->munge=ni_ao_munge;
3209 s->cancel=ni_ao_reset;
3211 s->type=COMEDI_SUBD_UNUSED;
3213 if((boardtype.reg_type & ni_reg_67xx_mask))
3214 init_ao_67xx(dev, s);
3216 /* digital i/o subdevice */
3218 s=dev->subdevices+2;
3219 s->type=COMEDI_SUBD_DIO;
3220 s->subdev_flags=SDF_WRITABLE|SDF_READABLE;
3222 s->io_bits=0; /* all bits input */
3223 s->range_table=&range_digital;
3224 if(boardtype.reg_type == ni_reg_m_series)
3227 s->insn_bits = ni_m_series_dio_insn_bits;
3228 s->insn_config=ni_m_series_dio_insn_config;
3229 ni_writel(s->io_bits, M_Offset_DIO_Direction);
3233 s->insn_bits=ni_dio_insn_bits;
3234 s->insn_config=ni_dio_insn_config;
3235 devpriv->dio_control = DIO_Pins_Dir(s->io_bits);
3236 ni_writew(devpriv->dio_control, DIO_Control_Register);
3240 s=dev->subdevices+3;
3241 if(boardtype.has_8255){
3242 subdev_8255_init(dev,s,ni_8255_callback,(unsigned long)dev);
3244 s->type=COMEDI_SUBD_UNUSED;
3247 /* general purpose counter/timer device */
3248 s=dev->subdevices+4;
3249 s->type = COMEDI_SUBD_COUNTER;
3250 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_CMD_READ;
3251 s->insn_read = ni_gpct_insn_read;
3252 s->insn_write = ni_gpct_insn_write;
3253 s->insn_config = ni_gpct_insn_config;
3256 s->do_cmdtest = ni_gpct_cmdtest;
3257 s->do_cmd = ni_gpct_cmd;
3258 s->cancel = ni_gpct_cancel;
3259 // s->poll=ni_gpct_poll;
3260 // s->munge=ni_gpct_munge;
3261 devpriv->an_trig_etc_reg = 0;
3265 /* calibration subdevice -- ai and ao */
3266 s=dev->subdevices+5;
3267 s->type=COMEDI_SUBD_CALIB;
3268 if(boardtype.reg_type == ni_reg_m_series)
3270 // internal PWM analog output used for AI nonlinearity calibration
3271 s->subdev_flags = SDF_INTERNAL;
3272 s->insn_config = &ni_m_series_pwm_config;
3275 ni_writel(0x0, M_Offset_Cal_PWM);
3276 } else if(boardtype.reg_type == ni_reg_6143)
3278 // internal PWM analog output used for AI nonlinearity calibration
3279 s->subdev_flags = SDF_INTERNAL;
3280 s->insn_config = &ni_6143_pwm_config;
3285 s->subdev_flags = SDF_WRITABLE | SDF_INTERNAL;
3286 s->insn_read = &ni_calib_insn_read;
3287 s->insn_write = &ni_calib_insn_write;
3288 caldac_setup(dev, s);
3292 s=dev->subdevices+6;
3293 s->type=COMEDI_SUBD_MEMORY;
3294 s->subdev_flags=SDF_READABLE|SDF_INTERNAL;
3296 if(boardtype.reg_type == ni_reg_m_series)
3298 s->n_chan = M_SERIES_EEPROM_SIZE;
3299 s->insn_read = &ni_m_series_eeprom_insn_read;
3303 s->insn_read = &ni_eeprom_insn_read;
3306 s=dev->subdevices + 7;
3307 s->type = COMEDI_SUBD_DIO;
3308 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3309 if(boardtype.reg_type == ni_reg_m_series)
3313 ni_writew(s->state, M_Offset_PFI_DO);
3314 for(i = 0; i < NUM_PFI_OUTPUT_SELECT_REGS; ++i)
3316 ni_writew(devpriv->pfi_output_select_reg[i], M_Offset_PFI_Output_Select(i + 1));
3323 s->insn_bits = ni_pfi_insn_bits;
3324 s->insn_config = ni_pfi_insn_config;
3325 ni_set_bits(dev, IO_Bidirection_Pin_Register, ~0, 0);
3327 /* cs5529 calibration adc */
3328 s = dev->subdevices + 8;
3329 if(boardtype.reg_type & ni_reg_67xx_mask)
3331 s->type = COMEDI_SUBD_AI;
3332 s->subdev_flags = SDF_READABLE | SDF_DIFF | SDF_INTERNAL;
3333 // one channel for each analog output channel
3334 s->n_chan = boardtype.n_aochan;
3335 s->maxdata = (1 << 16) - 1;
3336 s->range_table = &range_unknown; /* XXX */
3337 s->insn_read=cs5529_ai_insn_read;
3338 s->insn_config=NULL;
3342 s->type=COMEDI_SUBD_UNUSED;
3346 s=dev->subdevices+9;
3347 s->type=COMEDI_SUBD_SERIAL;
3348 s->subdev_flags=SDF_READABLE|SDF_WRITABLE|SDF_INTERNAL;
3351 s->insn_config = ni_serial_insn_config;
3352 devpriv->serial_interval_ns = 0;
3353 devpriv->serial_hw_mode = 0;
3356 s=dev->subdevices + 10;
3357 s->type = COMEDI_SUBD_DIO;
3358 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3361 s->insn_bits = ni_rtsi_insn_bits;
3362 s->insn_config = ni_rtsi_insn_config;
3365 /* ai configuration */
3366 ni_ai_reset(dev,dev->subdevices+0);
3367 if(boardtype.reg_type == ni_reg_m_series)
3368 ni_m_series_adc_reset(dev);
3369 if((boardtype.reg_type & ni_reg_6xxx_mask) == 0){
3370 // BEAM is this needed for PCI-6143 ??
3371 devpriv->clock_and_fout =
3372 Slow_Internal_Time_Divide_By_2 |
3373 Slow_Internal_Timebase |
3374 Clock_To_Board_Divide_By_2 |
3376 AI_Output_Divide_By_2 |
3377 AO_Output_Divide_By_2;
3379 devpriv->clock_and_fout =
3380 Slow_Internal_Time_Divide_By_2 |
3381 Slow_Internal_Timebase |
3382 Clock_To_Board_Divide_By_2 |
3385 devpriv->stc_writew(dev, devpriv->clock_and_fout, Clock_and_FOUT_Register);
3387 /* analog output configuration */
3388 ni_ao_reset(dev,dev->subdevices + 1);
3391 devpriv->stc_writew(dev, (IRQ_POLARITY?Interrupt_Output_Polarity:0) |
3392 (Interrupt_Output_On_3_Pins&0) |
3393 Interrupt_A_Enable |
3394 Interrupt_B_Enable |
3395 Interrupt_A_Output_Select(interrupt_pin(dev->irq)) |
3396 Interrupt_B_Output_Select(interrupt_pin(dev->irq)),
3397 Interrupt_Control_Register
3402 /* tell the STC which dma channels to use for AI and AO */
3403 bits = 1 << ( AI_DMA_CHAN );
3404 bits |= 1 << ( AO_DMA_CHAN + 4 );
3405 ni_writeb( bits, AI_AO_Select);
3406 /* tell the STC which dma channels to use for
3407 * General purpose counters 0 and 1 */
3408 bits = 1 << ( GPC0_DMA_CHAN );
3409 bits |= 1 << ( GPC1_DMA_CHAN + 4 );
3410 ni_writeb( bits, G0_G1_Select);
3412 if(boardtype.reg_type & ni_reg_6xxx_mask)
3414 ni_writeb( 0, Magic_611x );
3415 }else if(boardtype.reg_type == ni_reg_m_series)
3418 for(channel = 0; channel < boardtype.n_aochan; ++channel)
3420 ni_writeb(0xf, M_Offset_AO_Waveform_Order(channel));
3421 ni_writeb(0x0, M_Offset_AO_Reference_Attenuation(channel));
3423 ni_writeb(0x0, M_Offset_AO_Calibration);
3432 static int ni_8255_callback(int dir,int port,int data,unsigned long arg)
3434 comedi_device *dev=(comedi_device *)arg;
3437 ni_writeb(data,Port_A+2*port);
3440 return ni_readb(Port_A+2*port);
3445 presents the EEPROM as a subdevice
3448 static int ni_eeprom_insn_read(comedi_device *dev,comedi_subdevice *s,
3449 comedi_insn *insn,lsampl_t *data)
3451 data[0]=ni_read_eeprom(dev,CR_CHAN(insn->chanspec));
3457 reads bytes out of eeprom
3460 static int ni_read_eeprom(comedi_device *dev,int addr)
3465 bitstring=0x0300|((addr&0x100)<<3)|(addr&0xff);
3466 ni_writeb(0x04,Serial_Command);
3467 for(bit=0x8000;bit;bit>>=1){
3468 ni_writeb(0x04|((bit&bitstring)?0x02:0),Serial_Command);
3469 ni_writeb(0x05|((bit&bitstring)?0x02:0),Serial_Command);
3472 for(bit=0x80;bit;bit>>=1){
3473 ni_writeb(0x04,Serial_Command);
3474 ni_writeb(0x05,Serial_Command);
3475 bitstring|=((ni_readb(XXX_Status)&PROMOUT)?bit:0);
3477 ni_writeb(0x00,Serial_Command);
3482 static int ni_m_series_eeprom_insn_read(comedi_device *dev,comedi_subdevice *s,
3483 comedi_insn *insn,lsampl_t *data)
3485 data[0] = devpriv->eeprom_buffer[CR_CHAN(insn->chanspec)];
3490 static int ni_get_pwm_config(comedi_device *dev, lsampl_t *data)
3492 data[1] = devpriv->pwm_up_count * devpriv->clock_ns;
3493 data[2] = devpriv->pwm_down_count * devpriv->clock_ns;
3497 static int ni_m_series_pwm_config(comedi_device *dev, comedi_subdevice *s,
3498 comedi_insn *insn, lsampl_t *data)
3500 unsigned up_count, down_count;
3503 case INSN_CONFIG_PWM_OUTPUT:
3506 case TRIG_ROUND_NEAREST:
3507 up_count = (data[2] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3509 case TRIG_ROUND_DOWN:
3510 up_count = data[2] / devpriv->clock_ns;
3513 up_count = (data[2] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3521 case TRIG_ROUND_NEAREST:
3522 down_count = (data[4] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3524 case TRIG_ROUND_DOWN:
3525 down_count = data[4] / devpriv->clock_ns;
3528 down_count = (data[4] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3534 if(up_count * devpriv->clock_ns != data[2] ||
3535 down_count * devpriv->clock_ns != data[4])
3537 data[2] = up_count * devpriv->clock_ns;
3538 data[4] = down_count * devpriv->clock_ns;
3541 ni_writel(MSeries_Cal_PWM_High_Time_Bits(up_count) | MSeries_Cal_PWM_Low_Time_Bits(down_count), M_Offset_Cal_PWM);
3542 devpriv->pwm_up_count = up_count;
3543 devpriv->pwm_down_count = down_count;
3546 case INSN_CONFIG_GET_PWM_OUTPUT:
3547 return ni_get_pwm_config(dev, data);
3556 static int ni_6143_pwm_config(comedi_device *dev, comedi_subdevice *s,
3557 comedi_insn *insn, lsampl_t *data)
3559 unsigned up_count, down_count;
3562 case INSN_CONFIG_PWM_OUTPUT:
3565 case TRIG_ROUND_NEAREST:
3566 up_count = (data[2] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3568 case TRIG_ROUND_DOWN:
3569 up_count = data[2] / devpriv->clock_ns;
3572 up_count = (data[2] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3580 case TRIG_ROUND_NEAREST:
3581 down_count = (data[4] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3583 case TRIG_ROUND_DOWN:
3584 down_count = data[4] / devpriv->clock_ns;
3587 down_count = (data[4] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3593 if(up_count * devpriv->clock_ns != data[2] ||
3594 down_count * devpriv->clock_ns != data[4])
3596 data[2] = up_count * devpriv->clock_ns;
3597 data[4] = down_count * devpriv->clock_ns;
3600 ni_writel(up_count, Calibration_HighTime_6143);
3601 devpriv->pwm_up_count = up_count;
3602 ni_writel(down_count, Calibration_LowTime_6143);
3603 devpriv->pwm_down_count = down_count;
3606 case INSN_CONFIG_GET_PWM_OUTPUT:
3607 return ni_get_pwm_config(dev, data);
3615 static void ni_write_caldac(comedi_device *dev,int addr,int val);
3617 calibration subdevice
3619 static int ni_calib_insn_write(comedi_device *dev,comedi_subdevice *s,
3620 comedi_insn *insn,lsampl_t *data)
3622 ni_write_caldac(dev,CR_CHAN(insn->chanspec),data[0]);
3627 static int ni_calib_insn_read(comedi_device *dev,comedi_subdevice *s,
3628 comedi_insn *insn,lsampl_t *data)
3630 data[0] = devpriv->caldacs[CR_CHAN(insn->chanspec)];
3635 static int pack_mb88341(int addr,int val,int *bitstring);
3636 static int pack_dac8800(int addr,int val,int *bitstring);
3637 static int pack_dac8043(int addr,int val,int *bitstring);
3638 static int pack_ad8522(int addr,int val,int *bitstring);
3639 static int pack_ad8804(int addr,int val,int *bitstring);
3640 static int pack_ad8842(int addr,int val,int *bitstring);
3642 struct caldac_struct{
3645 int (*packbits)(int,int,int *);
3648 static struct caldac_struct caldacs[] = {
3649 [mb88341] = { 12, 8, pack_mb88341 },
3650 [dac8800] = { 8, 8, pack_dac8800 },
3651 [dac8043] = { 1, 12, pack_dac8043 },
3652 [ad8522] = { 2, 12, pack_ad8522 },
3653 [ad8804] = { 12, 8, pack_ad8804 },
3654 [ad8842] = { 8, 8, pack_ad8842 },
3655 [ad8804_debug] = { 16, 8, pack_ad8804 },
3658 static void caldac_setup(comedi_device *dev,comedi_subdevice *s)
3668 type = boardtype.caldac[0];
3669 if(type==caldac_none)return;
3670 n_bits=caldacs[type].n_bits;
3672 type = boardtype.caldac[i];
3673 if(type==caldac_none)break;
3674 if(caldacs[type].n_bits!=n_bits)diffbits=1;
3675 n_chans+=caldacs[type].n_chans;
3682 if(n_chans>MAX_N_CALDACS){
3683 printk("BUG! MAX_N_CALDACS too small\n");
3685 s->maxdata_list=devpriv->caldac_maxdata_list;
3687 for(i=0;i<n_dacs;i++){
3688 type = boardtype.caldac[i];
3689 for(j=0;j<caldacs[type].n_chans;j++){
3690 s->maxdata_list[chan]=
3691 (1<<caldacs[type].n_bits)-1;
3696 for( chan = 0; chan < s->n_chan; chan++ )
3697 ni_write_caldac( dev, i, s->maxdata_list[ i ] / 2 );
3699 type = boardtype.caldac[0];
3700 s->maxdata=(1<<caldacs[type].n_bits)-1;
3702 for( chan = 0; chan < s->n_chan; chan++ )
3703 ni_write_caldac( dev, i, s->maxdata / 2 );
3707 static void ni_write_caldac(comedi_device *dev,int addr,int val)
3709 unsigned int loadbit=0,bits=0,bit,bitstring=0;
3713 //printk("ni_write_caldac: chan=%d val=%d\n",addr,val);
3714 if( devpriv->caldacs[ addr ] == val ) return;
3715 devpriv->caldacs[ addr ] = val;
3718 type = boardtype.caldac[i];
3719 if(type==caldac_none)break;
3720 if(addr<caldacs[type].n_chans){
3721 bits=caldacs[type].packbits(addr,val,&bitstring);
3722 loadbit=SerDacLd(i);
3723 //printk("caldac: using i=%d addr=%d %x\n",i,addr,bitstring);
3726 addr-=caldacs[type].n_chans;
3729 for(bit=1<<(bits-1);bit;bit>>=1){
3730 ni_writeb(((bit&bitstring)?0x02:0),Serial_Command);
3732 ni_writeb(1|((bit&bitstring)?0x02:0),Serial_Command);
3735 ni_writeb(loadbit,Serial_Command);
3737 ni_writeb(0,Serial_Command);
3742 static int pack_mb88341(int addr,int val,int *bitstring)
3746 Note that address bits are reversed. Thanks to
3747 Ingo Keen for noticing this.
3749 Note also that the 88341 expects address values from
3750 1-12, whereas we use channel numbers 0-11. The NI
3751 docs use 1-12, also, so be careful here.
3754 *bitstring=((addr&0x1)<<11) |
3762 static int pack_dac8800(int addr,int val,int *bitstring)
3764 *bitstring=((addr&0x7)<<8)|(val&0xff);
3768 static int pack_dac8043(int addr,int val,int *bitstring)
3770 *bitstring=val&0xfff;
3774 static int pack_ad8522(int addr,int val,int *bitstring)
3776 *bitstring=(val&0xfff)|(addr ? 0xc000:0xa000);
3780 static int pack_ad8804(int addr,int val,int *bitstring)
3782 *bitstring=((addr&0xf)<<8) | (val&0xff);
3786 static int pack_ad8842(int addr,int val,int *bitstring)
3788 *bitstring=((addr+1)<<8) | (val&0xff);
3798 * General Purpose Counter/Timer section
3803 * Low level stuff...Each STC counter has two 24 bit load registers
3804 * (A&B). Just make it easier to access them.
3806 * These are inlined _only_ because they are used once in subsequent
3807 * code. Otherwise they should not be inlined.
3809 static inline void GPCT_Load_A(comedi_device *dev, int chan, unsigned int value)
3811 devpriv->stc_writel(dev, value & 0x00ffffff, G_Load_A_Register(chan));
3814 static inline void GPCT_Load_B(comedi_device *dev, int chan, unsigned int value)
3816 devpriv->stc_writel(dev, value & 0x00ffffff, G_Load_B_Register(chan));
3819 /* Load a value into the counter, using register A as the intermediate step.
3820 * You might use GPCT_Load_Using_A to load a 0x000000 into a counter
3823 static void GPCT_Load_Using_A(comedi_device *dev, int chan, unsigned int value)
3825 devpriv->gpct_mode[chan] &= (~G_Load_Source_Select);
3826 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
3827 GPCT_Load_A(dev,chan,value);
3828 devpriv->stc_writew(dev, devpriv->gpct_command[chan]|G_Load,G_Command_Register(chan));
3832 * Read the GPCTs current value.
3834 static int GPCT_G_Watch(comedi_device *dev, int chan)
3836 unsigned int hi1,hi2,lo;
3838 devpriv->gpct_command[chan] &= ~G_Save_Trace;
3839 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
3841 devpriv->gpct_command[chan] |= G_Save_Trace;
3842 devpriv->stc_writew(dev, devpriv->gpct_command[chan], G_Command_Register(chan));
3844 /* This procedure is used because the two registers cannot
3845 * be read atomically. */
3847 hi1 = devpriv->stc_readw(dev, G_Save_Register_High(chan));
3848 lo = devpriv->stc_readw(dev, G_Save_Register_Low(chan));
3849 hi2 = devpriv->stc_readw(dev, G_Save_Register_High(chan));
3852 return (hi1<<16)|lo;
3856 static int GPCT_Disarm(comedi_device *dev, int chan)
3858 devpriv->stc_writew(dev, devpriv->gpct_command[chan] | G_Disarm,G_Command_Register(chan));
3863 static int GPCT_Arm(comedi_device *dev, int chan)
3865 devpriv->stc_writew(dev, devpriv->gpct_command[chan] | G_Arm,G_Command_Register(chan));
3866 /* If the counter is doing pulse width measurement, then make
3867 sure that the counter did not start counting right away. This would
3868 indicate that we started acquiring the pulse after it had already
3869 started and our measurement would be inaccurate */
3870 if(devpriv->gpct_cur_operation[chan] == GPCT_SINGLE_PW){
3873 g_status=devpriv->stc_readw(dev, G_Status_Register);
3876 //TIM 5/2/01 possible error with very short pulses
3877 if((G0_Counting_St & g_status)|| !(G0_Armed_St&g_status)) {
3878 //error: we missed the beginning of the pulse
3879 return -EINVAL; //there is probably a more accurate error code...
3882 if((G1_Counting_St & g_status)|| !(G1_Armed_St&g_status)) {
3883 //error: we missed the beginning of the pulse
3891 static int GPCT_Set_Source(comedi_device *dev,int chan ,int source)
3893 //printk("GPCT_Set_Source...");
3894 devpriv->gpct_input_select[chan] &= ~G_Source_Select(0x1f);//reset gate to 0
3896 case GPCT_INT_CLOCK:
3897 devpriv->gpct_input_select[chan] |= G_Source_Select(0);//INT_TIMEBASE
3901 devpriv->gpct_input_select[chan] |= G_Source_Select(9);//PFI8
3903 devpriv->gpct_input_select[chan] |= G_Source_Select(4);//PFI3
3908 devpriv->stc_writew(dev, devpriv->gpct_input_select[chan], G_Input_Select_Register(chan));
3909 //printk("exit GPCT_Set_Source\n");
3913 static int GPCT_Set_Gate(comedi_device *dev,int chan ,int gate)
3915 //printk("GPCT_Set_Gate...");
3916 devpriv->gpct_input_select[chan] &= ~G_Gate_Select(0x1f);//reset gate to 0
3919 devpriv->gpct_input_select[chan] |= G_Gate_Select(31);//Low
3920 devpriv->gpct_mode[chan] |= G_Gate_Polarity;
3923 devpriv->gpct_mode[chan] &= ~G_Gate_Polarity;
3925 devpriv->gpct_input_select[chan] |= G_Gate_Select(10);//PFI9
3927 devpriv->gpct_input_select[chan] |= G_Gate_Select(5);//PFI4
3933 devpriv->stc_writew(dev, devpriv->gpct_input_select[chan], G_Input_Select_Register(chan));
3934 devpriv->stc_writew(dev, devpriv->gpct_mode[chan], G_Mode_Register(chan));
3935 //printk("exit GPCT_Set_Gate\n");
3939 static int GPCT_Set_Direction(comedi_device *dev,int chan,int direction)
3941 //printk("GPCT_Set_Direction...");
3943 devpriv->gpct_command[chan] &= ~G_Up_Down(0x3);
3944 switch (direction) {
3946 devpriv->gpct_command[chan] |= G_Up_Down(1);
3949 devpriv->gpct_command[chan] |= G_Up_Down(0);
3952 devpriv->gpct_command[chan] |= G_Up_Down(2);
3955 rt_printk("Error direction=0x%08x..",direction);
3958 devpriv->stc_writew(dev, devpriv->gpct_command[chan], G_Command_Register(chan));
3959 //TIM 4/23/01 devpriv->stc_writew(dev, devpriv->gpct_mode[chan], G_Mode_Register(chan));
3960 //printk("exit GPCT_Set_Direction\n");
3964 static void GPCT_Event_Counting(comedi_device *dev,int chan)
3967 //NOTE: possible residual bits from multibit masks can corrupt
3968 //If you config for several measurements between Resets, watch out!
3970 //printk("GPCT_Event_Counting...");
3972 devpriv->gpct_cur_operation[chan] = GPCT_SIMPLE_EVENT;
3975 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
3976 devpriv->gpct_mode[chan] |= G_Gating_Mode(1);
3978 // Trigger_Mode_For_Edge_Gate = 1
3979 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
3980 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);
3982 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
3983 //printk("exit GPCT_Event_Counting\n");
3986 static void GPCT_Period_Meas(comedi_device *dev, int chan)
3988 //printk("GPCT_Period_Meas...");
3990 devpriv->gpct_cur_operation[chan] = GPCT_SINGLE_PERIOD;
3993 //NOTE: possible residual bits from multibit masks can corrupt
3994 //If you config for several measurements between Resets, watch out!
3995 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
3996 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
3999 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
4000 devpriv->gpct_mode[chan] |= G_Output_Mode(3);
4004 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
4005 devpriv->gpct_mode[chan] |= G_Gating_Mode(2);
4007 // Trigger_Mode_For_Edge_Gate=0
4008 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
4009 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(0);
4011 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;
4012 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;
4013 devpriv->gpct_mode[chan] &= ~G_Loading_On_TC;
4014 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
4017 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
4018 devpriv->gpct_mode[chan] |= G_Stop_Mode(0);
4020 // Counting_Once = 2
4021 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
4022 devpriv->gpct_mode[chan] |= G_Counting_Once(2);
4025 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
4026 devpriv->gpct_command[chan] |= G_Up_Down(1);
4028 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4029 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
4030 //printk("exit GPCT_Period_Meas\n");
4033 static void GPCT_Pulse_Width_Meas(comedi_device *dev, int chan)
4035 //printk("GPCT_Pulse_Width_Meas...");
4037 devpriv->gpct_cur_operation[chan] = GPCT_SINGLE_PW;
4039 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
4040 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
4043 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
4044 devpriv->gpct_mode[chan] |= G_Output_Mode(3);
4047 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
4048 devpriv->gpct_mode[chan] |= G_Gating_Mode(1);//TIM 4/24/01 was 2
4050 // Trigger_Mode_For_Edge_Gate=2
4051 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
4052 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);//TIM 4/24/01 was 0
4055 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;//TIM 4/24/01 was 1
4056 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;//TIM 4/24/01 was 0
4058 devpriv->gpct_mode[chan] &= ~G_Loading_On_TC;
4059 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
4062 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
4063 devpriv->gpct_mode[chan] |= G_Stop_Mode(0);
4065 // Counting_Once = 2
4066 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
4067 devpriv->gpct_mode[chan] |= G_Counting_Once(2);
4070 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
4071 devpriv->gpct_command[chan] |= G_Up_Down(1);
4073 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4074 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
4076 //printk("exit GPCT_Pulse_Width_Meas\n");
4079 /* GPCT_Gen_Single_Pulse() creates pulse of length pulsewidth which starts after the Arm
4080 signal is sent. The pulse is delayed by the value already in the counter. This function could
4081 be modified to send a pulse in response to a trigger event at its gate.*/
4082 static void GPCT_Gen_Single_Pulse(comedi_device *dev, int chan, unsigned int length)
4084 //printk("GPCT_Gen_Cont...");
4086 devpriv->gpct_cur_operation[chan] = GPCT_SINGLE_PULSE_OUT;
4088 // Set length of the pulse
4089 GPCT_Load_B(dev,chan, length-1);
4091 //Load next time using B, This is reset by GPCT_Load_Using_A()
4092 devpriv->gpct_mode[chan] |= G_Load_Source_Select;
4094 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
4095 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
4098 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
4099 devpriv->gpct_mode[chan] |= G_Output_Mode(2); //TIM 4/26/01 was 3
4101 //Gating Mode=0 for untriggered single pulse
4102 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
4103 devpriv->gpct_mode[chan] |= G_Gating_Mode(0); //TIM 4/25/01 was 1
4105 // Trigger_Mode_For_Edge_Gate=0
4106 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
4107 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);
4110 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;
4111 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;
4112 devpriv->gpct_mode[chan] |= G_Loading_On_TC; //TIM 4/25/01
4113 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
4116 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
4117 devpriv->gpct_mode[chan] |= G_Stop_Mode(2); //TIM 4/25/01
4119 // Counting_Once = 2
4120 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
4121 devpriv->gpct_mode[chan] |= G_Counting_Once(1); //TIM 4/25/01
4124 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
4125 devpriv->gpct_command[chan] |= G_Up_Down(0); //TIM 4/25/01 was 1
4127 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4128 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
4130 //printk("exit GPCT_Gen_Cont\n");
4133 static void GPCT_Gen_Cont_Pulse(comedi_device *dev, int chan, unsigned int length)
4135 //printk("GPCT_Gen_Cont...");
4137 devpriv->gpct_cur_operation[chan] = GPCT_CONT_PULSE_OUT;
4139 // Set length of the pulse
4140 GPCT_Load_B(dev,chan, length-1);
4142 //Load next time using B, This is reset by GPCT_Load_Using_A()
4143 devpriv->gpct_mode[chan] |= G_Load_Source_Select;
4145 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
4146 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
4149 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
4150 devpriv->gpct_mode[chan] |= G_Output_Mode(2); //TIM 4/26/01 was 3
4152 //Gating Mode=0 for untriggered single pulse
4153 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
4154 devpriv->gpct_mode[chan] |= G_Gating_Mode(0); //TIM 4/26/01 was 0
4156 // Trigger_Mode_For_Edge_Gate=0
4157 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
4158 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);
4161 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;
4162 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;
4163 devpriv->gpct_mode[chan] |= G_Loading_On_TC;
4164 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
4167 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
4168 devpriv->gpct_mode[chan] |= G_Stop_Mode(0); //TIM 4/26/01
4170 // Counting_Once = 2
4171 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
4172 devpriv->gpct_mode[chan] |= G_Counting_Once(0); //TIM 4/26/01
4175 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
4176 devpriv->gpct_command[chan] |= G_Up_Down(0);
4179 //This seems pretty unsafe since I don't think it is cleared anywhere.
4180 //I don't think this is working
4181 //devpriv->gpct_command[chan] &= ~G_Bank_Switch_Enable;
4182 //devpriv->gpct_command[chan] &= ~G_Bank_Switch_Mode;
4185 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4186 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
4188 //printk("exit GPCT_Gen_Cont\n");
4191 static void GPCT_Reset(comedi_device *dev, int chan)
4195 //printk("GPCT_Reset...");
4196 devpriv->gpct_cur_operation[chan] = GPCT_RESET;
4200 devpriv->stc_writew(dev, G0_Reset,Joint_Reset_Register);
4201 ni_set_bits(dev,Interrupt_A_Enable_Register,G0_TC_Interrupt_Enable, 0);
4202 ni_set_bits(dev,Interrupt_A_Enable_Register,G0_Gate_Interrupt_Enable,0);
4203 temp_ack_reg |= G0_Gate_Error_Confirm;
4204 temp_ack_reg |= G0_TC_Error_Confirm;
4205 temp_ack_reg |= G0_TC_Interrupt_Ack;
4206 temp_ack_reg |= G0_Gate_Interrupt_Ack;
4207 devpriv->stc_writew(dev, temp_ack_reg,Interrupt_A_Ack_Register);
4209 //problem...this interferes with the other ctr...
4210 devpriv->an_trig_etc_reg |= GPFO_0_Output_Enable;
4211 devpriv->stc_writew(dev, devpriv->an_trig_etc_reg, Analog_Trigger_Etc_Register);
4214 devpriv->stc_writew(dev, G1_Reset,Joint_Reset_Register);
4215 ni_set_bits(dev,Interrupt_B_Enable_Register,G1_TC_Interrupt_Enable, 0);
4216 ni_set_bits(dev,Interrupt_B_Enable_Register,G0_Gate_Interrupt_Enable,0);
4217 temp_ack_reg |= G1_Gate_Error_Confirm;
4218 temp_ack_reg |= G1_TC_Error_Confirm;
4219 temp_ack_reg |= G1_TC_Interrupt_Ack;
4220 temp_ack_reg |= G1_Gate_Interrupt_Ack;
4221 devpriv->stc_writew(dev, temp_ack_reg,Interrupt_B_Ack_Register);
4223 devpriv->an_trig_etc_reg |= GPFO_1_Output_Enable;
4224 devpriv->stc_writew(dev, devpriv->an_trig_etc_reg, Analog_Trigger_Etc_Register);
4228 devpriv->gpct_mode[chan] = 0;
4229 devpriv->gpct_input_select[chan] = 0;
4230 devpriv->gpct_command[chan] = 0;
4232 devpriv->gpct_command[chan] |= G_Synchronized_Gate;
4234 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4235 devpriv->stc_writew(dev, devpriv->gpct_input_select[chan],G_Input_Select_Register(chan));
4236 devpriv->stc_writew(dev, 0,G_Autoincrement_Register(chan));
4238 //printk("exit GPCT_Reset\n");
4241 static int ni_gpct_insn_config(comedi_device *dev,comedi_subdevice *s,
4242 comedi_insn *insn,lsampl_t *data)
4245 //printk("data[0] is 0x%08x, data[1] is 0x%08x\n",data[0],data[1]);
4248 if(insn->n!=1)return -EINVAL;
4249 GPCT_Reset(dev,insn->chanspec);
4251 case GPCT_SET_SOURCE:
4252 if(insn->n!=2)return -EINVAL;
4253 retval=GPCT_Set_Source(dev,insn->chanspec,data[1]);
4256 if(insn->n!=2)return -EINVAL;
4257 retval=GPCT_Set_Gate(dev,insn->chanspec,data[1]);
4259 case GPCT_SET_DIRECTION:
4260 if(insn->n!=2) return -EINVAL;
4261 retval=GPCT_Set_Direction(dev,insn->chanspec,data[1]);
4263 case GPCT_GET_INT_CLK_FRQ:
4264 if(insn->n!=2) return -EINVAL;
4265 //There are actually 2 internal clocks on the STC, we always
4266 //use the fast 20MHz one at this time. Tim Ousley 5/1/01
4267 //NOTE: This is not the final interface, ideally the user
4268 //will never need to know the int. clk. freq.
4269 data[1]=50;//50ns = 20MHz = internal timebase of STC
4271 case GPCT_SET_OPERATION:
4272 //TIM 5/1/01 if((insn->n<2)||(insn->n>3))return -EINVAL;
4274 case GPCT_SIMPLE_EVENT:
4275 GPCT_Event_Counting(dev,insn->chanspec);
4277 case GPCT_SINGLE_PERIOD:
4278 GPCT_Period_Meas(dev,insn->chanspec);
4280 case GPCT_SINGLE_PW:
4281 GPCT_Pulse_Width_Meas(dev,insn->chanspec);
4283 case GPCT_SINGLE_PULSE_OUT:
4284 GPCT_Gen_Single_Pulse(dev,insn->chanspec,data[2]);
4286 case GPCT_CONT_PULSE_OUT:
4287 GPCT_Gen_Cont_Pulse(dev,insn->chanspec,data[2]);
4290 rt_printk("unsupported GPCT operation!\n");
4295 if(insn->n!=1)return -EINVAL;
4296 retval=GPCT_Arm(dev,insn->chanspec);
4299 if(insn->n!=1)return -EINVAL;
4300 retval=GPCT_Disarm(dev,insn->chanspec);
4306 //catch any errors from return values
4310 if(data[0]!=GPCT_ARM){
4311 rt_printk("error: retval was %d\n",retval);
4312 rt_printk("data[0] is 0x%08x, data[1] is 0x%08x\n",data[0],data[1]);
4319 static int ni_gpct_insn_read(comedi_device *dev,comedi_subdevice *s,
4320 comedi_insn *insn,lsampl_t *data) {
4322 int chan=insn->chanspec;
4323 int cur_op = devpriv->gpct_cur_operation[chan];
4325 //printk("in ni_gpct_insn_read, n=%d, data[0]=%d\n",insn->chanspec,data[0]);
4326 if(insn->n!=1)return -EINVAL;
4328 data[0] = GPCT_G_Watch(dev,insn->chanspec);
4330 /* for certain modes (period and pulse width measurment), the value
4331 in the counter is not valid until the counter stops. If the value is
4332 invalid, return a 0 */
4333 if((cur_op == GPCT_SINGLE_PERIOD) || (cur_op == GPCT_SINGLE_PW)){
4334 /* is the counter still running? */
4335 if(devpriv->stc_readw(dev, G_Status_Register) & (chan?G1_Counting_St:G0_Counting_St))
4341 static int ni_gpct_insn_write(comedi_device *dev,comedi_subdevice *s,
4342 comedi_insn *insn,lsampl_t *data) {
4344 //printk("in ni_gpct_insn_write");
4345 if(insn->n!=1)return -EINVAL;
4346 GPCT_Load_Using_A(dev,insn->chanspec,data[0]);
4350 static int ni_gpct_cmd(comedi_device *dev, comedi_subdevice *s)
4355 static int ni_gpct_cmdtest(comedi_device *dev, comedi_subdevice *s, comedi_cmd *cmd)
4360 static int ni_gpct_cancel(comedi_device *dev, comedi_subdevice *s)
4367 * Programmable Function Inputs
4371 static int ni_m_series_set_pfi_routing(comedi_device *dev, unsigned chan, unsigned source)
4373 unsigned pfi_reg_index;
4374 unsigned array_offset;
4375 if((source & 0x1f) != source) return -EINVAL;
4376 pfi_reg_index = 1 + chan / 3;
4377 array_offset = pfi_reg_index - 1;
4378 devpriv->pfi_output_select_reg[array_offset] &= ~MSeries_PFI_Output_Select_Mask(chan);
4379 devpriv->pfi_output_select_reg[array_offset] |= MSeries_PFI_Output_Select_Bits(chan, source);
4380 ni_writew(devpriv->pfi_output_select_reg[array_offset], M_Offset_PFI_Output_Select(pfi_reg_index));
4384 static int ni_old_set_pfi_routing(comedi_device *dev, unsigned chan, unsigned source)
4386 // pre-m-series boards have fixed signals on pfi pins
4387 if(source != ni_old_get_pfi_routing(dev, chan)) return -EINVAL;
4391 static int ni_set_pfi_routing(comedi_device *dev, unsigned chan, unsigned source)
4393 if(boardtype.reg_type == ni_reg_m_series)
4394 return ni_m_series_set_pfi_routing(dev, chan, source);
4396 return ni_old_set_pfi_routing(dev, chan, source);
4399 static unsigned ni_m_series_get_pfi_routing(comedi_device *dev, unsigned chan)
4401 const unsigned array_offset = chan / 3;
4402 return MSeries_PFI_Output_Select_Source(chan, devpriv->pfi_output_select_reg[array_offset]);
4405 static unsigned ni_old_get_pfi_routing(comedi_device *dev, unsigned chan)
4407 // pre-m-series boards have fixed signals on pfi pins
4411 return NI_PFI_OUTPUT_AI_START1;
4414 return NI_PFI_OUTPUT_AI_START2;
4417 return NI_PFI_OUTPUT_AI_CONVERT;
4420 return NI_PFI_OUTPUT_G_SRC1;
4423 return NI_PFI_OUTPUT_G_GATE1;
4426 return NI_PFI_OUTPUT_AO_UPDATE_N;
4429 return NI_PFI_OUTPUT_AO_START1;
4432 return NI_PFI_OUTPUT_AI_START_PULSE;
4435 return NI_PFI_OUTPUT_G_SRC0;
4438 return NI_PFI_OUTPUT_G_GATE0;
4441 rt_printk("%s: bug, unhandled case in switch.\n", __FUNCTION__);
4447 static unsigned ni_get_pfi_routing(comedi_device *dev, unsigned chan)
4449 if(boardtype.reg_type == ni_reg_m_series)
4450 return ni_m_series_get_pfi_routing(dev, chan);
4452 return ni_old_get_pfi_routing(dev, chan);
4455 static int ni_pfi_insn_bits(comedi_device *dev,comedi_subdevice *s,
4456 comedi_insn *insn,lsampl_t *data)
4458 if(boardtype.reg_type != ni_reg_m_series)
4465 s->state &= ~data[0];
4466 s->state |= (data[0] & data[1]);
4467 ni_writew(s->state, M_Offset_PFI_DO);
4469 data[1] = ni_readw(M_Offset_PFI_DI);
4473 static int ni_pfi_insn_config(comedi_device *dev,comedi_subdevice *s,
4474 comedi_insn *insn,lsampl_t *data)
4478 if(insn->n < 1)return -EINVAL;
4480 chan = CR_CHAN(insn->chanspec);
4484 ni_set_bits(dev, IO_Bidirection_Pin_Register, 1<<chan, 1);
4487 ni_set_bits(dev, IO_Bidirection_Pin_Register, 1<<chan, 0);
4489 case INSN_CONFIG_DIO_QUERY:
4490 data[1] = (devpriv->io_bidirection_pin_reg & (1<<chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
4493 case INSN_CONFIG_SET_ROUTING:
4494 return ni_set_pfi_routing(dev, chan, data[1]);
4496 case INSN_CONFIG_GET_ROUTING:
4497 data[1] = ni_get_pfi_routing(dev, chan);
4509 * NI RTSI Bus Functions
4512 static void ni_rtsi_init(comedi_device *dev)
4514 // Initialises the RTSI bus signal switch to a default state
4516 // Set clock mode to internal
4517 devpriv->clock_and_fout2 = MSeries_RTSI_10MHz_Bit;
4518 if(ni_set_master_clock(dev, NI_MIO_INTERNAL_CLOCK, 0) < 0)
4520 rt_printk("ni_set_master_clock failed, bug?");
4522 // default internal lines routing to RTSI bus lines
4523 devpriv->rtsi_trig_a_output_reg = RTSI_Trig_Output_Bits(0, NI_RTSI_OUTPUT_ADR_START1) |
4524 RTSI_Trig_Output_Bits(1, NI_RTSI_OUTPUT_ADR_START2) |
4525 RTSI_Trig_Output_Bits(2, NI_RTSI_OUTPUT_SCLKG) |
4526 RTSI_Trig_Output_Bits(3, NI_RTSI_OUTPUT_DACUPDN);
4527 devpriv->stc_writew(dev, devpriv->rtsi_trig_a_output_reg,
4528 RTSI_Trig_A_Output_Register);
4529 devpriv->rtsi_trig_b_output_reg = RTSI_Trig_Output_Bits(4, NI_RTSI_OUTPUT_DA_START1) |
4530 RTSI_Trig_Output_Bits(5, NI_RTSI_OUTPUT_G_SRC0) |
4531 RTSI_Trig_Output_Bits(6, NI_RTSI_OUTPUT_G_GATE0);
4532 if(boardtype.reg_type == ni_reg_m_series)
4533 devpriv->rtsi_trig_b_output_reg |= RTSI_Trig_Output_Bits(7, NI_RTSI_OUTPUT_RTSI_OSC);
4534 devpriv->stc_writew(dev, devpriv->rtsi_trig_b_output_reg,
4535 RTSI_Trig_B_Output_Register);
4537 // Sets the source and direction of the 4 on board lines
4538 // devpriv->stc_writew(dev, 0x0000, RTSI_Board_Register);
4541 static int ni_rtsi_insn_bits(comedi_device *dev,comedi_subdevice *s,
4542 comedi_insn *insn,lsampl_t *data)
4544 if(insn->n != 2) return -EINVAL;
4551 /* Find best multiplier/divider to try and get the PLL running at 80 MHz
4552 * given an arbitrary frequency input clock */
4553 static int ni_mseries_get_pll_parameters(unsigned reference_period_ns,
4554 unsigned *freq_divider, unsigned *freq_multiplier, unsigned *actual_period_ns)
4557 unsigned best_div = 1;
4558 static const unsigned max_div = 0x10;
4560 unsigned best_mult = 1;
4561 static const unsigned max_mult = 0x100;
4562 static const unsigned pico_per_nano = 1000;
4564 const unsigned reference_picosec = reference_period_ns * pico_per_nano;
4565 /* m-series wants the phased-locked loop to output 80MHz, which is divided by 4 to
4566 * 20 MHz for most timing clocks */
4567 static const unsigned target_picosec = 12500;
4568 static const unsigned fudge_factor_80_to_20Mhz = 4;
4569 int best_period_picosec = 0;
4570 for(div = 1; div <= max_div; ++div)
4572 for(mult = 1; mult <= max_mult; ++mult)
4574 unsigned new_period_ps = (reference_picosec * div) / mult;
4575 if(abs(new_period_ps - target_picosec) < abs(best_period_picosec - target_picosec))
4577 best_period_picosec = new_period_ps;
4583 if(best_period_picosec == 0)
4585 rt_printk("%s: bug, failed to find pll parameters\n", __FUNCTION__);
4588 *freq_divider = best_div;
4589 *freq_multiplier = best_mult;
4590 *actual_period_ns = (best_period_picosec * fudge_factor_80_to_20Mhz + (pico_per_nano / 2)) / pico_per_nano;
4594 static inline unsigned num_configurable_rtsi_channels(comedi_device *dev)
4596 if(boardtype.reg_type == ni_reg_m_series) return 8;
4600 static int ni_mseries_set_pll_master_clock(comedi_device *dev, unsigned source, unsigned period_ns)
4602 static const unsigned min_period_ns = 50;
4603 static const unsigned max_period_ns = 1000;
4604 static const unsigned timeout = 1000;
4605 unsigned pll_control_bits;
4606 unsigned freq_divider;
4607 unsigned freq_multiplier;
4610 if(source == NI_MIO_PLL_PXI10_CLOCK) period_ns = 100;
4611 // these limits are somewhat arbitrary, but NI advertises 1 to 20MHz range so we'll use that
4612 if(period_ns < min_period_ns || period_ns > max_period_ns)
4614 rt_printk("%s: you must specify an input clock frequency between %i and %i nanosec "
4615 "for the phased-lock loop.\n", __FUNCTION__, min_period_ns, max_period_ns);
4618 devpriv->rtsi_trig_direction_reg &= ~Use_RTSI_Clock_Bit;
4619 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4620 pll_control_bits = MSeries_PLL_Enable_Bit | MSeries_PLL_VCO_Mode_75_150MHz_Bits;
4621 devpriv->clock_and_fout2 |= MSeries_Timebase1_Select_Bit;
4622 devpriv->clock_and_fout2 &= ~MSeries_PLL_In_Source_Select_Mask;
4625 case NI_MIO_PLL_PXI_STAR_TRIGGER_CLOCK:
4626 devpriv->clock_and_fout2 |= MSeries_PLL_In_Source_Select_Star_Trigger_Bits;
4627 retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
4628 &freq_multiplier, &devpriv->clock_ns);
4629 if(retval < 0) return retval;
4631 case NI_MIO_PLL_PXI10_CLOCK:
4632 /* pxi clock is 10MHz */
4633 devpriv->clock_and_fout2 |= MSeries_PLL_In_Source_Select_PXI_Clock10;
4634 retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
4635 &freq_multiplier, &devpriv->clock_ns);
4636 if(retval < 0) return retval;
4640 unsigned rtsi_channel;
4641 static const unsigned max_rtsi_channel = 7;
4642 for(rtsi_channel = 0; rtsi_channel <= max_rtsi_channel; ++rtsi_channel)
4644 if(source == NI_MIO_PLL_RTSI_CLOCK(rtsi_channel))
4646 devpriv->clock_and_fout2 |= MSeries_PLL_In_Source_Select_RTSI_Bits(rtsi_channel);
4650 if(rtsi_channel > max_rtsi_channel) return -EINVAL;
4651 retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
4652 &freq_multiplier, &devpriv->clock_ns);
4653 if(retval < 0) return retval;
4657 ni_writew(devpriv->clock_and_fout2, M_Offset_Clock_and_Fout2);
4658 pll_control_bits |= MSeries_PLL_Divisor_Bits(freq_divider) | MSeries_PLL_Multiplier_Bits(freq_multiplier);
4659 // rt_printk("using divider=%i, multiplier=%i for PLL. pll_control_bits = 0x%x\n", freq_divider, freq_multiplier, pll_control_bits);
4660 // rt_printk("clock_ns=%d\n", devpriv->clock_ns);
4661 ni_writew(pll_control_bits, M_Offset_PLL_Control);
4662 devpriv->clock_source = source;
4663 /* it seems to typically take a few hundred microseconds for PLL to lock */
4664 for(i = 0; i < timeout; ++i)
4666 if(ni_readw(M_Offset_PLL_Status) & MSeries_PLL_Locked_Bit)
4674 rt_printk("%s: timed out waiting for PLL to lock to reference clock source %i with period %i ns.\n",
4675 __FUNCTION__, source, period_ns);
4681 static int ni_set_master_clock(comedi_device *dev, unsigned source, unsigned period_ns)
4683 if(source == NI_MIO_INTERNAL_CLOCK)
4685 devpriv->rtsi_trig_direction_reg &= ~Use_RTSI_Clock_Bit;
4686 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4687 devpriv->clock_ns = 50;
4688 if(boardtype.reg_type == ni_reg_m_series)
4690 devpriv->clock_and_fout2 &= ~(MSeries_Timebase1_Select_Bit | MSeries_Timebase3_Select_Bit);
4691 ni_writew(devpriv->clock_and_fout2, M_Offset_Clock_and_Fout2);
4692 ni_writew(0, M_Offset_PLL_Control);
4694 devpriv->clock_source = source;
4697 if(boardtype.reg_type == ni_reg_m_series)
4699 return ni_mseries_set_pll_master_clock(dev, source, period_ns);
4702 if(source == NI_MIO_RTSI_CLOCK)
4704 devpriv->rtsi_trig_direction_reg |= Use_RTSI_Clock_Bit;
4705 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4706 if(devpriv->clock_ns == 0)
4708 rt_printk("%s: we don't handle an unspecified clock period correctly yet, returning error.\n",
4713 devpriv->clock_ns = period_ns;
4715 devpriv->clock_source = source;
4723 static int ni_valid_rtsi_output_source(comedi_device *dev, unsigned chan, unsigned source)
4725 if(chan >= num_configurable_rtsi_channels(dev))
4727 if(chan == old_RTSI_clock_channel)
4729 if(source == NI_RTSI_OUTPUT_RTSI_OSC) return 1;
4732 rt_printk("%s: invalid source for channel=%i, channel %i is always the RTSI clock for pre-m-series boards.\n",
4733 __FUNCTION__, chan, old_RTSI_clock_channel);
4741 case NI_RTSI_OUTPUT_ADR_START1:
4742 case NI_RTSI_OUTPUT_ADR_START2:
4743 case NI_RTSI_OUTPUT_SCLKG:
4744 case NI_RTSI_OUTPUT_DACUPDN:
4745 case NI_RTSI_OUTPUT_DA_START1:
4746 case NI_RTSI_OUTPUT_G_SRC0:
4747 case NI_RTSI_OUTPUT_G_GATE0:
4748 case NI_RTSI_OUTPUT_RGOUT0:
4749 case NI_RTSI_OUTPUT_RTSI_BRD_0:
4752 case NI_RTSI_OUTPUT_RTSI_OSC:
4753 if(boardtype.reg_type == ni_reg_m_series)
4763 static int ni_set_rtsi_routing(comedi_device *dev, unsigned chan, unsigned source)
4765 if(ni_valid_rtsi_output_source(dev, chan, source) == 0) return -EINVAL;
4768 devpriv->rtsi_trig_a_output_reg &= ~RTSI_Trig_Output_Mask(chan);
4769 devpriv->rtsi_trig_a_output_reg |= RTSI_Trig_Output_Bits(chan, source);
4770 devpriv->stc_writew(dev, devpriv->rtsi_trig_a_output_reg,
4771 RTSI_Trig_A_Output_Register);
4774 devpriv->rtsi_trig_b_output_reg &= ~RTSI_Trig_Output_Mask(chan);
4775 devpriv->rtsi_trig_b_output_reg |= RTSI_Trig_Output_Bits(chan, source);
4776 devpriv->stc_writew(dev, devpriv->rtsi_trig_b_output_reg,
4777 RTSI_Trig_B_Output_Register);
4782 static unsigned ni_get_rtsi_routing(comedi_device *dev, unsigned chan)
4786 return RTSI_Trig_Output_Source(chan, devpriv->rtsi_trig_a_output_reg);
4787 }else if(chan < num_configurable_rtsi_channels(dev))
4789 return RTSI_Trig_Output_Source(chan, devpriv->rtsi_trig_b_output_reg);
4792 if(chan == old_RTSI_clock_channel)
4793 return NI_RTSI_OUTPUT_RTSI_OSC;
4794 rt_printk("%s: bug! should never get here?\n", __FUNCTION__);
4799 static int ni_rtsi_insn_config(comedi_device *dev,comedi_subdevice *s,
4800 comedi_insn *insn,lsampl_t *data)
4802 unsigned int chan = CR_CHAN(insn->chanspec);
4804 case INSN_CONFIG_DIO_OUTPUT:
4805 if(chan < num_configurable_rtsi_channels(dev))
4807 devpriv->rtsi_trig_direction_reg |= RTSI_Output_Bit(chan, boardtype.reg_type == ni_reg_m_series);
4808 }else if(chan == old_RTSI_clock_channel)
4810 devpriv->rtsi_trig_direction_reg |= Drive_RTSI_Clock_Bit;
4812 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4814 case INSN_CONFIG_DIO_INPUT:
4815 if(chan < num_configurable_rtsi_channels(dev))
4817 devpriv->rtsi_trig_direction_reg &= ~RTSI_Output_Bit(chan, boardtype.reg_type == ni_reg_m_series);
4818 }else if(chan == old_RTSI_clock_channel)
4820 devpriv->rtsi_trig_direction_reg &= ~Drive_RTSI_Clock_Bit;
4822 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4824 case INSN_CONFIG_DIO_QUERY:
4825 if(chan < num_configurable_rtsi_channels(dev))
4827 data[1] = (devpriv->rtsi_trig_direction_reg & RTSI_Output_Bit(chan, boardtype.reg_type == ni_reg_m_series)) ?
4828 INSN_CONFIG_DIO_OUTPUT : INSN_CONFIG_DIO_INPUT;
4829 }else if(chan == old_RTSI_clock_channel)
4831 data[1] = (devpriv->rtsi_trig_direction_reg & Drive_RTSI_Clock_Bit) ? INSN_CONFIG_DIO_OUTPUT : INSN_CONFIG_DIO_INPUT;
4835 case INSN_CONFIG_SET_CLOCK_SRC:
4836 return ni_set_master_clock(dev, data[1], data[2]);
4838 case INSN_CONFIG_GET_CLOCK_SRC:
4839 data[1] = devpriv->clock_source;
4840 data[2] = devpriv->clock_ns;
4843 case INSN_CONFIG_SET_ROUTING:
4844 return ni_set_rtsi_routing(dev, chan, data[1]);
4846 case INSN_CONFIG_GET_ROUTING:
4847 data[1] = ni_get_rtsi_routing(dev, chan);
4857 static int cs5529_wait_for_idle(comedi_device *dev)
4859 unsigned short status;
4860 const int timeout = HZ;
4863 for(i = 0; i < timeout; i++)
4865 status = ni_ao_win_inw(dev, CAL_ADC_Status_67xx);
4866 if((status & CSS_ADC_BUSY) == 0)
4870 set_current_state(TASK_INTERRUPTIBLE);
4871 if(schedule_timeout(1))
4876 //printk("looped %i times waiting for idle\n", i);
4879 rt_printk("%s: %s: timeout\n", __FILE__, __FUNCTION__);
4885 static void cs5529_command(comedi_device *dev, unsigned short value)
4887 static const int timeout = 100;
4890 ni_ao_win_outw(dev, value, CAL_ADC_Command_67xx);
4891 /* give time for command to start being serially clocked into cs5529.
4892 * this insures that the CSS_ADC_BUSY bit will get properly
4893 * set before we exit this function.
4895 for(i = 0; i < timeout; i++)
4897 if((ni_ao_win_inw(dev, CAL_ADC_Status_67xx) & CSS_ADC_BUSY))
4901 //printk("looped %i times writing command to cs5529\n", i);
4904 comedi_error(dev, "possible problem - never saw adc go busy?");
4908 /* write to cs5529 register */
4909 static void cs5529_config_write(comedi_device *dev, unsigned int value, unsigned int reg_select_bits)
4911 ni_ao_win_outw(dev, ((value >> 16) & 0xff), CAL_ADC_Config_Data_High_Word_67xx);
4912 ni_ao_win_outw(dev, (value & 0xffff), CAL_ADC_Config_Data_Low_Word_67xx);
4913 reg_select_bits &= CSCMD_REGISTER_SELECT_MASK;
4914 cs5529_command(dev, CSCMD_COMMAND | reg_select_bits);
4915 if(cs5529_wait_for_idle(dev))
4916 comedi_error(dev, "time or signal in cs5529_config_write()");
4919 /* read from cs5529 register */
4920 static unsigned int cs5529_config_read(comedi_device *dev, unsigned int reg_select_bits)
4924 reg_select_bits &= CSCMD_REGISTER_SELECT_MASK;
4925 cs5529_command(dev, CSCMD_COMMAND | CSCMD_READ | reg_select_bits);
4926 if(cs5529_wait_for_idle(dev))
4927 comedi_error(dev, "timeout or signal in cs5529_config_read()");
4928 value = (ni_ao_win_inw(dev, CAL_ADC_Config_Data_High_Word_67xx) << 16) & 0xff0000;
4929 value |= ni_ao_win_inw(dev, CAL_ADC_Config_Data_Low_Word_67xx) & 0xffff;
4933 static int cs5529_do_conversion(comedi_device *dev, unsigned short *data)
4936 unsigned short status;
4938 cs5529_command(dev, CSCMD_COMMAND | CSCMD_SINGLE_CONVERSION);
4939 retval = cs5529_wait_for_idle(dev);
4942 comedi_error(dev, "timeout or signal in cs5529_do_conversion()");
4945 status = ni_ao_win_inw(dev, CAL_ADC_Status_67xx);
4946 if(status & CSS_OSC_DETECT)
4948 rt_printk("ni_mio_common: cs5529 conversion error, status CSS_OSC_DETECT\n");
4951 if(status & CSS_OVERRANGE)
4953 rt_printk("ni_mio_common: cs5529 conversion error, overrange (ignoring)\n");
4957 *data = ni_ao_win_inw(dev, CAL_ADC_Data_67xx);
4958 /* cs5529 returns 16 bit signed data in bipolar mode */
4964 static int cs5529_ai_insn_read(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data)
4967 unsigned short sample;
4968 unsigned int channel_select;
4969 const unsigned int INTERNAL_REF = 0x1000;
4971 /* Set calibration adc source. Docs lie, reference select bits 8 to 11
4972 * do nothing. bit 12 seems to chooses internal reference voltage, bit
4973 * 13 causes the adc input to go overrange (maybe reads external reference?) */
4974 if(insn->chanspec & CR_ALT_SOURCE)
4975 channel_select = INTERNAL_REF;
4977 channel_select = CR_CHAN(insn->chanspec);
4978 ni_ao_win_outw(dev, channel_select, AO_Calibration_Channel_Select_67xx);
4980 for(n = 0; n < insn->n; n++)
4982 retval = cs5529_do_conversion(dev, &sample);
4983 if(retval < 0) return retval;
4989 static int init_cs5529(comedi_device *dev)
4991 unsigned int config_bits = CSCFG_PORT_MODE | CSCFG_WORD_RATE_2180_CYCLES;
4994 /* do self-calibration */
4995 cs5529_config_write(dev, config_bits | CSCFG_SELF_CAL_OFFSET_GAIN, CSCMD_CONFIG_REGISTER);
4996 /* need to force a conversion for calibration to run */
4997 cs5529_do_conversion(dev, NULL);
4999 /* force gain calibration to 1 */
5000 cs5529_config_write(dev, 0x400000, CSCMD_GAIN_REGISTER);
5001 cs5529_config_write(dev, config_bits | CSCFG_SELF_CAL_OFFSET, CSCMD_CONFIG_REGISTER);
5002 if(cs5529_wait_for_idle(dev))
5003 comedi_error(dev, "timeout or signal in init_cs5529()\n");
5007 rt_printk("config: 0x%x\n", cs5529_config_read(dev, CSCMD_CONFIG_REGISTER));
5008 rt_printk("gain: 0x%x\n", cs5529_config_read(dev, CSCMD_GAIN_REGISTER));
5009 rt_printk("offset: 0x%x\n", cs5529_config_read(dev, CSCMD_OFFSET_REGISTER));