📄 812pg.c
字号:
unsigned int Low_addres,High_addres,total;
unsigned long int Long_addres;
unsigned char page_address[4] = {0x00,PAGE1_REG_ADDRS,0x00,PAGE3_REG_ADDRS};
if ( Board_Status[Card_No] == NO_INIT ) return Board_No_Init ;
if ( ad_ch_no < 0 || ad_ch_no > 15 ) return Invalid_AD_Channel ;
if ( ad_gain < 0 || ad_gain > 4 ) return Invalid_AD_Gain ;
if ( dma_ch_no != 1 && dma_ch_no != 3 ) return Invalid_DMA_Channel;
if ( irq_no < 2 || irq_no == 8 || irq_no == 13 || irq_no > 15 )
return Invalid_IRQ_Channel;
if ( c1==1 || c2==1 || (unsigned long)c1*c2 < 20 )
return Invalid_Timer_Value ;
/*----------------------------------------------------------------------*/
/* DMA Function Setup */
/* Keep Card n DMA Number */
/*----------------------------------------------------------------------*/
DMA_Set [Card_No] = 1;
AD_DMA_Ch[Card_No] = dma_ch_no;
AD_DMA_Count[Card_No] = dma_count;
AD_INT_Ch[ Card_No ] = irq_no;
if (irq_no < 8) Ext_IRQ_Vect[Card_No] = 0x08 + irq_no ;
else if (irq_no == 9) Ext_IRQ_Vect[Card_No] = 0x0A ;
else Ext_IRQ_Vect[Card_No] = 0x70 + irq_no - 8;
_812_AD_Timer( 0 , 0 );
outp( Base_Address[Card_No]+GAIN_CTRL,ad_gain ); /* Select A/D Gain */
outp( Base_Address[Card_No]+MUX_CTRL ,ad_ch_no); /* Select A/D channel */
outp( Base_Address[Card_No]+MODE_CTRL, 0x00); /* Disable trig */
outp( Base_Address[Card_No]+CLR_IRQ , 0 );
/*---- ISR Vector Setup ----------------------------------------------*/
disable();
/* if (Card_No == 0){
old_isr0 = getvect( Ext_IRQ_Vect[Card_No] );
setvect( Ext_IRQ_Vect[Card_No] , dma_isr0 );
}
else{
old_isr1 = getvect( Ext_IRQ_Vect[Card_No] );
setvect( Ext_IRQ_Vect[Card_No] , dma_isr1 );
} */
/*---- DMA Setup -------------------------------------------------------*/
outp( DMA_WR_CLRFF , 0xFF ); /* DMA FLIP FLOP Low byte first */
outp( DMA_WR_MODE , LOBYTE(dma_ch_no)+0x44 ); /* single mode,channel x,write, */
/*---- get DMA ADDRESS pointer -----------------------------------------*/
Long_addres = (unsigned long int)FP_OFF(ad_buffer)
+ (unsigned long int)FP_SEG(ad_buffer) *16;
Low_addres = LOWORD ( Long_addres ) ;
High_addres = HIWORD ( Long_addres ) ;
/*---- set DMA base address --------------------------------------------*/
outp( DMA0_BASE_ADDRS+dma_ch_no*2 , LOBYTE(Low_addres)); /* Offset of A/D data buffer A */
outp( DMA0_BASE_ADDRS+dma_ch_no*2 , HIBYTE(Low_addres)); /* Offset of A/D data buffer A */
/*---- set DMA page address --------------------------------------------*/
outp( page_address[dma_ch_no] , LOBYTE(High_addres));
/*---- get & set DMA counter -------------------------------------------*/
total = dma_count*2-1 ;
outp( DMA0_BASE_CNTR+dma_ch_no*2 , LOBYTE(total) ); /* DMA count number */
outp( DMA0_BASE_CNTR+dma_ch_no*2 , HIBYTE(total) ); /* DMA count number */
enable();
/*---- disable DMA_CH_NO mask ------------------------------------------*/
outp( DMA_WR_MASK, dma_ch_no ); /* Ready to acept DRQ */
/* set 8259 */
if( irq_no < 8 ){
irqmask = inportb( IC8259_1 + 1 );
Ext_Irqmask[Card_No] = irqmask ;
outp( IC8259_1 + 1 , irqmask & (0xFF ^ (1 << irq_no)));
}
else{
irqmask = inportb( IC8259_1 + 1 );
outp( IC8259_1 + 1 , irqmask & 0xFB ); /* IRQ2 : 1111 1011 */
irqmask = inportb( IC8259_2 + 1 );
Ext_Irqmask[Card_No] = irqmask ;
outp( IC8259_2 + 1 , irqmask & (0xFF ^ (1 << (irq_no - 8))));
}
/*---- Timer Setup --------------------------------------------------------*/
_812_AD_Timer( c1 , c2 );
/*---- DMA Transfer begin -------------------------------------------------*/
outp( Base_Address[Card_No]+MODE_CTRL,0x02 );
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_AD_DMA_Status( int *status , int *count )
{
extern int Card_No;
extern int Board_Status[2];
extern int Base_Address[2];
extern int DMA_Set[2];
extern int AD_DMA_Ch[2];
int tc_flag;
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if (DMA_Set[Card_No] == 0) return AD_DMA_Not_Set ;
outp( DMA_WR_CLRFF , 0xFF ); /* DMA FLIP FLOP Low byte first */
*count = inp( DMA0_BASE_CNTR + AD_DMA_Ch[Card_No] *2 );
*(&(char)*count + 1) = inp( DMA0_BASE_CNTR + AD_DMA_Ch[Card_No] *2 );
*count = (*count+1) >> 1;
*count = AD_DMA_Count[Card_No] - *count ;
tc_flag = inp( DMA_RD_STATUS ) ;
if ( tc_flag & ( 1 << AD_DMA_Ch[Card_No] ) )
*status = AD_DMA_STOP;
else
*status = AD_DMA_RUN;
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_AD_DMA_Stop( int *count )
{
extern int Card_No;
extern int Board_Status[2];
extern int Base_Address[2];
extern int DMA_Set[2];
extern int AD_DMA_Ch[2];
extern int Ext_Irqmask[2];
extern int Ext_IRQ_Vect[2];
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if (DMA_Set[Card_No] == 0) return AD_DMA_Not_Set ;
outp( Base_Address[Card_No]+MODE_CTRL, 0x01);
DMA_Set[ Card_No ] = 0;
_812_AD_Timer( 0 , 0 );
if( AD_INT_Ch[Card_No]<8 ) outp( IC8259_1 + 1 , Ext_Irqmask[Card_No] );
else outp( IC8259_2 + 1 , Ext_Irqmask[Card_No] );
/* if (Card_No == 0) setvect( Ext_IRQ_Vect[0] , old_isr0 );
else setvect( Ext_IRQ_Vect[1] , old_isr1 );
*/
outp( Base_Address[Card_No]+CLR_IRQ , 0 );
outp( DMA_WR_CLRFF , 0xFF ); /* DMA FLIP FLOP Low byte first */
*count = inp( DMA0_BASE_CNTR + AD_DMA_Ch[Card_No] *2 );
*(char *)((char *)count + 1) =
inp( DMA0_BASE_CNTR + AD_DMA_Ch[Card_No] *2 );
*count = (*count+1) >> 1;
*count = AD_DMA_Count[Card_No] - *count;
return NoError;
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
void interrupt ad_isr0(void)
{
int d1,d2;
outp( Base_Address[0]+CLR_IRQ , 0 );
if( AD_Counter[0] < AD_INT_Count[0] )
{
d1 = inp(Base_Address[0]+AD_L) ;
d2 = inp(Base_Address[0]+AD_H) ;
* (AD_INT_Buf[0]+AD_Counter[0] ) = d1 + ((d2<<8) & 0x0F00) ;
AD_Counter[0] ++;
}
else AD_INT_Status[0] = AD_INT_STOP;
if( AD_INT_Ch[0] > 8 ) outp( IC8259_2, EOI );
outp( IC8259_1 , EOI );
}
void interrupt ad_isr1(void)
{
int d1,d2;
outp( Base_Address[1]+CLR_IRQ , 0 );
if( AD_Counter[1] < AD_INT_Count[1] )
{
d1 = inp(Base_Address[1]+AD_L) ;
d2 = inp(Base_Address[1]+AD_H) ;
* (AD_INT_Buf[1]+AD_Counter[1] ) = d1 + ((d2<<8) & 0x0F00) ;
AD_Counter[1] ++;
}
else AD_INT_Status[1] = AD_INT_STOP;
if( AD_INT_Ch[1] > 8 ) outp( IC8259_1, EOI );
outp( IC8259_1 , EOI );
}
/*----------------------------------------------------------------------*/
int _812_AD_INT_Start( int ad_ch_no, int ad_gain , int irq_no, int count ,
int *ad_buffer , int c1 , int c2)
{
extern int Card_No;
extern int Board_Status[2];
extern int Base_Address[2];
extern int Ext_Irqmask[2];
extern int Ext_IRQ_Vect[2];
extern int AD_INT_Status[2];
extern int AD_INT_Set[2];
extern int AD_INT_Ch[2];
extern int AD_INT_Count[2];
unsigned char irqmask;
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if ( ad_ch_no < 0 || ad_ch_no > 15 ) return Invalid_AD_Channel ;
if ( ad_gain < 0 || ad_gain > 4 ) return Invalid_AD_Gain ;
if ( irq_no < 2 || irq_no == 8 || irq_no == 13 || irq_no > 15 )
return Invalid_IRQ_Channel;
if ( c1==1 || c2==1 || (unsigned long)c1*c2 < 20 )
return Invalid_Timer_Value ;
/*---- AD Interrupt Transfer Setup -------------------------------------*/
_812_AD_Timer( 0 , 0 );
outp( Base_Address[Card_No]+GAIN_CTRL,ad_gain ); /* Select A/D Gain */
outp( Base_Address[Card_No]+MUX_CTRL ,ad_ch_no ); /* Select A/D channel */
outp( Base_Address[Card_No]+MODE_CTRL, 0x00); /* Disable trig */
outp( Base_Address[Card_No]+CLR_IRQ ,0 );
AD_INT_Set[Card_No] = 1;
AD_INT_Status[Card_No] = AD_INT_RUN;
AD_INT_Count[ Card_No ] = count ;
AD_INT_Buf[ Card_No ] = ad_buffer;
AD_INT_Ch[ Card_No ] = irq_no;
AD_Counter[ Card_No ] = 0;
if (irq_no < 8) Ext_IRQ_Vect[Card_No] = 0x08 + irq_no ;
else if (irq_no == 9) Ext_IRQ_Vect[Card_No] = 0x0A ;
else Ext_IRQ_Vect[Card_No] = 0x70 + irq_no -8;
/* if (Card_No == 0){
old_isr0 = getvect( Ext_IRQ_Vect[Card_No] );
setvect( Ext_IRQ_Vect[Card_No] , ad_isr0 );
}
else{
old_isr1 = getvect( Ext_IRQ_Vect[Card_No] );
setvect( Ext_IRQ_Vect[Card_No] , ad_isr1 );
}
*/
/*---- Set 8259 --------------------------------------------------------*/
disable();
if( irq_no < 8 ){
irqmask = inp( IC8259_1 + 1 );
Ext_Irqmask[Card_No] = irqmask ;
outp( IC8259_1 + 1 , irqmask & (0xFF ^ (1 << irq_no)) );
}
else{
irqmask = inp( IC8259_1 + 1 );
outp( IC8259_1 + 1 , irqmask & 0xFB ); /* IRQ2 : 1111 1011 */
irqmask = inp( IC8259_2 + 1 );
Ext_Irqmask[Card_No] = irqmask ;
outp( IC8259_2 + 1 , irqmask & (0xFF ^ (1 << (irq_no-8) )) );
}
enable();
_812_AD_Timer( c1 , c2 );
outp( Base_Address[Card_No]+MODE_CTRL, 0x06); /* Interrupt Transfer */
return NoError;
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
int _812_AD_INT_Status( int *status, int *count )
{
extern int Card_No;
extern int Board_Status[2];
extern int AD_INT_Status[2];
extern int AD_INT_Count[2];
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
*count = AD_Counter[ Card_No ];
*status = AD_INT_Status[ Card_No ];
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_AD_INT_Stop( int *count )
{
extern int Base_Address[2],Card_No;
extern int Ext_Irqmask[2] , Ext_IRQ_Vect[2];
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if (AD_INT_Set[Card_No] == 0) return AD_INT_Not_Set ;
outp( Base_Address[Card_No]+MODE_CTRL, 0x01); /* Soft trig */
if( AD_INT_Ch[Card_No]<8 ) outp( IC8259_1 + 1 , Ext_Irqmask[Card_No] );
else outp( IC8259_2 + 1 , Ext_Irqmask[Card_No] );
_812_AD_Timer( 0 , 0 );
/* if (Card_No == 0) setvect( Ext_IRQ_Vect[0] , old_isr0 );
else setvect( Ext_IRQ_Vect[1] , old_isr1 );
*/
*count = AD_Counter[ Card_No ];
return NoError;
}
/*----------------------------------------------------------------------*/
/*------------------------------------------ Timer ---------------------*/
/*----------------------------------------------------------------------*/
int _812_TIMER_Start( int timer_mode , unsigned int c0)
{
extern int Base_Address[2],Card_No;
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if (timer_mode<0 || timer_mode>5) return Invalid_Timer_Mode ;
Ext_Timer_Mode[Card_No] = timer_mode ;
outp(Base_Address[Card_No]+TMR_MODE, 0x30 | (timer_mode<<1) );
outp(Base_Address[Card_No]+TIMER0 , LOBYTE(c0) );
outp(Base_Address[Card_No]+TIMER0 , HIBYTE(c0) );
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_TIMER_Read( unsigned int *counter_value )
{
extern int Base_Address[2],Card_No;
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
outp(Base_Address[Card_No]+TMR_MODE, 0x00);
*counter_value = inp(Base_Address[Card_No]+TIMER0);
*(&(char)*counter_value + 1) = inp(Base_Address[Card_No]+TIMER0);
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_TIMER_Stop( unsigned int *counter_value ){
extern int Base_Address[2],Card_No;
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
outp(Base_Address[Card_No]+TMR_MODE, 0x00);
*counter_value = inp(Base_Address[Card_No]+TIMER0);
*(&(char)*counter_value + 1) = inp(Base_Address[Card_No]+TIMER0);
outp(Base_Address[Card_No]+TMR_MODE,0x30);
outp(Base_Address[Card_No]+TIMER0,1);
outp(Base_Address[Card_No]+TIMER0,0);
return NoError;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -