📄 812pg.c
字号:
/************************************************************************/
/* File name : 812PG.C */
/* Purpose : ACL-812PG Library Source Code */
/* Date : 5/15/1994 */
/* Version : 1.0 */
/* */
/* Copyright ADCLONE Inc. (c) 1994 all right reserved */
/************************************************************************/
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include "\ns\lib\812\812pg.h"
/**************************************/
/* Constants Decalerations */
/**************************************/
#define LOBYTE(arg) (*(unsigned char *)&arg)
#define HIBYTE(arg) (*((unsigned char *)&arg + 1))
#define LOWORD(arg) (*(unsigned int *)&arg)
#define HIWORD(arg) (*((unsigned int *)&arg + 1))
/***** Define Relative Addresses *****/
#define TIMER0 0x00
#define TIMER1 0x01
#define TIMER2 0x02
#define TMR_MODE 0x03
#define DA1_L 0x04
#define DA1_H 0x05
#define DA2_L 0x06
#define DA2_H 0x07
#define CLR_IRQ 0x08
#define GAIN_CTRL 0x09
#define MUX_CTRL 0x0A
#define MODE_CTRL 0x0B
#define SOFT_TRIG 0x0C
#define DOUT_L 0x0D
#define DOUT_H 0x0E
#define AD_L 0x04
#define AD_H 0x05
#define DIN_L 0x06
#define DIN_H 0x07
/*------- Define DMA ---------------------------------*/
#define DMA 0
#define DMA_WR_MASK DMA+0x0A
#define DMA_WR_MODE DMA+0x0B
#define DMA_WR_CLRFF DMA+0x0C
#define DMA_RD_STATUS DMA+0x08
#define DMA0_BASE_ADDRS DMA+0x00
#define DMA0_BASE_CNTR DMA+0x01
#define DMA1_BASE_ADDRS DMA+0x02
#define DMA1_BASE_CNTR DMA+0x03
#define DMA3_BASE_ADDRS DMA+0x06
#define DMA3_BASE_CNTR DMA+0x07
#define PAGE1_REG_ADDRS 0x83
#define PAGE3_REG_ADDRS 0x82
/*------- Define 8259 ---------------------------------*/
#define IC8259_1 0x20
#define IC8259_2 0xA0
#define EOI 0x20
/*------------------------------------------------------*/
#define NO_INIT 0xff
#define INITIALED 0x00
void interrupt dma_isr0(void);
void interrupt dma_isr1(void);
void interrupt ad_isr0(void);
void interrupt ad_isr1(void);
void interrupt (*old_isr0)(void);
void interrupt (*old_isr1)(void);
int Card_No;
int Board_Status[2] ={NO_INIT,NO_INIT};
int Base_Address[2];
int Ext_IRQ_Vect[2];
int Ext_Irqmask[2];
int DMA_Set[2] ={0,0};
int AD_INT_Ch[2] ={0,0};
int AD_DMA_Ch[2] ={1,3};
int AD_TC_Flag[2] ={1,1};
int AD_INT_Count[2];
int AD_Counter[2];
int AD_INT_Set[2] ={0,0};
int *AD_INT_Buf[2];
int AD_INT_Status[2] ={ AD_INT_STOP , AD_INT_STOP };
int Ext_Timer_Mode[2];
int AD_DMA_Count[2] ;
/*----------------------------------------------------------------------*/
int _812_Initial(int card_index ,int address)
{
extern int Card_No;
extern int Base_Address[2];
extern int Board_Status[2];
if ( card_index != 0 && card_index != 1 ) return Invalid_Board_Number;
if ( address > 0x3f0 || address < 0x200 || (address & 0x0f) != 0){
Board_Status[card_index] = NO_INIT ;
return Base_Address_Error ;
}
Card_No = card_index;
Base_Address[ Card_No ] = address;
Board_Status[card_index] = INITIALED ;
return NoError ;
}
int _812_Switch_Card_No( int card_index )
{
extern int Card_No;
if ( card_index != 0 && card_index != 1 ) return Invalid_Board_Number;
if (Board_Status[card_index] == NO_INIT) return Board_No_Init ;
Card_No = card_index;
return NoError;
}
/*---------------------------------------------- Digital Input ------------*/
int _812_DI(int port_no, unsigned char *data )
{
extern int Card_No;
extern int Base_Address[2];
extern int Board_Status[2];
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if (port_no == 0)
*data = inp( Base_Address[Card_No]+DIN_L );
else if (port_no == 1)
*data = inp( Base_Address[Card_No]+DIN_H );
else
return Port_Error;
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_DI_Channel( int ch_no, unsigned int *data )
{
extern int Card_No;
extern int Base_Address[2];
extern int Board_Status[2];
unsigned char dt;
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if( ch_no > 15 || ch_no<0 ) return Invalid_DI_Channel;
if( ch_no >=8 )
{
_812_DI( DI_HI_BYTE , &dt );
ch_no-=8;
}
else _812_DI( DI_LO_BYTE , &dt );
*data = ((unsigned int)dt >> ch_no) & 0x01;
return NoError;
}
/*---------------------------------------------- Digital Output ------------*/
/*int _812_DO_Old( int port_no, unsigned char data )
{
extern int Card_No;
extern int Base_Address[2];
extern int Board_Status[2];
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if (port_no == 0)
outp( Base_Address[Card_No] + DOUT_L , data );
else if (port_no == 1)
outp( Base_Address[Card_No] + DOUT_H , data );
else
return Port_Error;
return NoError;
}
*/
int _812_DO(unsigned data )
{
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
outpw( Base_Address[Card_No] + DOUT_L , data );
return NoError;
}
/*---------------------------------------------- DA -----------------------*/
int _812_DA( int da_no, unsigned int data )
{
extern int Card_No;
extern int Base_Address[2];
extern int Board_Status[2];
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if (da_no == 0){
outp(Base_Address[Card_No]+DA1_L,LOBYTE(data));
outp(Base_Address[Card_No]+DA1_H,HIBYTE(data));
}
else if (da_no == 1){
outp(Base_Address[Card_No]+DA2_L,LOBYTE(data));
outp(Base_Address[Card_No]+DA2_H,HIBYTE(data));
}
else{
return Invalid_DA_Channel;
}
return NoError;
}
/*---------------------------------------------- AD -----------------------*/
int _812_AD_Set_Channel( int ch )
{
extern int Card_No;
extern int Board_Status[2];
extern int Base_Address[2];
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if ( ch < 0 || ch > 15 ) return Invalid_AD_Channel ;
outp(Base_Address[Card_No]+MUX_CTRL , ch );
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_AD_Set_Gain( int gain )
{
extern int Card_No;
extern int Board_Status[2];
extern int Base_Address[2];
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if ( gain < 0 || gain > 4 ) return Invalid_AD_Gain ;
outp(Base_Address[Card_No]+GAIN_CTRL , gain );
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_AD_Set_Mode( int mode )
{
extern int Card_No;
extern int Board_Status[2];
extern int Base_Address[2];
if (Board_Status[Card_No] == NO_INIT) return Board_No_Init ;
if ( mode < 0 || mode > 7 ) return Invalid_Mode ;
outp(Base_Address[Card_No]+MODE_CTRL, mode );
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_AD_Soft_Trig( void )
{
extern int Card_No;
extern int Board_Status[2];
extern int Base_Address[2];
if ( Board_Status[Card_No] == NO_INIT ) return Board_No_Init ;
outp( Base_Address[Card_No]+SOFT_TRIG, 0 );
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_CLR_IRQ( void )
{
extern int Card_No;
extern int Board_Status[2];
extern int Base_Address[2];
if ( Board_Status[Card_No] == NO_INIT ) return Board_No_Init ;
outp( Base_Address[Card_No]+CLR_IRQ, 0 );
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_AD_Aquire( int *ad_data )
{
extern int Card_No;
extern int Board_Status[2];
extern int Base_Address[2];
int time_out_index=0;
if ( Board_Status[Card_No] == NO_INIT ) return Board_No_Init ;
outp(Base_Address[Card_No]+MODE_CTRL , AD_MODE_1 ); /* Set Soft Transfer*/
outp(Base_Address[Card_No]+SOFT_TRIG , 0 ); /* Software Trigger */
do {
*(char *)((char *)ad_data + 1) = inp( Base_Address[Card_No]+AD_H );
if ( time_out_index++ == 200 ) return AD_Aquire_Time_Out ;
}while( (*(&(char)*ad_data + 1) & 0x10 ) == 0x10 ); /* Check data ready */
*(char *)(ad_data)=(char)inp( Base_Address[Card_No]+AD_L );
return NoError;
}
/*----------------------------------------------------------------------*/
int _812_AD_Timer( int c1 , int c2 )
{
extern int Card_No;
extern int Board_Status[2];
extern int Base_Address[2];
if ( Board_Status[Card_No] == NO_INIT ) return Board_No_Init ;
if ( c1!=0 && c2!=0 ) {
if ( c1==1 || c2==1 || (unsigned long)c1*c2 < 20 )
return Invalid_Timer_Value ;
}
outp( Base_Address[Card_No]+TMR_MODE , 0x76 ); /* Mode 3 : Timer 1*/
outp( Base_Address[Card_No]+TIMER1 , LOBYTE( c1 ) );
outp( Base_Address[Card_No]+TIMER1 , HIBYTE( c1 ) );
outp( Base_Address[Card_No]+TMR_MODE , 0xB6 ); /* Mode 3 : Timer 2*/
outp( Base_Address[Card_No]+TIMER2 , LOBYTE( c2 ) );
outp( Base_Address[Card_No]+TIMER2 , HIBYTE( c2 ) );
return NoError;
}
/*----------------------------------------------------------------------*/
void interrupt dma_isr0(void)
{
extern int Base_Address[2];
extern int AD_INT_Ch[2];
extern int AD_DMA_Ch[2];
outportb( Base_Address[0]+MODE_CTRL,0x00); /* Disable Internal Trig */
outportb( Base_Address[0]+CLR_IRQ , 0 );
outportb( DMA_WR_MASK, 0x04 + AD_DMA_Ch[0]);
if( AD_INT_Ch[0] > 8 ) outp( IC8259_2, EOI );
outp( IC8259_1 , EOI );
}
void interrupt dma_isr1(void)
{
extern int Base_Address[2];
extern int AD_INT_Ch[2];
extern int AD_DMA_Ch[2];
outportb( Base_Address[1]+MODE_CTRL,0x00); /* Disable Internal Trig */
outportb( Base_Address[1]+CLR_IRQ , 0 );
outportb( DMA_WR_MASK, 0x04 + AD_DMA_Ch[1]);
if( AD_INT_Ch[1] > 8 ) outp( IC8259_2, EOI );
outp( IC8259_1 , EOI );
}
/*----------------------------------------------------------------------*/
int _812_AD_DMA_Start( int ad_ch_no, int ad_gain , int dma_ch_no , int irq_no,
int dma_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 DMA_Set[2];
extern int AD_DMA_Ch[2];
unsigned char irqmask;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -