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);
223 static void ni_rtsi_init(comedi_device *dev);
224 static int ni_rtsi_insn_bits(comedi_device *dev,comedi_subdevice *s,
225 comedi_insn *insn,lsampl_t *data);
226 static int ni_rtsi_insn_config(comedi_device *dev,comedi_subdevice *s,
227 comedi_insn *insn,lsampl_t *data);
229 static void caldac_setup(comedi_device *dev,comedi_subdevice *s);
230 static int ni_read_eeprom(comedi_device *dev,int addr);
232 #ifdef DEBUG_STATUS_A
233 static void ni_mio_print_status_a(int status);
235 #define ni_mio_print_status_a(a)
237 #ifdef DEBUG_STATUS_B
238 static void ni_mio_print_status_b(int status);
240 #define ni_mio_print_status_b(a)
243 static int ni_ai_reset(comedi_device *dev,comedi_subdevice *s);
245 static void ni_handle_fifo_half_full(comedi_device *dev);
246 static int ni_ao_fifo_half_empty(comedi_device *dev,comedi_subdevice *s);
248 static void ni_handle_fifo_dregs(comedi_device *dev);
249 static int ni_ai_inttrig(comedi_device *dev,comedi_subdevice *s,
250 unsigned int trignum);
251 static void ni_load_channelgain_list(comedi_device *dev,unsigned int n_chan,
253 static void shutdown_ai_command( comedi_device *dev );
255 static int ni_ao_inttrig(comedi_device *dev,comedi_subdevice *s,
256 unsigned int trignum);
258 static int ni_ao_reset(comedi_device *dev,comedi_subdevice *s);
260 static int ni_8255_callback(int dir,int port,int data,unsigned long arg);
262 static int ni_ns_to_timer(comedi_device *dev, int *nanosec, int round_mode);
265 /*GPCT function def's*/
266 static int GPCT_G_Watch(comedi_device *dev, int chan);
268 static void GPCT_Reset(comedi_device *dev, int chan);
269 static void GPCT_Gen_Cont_Pulse(comedi_device *dev, int chan, unsigned int length);
270 static void GPCT_Gen_Single_Pulse(comedi_device *dev, int chan, unsigned int length);
271 static void GPCT_Period_Meas(comedi_device *dev, int chan);
272 static void GPCT_Pulse_Width_Meas(comedi_device *dev, int chan);
273 static void GPCT_Event_Counting(comedi_device *dev,int chan);
274 static int GPCT_Set_Direction(comedi_device *dev,int chan,int direction);
275 static int GPCT_Set_Gate(comedi_device *dev,int chan ,int gate);
276 static int GPCT_Set_Source(comedi_device *dev,int chan ,int source);
278 static int ni_gpct_insn_write(comedi_device *dev,comedi_subdevice *s,
279 comedi_insn *insn,lsampl_t *data);
280 static int ni_gpct_insn_read(comedi_device *dev,comedi_subdevice *s,
281 comedi_insn *insn,lsampl_t *data);
282 static int ni_gpct_insn_config(comedi_device *dev,comedi_subdevice *s,
283 comedi_insn *insn,lsampl_t *data);
285 static int init_cs5529(comedi_device *dev);
286 static int cs5529_do_conversion(comedi_device *dev, unsigned short *data);
287 static int cs5529_ai_insn_read(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data);
288 static unsigned int cs5529_config_read(comedi_device *dev, unsigned int reg_select_bits);
289 static void cs5529_config_write(comedi_device *dev, unsigned int value, unsigned int reg_select_bits);
291 static int ni_m_series_pwm_config(comedi_device *dev, comedi_subdevice *s,
292 comedi_insn *insn,lsampl_t *data);
293 static int ni_6143_pwm_config(comedi_device *dev, comedi_subdevice *s,
294 comedi_insn *insn, lsampl_t *data);
296 static int ni_set_master_clock(comedi_device *dev, unsigned source, unsigned period_ns);
301 AIMODE_HALF_FULL = 1,
306 #define SERIAL_DISABLED 0
307 #define SERIAL_600NS 600
308 #define SERIAL_1_2US 1200
309 #define SERIAL_10US 10000
311 static const int num_adc_stages_611x = 3;
313 static void handle_a_interrupt(comedi_device *dev,unsigned short status,
314 unsigned int m_status);
315 static void handle_b_interrupt(comedi_device *dev,unsigned short status,
316 unsigned int m_status);
317 static void get_last_sample_611x( comedi_device *dev );
318 static void get_last_sample_6143( comedi_device *dev );
320 //static void mite_handle_interrupt(comedi_device *dev,unsigned int status);
321 static int ni_ai_drain_dma(comedi_device *dev );
324 static void ni_flush_ai_fifo(comedi_device *dev){
325 if(boardtype.reg_type == ni_reg_6143){
326 // Flush the 6143 data FIFO
327 ni_writel(0x10, AIFIFO_Control_6143); // Flush fifo
328 ni_writel(0x00, AIFIFO_Control_6143); // Flush fifo
329 while(ni_readl(AIFIFO_Status_6143) & 0x10); // Wait for complete
332 devpriv->stc_writew(dev, 1,ADC_FIFO_Clear);
336 static void win_out2(comedi_device *dev, uint32_t data, int reg)
338 devpriv->stc_writew(dev, data >> 16, reg);
339 devpriv->stc_writew(dev, data & 0xffff, reg + 1);
342 #define ao_win_out(data,addr) ni_ao_win_outw(dev,data,addr)
343 static inline void ni_ao_win_outw( comedi_device *dev, uint16_t data, int addr )
347 comedi_spin_lock_irqsave(&devpriv->window_lock,flags);
348 ni_writew(addr,AO_Window_Address_611x);
349 ni_writew(data,AO_Window_Data_611x);
350 comedi_spin_unlock_irqrestore(&devpriv->window_lock,flags);
353 static inline void ni_ao_win_outl(comedi_device *dev, uint32_t data, int addr)
357 comedi_spin_lock_irqsave(&devpriv->window_lock,flags);
358 ni_writew(addr,AO_Window_Address_611x);
359 ni_writel(data,AO_Window_Data_611x);
360 comedi_spin_unlock_irqrestore(&devpriv->window_lock,flags);
363 static inline unsigned short ni_ao_win_inw( comedi_device *dev, int addr )
368 comedi_spin_lock_irqsave(&devpriv->window_lock,flags);
369 ni_writew(addr, AO_Window_Address_611x);
370 data = ni_readw(AO_Window_Data_611x);
371 comedi_spin_unlock_irqrestore(&devpriv->window_lock,flags);
375 /* ni_set_bits( ) allows different parts of the ni_mio_common driver to
376 * share registers (such as Interrupt_A_Register) without interfering with
379 * NOTE: the switch/case statements are optimized out for a constant argument
380 * so this is actually quite fast--- If you must wrap another function around this
381 * make it inline to avoid a large speed penalty.
383 * value should only be 1 or 0.
385 static inline void ni_set_bits(comedi_device *dev, int reg, int bits, int value)
389 comedi_spin_lock_irqsave( &devpriv->window_lock, flags );
391 case Interrupt_A_Enable_Register:
393 devpriv->int_a_enable_reg |= bits;
395 devpriv->int_a_enable_reg &= ~bits;
396 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
397 devpriv->stc_writew(dev, devpriv->int_a_enable_reg,Interrupt_A_Enable_Register);
399 case Interrupt_B_Enable_Register:
401 devpriv->int_b_enable_reg |= bits;
403 devpriv->int_b_enable_reg &= ~bits;
404 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
405 devpriv->stc_writew(dev, devpriv->int_b_enable_reg,Interrupt_B_Enable_Register);
407 case IO_Bidirection_Pin_Register:
409 devpriv->io_bidirection_pin_reg |= bits;
411 devpriv->io_bidirection_pin_reg &= ~bits;
412 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
413 devpriv->stc_writew(dev, devpriv->io_bidirection_pin_reg,IO_Bidirection_Pin_Register);
416 rt_printk("Warning ni_set_bits() called with invalid arguments\n");
417 rt_printk("reg is %d\n",reg);
418 comedi_spin_unlock_irqrestore( &devpriv->window_lock, flags );
424 static irqreturn_t ni_E_interrupt(int irq,void *d,struct pt_regs * regs)
426 comedi_device *dev=d;
427 unsigned short a_status;
428 unsigned short b_status;
429 unsigned int m0_status;
430 unsigned int m1_status;
433 struct mite_struct *mite = devpriv->mite;
436 if(dev->attached == 0) return IRQ_NONE;
437 // lock to avoid race with comedi_poll
438 comedi_spin_lock_irqsave(&dev->spinlock, flags);
439 a_status=devpriv->stc_readw(dev, AI_Status_1_Register);
440 b_status=devpriv->stc_readw(dev, AO_Status_1_Register);
442 m0_status=readl(mite->mite_io_addr + MITE_CHSR(AI_DMA_CHAN));
443 m1_status=readl(mite->mite_io_addr + MITE_CHSR(AO_DMA_CHAN));
449 if(a_status&Interrupt_A_St || m0_status & CHSR_INT )
450 handle_a_interrupt(dev, a_status, m0_status);
451 if(b_status&Interrupt_B_St || m1_status & CHSR_INT )
452 handle_b_interrupt(dev, b_status, m1_status);
453 comedi_spin_unlock_irqrestore(&dev->spinlock, flags);
458 static void ni_sync_ai_dma(struct mite_struct *mite, comedi_device *dev)
461 comedi_subdevice *s = dev->subdevices + 0;
462 comedi_async *async = s->async;
463 unsigned int nbytes, old_alloc_count;
464 unsigned int bytes_per_scan = bytes_per_sample(s) * async->cmd.chanlist_len;
466 old_alloc_count = async->buf_write_alloc_count;
467 // write alloc as much as we can
468 comedi_buf_write_alloc(s->async, s->async->prealloc_bufsz);
470 nbytes = mite_bytes_written_to_memory_lb(mite, AI_DMA_CHAN);
472 if( (int)(mite_bytes_written_to_memory_ub(mite, AI_DMA_CHAN) - old_alloc_count) > 0 ){
473 rt_printk("ni_mio_common: DMA overwrite of free area\n");
475 async->events |= COMEDI_CB_OVERFLOW;
479 count = nbytes - async->buf_write_count;
481 /* it's possible count will be negative due to
482 * conservative value returned by mite_bytes_transferred */
485 comedi_buf_write_free(async, count);
487 async->scan_progress += count;
488 if( async->scan_progress >= bytes_per_scan )
490 async->scan_progress %= bytes_per_scan;
491 async->events |= COMEDI_CB_EOS;
493 async->events |= COMEDI_CB_BLOCK;
496 static void mite_handle_b_linkc(struct mite_struct *mite, comedi_device *dev)
499 comedi_subdevice *s = dev->subdevices + 1;
500 comedi_async *async = s->async;
501 u32 nbytes_ub, nbytes_lb;
502 unsigned int new_write_count;
503 u32 stop_count = async->cmd.stop_arg * sizeof(sampl_t);
505 writel(CHOR_CLRLC, mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
507 new_write_count = async->buf_write_count;
509 nbytes_lb = mite_bytes_read_from_memory_lb(mite, AO_DMA_CHAN);
510 if(async->cmd.stop_src == TRIG_COUNT &&
511 (int) (nbytes_lb - stop_count) > 0)
512 nbytes_lb = stop_count;
514 nbytes_ub = mite_bytes_read_from_memory_ub(mite, AO_DMA_CHAN);
515 if(async->cmd.stop_src == TRIG_COUNT &&
516 (int) (nbytes_ub - stop_count) > 0)
517 nbytes_ub = stop_count;
518 if((int)(nbytes_ub - devpriv->last_buf_write_count) > 0){
519 rt_printk("ni_mio_common: DMA underrun\n");
521 async->events |= COMEDI_CB_OVERFLOW;
525 devpriv->last_buf_write_count = new_write_count;
527 count = nbytes_lb - async->buf_read_count;
531 comedi_buf_read_free(async, count);
533 async->events |= COMEDI_CB_BLOCK;
536 static int ni_ao_wait_for_dma_load( comedi_device *dev )
538 static const int timeout = 10000;
541 for(i = 0; i < timeout; i++)
543 unsigned short b_status;
545 b_status = devpriv->stc_readw(dev, AO_Status_1_Register );
546 if( b_status & AO_FIFO_Half_Full_St )
548 /* if we poll too often, the pci bus activity seems
549 to slow the dma transfer down */
554 comedi_error(dev, "timed out waiting for dma load");
561 static void ni_handle_eos(comedi_device *dev, comedi_subdevice *s)
563 if(devpriv->aimode == AIMODE_SCAN)
566 static const int timeout = 10;
569 for(i = 0; i < timeout; i++)
571 ni_sync_ai_dma(devpriv->mite, dev);
572 if((s->async->events & COMEDI_CB_EOS)) break;
576 ni_handle_fifo_dregs(dev);
577 s->async->events |= COMEDI_CB_EOS;
580 /* handle special case of single scan using AI_End_On_End_Of_Scan */
581 if((devpriv->ai_cmd2 & AI_End_On_End_Of_Scan)){
582 shutdown_ai_command( dev );
587 static void shutdown_ai_command( comedi_device *dev )
589 comedi_subdevice *s = dev->subdevices + 0;
592 ni_ai_drain_dma( dev );
593 mite_dma_disarm(devpriv->mite, AI_DMA_CHAN);
595 ni_handle_fifo_dregs(dev);
596 get_last_sample_611x(dev);
597 get_last_sample_6143(dev);
599 ni_set_bits(dev, Interrupt_A_Enable_Register,
600 AI_SC_TC_Interrupt_Enable | AI_START1_Interrupt_Enable|
601 AI_START2_Interrupt_Enable| AI_START_Interrupt_Enable|
602 AI_STOP_Interrupt_Enable| AI_Error_Interrupt_Enable|
603 AI_FIFO_Interrupt_Enable,0);
605 s->async->events |= COMEDI_CB_EOA;
608 static void handle_a_interrupt(comedi_device *dev,unsigned short status,
609 unsigned int m_status)
611 comedi_subdevice *s=dev->subdevices+0;
612 unsigned short ack=0;
614 s->async->events = 0;
616 #ifdef DEBUG_INTERRUPT
617 rt_printk("ni_mio_common: interrupt: a_status=%04x m0_status=%08x\n",
619 ni_mio_print_status_a(status);
624 /* Currently, mite.c requires us to handle LINKC and DONE */
625 if(m_status & CHSR_LINKC){
626 writel(CHOR_CLRLC, devpriv->mite->mite_io_addr + MITE_CHOR(AI_DMA_CHAN));
627 ni_sync_ai_dma(devpriv->mite, dev);
630 if(m_status & CHSR_DONE){
631 writel(CHOR_CLRDONE, devpriv->mite->mite_io_addr + MITE_CHOR(AI_DMA_CHAN));
634 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)){
635 rt_printk("unknown mite interrupt, ack! (m_status=%08x)\n", m_status);
636 //mite_print_chsr(m_status);
637 mite_dma_disarm(devpriv->mite, AI_DMA_CHAN );
638 writel(CHOR_DMARESET, devpriv->mite->mite_io_addr + MITE_CHOR(AI_DMA_CHAN));
639 //disable_irq(dev->irq);
643 /* test for all uncommon interrupt events at the same time */
644 if(status&(AI_Overrun_St|AI_Overflow_St|AI_SC_TC_Error_St|AI_SC_TC_St|AI_START1_St)){
646 rt_printk("ni_mio_common: a_status=0xffff. Card removed?\n");
647 /* we probably aren't even running a command now,
648 * so it's a good idea to be careful. */
649 if(s->subdev_flags&SDF_RUNNING){
650 s->async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
651 //comedi_event(dev,s,s->async->events);
655 if(status&(AI_Overrun_St|AI_Overflow_St|AI_SC_TC_Error_St)){
656 rt_printk("ni_mio_common: ai error a_status=%04x\n",
658 ni_mio_print_status_a(status);
660 ni_ai_reset(dev,dev->subdevices);
663 shutdown_ai_command( dev );
665 s->async->events |= COMEDI_CB_ERROR;
666 if(status & (AI_Overrun_St | AI_Overflow_St))
667 s->async->events |= COMEDI_CB_OVERFLOW;
669 comedi_event(dev,s,s->async->events);
673 if(status&AI_SC_TC_St){
674 #ifdef DEBUG_INTERRUPT
675 rt_printk("ni_mio_common: SC_TC interrupt\n");
677 if(!devpriv->ai_continuous){
678 shutdown_ai_command( dev );
680 ack|=AI_SC_TC_Interrupt_Ack;
682 if(status&AI_START1_St){
683 ack|=AI_START1_Interrupt_Ack;
687 if(status&AI_FIFO_Half_Full_St){
689 static const int timeout = 10;
690 /* pcmcia cards (at least 6036) seem to stop producing interrupts if we
691 *fail to get the fifo less than half full, so loop to be sure.*/
692 for(i = 0; i < timeout; ++i)
694 ni_handle_fifo_half_full(dev);
695 if((devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Half_Full_St) == 0)
701 if( (status & AI_STOP_St) ){
702 ni_handle_eos(dev, s);
703 /* we need to ack the START, also */
704 ack |= AI_STOP_Interrupt_Ack|AI_START_Interrupt_Ack;
707 if(devpriv->aimode==AIMODE_SAMPLE){
708 ni_handle_fifo_dregs(dev);
710 //s->async->events |= COMEDI_CB_SAMPLE;
713 if(ack) devpriv->stc_writew(dev, ack,Interrupt_A_Ack_Register);
715 comedi_event(dev,s,s->async->events);
717 #ifdef DEBUG_INTERRUPT
718 status=devpriv->stc_readw(dev, AI_Status_1_Register);
719 if(status&Interrupt_A_St){
720 rt_printk("handle_a_interrupt: didn't clear interrupt? status=0x%x\n", status);
725 static void handle_b_interrupt(comedi_device *dev,unsigned short b_status, unsigned int m_status)
727 comedi_subdevice *s=dev->subdevices+1;
728 //unsigned short ack=0;
729 #ifdef DEBUG_INTERRUPT
730 rt_printk("ni_mio_common: interrupt: b_status=%04x m1_status=%08x\n",
732 ni_mio_print_status_b(b_status);
737 /* Currently, mite.c requires us to handle LINKC and DONE */
738 if(m_status & CHSR_LINKC){
739 mite_handle_b_linkc(devpriv->mite, dev);
742 if(m_status & CHSR_DONE){
743 writel(CHOR_CLRDONE, devpriv->mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
746 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)){
747 rt_printk("unknown mite interrupt, ack! (m_status=%08x)\n", m_status);
748 //mite_print_chsr(m_status);
749 mite_dma_disarm(devpriv->mite, AO_DMA_CHAN );
750 writel(CHOR_DMARESET, devpriv->mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
754 if(b_status==0xffff)return;
755 if(b_status&AO_Overrun_St){
756 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));
758 s->async->events |= COMEDI_CB_OVERFLOW;
761 if(b_status&AO_BC_TC_St){
762 MDPRINTK("ni_mio_common: AO BC_TC status=0x%04x status2=0x%04x\n",b_status,devpriv->stc_readw(dev, AO_Status_2_Register));
764 s->async->events |= COMEDI_CB_EOA;
768 if(b_status&AO_FIFO_Request_St){
771 ret = ni_ao_fifo_half_empty(dev,s);
773 rt_printk("ni_mio_common: AO buffer underrun\n");
774 ni_set_bits(dev, Interrupt_B_Enable_Register,
775 AO_FIFO_Interrupt_Enable|AO_Error_Interrupt_Enable, 0);
776 s->async->events |= COMEDI_CB_OVERFLOW;
781 b_status=devpriv->stc_readw(dev, AO_Status_1_Register);
782 if(b_status&Interrupt_B_St){
783 if(b_status&AO_FIFO_Request_St){
784 rt_printk("ni_mio_common: AO buffer underrun\n");
786 rt_printk("Ack! didn't clear AO interrupt. b_status=0x%04x\n",b_status);
787 ni_set_bits(dev,Interrupt_B_Enable_Register,~0,0);
789 s->async->events |= COMEDI_CB_OVERFLOW;
792 comedi_event(dev,s,s->async->events);
795 #ifdef DEBUG_STATUS_A
796 static char *status_a_strings[]={
797 "passthru0","fifo","G0_gate","G0_TC",
798 "stop","start","sc_tc","start1",
799 "start2","sc_tc_error","overflow","overrun",
800 "fifo_empty","fifo_half_full","fifo_full","interrupt_a"
803 static void ni_mio_print_status_a(int status)
807 rt_printk("A status:");
810 rt_printk(" %s",status_a_strings[i]);
817 #ifdef DEBUG_STATUS_B
818 static char *status_b_strings[]={
819 "passthru1","fifo","G1_gate","G1_TC",
820 "UI2_TC","UPDATE","UC_TC","BC_TC",
821 "start1","overrun","start","bc_tc_error",
822 "fifo_empty","fifo_half_full","fifo_full","interrupt_b"
825 static void ni_mio_print_status_b(int status)
829 rt_printk("B status:");
832 rt_printk(" %s",status_b_strings[i]);
841 static void ni_ao_fifo_load(comedi_device *dev,comedi_subdevice *s, int n)
843 comedi_async *async = s->async;
844 comedi_cmd *cmd = &async->cmd;
852 chan = async->cur_chan;
854 err &= comedi_buf_get(async, &d);
857 range = CR_RANGE(cmd->chanlist[chan]);
859 if(boardtype.reg_type & ni_reg_6xxx_mask)
861 packed_data = d & 0xffff;
862 /* 6711 only has 16 bit wide ao fifo */
863 if(boardtype.reg_type != ni_reg_6711)
865 err &= comedi_buf_get(async, &d);
869 packed_data |= ( d << 16 ) & 0xffff0000;
871 ni_writel( packed_data, DAC_FIFO_Data_611x );
873 ni_writew(d, DAC_FIFO_Data);
876 chan %= cmd->chanlist_len;
878 async->cur_chan = chan;
880 async->events |= COMEDI_CB_OVERFLOW;
885 * There's a small problem if the FIFO gets really low and we
886 * don't have the data to fill it. Basically, if after we fill
887 * the FIFO with all the data available, the FIFO is _still_
888 * less than half full, we never clear the interrupt. If the
889 * IRQ is in edge mode, we never get another interrupt, because
890 * this one wasn't cleared. If in level mode, we get flooded
891 * with interrupts that we can't fulfill, because nothing ever
892 * gets put into the buffer.
894 * This kind of situation is recoverable, but it is easier to
895 * just pretend we had a FIFO underrun, since there is a good
896 * chance it will happen anyway. This is _not_ the case for
897 * RT code, as RT code might purposely be running close to the
898 * metal. Needs to be fixed eventually.
900 static int ni_ao_fifo_half_empty(comedi_device *dev,comedi_subdevice *s)
904 n = comedi_buf_read_n_available(s);
906 s->async->events |= COMEDI_CB_OVERFLOW;
910 n /= sizeof(sampl_t);
911 if(n > boardtype.ao_fifo_depth / 2)
912 n = boardtype.ao_fifo_depth / 2;
914 ni_ao_fifo_load(dev,s,n);
916 s->async->events |= COMEDI_CB_BLOCK;
921 static int ni_ao_prep_fifo(comedi_device *dev,comedi_subdevice *s)
926 devpriv->stc_writew(dev, 1,DAC_FIFO_Clear);
927 if(boardtype.reg_type & ni_reg_6xxx_mask)
928 ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x);
931 n = comedi_buf_read_n_available(s);
934 n /= sizeof(sampl_t);
935 if(n > boardtype.ao_fifo_depth)
936 n = boardtype.ao_fifo_depth;
938 ni_ao_fifo_load(dev,s,n);
943 static void ni_ai_fifo_read(comedi_device *dev,comedi_subdevice *s,
946 comedi_async *async = s->async;
949 if(boardtype.reg_type == ni_reg_611x){
953 for( i = 0; i < n / 2; i++ ){
954 dl=ni_readl(ADC_FIFO_Data_611x);
955 /* This may get the hi/lo data in the wrong order */
956 data[0] = (dl>>16) & 0xffff;
957 data[1] = dl & 0xffff;
958 cfc_write_array_to_buffer(s, data, sizeof(data));
960 /* Check if there's a single sample stuck in the FIFO */
962 dl=ni_readl(ADC_FIFO_Data_611x);
963 data[0] = dl & 0xffff;
964 cfc_write_to_buffer(s, data[0]);
966 } else if(boardtype.reg_type == ni_reg_6143){
970 // This just reads the FIFO assuming the data is present, no checks on the FIFO status are performed
971 for(i = 0; i < n / 2; i++){
972 dl = ni_readl(AIFIFO_Data_6143);
974 data[0] = (dl >> 16) & 0xffff;
975 data[1] = dl & 0xffff;
976 cfc_write_array_to_buffer(s, data, sizeof(data));
979 /* Assume there is a single sample stuck in the FIFO */
980 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
981 dl = ni_readl(AIFIFO_Data_6143);
982 data[0] = (dl >> 16) & 0xffff;
983 cfc_write_to_buffer(s, data[0]);
986 if( n > sizeof(devpriv->ai_fifo_buffer) / sizeof(devpriv->ai_fifo_buffer[0]))
988 comedi_error( dev, "bug! ai_fifo_buffer too small" );
989 async->events |= COMEDI_CB_ERROR;
992 for(i = 0; i < n; i++){
993 devpriv->ai_fifo_buffer[i] = ni_readw(ADC_FIFO_Data_Register);
995 cfc_write_array_to_buffer( s, devpriv->ai_fifo_buffer,
996 n * sizeof(devpriv->ai_fifo_buffer[0]) );
1000 static void ni_handle_fifo_half_full(comedi_device *dev)
1003 comedi_subdevice *s=dev->subdevices+0;
1005 n=boardtype.ai_fifo_depth/2;
1007 ni_ai_fifo_read(dev,s,n);
1012 static int ni_ai_drain_dma(comedi_device *dev )
1014 struct mite_struct *mite = devpriv->mite;
1016 static const int timeout = 10000;
1018 for( i = 0; i < timeout; i++ )
1020 if((devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St) &&
1021 mite_bytes_in_transit(mite, AI_DMA_CHAN) == 0)
1027 rt_printk("ni_mio_common: wait for dma drain timed out\n");
1028 rt_printk("mite_bytes_in_transit=%i, AI_Status1_Register=0x%x\n",
1029 mite_bytes_in_transit(mite, AI_DMA_CHAN), devpriv->stc_readw(dev, AI_Status_1_Register));
1033 ni_sync_ai_dma( mite, dev );
1041 static void ni_handle_fifo_dregs(comedi_device *dev)
1043 comedi_subdevice *s=dev->subdevices+0;
1049 if(boardtype.reg_type == ni_reg_611x){
1050 while((devpriv->stc_readw(dev, AI_Status_1_Register)&AI_FIFO_Empty_St) == 0){
1051 dl=ni_readl(ADC_FIFO_Data_611x);
1053 /* This may get the hi/lo data in the wrong order */
1055 data[1] = (dl&0xffff);
1056 cfc_write_array_to_buffer(s, data, sizeof(data));
1058 }else if(boardtype.reg_type == ni_reg_6143){
1060 while(ni_readl(AIFIFO_Status_6143) & 0x04){
1061 dl = ni_readl(AIFIFO_Data_6143);
1063 /* This may get the hi/lo data in the wrong order */
1064 data[0] = (dl >> 16);
1065 data[1] = (dl & 0xffff);
1066 cfc_write_array_to_buffer(s, data, sizeof(data));
1069 // Check if stranded sample is present
1070 if(ni_readl(AIFIFO_Status_6143) & 0x01){
1071 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
1072 dl = ni_readl(AIFIFO_Data_6143);
1073 data[0] = (dl >> 16) & 0xffff;
1074 cfc_write_to_buffer(s, data[0]);
1078 fifo_empty = devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St;
1079 while(fifo_empty == 0)
1081 for(i = 0; i < sizeof(devpriv->ai_fifo_buffer) / sizeof(devpriv->ai_fifo_buffer[0]); i++)
1083 fifo_empty = devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St;
1084 if(fifo_empty) break;
1085 devpriv->ai_fifo_buffer[i] = ni_readw(ADC_FIFO_Data_Register);
1087 cfc_write_array_to_buffer( s, devpriv->ai_fifo_buffer,
1088 i * sizeof(devpriv->ai_fifo_buffer[0]) );
1093 static void get_last_sample_611x( comedi_device *dev )
1095 comedi_subdevice *s=dev->subdevices+0;
1099 if(boardtype.reg_type != ni_reg_611x) return;
1101 /* Check if there's a single sample stuck in the FIFO */
1102 if(ni_readb(XXX_Status)&0x80){
1103 dl=ni_readl(ADC_FIFO_Data_611x);
1105 cfc_write_to_buffer(s, data);
1109 static void get_last_sample_6143(comedi_device* dev)
1111 comedi_subdevice* s = dev->subdevices + 0;
1115 if(boardtype.reg_type != ni_reg_6143) return;
1117 /* Check if there's a single sample stuck in the FIFO */
1118 if(ni_readl(AIFIFO_Status_6143) & 0x01){
1119 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
1120 dl = ni_readl(AIFIFO_Data_6143);
1122 /* This may get the hi/lo data in the wrong order */
1123 data = (dl >> 16) & 0xffff;
1124 cfc_write_to_buffer(s, data);
1128 static void ni_ai_munge(comedi_device *dev, comedi_subdevice *s,
1129 void *data, unsigned int num_bytes, unsigned int chan_index )
1131 comedi_async *async = s->async;
1133 unsigned int length = num_bytes / bytes_per_sample(s);
1134 sampl_t *array = data;
1135 lsampl_t *larray = data;
1136 for(i = 0; i < length; i++)
1139 if(s->subdev_flags & SDF_LSAMPL)
1140 larray[i] = le32_to_cpu(larray[i]);
1142 array[i] = le16_to_cpu(array[i]);
1144 if(s->subdev_flags & SDF_LSAMPL)
1145 larray[i] += devpriv->ai_offset[chan_index];
1147 array[i] += devpriv->ai_offset[chan_index];
1149 chan_index %= async->cmd.chanlist_len;
1155 static void ni_ai_setup_MITE_dma(comedi_device *dev,comedi_cmd *cmd)
1157 struct mite_struct *mite = devpriv->mite;
1158 struct mite_channel *mite_chan = &mite->channels[ AI_DMA_CHAN ];
1159 comedi_subdevice *s = dev->subdevices + 0;
1161 /* write alloc the entire buffer */
1162 comedi_buf_write_alloc(s->async, s->async->prealloc_bufsz);
1164 mite_chan->current_link = 0;
1165 mite_chan->dir = COMEDI_INPUT;
1166 switch(boardtype.reg_type)
1170 mite_prep_dma(mite, AI_DMA_CHAN, 32, 16);
1172 case ni_reg_m_series:
1173 if(boardtype.adbits > 16)
1174 mite_prep_dma(mite, AI_DMA_CHAN, 32, 32);
1176 mite_prep_dma(mite, AI_DMA_CHAN, 16, 16); //guess
1179 mite_prep_dma(mite, AI_DMA_CHAN, 16, 16);
1183 mite_dma_arm(mite, AI_DMA_CHAN);
1186 static void ni_ao_setup_MITE_dma(comedi_device *dev,comedi_cmd *cmd)
1188 struct mite_struct *mite = devpriv->mite;
1189 struct mite_channel *mite_chan = &mite->channels[ AO_DMA_CHAN ];
1190 comedi_subdevice *s = dev->subdevices + 1;
1192 devpriv->last_buf_write_count = s->async->buf_write_count;
1194 mite_chan->current_link = 0;
1195 mite_chan->dir = COMEDI_OUTPUT;
1196 if(boardtype.reg_type & (ni_reg_611x | ni_reg_6713))
1197 mite_prep_dma(mite, AO_DMA_CHAN, 32, 32);
1199 mite_prep_dma(mite, AO_DMA_CHAN, 16, 16);
1202 mite_dma_arm(mite, AO_DMA_CHAN);
1208 used for both cancel ioctl and board initialization
1210 this is pretty harsh for a cancel, but it works...
1213 static int ni_ai_reset(comedi_device *dev,comedi_subdevice *s)
1216 mite_dma_disarm(devpriv->mite, AI_DMA_CHAN);
1218 /* ai configuration */
1219 devpriv->stc_writew(dev, AI_Configuration_Start | AI_Reset, Joint_Reset_Register);
1221 ni_set_bits(dev, Interrupt_A_Enable_Register,
1222 AI_SC_TC_Interrupt_Enable | AI_START1_Interrupt_Enable|
1223 AI_START2_Interrupt_Enable| AI_START_Interrupt_Enable|
1224 AI_STOP_Interrupt_Enable| AI_Error_Interrupt_Enable|
1225 AI_FIFO_Interrupt_Enable,0);
1227 ni_flush_ai_fifo(dev);
1229 if(boardtype.reg_type != ni_reg_6143)
1230 ni_writeb(0, Misc_Command);
1232 devpriv->stc_writew(dev, AI_Disarm, AI_Command_1_Register); /* reset pulses */
1233 devpriv->stc_writew(dev, AI_Start_Stop | AI_Mode_1_Reserved /*| AI_Trigger_Once */,
1234 AI_Mode_1_Register);
1235 devpriv->stc_writew(dev, 0x0000,AI_Mode_2_Register);
1236 /* generate FIFO interrupts on non-empty */
1237 devpriv->stc_writew(dev, (0<<6)|0x0000,AI_Mode_3_Register);
1238 if(boardtype.reg_type == ni_reg_611x){
1239 devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1241 AI_LOCALMUX_CLK_Pulse_Width, AI_Personal_Register);
1242 devpriv->stc_writew(dev, AI_SCAN_IN_PROG_Output_Select(3) |
1243 AI_EXTMUX_CLK_Output_Select(0) |
1244 AI_LOCALMUX_CLK_Output_Select(2) |
1245 AI_SC_TC_Output_Select(3) |
1246 AI_CONVERT_Output_Select(3),AI_Output_Control_Register);
1247 }else if(boardtype.reg_type == ni_reg_6143){
1248 devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1250 AI_LOCALMUX_CLK_Pulse_Width, AI_Personal_Register);
1251 devpriv->stc_writew(dev, AI_SCAN_IN_PROG_Output_Select(3) |
1252 AI_EXTMUX_CLK_Output_Select(0) |
1253 AI_LOCALMUX_CLK_Output_Select(2) |
1254 AI_SC_TC_Output_Select(3) |
1255 AI_CONVERT_Output_Select(2),AI_Output_Control_Register);
1257 devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
1259 AI_CONVERT_Pulse_Width |
1260 AI_LOCALMUX_CLK_Pulse_Width, AI_Personal_Register);
1261 devpriv->stc_writew(dev, AI_SCAN_IN_PROG_Output_Select(3) |
1262 AI_EXTMUX_CLK_Output_Select(0) |
1263 AI_LOCALMUX_CLK_Output_Select(2) |
1264 AI_SC_TC_Output_Select(3) |
1265 AI_CONVERT_Output_Select(2),AI_Output_Control_Register);
1267 /* the following registers should not be changed, because there
1268 * are no backup registers in devpriv. If you want to change
1269 * any of these, add a backup register and other appropriate code:
1270 * AI_Mode_1_Register
1271 * AI_Mode_3_Register
1272 * AI_Personal_Register
1273 * AI_Output_Control_Register
1275 devpriv->stc_writew(dev, AI_SC_TC_Error_Confirm | AI_START_Interrupt_Ack |
1276 AI_START2_Interrupt_Ack | AI_START1_Interrupt_Ack |
1277 AI_SC_TC_Interrupt_Ack | AI_Error_Interrupt_Ack |
1278 AI_STOP_Interrupt_Ack, Interrupt_A_Ack_Register); /* clear interrupts */
1280 devpriv->stc_writew(dev, AI_Configuration_End,Joint_Reset_Register);
1285 static int ni_ai_poll(comedi_device *dev,comedi_subdevice *s)
1287 unsigned long flags = 0;
1290 // lock to avoid race with interrupt handler
1291 if(in_interrupt() == 0)
1292 comedi_spin_lock_irqsave(&dev->spinlock, flags);
1294 ni_handle_fifo_dregs(dev);
1296 ni_sync_ai_dma(devpriv->mite, dev);
1298 count = s->async->buf_write_count - s->async->buf_read_count;
1299 if(in_interrupt() == 0)
1300 comedi_spin_unlock_irqrestore(&dev->spinlock, flags);
1306 static int ni_ai_insn_read(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data)
1309 const unsigned int mask = (1 << boardtype.adbits) - 1;
1314 ni_load_channelgain_list(dev,1,&insn->chanspec);
1316 ni_flush_ai_fifo(dev);
1318 signbits=devpriv->ai_offset[0];
1319 if(boardtype.reg_type == ni_reg_611x){
1320 for(n=0; n < num_adc_stages_611x; n++){
1321 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1324 for(n=0; n<insn->n; n++){
1325 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1326 /* The 611x has screwy 32-bit FIFOs. */
1328 for(i=0; i<NI_TIMEOUT; i++){
1329 if(ni_readb(XXX_Status)&0x80)
1331 d = ( ni_readl(ADC_FIFO_Data_611x) >> 16 ) & 0xffff;
1334 if(!(devpriv->stc_readw(dev, AI_Status_1_Register)&AI_FIFO_Empty_St))
1336 d = ni_readl(ADC_FIFO_Data_611x) & 0xffff;
1341 rt_printk("ni_mio_common: timeout in 611x ni_ai_insn_read\n");
1347 }else if(boardtype.reg_type == ni_reg_6143){
1348 for(n = 0; n < insn->n; n++){
1349 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1351 /* The 6143 has 32-bit FIFOs. You need to strobe a bit to move a single 16bit stranded sample into the FIFO */
1353 for(i = 0; i < NI_TIMEOUT; i++){
1354 if(ni_readl(AIFIFO_Status_6143) & 0x01)
1356 ni_writel(0x01, AIFIFO_Control_6143); // Get stranded sample into FIFO
1357 dl = ni_readl(AIFIFO_Data_6143);
1361 if(i == NI_TIMEOUT){
1362 rt_printk("ni_mio_common: timeout in 6143 ni_ai_insn_read\n");
1365 data[n] = (((dl >> 16) & 0xFFFF) + signbits) & 0xFFFF;
1368 for(n=0;n<insn->n;n++){
1369 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1370 for(i=0;i<NI_TIMEOUT;i++){
1371 if(!(devpriv->stc_readw(dev, AI_Status_1_Register)&AI_FIFO_Empty_St))
1375 rt_printk("ni_mio_common: timeout in ni_ai_insn_read\n");
1378 if(boardtype.reg_type == ni_reg_m_series)
1380 data[n] = ni_readl(M_Offset_AI_FIFO_Data) & mask;
1383 d = ni_readw(ADC_FIFO_Data_Register);
1384 d += signbits; /* subtle: needs to be short addition */
1392 void ni_prime_channelgain_list(comedi_device *dev)
1395 devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
1396 for(i = 0; i < NI_TIMEOUT; ++i)
1398 if(!(devpriv->stc_readw(dev, AI_Status_1_Register) & AI_FIFO_Empty_St))
1400 devpriv->stc_writew(dev, 1, ADC_FIFO_Clear);
1405 rt_printk("ni_mio_common: timeout loading channel/gain list\n");
1408 static void ni_m_series_load_channelgain_list(comedi_device *dev,unsigned int n_chan,
1411 unsigned int chan, range, aref;
1413 unsigned config_bits = 0;
1415 unsigned int dither;
1416 unsigned range_code;
1418 devpriv->stc_writew(dev, 1, Configuration_Memory_Clear);
1420 // offset = 1 << (boardtype.adbits - 1);
1421 if((list[0] & CR_ALT_SOURCE))
1423 chan = CR_CHAN(list[0]);
1424 range = CR_RANGE(list[0]);
1425 range_code = ni_gainlkup[boardtype.gainlkup][range];
1426 dither = ((list[0] & CR_ALT_FILTER) != 0);
1427 unsigned bypass_bits = MSeries_AI_Bypass_Config_FIFO_Bit;
1428 bypass_bits |= chan;
1429 bypass_bits |= (devpriv->ai_calib_source) & (MSeries_AI_Bypass_Cal_Sel_Pos_Mask |
1430 MSeries_AI_Bypass_Cal_Sel_Neg_Mask | MSeries_AI_Bypass_Mode_Mux_Mask |
1431 MSeries_AO_Bypass_AO_Cal_Sel_Mask);
1432 bypass_bits |= MSeries_AI_Bypass_Gain_Bits(range_code);
1434 bypass_bits |= MSeries_AI_Bypass_Dither_Bit;
1435 // don't use 2's complement encoding
1436 bypass_bits |= MSeries_AI_Bypass_Polarity_Bit;
1437 ni_writel(bypass_bits, M_Offset_AI_Config_FIFO_Bypass);
1440 ni_writel(0, M_Offset_AI_Config_FIFO_Bypass);
1443 for(i = 0; i < n_chan; i++)
1445 chan = CR_CHAN(list[i]);
1446 aref = CR_AREF(list[i]);
1447 range = CR_RANGE(list[i]);
1448 dither = ((list[i] & CR_ALT_FILTER) != 0);
1450 range_code = ni_gainlkup[boardtype.gainlkup][range];
1451 devpriv->ai_offset[i] = offset;
1456 config_bits |= MSeries_AI_Config_Channel_Type_Differential_Bits;
1459 config_bits |= MSeries_AI_Config_Channel_Type_Common_Ref_Bits;
1462 config_bits |= MSeries_AI_Config_Channel_Type_Ground_Ref_Bits;
1467 config_bits |= MSeries_AI_Config_Channel_Bits(chan);
1468 config_bits |= MSeries_AI_Config_Bank_Bits(chan);
1469 config_bits |= MSeries_AI_Config_Gain_Bits(range_code);
1470 if(i == n_chan - 1) config_bits |= MSeries_AI_Config_Last_Channel_Bit;
1471 if(dither) config_bits |= MSeries_AI_Config_Dither_Bit;
1472 // don't use 2's complement encoding
1473 config_bits |= MSeries_AI_Config_Polarity_Bit;
1474 ni_writew(config_bits, M_Offset_AI_Config_FIFO_Data);
1476 ni_prime_channelgain_list(dev);
1480 * Notes on the 6110 and 6111:
1481 * These boards a slightly different than the rest of the series, since
1482 * they have multiple A/D converters.
1483 * From the driver side, the configuration memory is a
1485 * Configuration Memory Low:
1487 * bit 8: unipolar/bipolar (should be 0 for bipolar)
1488 * bits 0-3: gain. This is 4 bits instead of 3 for the other boards
1489 * 1001 gain=0.1 (+/- 50)
1498 * Configuration Memory High:
1499 * bits 12-14: Channel Type
1500 * 001 for differential
1501 * 000 for calibration
1502 * bit 11: coupling (this is not currently handled)
1506 * valid channels are 0-3
1508 static void ni_load_channelgain_list(comedi_device *dev,unsigned int n_chan,
1511 unsigned int chan,range,aref;
1515 unsigned int dither;
1517 if(boardtype.reg_type == ni_reg_m_series)
1519 ni_m_series_load_channelgain_list(dev, n_chan, list);
1522 if(n_chan == 1 && (boardtype.reg_type != ni_reg_611x) && (boardtype.reg_type != ni_reg_6143)){
1523 if(devpriv->changain_state && devpriv->changain_spec==list[0]){
1527 devpriv->changain_state=1;
1528 devpriv->changain_spec=list[0];
1530 devpriv->changain_state=0;
1533 devpriv->stc_writew(dev, 1,Configuration_Memory_Clear);
1535 // Set up Calibration mode if required
1536 if(boardtype.reg_type == ni_reg_6143){
1537 if((list[0] & CR_ALT_SOURCE) && !devpriv->ai_calib_source_enabled){
1538 // Strobe Relay enable bit
1539 ni_writew(devpriv->ai_calib_source | Calibration_Channel_6143_RelayOn, Calibration_Channel_6143);
1540 ni_writew(devpriv->ai_calib_source, Calibration_Channel_6143);
1541 devpriv->ai_calib_source_enabled = 1;
1542 msleep_interruptible(100); // Allow relays to change
1544 else if(!(list[0] & CR_ALT_SOURCE) && devpriv->ai_calib_source_enabled){
1545 // Strobe Relay disable bit
1546 ni_writew(devpriv->ai_calib_source | Calibration_Channel_6143_RelayOff, Calibration_Channel_6143);
1547 ni_writew(devpriv->ai_calib_source, Calibration_Channel_6143);
1548 devpriv->ai_calib_source_enabled = 0;
1549 msleep_interruptible(100); // Allow relays to change
1553 offset=1<<(boardtype.adbits-1);
1554 for(i=0;i<n_chan;i++){
1555 if((boardtype.reg_type != ni_reg_6143) && (list[i] & CR_ALT_SOURCE)){
1556 chan=devpriv->ai_calib_source;
1558 chan=CR_CHAN(list[i]);
1560 aref=CR_AREF(list[i]);
1561 range=CR_RANGE(list[i]);
1562 dither=((list[i]&CR_ALT_FILTER)!=0);
1564 /* fix the external/internal range differences */
1565 range = ni_gainlkup[boardtype.gainlkup][range];
1566 if(boardtype.reg_type == ni_reg_611x)
1567 devpriv->ai_offset[i] = offset;
1569 devpriv->ai_offset[i] = (range&0x100)?0:offset;
1572 if( ( list[i] & CR_ALT_SOURCE ) )
1574 if(boardtype.reg_type == ni_reg_611x)
1575 ni_writew(CR_CHAN(list[i])&0x0003, Calibration_Channel_Select_611x);
1578 if(boardtype.reg_type == ni_reg_611x)
1580 else if(boardtype.reg_type == ni_reg_6143)
1585 hi |= AI_DIFFERENTIAL;
1597 hi |= AI_CONFIG_CHANNEL( chan );
1599 ni_writew(hi,Configuration_Memory_High);
1601 if(boardtype.reg_type != ni_reg_6143){
1603 if(i == n_chan - 1) lo |= AI_LAST_CHANNEL;
1604 if( dither ) lo |= AI_DITHER;
1606 ni_writew(lo,Configuration_Memory_Low);
1610 /* prime the channel/gain list */
1611 if((boardtype.reg_type != ni_reg_611x) && (boardtype.reg_type != ni_reg_6143)){
1612 ni_prime_channelgain_list(dev);
1616 static int ni_ns_to_timer(comedi_device *dev, int *nanosec, int round_mode)
1621 case TRIG_ROUND_NEAREST:
1623 divider = (*nanosec + devpriv->clock_ns / 2) / devpriv->clock_ns;
1625 case TRIG_ROUND_DOWN:
1626 divider = (*nanosec) / devpriv->clock_ns;
1629 divider=(*nanosec + devpriv->clock_ns - 1) / devpriv->clock_ns;
1633 *nanosec = devpriv->clock_ns * divider;
1637 static int ni_ai_cmdtest(comedi_device *dev,comedi_subdevice *s,comedi_cmd *cmd)
1643 /* step 1: make sure trigger sources are trivially valid */
1646 cmd->start_src &= TRIG_NOW|TRIG_INT|TRIG_EXT;
1647 if(!cmd->start_src || tmp!=cmd->start_src)err++;
1649 tmp=cmd->scan_begin_src;
1650 cmd->scan_begin_src &= TRIG_TIMER|TRIG_EXT;
1651 if(!cmd->scan_begin_src || tmp!=cmd->scan_begin_src)err++;
1653 tmp=cmd->convert_src;
1654 sources = TRIG_TIMER | TRIG_EXT;
1655 if((boardtype.reg_type == ni_reg_611x) || (boardtype.reg_type == ni_reg_6143)) sources |= TRIG_NOW;
1656 cmd->convert_src &= sources;
1657 if(!cmd->convert_src || tmp!=cmd->convert_src)err++;
1659 tmp=cmd->scan_end_src;
1660 cmd->scan_end_src &= TRIG_COUNT;
1661 if(!cmd->scan_end_src || tmp!=cmd->scan_end_src)err++;
1664 cmd->stop_src &= TRIG_COUNT|TRIG_NONE;
1665 if(!cmd->stop_src || tmp!=cmd->stop_src)err++;
1669 /* step 2: make sure trigger sources are unique and mutually compatible */
1671 /* note that mutual compatiblity is not an issue here */
1672 if(cmd->start_src!=TRIG_NOW &&
1673 cmd->start_src!=TRIG_INT &&
1674 cmd->start_src!=TRIG_EXT)err++;
1675 if(cmd->scan_begin_src!=TRIG_TIMER &&
1676 cmd->scan_begin_src!=TRIG_EXT &&
1677 cmd->scan_begin_src!=TRIG_OTHER)err++;
1678 if(cmd->convert_src!=TRIG_TIMER &&
1679 cmd->convert_src!=TRIG_EXT &&
1680 cmd->convert_src!=TRIG_NOW)err++;
1681 if(cmd->stop_src!=TRIG_COUNT &&
1682 cmd->stop_src!=TRIG_NONE)err++;
1686 /* step 3: make sure arguments are trivially compatible */
1688 if(cmd->start_src==TRIG_EXT){
1689 /* external trigger */
1690 unsigned int tmp = CR_CHAN(cmd->start_arg);
1692 if(tmp > 16) tmp = 16;
1693 tmp |= (cmd->start_arg & (CR_INVERT | CR_EDGE));
1694 if(cmd->start_arg != tmp){
1695 cmd->start_arg = tmp;
1699 if(cmd->start_arg!=0){
1700 /* true for both TRIG_NOW and TRIG_INT */
1705 if(cmd->scan_begin_src==TRIG_TIMER){
1706 if(cmd->scan_begin_arg<boardtype.ai_speed){
1707 cmd->scan_begin_arg=boardtype.ai_speed;
1710 if(cmd->scan_begin_arg > devpriv->clock_ns * 0xffffff){
1711 cmd->scan_begin_arg = devpriv->clock_ns * 0xffffff;
1714 }else if(cmd->scan_begin_src==TRIG_EXT){
1715 /* external trigger */
1716 unsigned int tmp = CR_CHAN(cmd->scan_begin_arg);
1719 tmp |= (cmd->scan_begin_arg & (CR_INVERT | CR_EDGE));
1720 if(cmd->scan_begin_arg!=tmp){
1721 cmd->scan_begin_arg = tmp;
1724 }else{ /* TRIG_OTHER */
1725 if(cmd->scan_begin_arg){
1726 cmd->scan_begin_arg=0;
1730 if(cmd->convert_src==TRIG_TIMER){
1731 if((boardtype.reg_type == ni_reg_611x) || (boardtype.reg_type == ni_reg_6143)){
1732 if(cmd->convert_arg != 0){
1733 cmd->convert_arg = 0;
1737 if(cmd->convert_arg<boardtype.ai_speed){
1738 cmd->convert_arg=boardtype.ai_speed;
1741 if(cmd->convert_arg>devpriv->clock_ns*0xffff){
1742 cmd->convert_arg=devpriv->clock_ns*0xffff;
1746 }else if(cmd->convert_src == TRIG_EXT){
1747 /* external trigger */
1748 unsigned int tmp = CR_CHAN(cmd->convert_arg);
1751 tmp |= (cmd->convert_arg&(CR_ALT_FILTER|CR_INVERT));
1752 if(cmd->convert_arg!=tmp){
1753 cmd->convert_arg = tmp;
1756 }else if(cmd->convert_src == TRIG_NOW){
1757 if(cmd->convert_arg != 0){
1758 cmd->convert_arg = 0;
1763 if(cmd->scan_end_arg!=cmd->chanlist_len){
1764 cmd->scan_end_arg=cmd->chanlist_len;
1767 if(cmd->stop_src==TRIG_COUNT){
1768 unsigned int max_count = 0x01000000;
1770 if(boardtype.reg_type == ni_reg_611x )
1771 max_count -= num_adc_stages_611x;
1772 if(cmd->stop_arg > max_count){
1773 cmd->stop_arg = max_count;
1776 if(cmd->stop_arg < 1){
1782 if(cmd->stop_arg!=0){
1790 /* step 4: fix up any arguments */
1792 if(cmd->scan_begin_src==TRIG_TIMER){
1793 tmp=cmd->scan_begin_arg;
1794 ni_ns_to_timer(dev, &cmd->scan_begin_arg, cmd->flags&TRIG_ROUND_MASK);
1795 if(tmp!=cmd->scan_begin_arg)err++;
1797 if(cmd->convert_src==TRIG_TIMER){
1798 if((boardtype.reg_type != ni_reg_611x) && (boardtype.reg_type != ni_reg_6143)){
1799 tmp=cmd->convert_arg;
1800 ni_ns_to_timer(dev, &cmd->convert_arg, cmd->flags&TRIG_ROUND_MASK);
1801 if(tmp!=cmd->convert_arg)err++;
1802 if(cmd->scan_begin_src==TRIG_TIMER &&
1803 cmd->scan_begin_arg<cmd->convert_arg*cmd->scan_end_arg){
1804 cmd->scan_begin_arg=cmd->convert_arg*cmd->scan_end_arg;
1815 static int ni_ai_cmd(comedi_device *dev,comedi_subdevice *s)
1817 comedi_cmd *cmd=&s->async->cmd;
1819 int mode1=0; /* mode1 is needed for both stop and convert */
1821 int start_stop_select=0;
1822 unsigned int stop_count;
1823 int interrupt_a_enable=0;
1825 MDPRINTK("ni_ai_cmd\n");
1828 comedi_error(dev, "cannot run command without an irq");
1831 ni_flush_ai_fifo(dev);
1833 ni_load_channelgain_list(dev,cmd->chanlist_len,cmd->chanlist);
1835 /* start configuration */
1836 devpriv->stc_writew(dev, AI_Configuration_Start,Joint_Reset_Register);
1838 /* disable analog triggering for now, since it
1839 * interferes with the use of pfi0 */
1840 devpriv->an_trig_etc_reg &= ~Analog_Trigger_Enable;
1841 devpriv->stc_writew(dev, devpriv->an_trig_etc_reg, Analog_Trigger_Etc_Register);
1843 switch(cmd->start_src){
1846 devpriv->stc_writew(dev, AI_START2_Select(0)|
1847 AI_START1_Sync|AI_START1_Edge|AI_START1_Select(0),
1848 AI_Trigger_Select_Register);
1852 int chan = CR_CHAN(cmd->start_arg);
1853 unsigned int bits = AI_START2_Select(0)|
1855 AI_START1_Select(chan + 1);
1857 if(cmd->start_arg & CR_INVERT)
1858 bits |= AI_START1_Polarity;
1859 if(cmd->start_arg & CR_EDGE)
1860 bits |= AI_START1_Edge;
1861 devpriv->stc_writew(dev, bits, AI_Trigger_Select_Register);
1866 mode2 &= ~AI_Pre_Trigger;
1867 mode2 &= ~AI_SC_Initial_Load_Source;
1868 mode2 &= ~AI_SC_Reload_Mode;
1869 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
1871 if(cmd->chanlist_len == 1 || (boardtype.reg_type == ni_reg_611x) || (boardtype.reg_type == ni_reg_6143)){
1872 start_stop_select |= AI_STOP_Polarity;
1873 start_stop_select |= AI_STOP_Select( 31 ); // logic low
1874 start_stop_select |= AI_STOP_Sync;
1877 start_stop_select |= AI_STOP_Select(19); // ai configuration memory
1879 devpriv->stc_writew(dev, start_stop_select, AI_START_STOP_Select_Register);
1881 devpriv->ai_cmd2 = 0;
1882 switch(cmd->stop_src){
1884 stop_count = cmd->stop_arg - 1;
1886 if(boardtype.reg_type == ni_reg_611x){
1887 // have to take 3 stage adc pipeline into account
1888 stop_count += num_adc_stages_611x;
1890 /* stage number of scans */
1891 devpriv->stc_writel(dev, stop_count, AI_SC_Load_A_Registers);
1893 mode1 |= AI_Start_Stop | AI_Mode_1_Reserved | AI_Trigger_Once;
1894 devpriv->stc_writew(dev, mode1,AI_Mode_1_Register);
1895 /* load SC (Scan Count) */
1896 devpriv->stc_writew(dev, AI_SC_Load,AI_Command_1_Register);
1898 devpriv->ai_continuous = 0;
1899 if( stop_count == 0 ){
1900 devpriv->ai_cmd2 |= AI_End_On_End_Of_Scan;
1901 interrupt_a_enable |= AI_STOP_Interrupt_Enable;
1902 // this is required to get the last sample for chanlist_len > 1, not sure why
1903 if(cmd->chanlist_len > 1)
1904 start_stop_select |= AI_STOP_Polarity | AI_STOP_Edge;
1908 /* stage number of scans */
1909 devpriv->stc_writel(dev, 0,AI_SC_Load_A_Registers);
1911 mode1 |= AI_Start_Stop | AI_Mode_1_Reserved | AI_Continuous;
1912 devpriv->stc_writew(dev, mode1,AI_Mode_1_Register);
1914 /* load SC (Scan Count) */
1915 devpriv->stc_writew(dev, AI_SC_Load,AI_Command_1_Register);
1917 devpriv->ai_continuous = 1;
1922 switch(cmd->scan_begin_src){
1925 stop bits for non 611x boards
1926 AI_SI_Special_Trigger_Delay=0
1928 AI_START_STOP_Select_Register:
1929 AI_START_Polarity=0 (?) rising edge
1930 AI_START_Edge=1 edge triggered
1932 AI_START_Select=0 SI_TC
1933 AI_STOP_Polarity=0 rising edge
1934 AI_STOP_Edge=0 level
1936 AI_STOP_Select=19 external pin (configuration mem)
1938 start_stop_select |= AI_START_Edge | AI_START_Sync;
1939 devpriv->stc_writew(dev, start_stop_select, AI_START_STOP_Select_Register);
1941 mode2 |= AI_SI_Reload_Mode(0);
1942 /* AI_SI_Initial_Load_Source=A */
1943 mode2 &= ~AI_SI_Initial_Load_Source;
1944 //mode2 |= AI_SC_Reload_Mode;
1945 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
1948 timer = ni_ns_to_timer(dev, &cmd->scan_begin_arg, TRIG_ROUND_NEAREST);
1949 devpriv->stc_writel(dev, timer,AI_SI_Load_A_Registers);
1950 devpriv->stc_writew(dev, AI_SI_Load,AI_Command_1_Register);
1953 if( cmd->scan_begin_arg & CR_EDGE )
1954 start_stop_select |= AI_START_Edge;
1955 /* AI_START_Polarity==1 is falling edge */
1956 if( cmd->scan_begin_arg & CR_INVERT )
1957 start_stop_select |= AI_START_Polarity;
1958 if( cmd->scan_begin_src != cmd->convert_src ||
1959 ( cmd->scan_begin_arg & ~CR_EDGE ) != ( cmd->convert_arg & ~CR_EDGE ) )
1960 start_stop_select |= AI_START_Sync;
1961 start_stop_select |= AI_START_Select(1 + CR_CHAN(cmd->scan_begin_arg));
1962 devpriv->stc_writew(dev, start_stop_select, AI_START_STOP_Select_Register);
1966 switch(cmd->convert_src){
1969 if( cmd->convert_arg == 0 || cmd->convert_src == TRIG_NOW )
1972 timer = ni_ns_to_timer(dev, &cmd->convert_arg, TRIG_ROUND_NEAREST);
1973 devpriv->stc_writew(dev, 1,AI_SI2_Load_A_Register); /* 0,0 does not work. */
1974 devpriv->stc_writew(dev, timer,AI_SI2_Load_B_Register);
1976 /* AI_SI2_Reload_Mode = alternate */
1977 /* AI_SI2_Initial_Load_Source = A */
1978 mode2 &= ~AI_SI2_Initial_Load_Source;
1979 mode2 |= AI_SI2_Reload_Mode;
1980 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
1983 devpriv->stc_writew(dev, AI_SI2_Load,AI_Command_1_Register);
1985 mode2 |= AI_SI2_Reload_Mode; // alternate
1986 mode2 |= AI_SI2_Initial_Load_Source; // B
1988 devpriv->stc_writew(dev, mode2,AI_Mode_2_Register);
1991 mode1 |= AI_CONVERT_Source_Select(1+cmd->convert_arg);
1992 if( ( cmd->convert_arg & CR_INVERT ) == 0 )
1993 mode1 |= AI_CONVERT_Source_Polarity;
1994 devpriv->stc_writew(dev, mode1,AI_Mode_1_Register);
1996 mode2 |= AI_Start_Stop_Gate_Enable | AI_SC_Gate_Enable;
1997 devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
2004 /* interrupt on FIFO, errors, SC_TC */
2005 interrupt_a_enable |= AI_Error_Interrupt_Enable|
2006 AI_SC_TC_Interrupt_Enable;
2009 interrupt_a_enable|=AI_FIFO_Interrupt_Enable;
2012 if(cmd->flags & TRIG_WAKE_EOS || (devpriv->ai_cmd2 & AI_End_On_End_Of_Scan)){
2013 /* wake on end-of-scan */
2014 devpriv->aimode=AIMODE_SCAN;
2016 devpriv->aimode=AIMODE_HALF_FULL;
2019 switch(devpriv->aimode){
2020 case AIMODE_HALF_FULL:
2021 /*generate FIFO interrupts and DMA requests on half-full */
2023 devpriv->stc_writew(dev, AI_FIFO_Mode_HF_to_E, AI_Mode_3_Register);
2025 devpriv->stc_writew(dev, AI_FIFO_Mode_HF, AI_Mode_3_Register);
2029 /*generate FIFO interrupts on non-empty */
2030 devpriv->stc_writew(dev, AI_FIFO_Mode_NE, AI_Mode_3_Register);
2034 devpriv->stc_writew(dev, AI_FIFO_Mode_NE, AI_Mode_3_Register);
2036 devpriv->stc_writew(dev, AI_FIFO_Mode_HF, AI_Mode_3_Register);
2038 interrupt_a_enable |= AI_STOP_Interrupt_Enable;
2044 devpriv->stc_writew(dev, 0x3f80,Interrupt_A_Ack_Register); /* clear interrupts */
2046 ni_set_bits(dev, Interrupt_A_Enable_Register, interrupt_a_enable, 1);
2048 MDPRINTK("Interrupt_A_Enable_Register = 0x%04x\n",devpriv->int_a_enable_reg);
2050 /* interrupt on nothing */
2051 ni_set_bits(dev, Interrupt_A_Enable_Register, ~0, 0);
2053 /* XXX start polling if necessary */
2054 MDPRINTK("interrupting on nothing\n");
2057 /* end configuration */
2058 devpriv->stc_writew(dev, AI_Configuration_End,Joint_Reset_Register);
2060 switch(cmd->scan_begin_src){
2062 devpriv->stc_writew(dev, AI_SI2_Arm | AI_SI_Arm | AI_DIV_Arm | AI_SC_Arm,
2063 AI_Command_1_Register);
2066 /* XXX AI_SI_Arm? */
2067 devpriv->stc_writew(dev, AI_SI2_Arm | AI_SI_Arm | AI_DIV_Arm | AI_SC_Arm,
2068 AI_Command_1_Register);
2073 ni_ai_setup_MITE_dma(dev,cmd);
2074 //mite_dump_regs(devpriv->mite);
2077 switch(cmd->start_src){
2079 /* AI_START1_Pulse */
2080 devpriv->stc_writew(dev, AI_START1_Pulse | devpriv->ai_cmd2, AI_Command_2_Register );
2081 s->async->inttrig=NULL;
2084 s->async->inttrig=NULL;
2087 s->async->inttrig=ni_ai_inttrig;
2091 MDPRINTK("exit ni_ai_cmd\n");
2096 static int ni_ai_inttrig(comedi_device *dev,comedi_subdevice *s,
2097 unsigned int trignum)
2099 if(trignum!=0)return -EINVAL;
2101 devpriv->stc_writew(dev, AI_START1_Pulse | devpriv->ai_cmd2, AI_Command_2_Register );
2102 s->async->inttrig=NULL;
2107 static int ni_ai_config_analog_trig(comedi_device *dev,comedi_subdevice *s,
2108 comedi_insn *insn, lsampl_t *data);
2110 static int ni_ai_insn_config(comedi_device *dev,comedi_subdevice *s,
2111 comedi_insn *insn, lsampl_t *data)
2113 if(insn->n<1)return -EINVAL;
2116 case INSN_CONFIG_ANALOG_TRIG:
2117 return ni_ai_config_analog_trig(dev,s,insn,data);
2118 case INSN_CONFIG_ALT_SOURCE:
2119 if(boardtype.reg_type == ni_reg_m_series)
2121 if(data[1] & ~(MSeries_AI_Bypass_Cal_Sel_Pos_Mask |
2122 MSeries_AI_Bypass_Cal_Sel_Neg_Mask | MSeries_AI_Bypass_Mode_Mux_Mask |
2123 MSeries_AO_Bypass_AO_Cal_Sel_Mask))
2127 devpriv->ai_calib_source = data[1];
2128 } else if(boardtype.reg_type == ni_reg_6143)
2130 unsigned int calib_source;
2132 calib_source = data[1] & 0xf;
2135 if(calib_source > 0xF)
2138 devpriv->ai_calib_source = calib_source;
2139 ni_writew(calib_source, Calibration_Channel_6143);
2142 unsigned int calib_source;
2143 unsigned int calib_source_adjust;
2145 calib_source = data[1] & 0xf;
2146 calib_source_adjust = ( data[1] >> 4 ) & 0xff;
2148 if(calib_source >= 8)
2150 devpriv->ai_calib_source = calib_source;
2151 if(boardtype.reg_type == ni_reg_611x){
2152 ni_writeb( calib_source_adjust, Cal_Gain_Select_611x );
2163 static int ni_ai_config_analog_trig(comedi_device *dev,comedi_subdevice *s,
2164 comedi_insn *insn, lsampl_t *data)
2166 unsigned int a,b,modebits;
2170 * data[2] is analog line
2171 * data[3] is set level
2172 * data[4] is reset level */
2173 if(!boardtype.has_analog_trig)return -EINVAL;
2174 if(insn->n!=5)return -EINVAL;
2175 if((data[1]&0xffff0000) != COMEDI_EV_SCAN_BEGIN){
2176 data[1]&=~(COMEDI_EV_SCAN_BEGIN&0xffff);
2179 if(data[2]>=boardtype.n_adchan){
2180 data[2]=boardtype.n_adchan-1;
2183 if(data[3]>255){ /* a */
2187 if(data[4]>255){ /* b */
2198 * high mode 00 00 01 10
2199 * low mode 00 00 10 01
2201 * hysteresis low mode 10 00 00 01
2202 * hysteresis high mode 01 00 00 10
2203 * middle mode 10 01 01 10
2208 modebits=data[1]&0xff;
2210 /* two level mode */
2215 modebits=((data[1]&0xf)<<4)|((data[1]&0xf0)>>4);
2217 devpriv->atrig_low = a;
2218 devpriv->atrig_high = b;
2220 case 0x81: /* low hysteresis mode */
2221 devpriv->atrig_mode = 6;
2223 case 0x42: /* high hysteresis mode */
2224 devpriv->atrig_mode = 3;
2226 case 0x96: /* middle window mode */
2227 devpriv->atrig_mode = 2;
2234 /* one level mode */
2240 case 0x06: /* high window mode */
2241 devpriv->atrig_high = a;
2242 devpriv->atrig_mode = 0;
2244 case 0x09: /* low window mode */
2245 devpriv->atrig_low = a;
2246 devpriv->atrig_mode = 1;
2253 if(err)return -EAGAIN;
2257 /* munge data from unsigned to 2's complement for analog output bipolar modes */
2258 static void ni_ao_munge(comedi_device *dev, comedi_subdevice *s,
2259 void *data, unsigned int num_bytes, unsigned int chan_index )
2261 comedi_async *async = s->async;
2264 unsigned int offset;
2265 unsigned int length = num_bytes / sizeof( sampl_t );
2266 sampl_t *array = data;
2268 offset = 1 << (boardtype.aobits - 1);
2269 for(i = 0; i < length; i++)
2271 range = CR_RANGE( async->cmd.chanlist[ chan_index ] );
2272 if(boardtype.ao_unipolar == 0 || (range & 1) == 0 )
2275 array[i] = cpu_to_le16( array[i] );
2278 chan_index %= async->cmd.chanlist_len;
2282 static int ni_ao_config_chanlist(comedi_device *dev, comedi_subdevice *s,
2283 unsigned int chanspec[], unsigned int n_chans)
2291 for(i=0;i<n_chans;i++){
2292 chan = CR_CHAN(chanspec[i]);
2293 range = CR_RANGE(chanspec[i]);
2294 if(boardtype.reg_type == ni_reg_m_series)
2296 comedi_krange *krange = s->range_table->range + range;
2299 switch(krange->max - krange->min)
2302 conf |= MSeries_AO_DAC_Reference_10V_Internal_Bits;
2303 ni_writeb(0, M_Offset_AO_Reference_Attenuation(chan));
2306 conf |= MSeries_AO_DAC_Reference_5V_Internal_Bits;
2307 ni_writeb(0, M_Offset_AO_Reference_Attenuation(chan));
2310 conf |= MSeries_AO_DAC_Reference_10V_Internal_Bits;
2311 ni_writeb(MSeries_Attenuate_x5_Bit, M_Offset_AO_Reference_Attenuation(chan));
2314 conf |= MSeries_AO_DAC_Reference_5V_Internal_Bits;
2315 ni_writeb(MSeries_Attenuate_x5_Bit, M_Offset_AO_Reference_Attenuation(chan));
2318 rt_printk("%s: bug! unhandled ao reference voltage\n", __FUNCTION__);
2321 switch(krange->max + krange->min)
2324 conf |= MSeries_AO_DAC_Offset_0V_Bits;
2327 conf |= MSeries_AO_DAC_Offset_5V_Bits;
2330 rt_printk("%s: bug! unhandled ao offset voltage\n", __FUNCTION__);
2333 ni_writeb(conf, M_Offset_AO_Config_Bank(chan));
2336 conf = AO_Channel(chan);
2338 if(boardtype.ao_unipolar){
2341 invert = (1<<(boardtype.aobits-1));
2349 invert = (1<<(boardtype.aobits-1));
2352 /* not all boards can deglitch, but this shouldn't hurt */
2353 if(chanspec[i] & CR_DEGLITCH)
2354 conf |= AO_Deglitch;
2356 /* analog reference */
2357 /* AREF_OTHER connects AO ground to AI ground, i think */
2358 conf |= (CR_AREF(chanspec[i])==AREF_OTHER)? AO_Ground_Ref : 0;
2360 ni_writew(conf,AO_Configuration);
2362 devpriv->ao_conf[chan] = conf;
2367 static int ni_ao_insn_read(comedi_device *dev,comedi_subdevice *s,
2368 comedi_insn *insn,lsampl_t *data)
2370 data[0] = devpriv->ao[CR_CHAN(insn->chanspec)];
2375 static int ni_ao_insn_write(comedi_device *dev,comedi_subdevice *s,
2376 comedi_insn *insn,lsampl_t *data)
2378 unsigned int chan = CR_CHAN(insn->chanspec);
2379 unsigned int invert;
2381 invert = ni_ao_config_chanlist(dev,s,&insn->chanspec,1);
2383 devpriv->ao[chan] = data[0];
2385 if(boardtype.reg_type == ni_reg_m_series)
2387 ni_writew(data[0], M_Offset_DAC_Direct_Data(chan));
2390 ni_writew(data[0] ^ invert,(chan)? DAC1_Direct_Data : DAC0_Direct_Data);
2395 static int ni_ao_insn_write_671x(comedi_device *dev,comedi_subdevice *s,
2396 comedi_insn *insn,lsampl_t *data)
2398 unsigned int chan = CR_CHAN(insn->chanspec);
2399 unsigned int invert;
2401 ao_win_out(1 << chan, AO_Immediate_671x);
2402 invert = 1 << (boardtype.aobits - 1);
2404 ni_ao_config_chanlist(dev,s,&insn->chanspec,1);
2406 devpriv->ao[chan] = data[0];
2407 ao_win_out(data[0] ^ invert, DACx_Direct_Data_671x(chan));
2412 static int ni_ao_inttrig(comedi_device *dev,comedi_subdevice *s,
2413 unsigned int trignum)
2416 int interrupt_b_bits;
2418 static const int timeout = 1000;
2420 if(trignum!=0)return -EINVAL;
2422 ni_set_bits(dev, Interrupt_B_Enable_Register, AO_FIFO_Interrupt_Enable | AO_Error_Interrupt_Enable, 0);
2423 interrupt_b_bits = AO_Error_Interrupt_Enable;
2425 devpriv->stc_writew(dev, 1, DAC_FIFO_Clear);
2426 if(boardtype.reg_type & ni_reg_6xxx_mask)
2427 ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x);
2428 ni_ao_setup_MITE_dma(dev, &s->async->cmd);
2429 ret = ni_ao_wait_for_dma_load(dev);
2430 if(ret < 0) return ret;
2433 ret = ni_ao_prep_fifo(dev,s);
2434 if(ret==0)return -EPIPE;
2436 interrupt_b_bits |= AO_FIFO_Interrupt_Enable;
2439 devpriv->stc_writew(dev, devpriv->ao_mode3|AO_Not_An_UPDATE,AO_Mode_3_Register);
2440 devpriv->stc_writew(dev, devpriv->ao_mode3,AO_Mode_3_Register);
2441 /* wait for DACs to be loaded */
2442 for(i = 0; i < timeout; i++)
2445 if((devpriv->stc_readw(dev, Joint_Status_2_Register) & AO_TMRDACWRs_In_Progress_St) == 0)
2450 comedi_error(dev, "timed out waiting for AO_TMRDACWRs_In_Progress_St to clear");
2453 // stc manual says we are need to clear error interrupt after AO_TMRDACWRs_In_Progress_St clears
2454 devpriv->stc_writew(dev, AO_Error_Interrupt_Ack, Interrupt_B_Ack_Register);
2456 ni_set_bits(dev, Interrupt_B_Enable_Register, interrupt_b_bits, 1);
2458 devpriv->stc_writew(dev, devpriv->ao_cmd1|AO_UI_Arm|AO_UC_Arm|AO_BC_Arm|AO_DAC1_Update_Mode|AO_DAC0_Update_Mode,
2459 AO_Command_1_Register);
2461 devpriv->stc_writew(dev, devpriv->ao_cmd2|AO_START1_Pulse,AO_Command_2_Register);
2463 s->async->inttrig=NULL;
2468 static int ni_ao_cmd(comedi_device *dev,comedi_subdevice *s)
2470 comedi_cmd *cmd = &s->async->cmd;
2477 comedi_error(dev, "cannot run command without an irq");
2480 trigvar = ni_ns_to_timer(dev, &cmd->scan_begin_arg, TRIG_ROUND_NEAREST);
2482 devpriv->stc_writew(dev, AO_Configuration_Start,Joint_Reset_Register);
2484 devpriv->stc_writew(dev, AO_Disarm,AO_Command_1_Register);
2486 if(boardtype.reg_type & ni_reg_6xxx_mask)
2488 ao_win_out(CLEAR_WG, AO_Misc_611x);
2491 for(i = 0; i < cmd->chanlist_len; i++)
2495 chan = CR_CHAN(cmd->chanlist[i]);
2497 ao_win_out(chan, AO_Waveform_Generation_611x);
2499 ao_win_out(bits, AO_Timed_611x);
2502 ni_ao_config_chanlist(dev,s,cmd->chanlist,cmd->chanlist_len);
2504 if(cmd->stop_src==TRIG_NONE){
2505 devpriv->ao_mode1|=AO_Continuous;
2506 devpriv->ao_mode1&=~AO_Trigger_Once;
2508 devpriv->ao_mode1&=~AO_Continuous;
2509 devpriv->ao_mode1|=AO_Trigger_Once;
2511 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2512 devpriv->ao_trigger_select&=~(AO_START1_Polarity|AO_START1_Select(-1));
2513 devpriv->ao_trigger_select|=AO_START1_Edge|AO_START1_Sync;
2514 devpriv->stc_writew(dev, devpriv->ao_trigger_select,AO_Trigger_Select_Register);
2515 devpriv->ao_mode3&=~AO_Trigger_Length;
2516 devpriv->stc_writew(dev, devpriv->ao_mode3,AO_Mode_3_Register);
2518 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2519 devpriv->ao_mode2&=~AO_BC_Initial_Load_Source;
2520 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2521 if(cmd->stop_src==TRIG_NONE){
2522 devpriv->stc_writel(dev, 0xffffff,AO_BC_Load_A_Register);
2524 devpriv->stc_writel(dev, 0,AO_BC_Load_A_Register);
2526 devpriv->stc_writew(dev, AO_BC_Load,AO_Command_1_Register);
2527 devpriv->ao_mode2&=~AO_UC_Initial_Load_Source;
2528 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2529 switch(cmd->stop_src){
2531 devpriv->stc_writel(dev, cmd->stop_arg,AO_UC_Load_A_Register);
2532 devpriv->stc_writew(dev, AO_UC_Load,AO_Command_1_Register);
2533 devpriv->stc_writel(dev, cmd->stop_arg - 1,AO_UC_Load_A_Register);
2536 devpriv->stc_writel(dev, 0xffffff,AO_UC_Load_A_Register);
2537 devpriv->stc_writew(dev, AO_UC_Load,AO_Command_1_Register);
2538 devpriv->stc_writel(dev, 0xffffff,AO_UC_Load_A_Register);
2541 devpriv->stc_writel(dev, 0,AO_UC_Load_A_Register);
2542 devpriv->stc_writew(dev, AO_UC_Load,AO_Command_1_Register);
2543 devpriv->stc_writel(dev, cmd->stop_arg,AO_UC_Load_A_Register);
2546 devpriv->ao_cmd2&=~AO_BC_Gate_Enable;
2547 devpriv->stc_writew(dev, devpriv->ao_cmd2,AO_Command_2_Register);
2548 devpriv->ao_mode1&=~(AO_UI_Source_Select(0x1f)|AO_UI_Source_Polarity);
2549 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2550 devpriv->ao_mode2&=~(AO_UI_Reload_Mode(3)|AO_UI_Initial_Load_Source);
2551 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2552 devpriv->stc_writel(dev, 1,AO_UI_Load_A_Register);
2553 devpriv->stc_writew(dev, AO_UI_Load,AO_Command_1_Register);
2554 devpriv->stc_writel(dev, trigvar,AO_UI_Load_A_Register);
2556 if((boardtype.reg_type & ni_reg_6xxx_mask) == 0){
2557 if(cmd->scan_end_arg>1){
2558 devpriv->ao_mode1|=AO_Multiple_Channels;
2559 devpriv->stc_writew(dev, AO_Number_Of_Channels(cmd->scan_end_arg-1)|
2560 AO_UPDATE_Output_Select(1),
2561 AO_Output_Control_Register);
2563 devpriv->ao_mode1&=~AO_Multiple_Channels;
2564 devpriv->stc_writew(dev, AO_Number_Of_Channels(CR_CHAN(cmd->chanlist[0]))|
2565 AO_UPDATE_Output_Select(1),
2566 AO_Output_Control_Register);
2568 devpriv->stc_writew(dev, devpriv->ao_mode1,AO_Mode_1_Register);
2571 devpriv->stc_writew(dev, AO_DAC0_Update_Mode|AO_DAC1_Update_Mode,AO_Command_1_Register);
2573 devpriv->ao_mode3|=AO_Stop_On_Overrun_Error;
2574 devpriv->stc_writew(dev, devpriv->ao_mode3,AO_Mode_3_Register);
2576 devpriv->ao_mode2 &= AO_FIFO_Mode_Mask;
2578 devpriv->ao_mode2 |= AO_FIFO_Mode_HF_to_F;
2580 devpriv->ao_mode2 |= AO_FIFO_Mode_HF;
2582 devpriv->ao_mode2 &= ~AO_FIFO_Retransmit_Enable;
2583 devpriv->stc_writew(dev, devpriv->ao_mode2,AO_Mode_2_Register);
2585 bits = AO_BC_Source_Select | AO_UPDATE_Pulse_Width |
2586 AO_TMRDACWR_Pulse_Width;
2587 if( boardtype.ao_fifo_depth )
2588 bits |= AO_FIFO_Enable;
2590 bits |= AO_DMA_PIO_Control;
2591 devpriv->stc_writew(dev, bits, AO_Personal_Register);
2592 // enable sending of ao dma requests
2593 devpriv->stc_writew(dev, AO_AOFREQ_Enable, AO_Start_Select_Register);
2595 devpriv->stc_writew(dev, AO_Configuration_End,Joint_Reset_Register);
2597 if(cmd->stop_src==TRIG_COUNT) {
2598 devpriv->stc_writew(dev, AO_BC_TC_Interrupt_Ack,Interrupt_B_Ack_Register);
2599 ni_set_bits(dev, Interrupt_B_Enable_Register,
2600 AO_BC_TC_Interrupt_Enable, 1);
2603 s->async->inttrig=ni_ao_inttrig;
2608 static int ni_ao_cmdtest(comedi_device *dev,comedi_subdevice *s,comedi_cmd *cmd)
2613 /* step 1: make sure trigger sources are trivially valid */
2616 cmd->start_src &= TRIG_INT;
2617 if(!cmd->start_src || tmp!=cmd->start_src)err++;
2619 tmp=cmd->scan_begin_src;
2620 cmd->scan_begin_src &= TRIG_TIMER;
2621 if(!cmd->scan_begin_src || tmp!=cmd->scan_begin_src)err++;
2623 tmp=cmd->convert_src;
2624 cmd->convert_src &= TRIG_NOW;
2625 if(!cmd->convert_src || tmp!=cmd->convert_src)err++;
2627 tmp=cmd->scan_end_src;
2628 cmd->scan_end_src &= TRIG_COUNT;
2629 if(!cmd->scan_end_src || tmp!=cmd->scan_end_src)err++;
2632 cmd->stop_src &= TRIG_COUNT|TRIG_NONE;
2633 if(!cmd->stop_src || tmp!=cmd->stop_src)err++;
2637 /* step 2: make sure trigger sources are unique and mutually compatible */
2639 if(cmd->stop_src!=TRIG_COUNT &&
2640 cmd->stop_src!=TRIG_NONE)err++;
2644 /* step 3: make sure arguments are trivially compatible */
2646 if(cmd->start_arg!=0){
2651 /* XXX need ao_speed */
2652 if(cmd->scan_begin_arg<boardtype.ao_speed){
2653 cmd->scan_begin_arg=boardtype.ao_speed;
2657 if(cmd->scan_begin_arg>devpriv->clock_ns*0xffffff){ /* XXX check */
2658 cmd->scan_begin_arg=devpriv->clock_ns*0xffffff;
2661 if(cmd->convert_arg!=0){
2665 if(cmd->scan_end_arg!=cmd->chanlist_len){
2666 cmd->scan_end_arg=cmd->chanlist_len;
2669 if(cmd->stop_src==TRIG_COUNT){ /* XXX check */
2670 if(cmd->stop_arg>0x00ffffff){
2671 cmd->stop_arg=0x00ffffff;
2676 if(cmd->stop_arg!=0){
2684 /* step 4: fix up any arguments */
2686 tmp = cmd->scan_begin_arg;
2687 ni_ns_to_timer(dev, &cmd->scan_begin_arg, cmd->flags&TRIG_ROUND_MASK);
2688 if(tmp!=cmd->scan_begin_arg)err++;
2692 /* step 5: fix up chanlist */
2700 static int ni_ao_reset(comedi_device *dev,comedi_subdevice *s)
2702 //devpriv->ao0p=0x0000;
2703 //ni_writew(devpriv->ao0p,AO_Configuration);
2705 //devpriv->ao1p=AO_Channel(1);
2706 //ni_writew(devpriv->ao1p,AO_Configuration);
2709 mite_dma_disarm(devpriv->mite, AO_DMA_CHAN);
2710 writel(CHOR_DMARESET | CHOR_FRESET, devpriv->mite->mite_io_addr + MITE_CHOR(AO_DMA_CHAN));
2713 devpriv->stc_writew(dev, AO_Configuration_Start,Joint_Reset_Register);
2714 devpriv->stc_writew(dev, AO_Disarm,AO_Command_1_Register);
2715 ni_set_bits(dev,Interrupt_B_Enable_Register,~0,0);
2716 devpriv->stc_writew(dev, AO_BC_Source_Select, AO_Personal_Register);
2717 devpriv->stc_writew(dev, 0x3f98,Interrupt_B_Ack_Register);
2718 devpriv->stc_writew(dev, AO_BC_Source_Select | AO_UPDATE_Pulse_Width |
2719 AO_TMRDACWR_Pulse_Width, AO_Personal_Register);
2720 devpriv->stc_writew(dev, 0,AO_Output_Control_Register);
2721 devpriv->stc_writew(dev, 0,AO_Start_Select_Register);
2723 devpriv->stc_writew(dev, devpriv->ao_cmd1,AO_Command_1_Register);
2725 devpriv->ao_mode1=0;
2726 devpriv->ao_mode2=0;
2727 if(boardtype.reg_type == ni_reg_m_series)
2728 devpriv->ao_mode3 = AO_Last_Gate_Disable;
2730 devpriv->ao_mode3 = 0;
2731 devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
2732 devpriv->ao_trigger_select=0;
2733 if(boardtype.reg_type & ni_reg_6xxx_mask){
2734 ao_win_out(0x3, AO_Immediate_671x);
2735 ao_win_out(CLEAR_WG, AO_Misc_611x);
2737 devpriv->stc_writew(dev, AO_Configuration_End, Joint_Reset_Register);
2742 static int ni_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
2743 comedi_insn *insn,lsampl_t *data)
2746 rt_printk("ni_dio_insn_config() chan=%d io=%d\n",
2747 CR_CHAN(insn->chanspec),data[0]);
2750 case INSN_CONFIG_DIO_OUTPUT:
2751 s->io_bits |= 1<<CR_CHAN(insn->chanspec);
2753 case INSN_CONFIG_DIO_INPUT:
2754 s->io_bits &= ~(1<<CR_CHAN(insn->chanspec));
2756 case INSN_CONFIG_DIO_QUERY:
2757 data[1] = (s->io_bits & (1<<CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT : COMEDI_INPUT;
2764 devpriv->dio_control &= ~DIO_Pins_Dir_Mask;
2765 devpriv->dio_control |= DIO_Pins_Dir(s->io_bits);
2766 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
2771 static int ni_dio_insn_bits(comedi_device *dev,comedi_subdevice *s,
2772 comedi_insn *insn,lsampl_t *data)
2775 rt_printk("ni_dio_insn_bits() mask=0x%x bits=0x%x\n",data[0],data[1]);
2777 if(insn->n!=2)return -EINVAL;
2779 /* Perform check to make sure we're not using the
2780 serial part of the dio */
2781 if((data[0] & (DIO_SDIN | DIO_SDOUT)) && devpriv->serial_interval_ns)
2784 s->state &= ~data[0];
2785 s->state |= (data[0]&data[1]);
2786 devpriv->dio_output &= ~DIO_Parallel_Data_Mask;
2787 devpriv->dio_output |= DIO_Parallel_Data_Out(s->state);
2788 devpriv->stc_writew(dev, devpriv->dio_output,DIO_Output_Register);
2790 data[1] = devpriv->stc_readw(dev, DIO_Parallel_Input_Register);
2795 static int ni_m_series_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
2796 comedi_insn *insn, lsampl_t *data)
2799 rt_printk("ni_m_series_dio_insn_config() chan=%d io=%d\n",
2800 CR_CHAN(insn->chanspec), data[0]);
2804 case INSN_CONFIG_DIO_OUTPUT:
2805 s->io_bits |= 1 << CR_CHAN(insn->chanspec);
2807 case INSN_CONFIG_DIO_INPUT:
2808 s->io_bits &= ~(1 << CR_CHAN(insn->chanspec));
2810 case INSN_CONFIG_DIO_QUERY:
2811 data[1] = (s->io_bits & (1<<CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT : COMEDI_INPUT;
2818 ni_writel(s->io_bits, M_Offset_DIO_Direction);
2823 static int ni_m_series_dio_insn_bits(comedi_device *dev,comedi_subdevice *s,
2824 comedi_insn *insn, lsampl_t *data)
2827 rt_printk("ni_m_series_dio_insn_bits() mask=0x%x bits=0x%x\n",data[0],data[1]);
2829 if(insn->n!=2)return -EINVAL;
2831 s->state &= ~data[0];
2832 s->state |= (data[0] & data[1]);
2833 ni_writel(s->state, M_Offset_Static_Digital_Output);
2835 data[1] = ni_readl(M_Offset_Static_Digital_Input);
2840 static int ni_serial_insn_config(comedi_device *dev,comedi_subdevice *s,
2841 comedi_insn *insn,lsampl_t *data)
2844 unsigned char byte_out, byte_in;
2846 if(insn->n!=2)return -EINVAL;
2849 case INSN_CONFIG_SERIAL_CLOCK:
2852 rt_printk("SPI serial clock Config cd\n", data[1]);
2854 devpriv->serial_hw_mode = 1;
2855 devpriv->dio_control |= DIO_HW_Serial_Enable;
2857 if(data[1] == SERIAL_DISABLED) {
2858 devpriv->serial_hw_mode = 0;
2859 devpriv->dio_control &= ~(DIO_HW_Serial_Enable |
2860 DIO_Software_Serial_Control);
2861 data[1] = SERIAL_DISABLED;
2862 devpriv->serial_interval_ns = data[1];
2864 else if(data[1] <= SERIAL_600NS) {
2865 /* Warning: this clock speed is too fast to reliably
2867 devpriv->dio_control &= ~DIO_HW_Serial_Timebase;
2868 devpriv->clock_and_fout |= Slow_Internal_Timebase;
2869 devpriv->clock_and_fout &= ~DIO_Serial_Out_Divide_By_2;
2870 data[1] = SERIAL_600NS;
2871 devpriv->serial_interval_ns = data[1];
2873 else if(data[1] <= SERIAL_1_2US) {
2874 devpriv->dio_control &= ~DIO_HW_Serial_Timebase;
2875 devpriv->clock_and_fout |= Slow_Internal_Timebase |
2876 DIO_Serial_Out_Divide_By_2;
2877 data[1] = SERIAL_1_2US;
2878 devpriv->serial_interval_ns = data[1];
2880 else if(data[1] <= SERIAL_10US) {
2881 devpriv->dio_control |= DIO_HW_Serial_Timebase;
2882 devpriv->clock_and_fout |= Slow_Internal_Timebase |
2883 DIO_Serial_Out_Divide_By_2;
2884 /* Note: DIO_Serial_Out_Divide_By_2 only affects
2885 600ns/1.2us. If you turn divide_by_2 off with the
2886 slow clock, you will still get 10us, except then
2887 all your delays are wrong. */
2888 data[1] = SERIAL_10US;
2889 devpriv->serial_interval_ns = data[1];
2892 devpriv->dio_control &= ~(DIO_HW_Serial_Enable |
2893 DIO_Software_Serial_Control);
2894 devpriv->serial_hw_mode = 0;
2895 data[1] = (data[1] / 1000) * 1000;
2896 devpriv->serial_interval_ns = data[1];
2899 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
2900 devpriv->stc_writew(dev, devpriv->clock_and_fout,Clock_and_FOUT_Register);
2905 case INSN_CONFIG_BIDIRECTIONAL_DATA:
2907 if(devpriv->serial_interval_ns == 0) {
2911 byte_out = data[1] & 0xFF;
2913 if(devpriv->serial_hw_mode) {
2914 err = ni_serial_hw_readwrite8(dev,s,byte_out,&byte_in);
2915 } else if(devpriv->serial_interval_ns > 0) {
2916 err = ni_serial_sw_readwrite8(dev,s,byte_out,&byte_in);
2918 rt_printk("ni_serial_insn_config: serial disabled!\n");
2921 if(err < 0) return err;
2922 data[1] = byte_in & 0xFF;
2932 static int ni_serial_hw_readwrite8(comedi_device *dev,comedi_subdevice *s,
2933 unsigned char data_out,
2934 unsigned char *data_in)
2936 unsigned int status1;
2937 int err = 0, count = 20;
2940 rt_printk("ni_serial_hw_readwrite8: outputting 0x%x\n", data_out);
2943 devpriv->dio_output &= ~DIO_Serial_Data_Mask;
2944 devpriv->dio_output |= DIO_Serial_Data_Out(data_out);
2945 devpriv->stc_writew(dev, devpriv->dio_output,DIO_Output_Register);
2947 status1 = devpriv->stc_readw(dev, Joint_Status_1_Register);
2948 if(status1 & DIO_Serial_IO_In_Progress_St) {
2953 devpriv->dio_control |= DIO_HW_Serial_Start;
2954 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
2955 devpriv->dio_control &= ~DIO_HW_Serial_Start;
2957 /* Wait until STC says we're done, but don't loop infinitely. */
2958 while((status1 = devpriv->stc_readw(dev, Joint_Status_1_Register)) & DIO_Serial_IO_In_Progress_St) {
2959 /* Delay one bit per loop */
2960 comedi_udelay((devpriv->serial_interval_ns + 999) / 1000);
2962 rt_printk("ni_serial_hw_readwrite8: SPI serial I/O didn't finish in time!\n");
2968 /* Delay for last bit. This delay is absolutely necessary, because
2969 DIO_Serial_IO_In_Progress_St goes high one bit too early. */
2970 comedi_udelay((devpriv->serial_interval_ns + 999) / 1000);
2972 if(data_in != NULL) {
2973 *data_in = devpriv->stc_readw(dev, DIO_Serial_Input_Register);
2975 rt_printk("ni_serial_hw_readwrite8: inputted 0x%x\n", *data_in);
2980 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
2985 static int ni_serial_sw_readwrite8(comedi_device *dev,comedi_subdevice *s,
2986 unsigned char data_out,
2987 unsigned char *data_in)
2989 unsigned char mask, input = 0;
2992 rt_printk("ni_serial_sw_readwrite8: outputting 0x%x\n", data_out);
2995 /* Wait for one bit before transfer */
2996 comedi_udelay((devpriv->serial_interval_ns + 999) / 1000);
2998 for(mask = 0x80; mask; mask >>= 1) {
2999 /* Output current bit; note that we cannot touch s->state
3000 because it is a per-subdevice field, and serial is
3001 a separate subdevice from DIO. */
3002 devpriv->dio_output &= ~DIO_SDOUT;
3003 if(data_out & mask) {
3004 devpriv->dio_output |= DIO_SDOUT;
3006 devpriv->stc_writew(dev, devpriv->dio_output,DIO_Output_Register);
3008 /* Assert SDCLK (active low, inverted), wait for half of
3009 the delay, deassert SDCLK, and wait for the other half. */
3010 devpriv->dio_control |= DIO_Software_Serial_Control;
3011 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
3013 comedi_udelay((devpriv->serial_interval_ns + 999) / 2000);
3015 devpriv->dio_control &= ~DIO_Software_Serial_Control;
3016 devpriv->stc_writew(dev, devpriv->dio_control,DIO_Control_Register);
3018 comedi_udelay((devpriv->serial_interval_ns + 999) / 2000);
3020 /* Input current bit */
3021 if(devpriv->stc_readw(dev, DIO_Parallel_Input_Register) & DIO_SDIN) {
3022 /* rt_printk("DIO_P_I_R: 0x%x\n", devpriv->stc_readw(dev, DIO_Parallel_Input_Register)); */
3027 rt_printk("ni_serial_sw_readwrite8: inputted 0x%x\n", input);
3029 if(data_in) *data_in = input;
3034 static void mio_common_detach(comedi_device *dev)
3036 if(dev->subdevices && boardtype.has_8255)
3037 subdev_8255_cleanup(dev,dev->subdevices+3);
3040 static void init_ao_67xx(comedi_device *dev, comedi_subdevice *s)
3044 for(i = 0; i < s->n_chan; i++)
3045 ni_ao_win_outw(dev, AO_Channel(i) | 0x0, AO_Configuration_2_67xx);
3048 static int ni_alloc_private(comedi_device *dev)
3052 ret = alloc_private(dev, sizeof(ni_private));
3053 if(ret < 0) return ret;
3055 spin_lock_init(&devpriv->window_lock);
3060 static int ni_E_init(comedi_device *dev,comedi_devconfig *it)
3062 comedi_subdevice *s;
3065 if(boardtype.n_aochan > MAX_N_AO_CHAN)
3067 printk("bug! boardtype.n_aochan > MAX_N_AO_CHAN\n");
3071 if(alloc_subdevices(dev, 11) < 0)
3074 /* analog input subdevice */
3076 s=dev->subdevices+0;
3078 if(boardtype.n_adchan){
3079 s->type=COMEDI_SUBD_AI;
3080 s->subdev_flags=SDF_READABLE | SDF_DIFF | SDF_DITHER;
3081 if(boardtype.reg_type != ni_reg_611x)
3082 s->subdev_flags |= SDF_GROUND | SDF_COMMON | SDF_OTHER;
3083 if(boardtype.adbits > 16)
3084 s->subdev_flags |= SDF_LSAMPL;
3085 if(boardtype.reg_type == ni_reg_m_series)
3086 s->subdev_flags |= SDF_SOFT_CALIBRATED;
3087 s->n_chan=boardtype.n_adchan;
3088 s->len_chanlist=512;
3089 s->maxdata=(1<<boardtype.adbits)-1;
3090 s->range_table=ni_range_lkup[boardtype.gainlkup];
3091 s->insn_read=ni_ai_insn_read;
3092 s->insn_config=ni_ai_insn_config;
3093 s->do_cmdtest=ni_ai_cmdtest;
3094 s->do_cmd=ni_ai_cmd;
3095 s->cancel=ni_ai_reset;
3097 s->munge=ni_ai_munge;
3099 s->type=COMEDI_SUBD_UNUSED;
3102 /* analog output subdevice */
3104 s=dev->subdevices+1;
3105 if(boardtype.n_aochan){
3106 dev->write_subdev=s;
3107 s->type=COMEDI_SUBD_AO;
3108 s->subdev_flags=SDF_WRITABLE|SDF_DEGLITCH|SDF_GROUND;
3109 if(boardtype.reg_type == ni_reg_m_series)
3110 s->subdev_flags |= SDF_SOFT_CALIBRATED;
3111 s->n_chan=boardtype.n_aochan;
3112 s->maxdata=(1<<boardtype.aobits)-1;
3113 s->range_table = boardtype.ao_range_table;
3114 s->insn_read=ni_ao_insn_read;
3115 if(boardtype.reg_type & ni_reg_6xxx_mask){
3116 s->insn_write=ni_ao_insn_write_671x;
3118 s->insn_write=ni_ao_insn_write;
3121 if(boardtype.n_aochan){
3123 if(boardtype.ao_fifo_depth){
3125 s->do_cmd=ni_ao_cmd;
3126 s->do_cmdtest=ni_ao_cmdtest;
3127 s->len_chanlist = boardtype.n_aochan;
3128 if(boardtype.reg_type != ni_reg_m_series)
3129 s->munge=ni_ao_munge;
3131 s->cancel=ni_ao_reset;
3133 s->type=COMEDI_SUBD_UNUSED;
3135 if((boardtype.reg_type & ni_reg_67xx_mask))
3136 init_ao_67xx(dev, s);
3138 /* digital i/o subdevice */
3140 s=dev->subdevices+2;
3141 s->type=COMEDI_SUBD_DIO;
3142 s->subdev_flags=SDF_WRITABLE|SDF_READABLE;
3144 s->io_bits=0; /* all bits input */
3145 s->range_table=&range_digital;
3146 if(boardtype.reg_type == ni_reg_m_series)
3149 s->insn_bits = ni_m_series_dio_insn_bits;
3150 s->insn_config=ni_m_series_dio_insn_config;
3151 ni_writel(s->io_bits, M_Offset_DIO_Direction);
3155 s->insn_bits=ni_dio_insn_bits;
3156 s->insn_config=ni_dio_insn_config;
3157 devpriv->dio_control = DIO_Pins_Dir(s->io_bits);
3158 ni_writew(devpriv->dio_control, DIO_Control_Register);
3162 s=dev->subdevices+3;
3163 if(boardtype.has_8255){
3164 subdev_8255_init(dev,s,ni_8255_callback,(unsigned long)dev);
3166 s->type=COMEDI_SUBD_UNUSED;
3169 /* general purpose counter/timer device */
3170 s=dev->subdevices+4;
3171 s->type=COMEDI_SUBD_COUNTER;
3172 s->subdev_flags=SDF_READABLE|SDF_WRITABLE;
3173 s->insn_read= ni_gpct_insn_read;
3174 s->insn_write= ni_gpct_insn_write;
3175 s->insn_config=ni_gpct_insn_config;
3178 devpriv->an_trig_etc_reg = 0;
3182 /* calibration subdevice -- ai and ao */
3183 s=dev->subdevices+5;
3184 s->type=COMEDI_SUBD_CALIB;
3185 if(boardtype.reg_type == ni_reg_m_series)
3187 // internal PWM analog output used for AI nonlinearity calibration
3188 s->subdev_flags = SDF_INTERNAL;
3189 s->insn_config = &ni_m_series_pwm_config;
3192 ni_writel(0x0, M_Offset_Cal_PWM);
3193 } else if(boardtype.reg_type == ni_reg_6143)
3195 // internal PWM analog output used for AI nonlinearity calibration
3196 s->subdev_flags = SDF_INTERNAL;
3197 s->insn_config = &ni_6143_pwm_config;
3202 s->subdev_flags = SDF_WRITABLE | SDF_INTERNAL;
3203 s->insn_read = &ni_calib_insn_read;
3204 s->insn_write = &ni_calib_insn_write;
3205 caldac_setup(dev, s);
3209 s=dev->subdevices+6;
3210 s->type=COMEDI_SUBD_MEMORY;
3211 s->subdev_flags=SDF_READABLE|SDF_INTERNAL;
3213 if(boardtype.reg_type == ni_reg_m_series)
3215 s->n_chan = M_SERIES_EEPROM_SIZE;
3216 s->insn_read = &ni_m_series_eeprom_insn_read;
3220 s->insn_read = &ni_eeprom_insn_read;
3223 s=dev->subdevices + 7;
3224 s->type = COMEDI_SUBD_DIO;
3225 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3226 if(boardtype.reg_type == ni_reg_m_series)
3234 s->insn_bits = ni_pfi_insn_bits;
3235 s->insn_config = ni_pfi_insn_config;
3236 ni_set_bits(dev, IO_Bidirection_Pin_Register, ~0, 0);
3238 /* cs5529 calibration adc */
3239 s = dev->subdevices + 8;
3240 if(boardtype.reg_type & ni_reg_67xx_mask)
3242 s->type = COMEDI_SUBD_AI;
3243 s->subdev_flags = SDF_READABLE | SDF_DIFF | SDF_INTERNAL;
3244 // one channel for each analog output channel
3245 s->n_chan = boardtype.n_aochan;
3246 s->maxdata = (1 << 16) - 1;
3247 s->range_table = &range_unknown; /* XXX */
3248 s->insn_read=cs5529_ai_insn_read;
3249 s->insn_config=NULL;
3253 s->type=COMEDI_SUBD_UNUSED;
3257 s=dev->subdevices+9;
3258 s->type=COMEDI_SUBD_SERIAL;
3259 s->subdev_flags=SDF_READABLE|SDF_WRITABLE|SDF_INTERNAL;
3262 s->insn_config = ni_serial_insn_config;
3263 devpriv->serial_interval_ns = 0;
3264 devpriv->serial_hw_mode = 0;
3267 s=dev->subdevices + 10;
3268 s->type = COMEDI_SUBD_DIO;
3269 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3272 s->insn_bits = ni_rtsi_insn_bits;
3273 s->insn_config = ni_rtsi_insn_config;
3276 /* ai configuration */
3277 ni_ai_reset(dev,dev->subdevices+0);
3278 if((boardtype.reg_type & ni_reg_6xxx_mask) == 0){
3279 // BEAM is this needed for PCI-6143 ??
3280 devpriv->clock_and_fout =
3281 Slow_Internal_Time_Divide_By_2 |
3282 Slow_Internal_Timebase |
3283 Clock_To_Board_Divide_By_2 |
3285 AI_Output_Divide_By_2 |
3286 AO_Output_Divide_By_2;
3288 devpriv->clock_and_fout =
3289 Slow_Internal_Time_Divide_By_2 |
3290 Slow_Internal_Timebase |
3291 Clock_To_Board_Divide_By_2 |
3294 devpriv->stc_writew(dev, devpriv->clock_and_fout, Clock_and_FOUT_Register);
3296 /* analog output configuration */
3297 ni_ao_reset(dev,dev->subdevices + 1);
3300 devpriv->stc_writew(dev, (IRQ_POLARITY?Interrupt_Output_Polarity:0) |
3301 (Interrupt_Output_On_3_Pins&0) |
3302 Interrupt_A_Enable |
3303 Interrupt_B_Enable |
3304 Interrupt_A_Output_Select(interrupt_pin(dev->irq)) |
3305 Interrupt_B_Output_Select(interrupt_pin(dev->irq)),
3306 Interrupt_Control_Register
3311 /* tell the STC which dma channels to use for AI and AO */
3312 bits = 1 << ( AI_DMA_CHAN );
3313 bits |= 1 << ( AO_DMA_CHAN + 4 );
3314 ni_writeb( bits, AI_AO_Select);
3315 /* tell the STC which dma channels to use for
3316 * General purpose counters 0 and 1 */
3317 bits = 1 << ( GPC0_DMA_CHAN );
3318 bits |= 1 << ( GPC1_DMA_CHAN + 4 );
3319 ni_writeb( bits, G0_G1_Select);
3321 if(boardtype.reg_type & ni_reg_6xxx_mask)
3323 ni_writeb( 0, Magic_611x );
3324 }else if(boardtype.reg_type == ni_reg_m_series)
3327 for(channel = 0; channel < boardtype.n_aochan; ++channel)
3329 ni_writeb(0xf, M_Offset_AO_Waveform_Order(channel));
3330 ni_writeb(0x0, M_Offset_AO_Reference_Attenuation(channel));
3332 ni_writeb(0x0, M_Offset_AO_Calibration);
3341 static int ni_8255_callback(int dir,int port,int data,unsigned long arg)
3343 comedi_device *dev=(comedi_device *)arg;
3346 ni_writeb(data,Port_A+2*port);
3349 return ni_readb(Port_A+2*port);
3354 presents the EEPROM as a subdevice
3357 static int ni_eeprom_insn_read(comedi_device *dev,comedi_subdevice *s,
3358 comedi_insn *insn,lsampl_t *data)
3360 data[0]=ni_read_eeprom(dev,CR_CHAN(insn->chanspec));
3366 reads bytes out of eeprom
3369 static int ni_read_eeprom(comedi_device *dev,int addr)
3374 bitstring=0x0300|((addr&0x100)<<3)|(addr&0xff);
3375 ni_writeb(0x04,Serial_Command);
3376 for(bit=0x8000;bit;bit>>=1){
3377 ni_writeb(0x04|((bit&bitstring)?0x02:0),Serial_Command);
3378 ni_writeb(0x05|((bit&bitstring)?0x02:0),Serial_Command);
3381 for(bit=0x80;bit;bit>>=1){
3382 ni_writeb(0x04,Serial_Command);
3383 ni_writeb(0x05,Serial_Command);
3384 bitstring|=((ni_readb(XXX_Status)&PROMOUT)?bit:0);
3386 ni_writeb(0x00,Serial_Command);
3391 static int ni_m_series_eeprom_insn_read(comedi_device *dev,comedi_subdevice *s,
3392 comedi_insn *insn,lsampl_t *data)
3394 data[0] = devpriv->eeprom_buffer[CR_CHAN(insn->chanspec)];
3399 static int ni_get_pwm_config(comedi_device *dev, lsampl_t *data)
3401 data[1] = devpriv->pwm_up_count * devpriv->clock_ns;
3402 data[2] = devpriv->pwm_down_count * devpriv->clock_ns;
3406 static int ni_m_series_pwm_config(comedi_device *dev, comedi_subdevice *s,
3407 comedi_insn *insn, lsampl_t *data)
3409 unsigned up_count, down_count;
3412 case INSN_CONFIG_PWM_OUTPUT:
3415 case TRIG_ROUND_NEAREST:
3416 up_count = (data[2] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3418 case TRIG_ROUND_DOWN:
3419 up_count = data[2] / devpriv->clock_ns;
3422 up_count = (data[2] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3430 case TRIG_ROUND_NEAREST:
3431 down_count = (data[4] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3433 case TRIG_ROUND_DOWN:
3434 down_count = data[4] / devpriv->clock_ns;
3437 down_count = (data[4] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3443 if(up_count * devpriv->clock_ns != data[2] ||
3444 down_count * devpriv->clock_ns != data[4])
3446 data[2] = up_count * devpriv->clock_ns;
3447 data[4] = down_count * devpriv->clock_ns;
3450 ni_writel(MSeries_Cal_PWM_High_Time_Bits(up_count) | MSeries_Cal_PWM_Low_Time_Bits(down_count), M_Offset_Cal_PWM);
3451 devpriv->pwm_up_count = up_count;
3452 devpriv->pwm_down_count = down_count;
3455 case INSN_CONFIG_GET_PWM_OUTPUT:
3456 return ni_get_pwm_config(dev, data);
3465 static int ni_6143_pwm_config(comedi_device *dev, comedi_subdevice *s,
3466 comedi_insn *insn, lsampl_t *data)
3468 unsigned up_count, down_count;
3471 case INSN_CONFIG_PWM_OUTPUT:
3474 case TRIG_ROUND_NEAREST:
3475 up_count = (data[2] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3477 case TRIG_ROUND_DOWN:
3478 up_count = data[2] / devpriv->clock_ns;
3481 up_count = (data[2] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3489 case TRIG_ROUND_NEAREST:
3490 down_count = (data[4] + devpriv->clock_ns / 2) / devpriv->clock_ns;
3492 case TRIG_ROUND_DOWN:
3493 down_count = data[4] / devpriv->clock_ns;
3496 down_count = (data[4] + devpriv->clock_ns - 1) / devpriv->clock_ns;
3502 if(up_count * devpriv->clock_ns != data[2] ||
3503 down_count * devpriv->clock_ns != data[4])
3505 data[2] = up_count * devpriv->clock_ns;
3506 data[4] = down_count * devpriv->clock_ns;
3509 ni_writel(up_count, Calibration_HighTime_6143);
3510 devpriv->pwm_up_count = up_count;
3511 ni_writel(down_count, Calibration_LowTime_6143);
3512 devpriv->pwm_down_count = down_count;
3515 case INSN_CONFIG_GET_PWM_OUTPUT:
3516 return ni_get_pwm_config(dev, data);
3524 static void ni_write_caldac(comedi_device *dev,int addr,int val);
3526 calibration subdevice
3528 static int ni_calib_insn_write(comedi_device *dev,comedi_subdevice *s,
3529 comedi_insn *insn,lsampl_t *data)
3531 ni_write_caldac(dev,CR_CHAN(insn->chanspec),data[0]);
3536 static int ni_calib_insn_read(comedi_device *dev,comedi_subdevice *s,
3537 comedi_insn *insn,lsampl_t *data)
3539 data[0] = devpriv->caldacs[CR_CHAN(insn->chanspec)];
3544 static int pack_mb88341(int addr,int val,int *bitstring);
3545 static int pack_dac8800(int addr,int val,int *bitstring);
3546 static int pack_dac8043(int addr,int val,int *bitstring);
3547 static int pack_ad8522(int addr,int val,int *bitstring);
3548 static int pack_ad8804(int addr,int val,int *bitstring);
3549 static int pack_ad8842(int addr,int val,int *bitstring);
3551 struct caldac_struct{
3554 int (*packbits)(int,int,int *);
3557 static struct caldac_struct caldacs[] = {
3558 [mb88341] = { 12, 8, pack_mb88341 },
3559 [dac8800] = { 8, 8, pack_dac8800 },
3560 [dac8043] = { 1, 12, pack_dac8043 },
3561 [ad8522] = { 2, 12, pack_ad8522 },
3562 [ad8804] = { 12, 8, pack_ad8804 },
3563 [ad8842] = { 8, 8, pack_ad8842 },
3564 [ad8804_debug] = { 16, 8, pack_ad8804 },
3567 static void caldac_setup(comedi_device *dev,comedi_subdevice *s)
3577 type = boardtype.caldac[0];
3578 if(type==caldac_none)return;
3579 n_bits=caldacs[type].n_bits;
3581 type = boardtype.caldac[i];
3582 if(type==caldac_none)break;
3583 if(caldacs[type].n_bits!=n_bits)diffbits=1;
3584 n_chans+=caldacs[type].n_chans;
3591 if(n_chans>MAX_N_CALDACS){
3592 printk("BUG! MAX_N_CALDACS too small\n");
3594 s->maxdata_list=devpriv->caldac_maxdata_list;
3596 for(i=0;i<n_dacs;i++){
3597 type = boardtype.caldac[i];
3598 for(j=0;j<caldacs[type].n_chans;j++){
3599 s->maxdata_list[chan]=
3600 (1<<caldacs[type].n_bits)-1;
3605 for( chan = 0; chan < s->n_chan; chan++ )
3606 ni_write_caldac( dev, i, s->maxdata_list[ i ] / 2 );
3608 type = boardtype.caldac[0];
3609 s->maxdata=(1<<caldacs[type].n_bits)-1;
3611 for( chan = 0; chan < s->n_chan; chan++ )
3612 ni_write_caldac( dev, i, s->maxdata / 2 );
3616 static void ni_write_caldac(comedi_device *dev,int addr,int val)
3618 unsigned int loadbit=0,bits=0,bit,bitstring=0;
3622 //printk("ni_write_caldac: chan=%d val=%d\n",addr,val);
3623 if( devpriv->caldacs[ addr ] == val ) return;
3624 devpriv->caldacs[ addr ] = val;
3627 type = boardtype.caldac[i];
3628 if(type==caldac_none)break;
3629 if(addr<caldacs[type].n_chans){
3630 bits=caldacs[type].packbits(addr,val,&bitstring);
3631 loadbit=SerDacLd(i);
3632 //printk("caldac: using i=%d addr=%d %x\n",i,addr,bitstring);
3635 addr-=caldacs[type].n_chans;
3638 for(bit=1<<(bits-1);bit;bit>>=1){
3639 ni_writeb(((bit&bitstring)?0x02:0),Serial_Command);
3641 ni_writeb(1|((bit&bitstring)?0x02:0),Serial_Command);
3644 ni_writeb(loadbit,Serial_Command);
3646 ni_writeb(0,Serial_Command);
3651 static int pack_mb88341(int addr,int val,int *bitstring)
3655 Note that address bits are reversed. Thanks to
3656 Ingo Keen for noticing this.
3658 Note also that the 88341 expects address values from
3659 1-12, whereas we use channel numbers 0-11. The NI
3660 docs use 1-12, also, so be careful here.
3663 *bitstring=((addr&0x1)<<11) |
3671 static int pack_dac8800(int addr,int val,int *bitstring)
3673 *bitstring=((addr&0x7)<<8)|(val&0xff);
3677 static int pack_dac8043(int addr,int val,int *bitstring)
3679 *bitstring=val&0xfff;
3683 static int pack_ad8522(int addr,int val,int *bitstring)
3685 *bitstring=(val&0xfff)|(addr ? 0xc000:0xa000);
3689 static int pack_ad8804(int addr,int val,int *bitstring)
3691 *bitstring=((addr&0xf)<<8) | (val&0xff);
3695 static int pack_ad8842(int addr,int val,int *bitstring)
3697 *bitstring=((addr+1)<<8) | (val&0xff);
3707 * General Purpose Counter/Timer section
3712 * Low level stuff...Each STC counter has two 24 bit load registers
3713 * (A&B). Just make it easier to access them.
3715 * These are inlined _only_ because they are used once in subsequent
3716 * code. Otherwise they should not be inlined.
3718 static inline void GPCT_Load_A(comedi_device *dev, int chan, unsigned int value)
3720 devpriv->stc_writel(dev, value & 0x00ffffff, G_Load_A_Register(chan));
3723 static inline void GPCT_Load_B(comedi_device *dev, int chan, unsigned int value)
3725 devpriv->stc_writel(dev, value & 0x00ffffff, G_Load_B_Register(chan));
3728 /* Load a value into the counter, using register A as the intermediate step.
3729 * You might use GPCT_Load_Using_A to load a 0x000000 into a counter
3732 static void GPCT_Load_Using_A(comedi_device *dev, int chan, unsigned int value)
3734 devpriv->gpct_mode[chan] &= (~G_Load_Source_Select);
3735 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
3736 GPCT_Load_A(dev,chan,value);
3737 devpriv->stc_writew(dev, devpriv->gpct_command[chan]|G_Load,G_Command_Register(chan));
3741 * Read the GPCTs current value.
3743 static int GPCT_G_Watch(comedi_device *dev, int chan)
3745 unsigned int hi1,hi2,lo;
3747 devpriv->gpct_command[chan] &= ~G_Save_Trace;
3748 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
3750 devpriv->gpct_command[chan] |= G_Save_Trace;
3751 devpriv->stc_writew(dev, devpriv->gpct_command[chan], G_Command_Register(chan));
3753 /* This procedure is used because the two registers cannot
3754 * be read atomically. */
3756 hi1 = devpriv->stc_readw(dev, G_Save_Register_High(chan));
3757 lo = devpriv->stc_readw(dev, G_Save_Register_Low(chan));
3758 hi2 = devpriv->stc_readw(dev, G_Save_Register_High(chan));
3761 return (hi1<<16)|lo;
3765 static int GPCT_Disarm(comedi_device *dev, int chan)
3767 devpriv->stc_writew(dev, devpriv->gpct_command[chan] | G_Disarm,G_Command_Register(chan));
3772 static int GPCT_Arm(comedi_device *dev, int chan)
3774 devpriv->stc_writew(dev, devpriv->gpct_command[chan] | G_Arm,G_Command_Register(chan));
3775 /* If the counter is doing pulse width measurement, then make
3776 sure that the counter did not start counting right away. This would
3777 indicate that we started acquiring the pulse after it had already
3778 started and our measurement would be inaccurate */
3779 if(devpriv->gpct_cur_operation[chan] == GPCT_SINGLE_PW){
3782 g_status=devpriv->stc_readw(dev, G_Status_Register);
3785 //TIM 5/2/01 possible error with very short pulses
3786 if((G0_Counting_St & g_status)|| !(G0_Armed_St&g_status)) {
3787 //error: we missed the beginning of the pulse
3788 return -EINVAL; //there is probably a more accurate error code...
3791 if((G1_Counting_St & g_status)|| !(G1_Armed_St&g_status)) {
3792 //error: we missed the beginning of the pulse
3800 static int GPCT_Set_Source(comedi_device *dev,int chan ,int source)
3802 //printk("GPCT_Set_Source...");
3803 devpriv->gpct_input_select[chan] &= ~G_Source_Select(0x1f);//reset gate to 0
3805 case GPCT_INT_CLOCK:
3806 devpriv->gpct_input_select[chan] |= G_Source_Select(0);//INT_TIMEBASE
3810 devpriv->gpct_input_select[chan] |= G_Source_Select(9);//PFI8
3812 devpriv->gpct_input_select[chan] |= G_Source_Select(4);//PFI3
3817 devpriv->stc_writew(dev, devpriv->gpct_input_select[chan], G_Input_Select_Register(chan));
3818 //printk("exit GPCT_Set_Source\n");
3822 static int GPCT_Set_Gate(comedi_device *dev,int chan ,int gate)
3824 //printk("GPCT_Set_Gate...");
3825 devpriv->gpct_input_select[chan] &= ~G_Gate_Select(0x1f);//reset gate to 0
3828 devpriv->gpct_input_select[chan] |= G_Gate_Select(31);//Low
3829 devpriv->gpct_mode[chan] |= G_Gate_Polarity;
3832 devpriv->gpct_mode[chan] &= ~G_Gate_Polarity;
3834 devpriv->gpct_input_select[chan] |= G_Gate_Select(10);//PFI9
3836 devpriv->gpct_input_select[chan] |= G_Gate_Select(5);//PFI4
3842 devpriv->stc_writew(dev, devpriv->gpct_input_select[chan], G_Input_Select_Register(chan));
3843 devpriv->stc_writew(dev, devpriv->gpct_mode[chan], G_Mode_Register(chan));
3844 //printk("exit GPCT_Set_Gate\n");
3848 static int GPCT_Set_Direction(comedi_device *dev,int chan,int direction)
3850 //printk("GPCT_Set_Direction...");
3852 devpriv->gpct_command[chan] &= ~G_Up_Down(0x3);
3853 switch (direction) {
3855 devpriv->gpct_command[chan] |= G_Up_Down(1);
3858 devpriv->gpct_command[chan] |= G_Up_Down(0);
3861 devpriv->gpct_command[chan] |= G_Up_Down(2);
3864 rt_printk("Error direction=0x%08x..",direction);
3867 devpriv->stc_writew(dev, devpriv->gpct_command[chan], G_Command_Register(chan));
3868 //TIM 4/23/01 devpriv->stc_writew(dev, devpriv->gpct_mode[chan], G_Mode_Register(chan));
3869 //printk("exit GPCT_Set_Direction\n");
3873 static void GPCT_Event_Counting(comedi_device *dev,int chan)
3876 //NOTE: possible residual bits from multibit masks can corrupt
3877 //If you config for several measurements between Resets, watch out!
3879 //printk("GPCT_Event_Counting...");
3881 devpriv->gpct_cur_operation[chan] = GPCT_SIMPLE_EVENT;
3884 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
3885 devpriv->gpct_mode[chan] |= G_Gating_Mode(1);
3887 // Trigger_Mode_For_Edge_Gate = 1
3888 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
3889 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);
3891 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
3892 //printk("exit GPCT_Event_Counting\n");
3895 static void GPCT_Period_Meas(comedi_device *dev, int chan)
3897 //printk("GPCT_Period_Meas...");
3899 devpriv->gpct_cur_operation[chan] = GPCT_SINGLE_PERIOD;
3902 //NOTE: possible residual bits from multibit masks can corrupt
3903 //If you config for several measurements between Resets, watch out!
3904 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
3905 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
3908 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
3909 devpriv->gpct_mode[chan] |= G_Output_Mode(3);
3913 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
3914 devpriv->gpct_mode[chan] |= G_Gating_Mode(2);
3916 // Trigger_Mode_For_Edge_Gate=0
3917 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
3918 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(0);
3920 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;
3921 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;
3922 devpriv->gpct_mode[chan] &= ~G_Loading_On_TC;
3923 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
3926 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
3927 devpriv->gpct_mode[chan] |= G_Stop_Mode(0);
3929 // Counting_Once = 2
3930 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
3931 devpriv->gpct_mode[chan] |= G_Counting_Once(2);
3934 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
3935 devpriv->gpct_command[chan] |= G_Up_Down(1);
3937 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
3938 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
3939 //printk("exit GPCT_Period_Meas\n");
3942 static void GPCT_Pulse_Width_Meas(comedi_device *dev, int chan)
3944 //printk("GPCT_Pulse_Width_Meas...");
3946 devpriv->gpct_cur_operation[chan] = GPCT_SINGLE_PW;
3948 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
3949 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
3952 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
3953 devpriv->gpct_mode[chan] |= G_Output_Mode(3);
3956 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
3957 devpriv->gpct_mode[chan] |= G_Gating_Mode(1);//TIM 4/24/01 was 2
3959 // Trigger_Mode_For_Edge_Gate=2
3960 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
3961 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);//TIM 4/24/01 was 0
3964 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;//TIM 4/24/01 was 1
3965 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;//TIM 4/24/01 was 0
3967 devpriv->gpct_mode[chan] &= ~G_Loading_On_TC;
3968 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
3971 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
3972 devpriv->gpct_mode[chan] |= G_Stop_Mode(0);
3974 // Counting_Once = 2
3975 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
3976 devpriv->gpct_mode[chan] |= G_Counting_Once(2);
3979 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
3980 devpriv->gpct_command[chan] |= G_Up_Down(1);
3982 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
3983 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
3985 //printk("exit GPCT_Pulse_Width_Meas\n");
3988 /* GPCT_Gen_Single_Pulse() creates pulse of length pulsewidth which starts after the Arm
3989 signal is sent. The pulse is delayed by the value already in the counter. This function could
3990 be modified to send a pulse in response to a trigger event at its gate.*/
3991 static void GPCT_Gen_Single_Pulse(comedi_device *dev, int chan, unsigned int length)
3993 //printk("GPCT_Gen_Cont...");
3995 devpriv->gpct_cur_operation[chan] = GPCT_SINGLE_PULSE_OUT;
3997 // Set length of the pulse
3998 GPCT_Load_B(dev,chan, length-1);
4000 //Load next time using B, This is reset by GPCT_Load_Using_A()
4001 devpriv->gpct_mode[chan] |= G_Load_Source_Select;
4003 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
4004 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
4007 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
4008 devpriv->gpct_mode[chan] |= G_Output_Mode(2); //TIM 4/26/01 was 3
4010 //Gating Mode=0 for untriggered single pulse
4011 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
4012 devpriv->gpct_mode[chan] |= G_Gating_Mode(0); //TIM 4/25/01 was 1
4014 // Trigger_Mode_For_Edge_Gate=0
4015 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
4016 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);
4019 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;
4020 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;
4021 devpriv->gpct_mode[chan] |= G_Loading_On_TC; //TIM 4/25/01
4022 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
4025 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
4026 devpriv->gpct_mode[chan] |= G_Stop_Mode(2); //TIM 4/25/01
4028 // Counting_Once = 2
4029 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
4030 devpriv->gpct_mode[chan] |= G_Counting_Once(1); //TIM 4/25/01
4033 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
4034 devpriv->gpct_command[chan] |= G_Up_Down(0); //TIM 4/25/01 was 1
4036 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4037 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
4039 //printk("exit GPCT_Gen_Cont\n");
4042 static void GPCT_Gen_Cont_Pulse(comedi_device *dev, int chan, unsigned int length)
4044 //printk("GPCT_Gen_Cont...");
4046 devpriv->gpct_cur_operation[chan] = GPCT_CONT_PULSE_OUT;
4048 // Set length of the pulse
4049 GPCT_Load_B(dev,chan, length-1);
4051 //Load next time using B, This is reset by GPCT_Load_Using_A()
4052 devpriv->gpct_mode[chan] |= G_Load_Source_Select;
4054 devpriv->gpct_mode[chan] &= ~G_OR_Gate;
4055 devpriv->gpct_mode[chan] &= ~G_Gate_Select_Load_Source;
4058 devpriv->gpct_mode[chan] &= ~(G_Output_Mode(0x3));
4059 devpriv->gpct_mode[chan] |= G_Output_Mode(2); //TIM 4/26/01 was 3
4061 //Gating Mode=0 for untriggered single pulse
4062 devpriv->gpct_mode[chan] &= ~(G_Gating_Mode(0x3));
4063 devpriv->gpct_mode[chan] |= G_Gating_Mode(0); //TIM 4/26/01 was 0
4065 // Trigger_Mode_For_Edge_Gate=0
4066 devpriv->gpct_mode[chan] &= ~(G_Trigger_Mode_For_Edge_Gate(0x3));
4067 devpriv->gpct_mode[chan] |= G_Trigger_Mode_For_Edge_Gate(2);
4070 devpriv->gpct_mode[chan] |= G_Reload_Source_Switching;
4071 devpriv->gpct_mode[chan] &= ~G_Loading_On_Gate;
4072 devpriv->gpct_mode[chan] |= G_Loading_On_TC;
4073 devpriv->gpct_mode[chan] &= ~G_Gate_On_Both_Edges;
4076 devpriv->gpct_mode[chan] &= ~(G_Stop_Mode(0x3));
4077 devpriv->gpct_mode[chan] |= G_Stop_Mode(0); //TIM 4/26/01
4079 // Counting_Once = 2
4080 devpriv->gpct_mode[chan] &= ~(G_Counting_Once(0x3));
4081 devpriv->gpct_mode[chan] |= G_Counting_Once(0); //TIM 4/26/01
4084 devpriv->gpct_command[chan] &= ~(G_Up_Down(0x3));
4085 devpriv->gpct_command[chan] |= G_Up_Down(0);
4088 //This seems pretty unsafe since I don't think it is cleared anywhere.
4089 //I don't think this is working
4090 //devpriv->gpct_command[chan] &= ~G_Bank_Switch_Enable;
4091 //devpriv->gpct_command[chan] &= ~G_Bank_Switch_Mode;
4094 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4095 devpriv->stc_writew(dev, devpriv->gpct_command[chan],G_Command_Register(chan));
4097 //printk("exit GPCT_Gen_Cont\n");
4100 static void GPCT_Reset(comedi_device *dev, int chan)
4104 //printk("GPCT_Reset...");
4105 devpriv->gpct_cur_operation[chan] = GPCT_RESET;
4109 devpriv->stc_writew(dev, G0_Reset,Joint_Reset_Register);
4110 ni_set_bits(dev,Interrupt_A_Enable_Register,G0_TC_Interrupt_Enable, 0);
4111 ni_set_bits(dev,Interrupt_A_Enable_Register,G0_Gate_Interrupt_Enable,0);
4112 temp_ack_reg |= G0_Gate_Error_Confirm;
4113 temp_ack_reg |= G0_TC_Error_Confirm;
4114 temp_ack_reg |= G0_TC_Interrupt_Ack;
4115 temp_ack_reg |= G0_Gate_Interrupt_Ack;
4116 devpriv->stc_writew(dev, temp_ack_reg,Interrupt_A_Ack_Register);
4118 //problem...this interferes with the other ctr...
4119 devpriv->an_trig_etc_reg |= GPFO_0_Output_Enable;
4120 devpriv->stc_writew(dev, devpriv->an_trig_etc_reg, Analog_Trigger_Etc_Register);
4123 devpriv->stc_writew(dev, G1_Reset,Joint_Reset_Register);
4124 ni_set_bits(dev,Interrupt_B_Enable_Register,G1_TC_Interrupt_Enable, 0);
4125 ni_set_bits(dev,Interrupt_B_Enable_Register,G0_Gate_Interrupt_Enable,0);
4126 temp_ack_reg |= G1_Gate_Error_Confirm;
4127 temp_ack_reg |= G1_TC_Error_Confirm;
4128 temp_ack_reg |= G1_TC_Interrupt_Ack;
4129 temp_ack_reg |= G1_Gate_Interrupt_Ack;
4130 devpriv->stc_writew(dev, temp_ack_reg,Interrupt_B_Ack_Register);
4132 devpriv->an_trig_etc_reg |= GPFO_1_Output_Enable;
4133 devpriv->stc_writew(dev, devpriv->an_trig_etc_reg, Analog_Trigger_Etc_Register);
4137 devpriv->gpct_mode[chan] = 0;
4138 devpriv->gpct_input_select[chan] = 0;
4139 devpriv->gpct_command[chan] = 0;
4141 devpriv->gpct_command[chan] |= G_Synchronized_Gate;
4143 devpriv->stc_writew(dev, devpriv->gpct_mode[chan],G_Mode_Register(chan));
4144 devpriv->stc_writew(dev, devpriv->gpct_input_select[chan],G_Input_Select_Register(chan));
4145 devpriv->stc_writew(dev, 0,G_Autoincrement_Register(chan));
4147 //printk("exit GPCT_Reset\n");
4150 static int ni_gpct_insn_config(comedi_device *dev,comedi_subdevice *s,
4151 comedi_insn *insn,lsampl_t *data)
4154 //printk("data[0] is 0x%08x, data[1] is 0x%08x\n",data[0],data[1]);
4157 if(insn->n!=1)return -EINVAL;
4158 GPCT_Reset(dev,insn->chanspec);
4160 case GPCT_SET_SOURCE:
4161 if(insn->n!=2)return -EINVAL;
4162 retval=GPCT_Set_Source(dev,insn->chanspec,data[1]);
4165 if(insn->n!=2)return -EINVAL;
4166 retval=GPCT_Set_Gate(dev,insn->chanspec,data[1]);
4168 case GPCT_SET_DIRECTION:
4169 if(insn->n!=2) return -EINVAL;
4170 retval=GPCT_Set_Direction(dev,insn->chanspec,data[1]);
4172 case GPCT_GET_INT_CLK_FRQ:
4173 if(insn->n!=2) return -EINVAL;
4174 //There are actually 2 internal clocks on the STC, we always
4175 //use the fast 20MHz one at this time. Tim Ousley 5/1/01
4176 //NOTE: This is not the final interface, ideally the user
4177 //will never need to know the int. clk. freq.
4178 data[1]=50;//50ns = 20MHz = internal timebase of STC
4180 case GPCT_SET_OPERATION:
4181 //TIM 5/1/01 if((insn->n<2)||(insn->n>3))return -EINVAL;
4183 case GPCT_SIMPLE_EVENT:
4184 GPCT_Event_Counting(dev,insn->chanspec);
4186 case GPCT_SINGLE_PERIOD:
4187 GPCT_Period_Meas(dev,insn->chanspec);
4189 case GPCT_SINGLE_PW:
4190 GPCT_Pulse_Width_Meas(dev,insn->chanspec);
4192 case GPCT_SINGLE_PULSE_OUT:
4193 GPCT_Gen_Single_Pulse(dev,insn->chanspec,data[2]);
4195 case GPCT_CONT_PULSE_OUT:
4196 GPCT_Gen_Cont_Pulse(dev,insn->chanspec,data[2]);
4199 rt_printk("unsupported GPCT operation!\n");
4204 if(insn->n!=1)return -EINVAL;
4205 retval=GPCT_Arm(dev,insn->chanspec);
4208 if(insn->n!=1)return -EINVAL;
4209 retval=GPCT_Disarm(dev,insn->chanspec);
4215 //catch any errors from return values
4219 if(data[0]!=GPCT_ARM){
4220 rt_printk("error: retval was %d\n",retval);
4221 rt_printk("data[0] is 0x%08x, data[1] is 0x%08x\n",data[0],data[1]);
4228 static int ni_gpct_insn_read(comedi_device *dev,comedi_subdevice *s,
4229 comedi_insn *insn,lsampl_t *data) {
4231 int chan=insn->chanspec;
4232 int cur_op = devpriv->gpct_cur_operation[chan];
4234 //printk("in ni_gpct_insn_read, n=%d, data[0]=%d\n",insn->chanspec,data[0]);
4235 if(insn->n!=1)return -EINVAL;
4237 data[0] = GPCT_G_Watch(dev,insn->chanspec);
4239 /* for certain modes (period and pulse width measurment), the value
4240 in the counter is not valid until the counter stops. If the value is
4241 invalid, return a 0 */
4242 if((cur_op == GPCT_SINGLE_PERIOD) || (cur_op == GPCT_SINGLE_PW)){
4243 /* is the counter still running? */
4244 if(devpriv->stc_readw(dev, G_Status_Register) & (chan?G1_Counting_St:G0_Counting_St))
4250 static int ni_gpct_insn_write(comedi_device *dev,comedi_subdevice *s,
4251 comedi_insn *insn,lsampl_t *data) {
4253 //printk("in ni_gpct_insn_write");
4254 if(insn->n!=1)return -EINVAL;
4255 GPCT_Load_Using_A(dev,insn->chanspec,data[0]);
4262 * Programmable Function Inputs
4266 int ni_m_series_set_pfi_routing(comedi_device *dev, unsigned chan, unsigned source)
4268 if((source & 0x1f) != source) return -EINVAL;
4269 const unsigned pfi_reg_index = 1 + chan / 3;
4270 const unsigned array_offset = pfi_reg_index - 1;
4271 devpriv->pfi_output_select_reg[array_offset] &= ~MSeries_PFI_Output_Select_Mask(chan);
4272 devpriv->pfi_output_select_reg[array_offset] |= MSeries_PFI_Output_Select_Bits(chan, source);
4273 ni_writew(devpriv->pfi_output_select_reg[array_offset], M_Offset_PFI_Output_Select(pfi_reg_index));
4277 int ni_old_set_pfi_routing(comedi_device *dev, unsigned chan, unsigned source)
4279 // pre-m-series boards have fixed signals on pfi pins
4280 if(source != ni_old_get_pfi_routing(dev, chan)) return -EINVAL;
4284 int ni_set_pfi_routing(comedi_device *dev, unsigned chan, unsigned source)
4286 if(boardtype.reg_type == ni_reg_m_series)
4287 return ni_m_series_set_pfi_routing(dev, chan, source);
4289 return ni_old_set_pfi_routing(dev, chan, source);
4292 unsigned ni_m_series_get_pfi_routing(comedi_device *dev, unsigned chan)
4294 const unsigned array_offset = chan / 3;
4295 return MSeries_PFI_Output_Select_Source(chan, devpriv->pfi_output_select_reg[array_offset]);
4298 unsigned ni_old_get_pfi_routing(comedi_device *dev, unsigned chan)
4300 // pre-m-series boards have fixed signals on pfi pins
4304 return NI_PFI_OUTPUT_AI_START1;
4307 return NI_PFI_OUTPUT_AI_START2;
4310 return NI_PFI_OUTPUT_AI_CONVERT;
4313 return NI_PFI_OUTPUT_G_SRC1;
4316 return NI_PFI_OUTPUT_G_GATE1;
4319 return NI_PFI_OUTPUT_AO_UPDATE_N;
4322 return NI_PFI_OUTPUT_AO_START1;
4325 return NI_PFI_OUTPUT_AI_START_PULSE;
4328 return NI_PFI_OUTPUT_G_SRC0;
4331 return NI_PFI_OUTPUT_G_GATE0;
4334 rt_printk("%s: bug, unhandled case in switch.\n", __FUNCTION__);
4340 unsigned ni_get_pfi_routing(comedi_device *dev, unsigned chan)
4342 if(boardtype.reg_type == ni_reg_m_series)
4343 return ni_m_series_get_pfi_routing(dev, chan);
4345 return ni_old_get_pfi_routing(dev, chan);
4348 static int ni_pfi_insn_bits(comedi_device *dev,comedi_subdevice *s,
4349 comedi_insn *insn,lsampl_t *data)
4351 if(insn->n!=2)return -EINVAL;
4358 static int ni_pfi_insn_config(comedi_device *dev,comedi_subdevice *s,
4359 comedi_insn *insn,lsampl_t *data)
4363 if(insn->n < 1)return -EINVAL;
4365 chan = CR_CHAN(insn->chanspec);
4369 ni_set_bits(dev, IO_Bidirection_Pin_Register, 1<<chan, 1);
4372 ni_set_bits(dev, IO_Bidirection_Pin_Register, 1<<chan, 0);
4374 case INSN_CONFIG_DIO_QUERY:
4375 data[1] = (devpriv->io_bidirection_pin_reg & (1<<chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
4378 case INSN_CONFIG_SET_ROUTING:
4379 return ni_set_pfi_routing(dev, chan, data[1]);
4381 case INSN_CONFIG_GET_ROUTING:
4382 data[1] = ni_get_pfi_routing(dev, chan);
4394 * NI RTSI Bus Functions
4397 static void ni_rtsi_init(comedi_device *dev)
4399 // Initialises the RTSI bus signal switch to a default state
4401 // Set clock mode to internal
4402 devpriv->clock_and_fout2 = MSeries_RTSI_10MHz_Bit;
4403 if(ni_set_master_clock(dev, NI_MIO_INTERNAL_CLOCK, 0) < 0)
4405 rt_printk("ni_set_master_clock failed, bug?");
4407 // default internal lines routing to RTSI bus lines
4408 devpriv->rtsi_trig_a_output_reg = RTSI_Trig_Output_Bits(0, NI_RTSI_OUTPUT_ADR_START1) |
4409 RTSI_Trig_Output_Bits(1, NI_RTSI_OUTPUT_ADR_START2) |
4410 RTSI_Trig_Output_Bits(2, NI_RTSI_OUTPUT_SCLKG) |
4411 RTSI_Trig_Output_Bits(3, NI_RTSI_OUTPUT_DACUPDN);
4412 devpriv->stc_writew(dev, devpriv->rtsi_trig_a_output_reg,
4413 RTSI_Trig_A_Output_Register);
4414 devpriv->rtsi_trig_b_output_reg = RTSI_Trig_Output_Bits(4, NI_RTSI_OUTPUT_DA_START1) |
4415 RTSI_Trig_Output_Bits(5, NI_RTSI_OUTPUT_G_SRC0) |
4416 RTSI_Trig_Output_Bits(6, NI_RTSI_OUTPUT_G_GATE0);
4417 if(boardtype.reg_type == ni_reg_m_series)
4418 devpriv->rtsi_trig_b_output_reg |= RTSI_Trig_Output_Bits(7, NI_RTSI_OUTPUT_RTSI_OSC);
4419 devpriv->stc_writew(dev, devpriv->rtsi_trig_b_output_reg,
4420 RTSI_Trig_B_Output_Register);
4422 // Sets the source and direction of the 4 on board lines
4423 // devpriv->stc_writew(dev, 0x0000, RTSI_Board_Register);
4426 static int ni_rtsi_insn_bits(comedi_device *dev,comedi_subdevice *s,
4427 comedi_insn *insn,lsampl_t *data)
4429 if(insn->n != 2) return -EINVAL;
4436 /* Find best multiplier/divider to try and get the PLL running at 80 MHz
4437 * given an arbitrary frequency input clock */
4438 static int ni_mseries_get_pll_parameters(unsigned reference_period_ns,
4439 unsigned *freq_divider, unsigned *freq_multiplier, unsigned *actual_period_ns)
4442 unsigned best_div = 1;
4443 static const unsigned max_div = 0x10;
4445 unsigned best_mult = 1;
4446 static const unsigned max_mult = 0x100;
4447 static const unsigned pico_per_nano = 1000;
4449 const unsigned reference_picosec = reference_period_ns * pico_per_nano;
4450 /* m-series wants the phased-locked loop to output 80MHz, which is divided by 4 to
4451 * 20 MHz for most timing clocks */
4452 static const unsigned target_picosec = 12500;
4453 int best_period_picosec = 0;
4454 for(div = 1; div <= max_div; ++div)
4456 for(mult = 1; mult <= max_mult; ++mult)
4458 unsigned new_period_ps = (reference_picosec * div) / mult;
4459 if(abs(new_period_ps - target_picosec) < abs(best_period_picosec - target_picosec))
4461 best_period_picosec = new_period_ps;
4467 if(best_period_picosec == 0)
4469 rt_printk("%s: bug, failed to find pll parameters\n", __FUNCTION__);
4472 *freq_divider = best_div;
4473 *freq_multiplier = best_mult;
4474 static const unsigned fudge_factor_80_to_20Mhz = 4;
4475 *actual_period_ns = (best_period_picosec * fudge_factor_80_to_20Mhz + (pico_per_nano / 2)) / pico_per_nano;
4479 static inline unsigned num_configurable_rtsi_channels(comedi_device *dev)
4481 if(boardtype.reg_type == ni_reg_m_series) return 8;
4485 static int ni_mseries_set_pll_master_clock(comedi_device *dev, unsigned source, unsigned period_ns)
4487 if(source == NI_MIO_PLL_PXI10_CLOCK) period_ns = 100;
4488 // these limits are somewhat arbitrary, but NI advertises 1 to 20MHz range so we'll use that
4489 static const unsigned min_period_ns = 50;
4490 static const unsigned max_period_ns = 1000;
4491 if(period_ns < min_period_ns || period_ns > max_period_ns)
4493 rt_printk("%s: you must specify an input clock frequency between %i and %i nanosec "
4494 "for the phased-lock loop.\n", __FUNCTION__, min_period_ns, max_period_ns);
4497 devpriv->rtsi_trig_direction_reg &= ~Use_RTSI_Clock_Bit;
4498 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4499 unsigned pll_control_bits = MSeries_PLL_Enable_Bit | MSeries_PLL_VCO_Mode_75_150MHz_Bits;
4500 devpriv->clock_and_fout2 |= MSeries_Timebase1_Select_Bit;
4501 devpriv->clock_and_fout2 &= ~MSeries_PLL_In_Source_Select_Mask;
4503 unsigned freq_divider;
4504 unsigned freq_multiplier;
4507 case NI_MIO_PLL_PXI_STAR_TRIGGER_CLOCK:
4508 devpriv->clock_and_fout2 |= MSeries_PLL_In_Source_Select_Star_Trigger_Bits;
4509 retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
4510 &freq_multiplier, &devpriv->clock_ns);
4511 if(retval < 0) return retval;
4513 case NI_MIO_PLL_PXI10_CLOCK:
4514 /* pxi clock is 10MHz */
4515 devpriv->clock_and_fout2 |= MSeries_PLL_In_Source_Select_PXI_Clock10;
4516 retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
4517 &freq_multiplier, &devpriv->clock_ns);
4518 if(retval < 0) return retval;
4522 unsigned rtsi_channel;
4523 static const unsigned max_rtsi_channel = 7;
4524 for(rtsi_channel = 0; rtsi_channel <= max_rtsi_channel; ++rtsi_channel)
4526 if(source == NI_MIO_PLL_RTSI_CLOCK(rtsi_channel))
4528 devpriv->clock_and_fout2 |= MSeries_PLL_In_Source_Select_RTSI_Bits(rtsi_channel);
4532 if(rtsi_channel > max_rtsi_channel) return -EINVAL;
4533 retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
4534 &freq_multiplier, &devpriv->clock_ns);
4535 if(retval < 0) return retval;
4539 ni_writew(devpriv->clock_and_fout2, M_Offset_Clock_and_Fout2);
4540 pll_control_bits |= MSeries_PLL_Divisor_Bits(freq_divider) | MSeries_PLL_Multiplier_Bits(freq_multiplier);
4541 // rt_printk("using divider=%i, multiplier=%i for PLL. pll_control_bits = 0x%x\n", freq_divider, freq_multiplier, pll_control_bits);
4542 // rt_printk("clock_ns=%d\n", devpriv->clock_ns);
4543 ni_writew(pll_control_bits, M_Offset_PLL_Control);
4544 devpriv->clock_source = source;
4546 static const unsigned timeout = 1000;
4547 /* it seems to typically take a few hundred microseconds for PLL to lock */
4548 for(i = 0; i < timeout; ++i)
4550 if(ni_readw(M_Offset_PLL_Status) & MSeries_PLL_Locked_Bit)
4558 rt_printk("%s: timed out waiting for PLL to lock to reference clock source %i with period %i ns.\n",
4559 __FUNCTION__, source, period_ns);
4565 static int ni_set_master_clock(comedi_device *dev, unsigned source, unsigned period_ns)
4567 if(source == NI_MIO_INTERNAL_CLOCK)
4569 devpriv->rtsi_trig_direction_reg &= ~Use_RTSI_Clock_Bit;
4570 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4571 devpriv->clock_ns = 50;
4572 if(boardtype.reg_type == ni_reg_m_series)
4574 devpriv->clock_and_fout2 &= ~(MSeries_Timebase1_Select_Bit | MSeries_Timebase3_Select_Bit);
4575 ni_writew(devpriv->clock_and_fout2, M_Offset_Clock_and_Fout2);
4576 ni_writew(0, M_Offset_PLL_Control);
4578 devpriv->clock_source = source;
4581 if(boardtype.reg_type == ni_reg_m_series)
4583 return ni_mseries_set_pll_master_clock(dev, source, period_ns);
4586 if(source == NI_MIO_RTSI_CLOCK)
4588 devpriv->rtsi_trig_direction_reg |= Use_RTSI_Clock_Bit;
4589 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4590 if(devpriv->clock_ns == 0)
4592 rt_printk("%s: we don't handle an unspecified clock period correctly yet, returning error.\n",
4597 devpriv->clock_ns = period_ns;
4599 devpriv->clock_source = source;
4607 int ni_valid_rtsi_output_source(comedi_device *dev, unsigned chan, unsigned source)
4609 if(chan >= num_configurable_rtsi_channels(dev))
4611 if(chan == old_RTSI_clock_channel)
4613 if(source == NI_RTSI_OUTPUT_RTSI_OSC) return 1;
4616 rt_printk("%s: invalid source for channel=%i, channel %i is always the RTSI clock for pre-m-series boards.\n",
4617 __FUNCTION__, chan, old_RTSI_clock_channel);
4625 case NI_RTSI_OUTPUT_ADR_START1:
4626 case NI_RTSI_OUTPUT_ADR_START2:
4627 case NI_RTSI_OUTPUT_SCLKG:
4628 case NI_RTSI_OUTPUT_DACUPDN:
4629 case NI_RTSI_OUTPUT_DA_START1:
4630 case NI_RTSI_OUTPUT_G_SRC0:
4631 case NI_RTSI_OUTPUT_G_GATE0:
4632 case NI_RTSI_OUTPUT_RGOUT0:
4633 case NI_RTSI_OUTPUT_RTSI_BRD_0:
4636 case NI_RTSI_OUTPUT_RTSI_OSC:
4637 if(boardtype.reg_type == ni_reg_m_series)
4647 int ni_set_rtsi_routing(comedi_device *dev, unsigned chan, unsigned source)
4649 if(ni_valid_rtsi_output_source(dev, chan, source) == 0) return -EINVAL;
4652 devpriv->rtsi_trig_a_output_reg &= ~RTSI_Trig_Output_Mask(chan);
4653 devpriv->rtsi_trig_a_output_reg |= RTSI_Trig_Output_Bits(chan, source);
4654 devpriv->stc_writew(dev, devpriv->rtsi_trig_a_output_reg,
4655 RTSI_Trig_A_Output_Register);
4658 devpriv->rtsi_trig_b_output_reg &= ~RTSI_Trig_Output_Mask(chan);
4659 devpriv->rtsi_trig_b_output_reg |= RTSI_Trig_Output_Bits(chan, source);
4660 devpriv->stc_writew(dev, devpriv->rtsi_trig_b_output_reg,
4661 RTSI_Trig_B_Output_Register);
4666 unsigned ni_get_rtsi_routing(comedi_device *dev, unsigned chan)
4670 return RTSI_Trig_Output_Source(chan, devpriv->rtsi_trig_a_output_reg);
4671 }else if(chan < num_configurable_rtsi_channels(dev))
4673 return RTSI_Trig_Output_Source(chan, devpriv->rtsi_trig_b_output_reg);
4676 if(chan == old_RTSI_clock_channel)
4677 return NI_RTSI_OUTPUT_RTSI_OSC;
4678 rt_printk("%s: bug! should never get here?\n", __FUNCTION__);
4683 static int ni_rtsi_insn_config(comedi_device *dev,comedi_subdevice *s,
4684 comedi_insn *insn,lsampl_t *data)
4686 unsigned int chan = CR_CHAN(insn->chanspec);
4688 case INSN_CONFIG_DIO_OUTPUT:
4689 if(chan < num_configurable_rtsi_channels(dev))
4691 devpriv->rtsi_trig_direction_reg |= RTSI_Output_Bit(chan, boardtype.reg_type == ni_reg_m_series);
4692 }else if(chan == old_RTSI_clock_channel)
4694 devpriv->rtsi_trig_direction_reg |= Drive_RTSI_Clock_Bit;
4696 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4698 case INSN_CONFIG_DIO_INPUT:
4699 if(chan < num_configurable_rtsi_channels(dev))
4701 devpriv->rtsi_trig_direction_reg &= ~RTSI_Output_Bit(chan, boardtype.reg_type == ni_reg_m_series);
4702 }else if(chan == old_RTSI_clock_channel)
4704 devpriv->rtsi_trig_direction_reg &= ~Drive_RTSI_Clock_Bit;
4706 devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg, RTSI_Trig_Direction_Register);
4708 case INSN_CONFIG_DIO_QUERY:
4709 if(chan < num_configurable_rtsi_channels(dev))
4711 data[1] = (devpriv->rtsi_trig_direction_reg & RTSI_Output_Bit(chan, boardtype.reg_type == ni_reg_m_series)) ?
4712 INSN_CONFIG_DIO_OUTPUT : INSN_CONFIG_DIO_INPUT;
4713 }else if(chan == old_RTSI_clock_channel)
4715 data[1] = (devpriv->rtsi_trig_direction_reg & Drive_RTSI_Clock_Bit) ? INSN_CONFIG_DIO_OUTPUT : INSN_CONFIG_DIO_INPUT;
4719 case INSN_CONFIG_SET_CLOCK_SRC:
4720 return ni_set_master_clock(dev, data[1], data[2]);
4722 case INSN_CONFIG_GET_CLOCK_SRC:
4723 data[1] = devpriv->clock_source;
4724 data[2] = devpriv->clock_ns;
4727 case INSN_CONFIG_SET_ROUTING:
4728 return ni_set_rtsi_routing(dev, chan, data[1]);
4730 case INSN_CONFIG_GET_ROUTING:
4731 data[1] = ni_get_rtsi_routing(dev, chan);
4741 static int cs5529_wait_for_idle(comedi_device *dev)
4743 unsigned short status;
4744 const int timeout = HZ;
4747 for(i = 0; i < timeout; i++)
4749 status = ni_ao_win_inw(dev, CAL_ADC_Status_67xx);
4750 if((status & CSS_ADC_BUSY) == 0)
4754 set_current_state(TASK_INTERRUPTIBLE);
4755 if(schedule_timeout(1))
4760 //printk("looped %i times waiting for idle\n", i);
4763 rt_printk("%s: %s: timeout\n", __FILE__, __FUNCTION__);
4769 static void cs5529_command(comedi_device *dev, unsigned short value)
4771 static const int timeout = 100;
4774 ni_ao_win_outw(dev, value, CAL_ADC_Command_67xx);
4775 /* give time for command to start being serially clocked into cs5529.
4776 * this insures that the CSS_ADC_BUSY bit will get properly
4777 * set before we exit this function.
4779 for(i = 0; i < timeout; i++)
4781 if((ni_ao_win_inw(dev, CAL_ADC_Status_67xx) & CSS_ADC_BUSY))
4785 //printk("looped %i times writing command to cs5529\n", i);
4788 comedi_error(dev, "possible problem - never saw adc go busy?");
4792 /* write to cs5529 register */
4793 static void cs5529_config_write(comedi_device *dev, unsigned int value, unsigned int reg_select_bits)
4795 ni_ao_win_outw(dev, ((value >> 16) & 0xff), CAL_ADC_Config_Data_High_Word_67xx);
4796 ni_ao_win_outw(dev, (value & 0xffff), CAL_ADC_Config_Data_Low_Word_67xx);
4797 reg_select_bits &= CSCMD_REGISTER_SELECT_MASK;
4798 cs5529_command(dev, CSCMD_COMMAND | reg_select_bits);
4799 if(cs5529_wait_for_idle(dev))
4800 comedi_error(dev, "time or signal in cs5529_config_write()");
4803 /* read from cs5529 register */
4804 static unsigned int cs5529_config_read(comedi_device *dev, unsigned int reg_select_bits)
4808 reg_select_bits &= CSCMD_REGISTER_SELECT_MASK;
4809 cs5529_command(dev, CSCMD_COMMAND | CSCMD_READ | reg_select_bits);
4810 if(cs5529_wait_for_idle(dev))
4811 comedi_error(dev, "timeout or signal in cs5529_config_read()");
4812 value = (ni_ao_win_inw(dev, CAL_ADC_Config_Data_High_Word_67xx) << 16) & 0xff0000;
4813 value |= ni_ao_win_inw(dev, CAL_ADC_Config_Data_Low_Word_67xx) & 0xffff;
4817 static int cs5529_do_conversion(comedi_device *dev, unsigned short *data)
4820 unsigned short status;
4822 cs5529_command(dev, CSCMD_COMMAND | CSCMD_SINGLE_CONVERSION);
4823 retval = cs5529_wait_for_idle(dev);
4826 comedi_error(dev, "timeout or signal in cs5529_do_conversion()");
4829 status = ni_ao_win_inw(dev, CAL_ADC_Status_67xx);
4830 if(status & CSS_OSC_DETECT)
4832 rt_printk("ni_mio_common: cs5529 conversion error, status CSS_OSC_DETECT\n");
4835 if(status & CSS_OVERRANGE)
4837 rt_printk("ni_mio_common: cs5529 conversion error, overrange (ignoring)\n");
4841 *data = ni_ao_win_inw(dev, CAL_ADC_Data_67xx);
4842 /* cs5529 returns 16 bit signed data in bipolar mode */
4848 static int cs5529_ai_insn_read(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data)
4851 unsigned short sample;
4852 unsigned int channel_select;
4853 const unsigned int INTERNAL_REF = 0x1000;
4855 /* Set calibration adc source. Docs lie, reference select bits 8 to 11
4856 * do nothing. bit 12 seems to chooses internal reference voltage, bit
4857 * 13 causes the adc input to go overrange (maybe reads external reference?) */
4858 if(insn->chanspec & CR_ALT_SOURCE)
4859 channel_select = INTERNAL_REF;
4861 channel_select = CR_CHAN(insn->chanspec);
4862 ni_ao_win_outw(dev, channel_select, AO_Calibration_Channel_Select_67xx);
4864 for(n = 0; n < insn->n; n++)
4866 retval = cs5529_do_conversion(dev, &sample);
4867 if(retval < 0) return retval;
4873 static int init_cs5529(comedi_device *dev)
4875 unsigned int config_bits = CSCFG_PORT_MODE | CSCFG_WORD_RATE_2180_CYCLES;
4878 /* do self-calibration */
4879 cs5529_config_write(dev, config_bits | CSCFG_SELF_CAL_OFFSET_GAIN, CSCMD_CONFIG_REGISTER);
4880 /* need to force a conversion for calibration to run */
4881 cs5529_do_conversion(dev, NULL);
4883 /* force gain calibration to 1 */
4884 cs5529_config_write(dev, 0x400000, CSCMD_GAIN_REGISTER);
4885 cs5529_config_write(dev, config_bits | CSCFG_SELF_CAL_OFFSET, CSCMD_CONFIG_REGISTER);
4886 if(cs5529_wait_for_idle(dev))
4887 comedi_error(dev, "timeout or signal in init_cs5529()\n");
4891 rt_printk("config: 0x%x\n", cs5529_config_read(dev, CSCMD_CONFIG_REGISTER));
4892 rt_printk("gain: 0x%x\n", cs5529_config_read(dev, CSCMD_GAIN_REGISTER));
4893 rt_printk("offset: 0x%x\n", cs5529_config_read(dev, CSCMD_OFFSET_REGISTER));