From f81cf24ae1d91c13cd091cf3b7a5fa91deed0126 Mon Sep 17 00:00:00 2001 From: Frank Mori Hess Date: Thu, 1 Jan 2004 23:59:14 +0000 Subject: [PATCH] some cleanups, verified that 6711 ao command works now (needed to modify ao_waveform to preload more samples into comedi's buffer though) --- comedi/drivers/ni_atmio.c | 12 -------- comedi/drivers/ni_mio_common.c | 51 +++++++++++++++++++++++++++------- comedi/drivers/ni_mio_cs.c | 11 -------- comedi/drivers/ni_pcimio.c | 24 +--------------- comedi/drivers/ni_stc.h | 2 +- 5 files changed, 43 insertions(+), 57 deletions(-) diff --git a/comedi/drivers/ni_atmio.c b/comedi/drivers/ni_atmio.c index 5e472e23..8da2416d 100644 --- a/comedi/drivers/ni_atmio.c +++ b/comedi/drivers/ni_atmio.c @@ -286,11 +286,6 @@ static inline void __win_out(comedi_device *dev, unsigned short data, int addr) comedi_spin_unlock_irqrestore(&dev->spinlock,flags); } -#define win_out2(data,addr) do{ \ - win_out((data)>>16, (addr)); \ - win_out((data)&0xffff, (addr)+1); \ -}while(0) - #define win_in(addr) __win_in(dev,addr) static inline unsigned short __win_in(comedi_device *dev, int addr) { @@ -309,13 +304,6 @@ static inline unsigned short __win_in(comedi_device *dev, int addr) return ret; } -#define ao_win_out(a,b) do{ \ - ni_writew((b),AO_Window_Address_671x); \ - ni_writew((a),AO_Window_Data_671x); \ -}while(0) - - - #ifdef __ISAPNP__ static struct isapnp_device_id device_ids[] = { { ISAPNP_DEVICE_SINGLE('N','I','C',0x1900,'N','I','C',0x0000), }, diff --git a/comedi/drivers/ni_mio_common.c b/comedi/drivers/ni_mio_common.c index d04cb25b..8a83e7ac 100644 --- a/comedi/drivers/ni_mio_common.c +++ b/comedi/drivers/ni_mio_common.c @@ -257,9 +257,36 @@ static void get_last_sample_611x( comedi_device *dev ); static int ni_ai_drain_dma(comedi_device *dev ); #endif +#define win_out2(data,addr) do{ \ + win_out((data)>>16, (addr)); \ + win_out((data)&0xffff, (addr)+1); \ +}while(0) + + +#define ao_win_out(data,addr) ni_ao_win_outw(dev,data,addr) +static inline void ni_ao_win_outw( comedi_device *dev, uint16_t data, int addr ) +{ + unsigned long flags; + + comedi_spin_lock_irqsave(&dev->spinlock,flags); + ni_writew(addr,AO_Window_Address_671x); + ni_writew(data,AO_Window_Data_671x); + comedi_spin_unlock_irqrestore(&dev->spinlock,flags); +} + +static inline void ni_ao_win_outl(comedi_device *dev, uint32_t data, int addr) +{ + unsigned long flags; + + comedi_spin_lock_irqsave(&dev->spinlock,flags); + ni_writew(addr,AO_Window_Address_671x); + ni_writel(data,AO_Window_Data_671x); + comedi_spin_unlock_irqrestore(&dev->spinlock,flags); +} + /* ni_set_bits( ) allows different parts of the ni_mio_common driver to * share registers (such as Interrupt_A_Register) without interfering with -* each other. +* each other. * * NOTE: the switch/case statements are optimized out for a constant argument * so this is actually quite fast--- If you must wrap another function around this @@ -465,16 +492,20 @@ static int ni_ao_wait_for_dma_load( comedi_device *dev ) static const int timeout = 10000; int i; - for( i = 0; i < timeout; i++ ) + for(i = 0; i < timeout; i++) { unsigned short b_status; b_status = win_in( AO_Status_1_Register ); if( b_status & AO_FIFO_Half_Full_St ) break; + comedi_udelay(1); + } + if( i == timeout ) + { + comedi_error(dev, "timed out waiting for dma load"); + return -EPIPE; } - if( i == timeout ) return -EPIPE; - return 0; } @@ -814,8 +845,8 @@ static int ni_ao_fifo_half_empty(comedi_device *dev,comedi_subdevice *s) } n /= sizeof(sampl_t); - if(n>boardtype.ao_fifo_depth/sizeof(sampl_t)) - n=boardtype.ao_fifo_depth/sizeof(sampl_t); + if(n > boardtype.ao_fifo_depth / 2) + n = boardtype.ao_fifo_depth / 2; ni_ao_fifo_load(dev,s,n); @@ -830,14 +861,15 @@ static int ni_ao_prep_fifo(comedi_device *dev,comedi_subdevice *s) /* reset fifo */ win_out(0,DAC_FIFO_Clear); + ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x); /* load some data */ n = comedi_buf_read_n_available(s); if(n==0)return 0; n /= sizeof(sampl_t); - if(n>boardtype.ao_fifo_depth) - n=boardtype.ao_fifo_depth; + if(n > boardtype.ao_fifo_depth) + n = boardtype.ao_fifo_depth; ni_ao_fifo_load(dev,s,n); @@ -2071,8 +2103,7 @@ static int ni_ao_inttrig(comedi_device *dev,comedi_subdevice *s, bits = AO_Error_Interrupt_Enable; #ifdef PCIDMA win_out(0, DAC_FIFO_Clear); - // offset load doesn't seem to be necessary - //ao_win_out( 0x6, AO_FIFO_Offset_Load_611x ); + ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x); ni_ao_setup_MITE_dma(dev, &s->async->cmd); ret = ni_ao_wait_for_dma_load(dev); if(ret < 0) return ret; diff --git a/comedi/drivers/ni_mio_cs.c b/comedi/drivers/ni_mio_cs.c index 20c4c169..c094e868 100644 --- a/comedi/drivers/ni_mio_cs.c +++ b/comedi/drivers/ni_mio_cs.c @@ -193,11 +193,6 @@ static inline void __win_out(comedi_device *dev, unsigned short data, int addr) comedi_spin_unlock_irqrestore(&dev->spinlock,flags); } -#define win_out2(data,addr) do{ \ - win_out((data)>>16, (addr)); \ - win_out((data)&0xffff, (addr)+1); \ -}while(0) - #define win_in(addr) __win_in(dev,addr) static inline unsigned short __win_in(comedi_device *dev, int addr) { @@ -216,12 +211,6 @@ static inline unsigned short __win_in(comedi_device *dev, int addr) return ret; } -#define ao_win_out(a,b) do{ \ - ni_writew((b),AO_Window_Address_671x); \ - ni_writew((a),AO_Window_Data_671x); \ -}while(0) - - typedef struct{ dev_link_t *link; diff --git a/comedi/drivers/ni_pcimio.c b/comedi/drivers/ni_pcimio.c index 4cae1173..03865c3c 100644 --- a/comedi/drivers/ni_pcimio.c +++ b/comedi/drivers/ni_pcimio.c @@ -489,7 +489,7 @@ static ni_board ni_boards[]={ n_aochan: 4, aobits: 12, ao_unipolar: 0, - ao_fifo_depth: 8192, + ao_fifo_depth: 16384, /* data sheet says 8192, but fifo really holds 16384 samples */ reg_type: ni_reg_6711, caldac: {ad8804_debug,ad8804_debug}, }, @@ -652,11 +652,6 @@ static inline void __win_out(comedi_device *dev, unsigned short data, int addr) comedi_spin_unlock_irqrestore(&dev->spinlock,flags); } -#define win_out2(data,addr) do{ \ - win_out((data)>>16, (addr)); \ - win_out((data)&0xffff, (addr)+1); \ -}while(0) - #define win_in(addr) __win_in(dev,addr) static inline unsigned short __win_in(comedi_device *dev, int addr) { @@ -671,23 +666,6 @@ static inline unsigned short __win_in(comedi_device *dev, int addr) return ret; } -#define ao_win_out(data,addr) __ao_win_out(dev,data,addr) -static inline void __ao_win_out( comedi_device *dev, uint16_t data, int addr ) -{ - unsigned long flags; - - comedi_spin_lock_irqsave(&dev->spinlock,flags); - ni_writew(addr,AO_Window_Address_671x); - ni_writew(data,AO_Window_Data_671x); - comedi_spin_unlock_irqrestore(&dev->spinlock,flags); -} - -#define ao_win_out2(data,addr) do{ \ - ao_win_out((data)>>16, (addr)); \ - ao_win_out((data)&0xffff, (addr)+1); \ -}while(0) - - #define interrupt_pin(a) 0 #define IRQ_POLARITY 1 diff --git a/comedi/drivers/ni_stc.h b/comedi/drivers/ni_stc.h index 94b105df..6d6e1ecd 100644 --- a/comedi/drivers/ni_stc.h +++ b/comedi/drivers/ni_stc.h @@ -647,7 +647,7 @@ static inline unsigned int AI_CONFIG_CHANNEL( unsigned int channel ) #define Calibration_Channel_Select_611x 0x1a /* w16 (new) */ #define ADC_FIFO_Data_611x 0x1c /* r32 (incompatible) */ #define AI_FIFO_Offset_Load_611x 0x05 /* r8 (new) */ -#define AO_FIFO_Offset_Load_611x 0x13 /* W32? */ +#define AO_FIFO_Offset_Load_611x 0x13 /* W32 */ #define DAC_FIFO_Data_611x 0x14 /* w32 (incompatible) */ #define AO_Window_Addr_611x 0x18 /* w16 */ #define AO_Window_Data_611x 0x1e /* w16 */ -- 2.26.2