📄 etr232i_new.cpp
字号:
#include <dos.h>
#include "etr232i.h"
#define PIOMODE0 0xFF70
#define PIODIR0 0xFF72
#define PIODATA0 0xFF74
#define PIOMODE1 0xFF76
#define PIODIR1 0xFF78
#define PIODATA1 0xFF7A
#define WDTCTRL 0xFFE6
#define TMR0CNT 0xFF50
#define TMR0CMPA 0xFF52
//#define MULTIPLIER 1143L //V8
//#define MULTIPLIER 1000L //V11
#define MaxTick 0x1800beL
#define GPIO0 0x0001 // PIODATA0
#define GPIO1 0x0400 // PIODATA0
#define GPIO2 0x8000 // PIODATA0
#define GPIO3 0x0200 // PIODATA1
#define GPIO4 0x0400 // PIODATA1
#define GPIO5 0x0800 // PIODATA1
#define GPIO6 0x1000 // PIODATA1
#define GPIO7 0x2000 // PIODATA1
unsigned int DatBit[8] = { GPIO0, GPIO1, GPIO2, GPIO3,
GPIO4, GPIO5, GPIO6, GPIO7 };
// Valid bits: Dir[0], Dir[1], ... Dir[7]
// Dir[i] = 0: output
// Dir[i] = 1: input (default setting)
unsigned char GPIODirCfg( unsigned char Dir, int BitIdx )
{
unsigned int i1, portMode, portDir, N;
if( BitIdx < 0 )
{
i1 = 0; // setup all 8 bits
N = 8;
}
else
{
i1 = BitIdx;
N = i1 + 1;
}
disable( );
for( ; i1<N; i1++ )
{
if( i1 < 3 )
{
portMode = PIOMODE0;
portDir = PIODIR0;
}
else
{
portMode = PIOMODE1;
portDir = PIODIR1;
}
if( Dir&(1<<i1) ) // input
{
outport( portMode, inport(portMode)&~DatBit[i1] );
outport( portDir, inport(portDir)|DatBit[i1] );
}
else // output
{
outport( portMode, inport(portMode)|DatBit[i1] );
outport( portDir, inport(portDir)&~DatBit[i1] );
}
}
enable( );
return 0;
}
// Valid bits: Value[0], Value[1], ... Value[7]
void GPIOWrite( unsigned char Value )
{
unsigned int i1;
disable( );
i1 = inport( PIODATA0 )&~(GPIO0|GPIO1|GPIO2);
if( Value&0x01 ) i1 |= GPIO0;
if( Value&0x02 ) i1 |= GPIO1;
if( Value&0x04 ) i1 |= GPIO2;
outport( PIODATA0, i1|inport(PIODIR0) );
i1 = inport( PIODATA1 )&~(GPIO3|GPIO4|GPIO5|GPIO6|GPIO7);
if( Value&0x08 ) i1 |= GPIO3;
if( Value&0x10 ) i1 |= GPIO4;
if( Value&0x20 ) i1 |= GPIO5;
if( Value&0x40 ) i1 |= GPIO6;
if( Value&0x80 ) i1 |= GPIO7;
outport( PIODATA1, i1|inport(PIODIR1) );
enable( );
}
// return input status
unsigned char GPIORead( )
{
unsigned int i1;
unsigned char ub1;
ub1 = 0;
i1 = inport( PIODATA0 );
if( i1&GPIO0 ) ub1 |= 0x01;
if( i1&GPIO1 ) ub1 |= 0x02;
if( i1&GPIO2 ) ub1 |= 0x04;
i1 = inport( PIODATA1 );
if( i1&GPIO3 ) ub1 |= 0x08;
if( i1&GPIO4 ) ub1 |= 0x10;
if( i1&GPIO5 ) ub1 |= 0x20;
if( i1&GPIO6 ) ub1 |= 0x40;
if( i1&GPIO7 ) ub1 |= 0x80;
return ub1;
}
// BitIdx = 0, 1, ...7
unsigned int GPIOSetBit( int BitIdx, int L10 )
{
unsigned int port;
disable( );
if( BitIdx <= 2 ) port = PIODATA0;
else port = PIODATA1;
if( L10 ) outport( port, inport(port)|DatBit[BitIdx] );
else outport( port, inport(port)&~DatBit[BitIdx] );
enable( );
return 0;
}
// L10 = 0, 1
void GPRS_STB( int L10 )
{
unsigned int Reg;
disable( );
// get current value
Reg = inport( PIODATA0 );
if( L10 ) Reg |= 0x2000;
else Reg &= 0xdfff;
outport( PIODATA0, Reg );
enable( );
}
// return = 0, 1
unsigned int GPRS_PWR( )
{
unsigned int Reg;
// get current value
Reg = inport( PIODATA0 ) & inport( PIODIR0 );
if( Reg&0x0008 ) return 1;
return 0;
}
// L10 = 0, 1
void GPRS_AUX( int L10 )
{
unsigned int ui1;
//check PIO11 config
if( inport(PIOMODE0)&0x0800 ) // V9, V11 version
{
disable( );
// get current value
ui1 = inport( PIODATA0 );
if( L10 ) ui1 |= 0x0800; // PIO11 as GPRS_AUX
else ui1 &= ~0x0800;
outport( PIODATA0, ui1 );
enable( );
}
else // V8 version
{
if( L10 ) outportb( 0x23, 0x03 );
else outportb( 0x23, 0x01 );
}
}
void NB_Delay( unsigned int milliseconds )
{
unsigned long MULTIPLIER;
unsigned long stop;
unsigned int cur, prev;
unsigned int TMR0SIZE;
TMR0SIZE = inport(TMR0CMPA);
if( TMR0SIZE==0xD68D ) MULTIPLIER = 1000;
else MULTIPLIER = 1143;
prev = inport( TMR0CNT );
stop = prev + ((unsigned long)milliseconds * MULTIPLIER);
cur = inport( TMR0CNT );
while( cur < stop )
{
if(cur < prev) /* Check for timer wraparound */
{
if (stop < TMR0SIZE) break;
stop -= TMR0SIZE;
}
prev = cur;
cur = inport( TMR0CNT );
}
}
void NB_DelayUS( unsigned int microseconds )
{
unsigned long stop;
unsigned int cur, prev;
unsigned int TMR0SIZE;
TMR0SIZE = inport(TMR0CMPA);
prev = inport( TMR0CNT );
stop = prev + (unsigned long)microseconds;
cur = inport( TMR0CNT );
while( cur < stop )
{
if(cur < prev) /* Check for timer wraparound */
{
if (stop < TMR0SIZE) break;
stop -= TMR0SIZE;
}
prev = cur;
cur = inport( TMR0CNT );
}
}
// timer1's input clock = 1MHz
int SetTMR1( unsigned Divider )
{
unsigned int i1;
i1 = Divider / 2;
outport( 0xff5a, i1 );
i1 = Divider - i1;
outport( 0xff5c, i1 );
return 0;
}
void SysReboot( )
{
disable( );
outport( 0xff28, 0x07fd ); // mask all interrupts
asm db 0xea
asm dw 0xfff0
asm dw 0xf000
}
////////////////////////////////////////////////////////
// watchdog duration time = 1exp2(ExpNum)/24.0MHz
// ExpNum = 0: disable WDT
// ExpNum = 25, 26: enable WDT
////////////////////////////////////////////////////////
int SetWDT( int ExpNum )
{
unsigned int WDTReg;
switch( ExpNum )
{
case 25: WDTReg = 0xc040; break; // enable WDT
case 26: WDTReg = 0xc080; break; // enable WDT
default: WDTReg = 0; // disable WDT
}
// cleanup MAX706 before enable it!
outport( PIODATA0, inport(PIODATA0)^0x0002 );
outport( WDTCTRL, 0x3333 ); // keyed sequence for writing
outport( WDTCTRL, 0xCCCC );
outport( WDTCTRL, WDTReg );
outportb( 0x2a, 0 ); // enable MAX706
return ReloadWDT( );
}
int ReloadWDT( )
{
// reload MAX706
outport( PIODATA0, inport(PIODATA0)^0x0002 );
outport( WDTCTRL, 0x5555 ); // keyed sequence for reading
outport( WDTCTRL, 0xAAAA );
if( inport(WDTCTRL)&0x8000 ) return 1;
return 0;
}
unsigned long NB_DayCnt = 0;
unsigned long NB_PrevTick = 0;
unsigned long NB_clock( )
{
unsigned long currtick;
disable( );
currtick = *((unsigned long far*)(0x0040006Cl));
enable( );
if( currtick < NB_PrevTick ) NB_DayCnt += MaxTick;
NB_PrevTick = currtick;
currtick = NB_PrevTick + NB_DayCnt;
return currtick; //overflow happens after 2730 days since power on!!!
}
void CacheEnable( )
{
unsigned long MACBuffer;
unsigned int loww, highw;
// for etr232i: 0xb4000 - 0xbe000 => 40KB
MACBuffer = 0xb4000L;
// Non-Cache Region0 for MAC descriptor and buffer
loww = (unsigned int)MACBuffer & 0xffff;
highw = (unsigned int)(MACBuffer>>16);
outport(0xfec2, loww); // NCR0 start low word
outport(0xfec4, highw); // NCR0 start high word
MACBuffer += 0x0a000L; // Buffer size = 40kb
loww = (unsigned int)MACBuffer & 0xffff;
highw = (unsigned int)(MACBuffer>>16);
outport(0xfec6, loww); // NCR0 end low word
outport(0xfec8, highw); // NCR0 end high word
// Cache Control Setting
outport(0xfec0, 0xc100); // NCR0 enable
}
void SetCS0AsMem( )
{
outportb( 0x90, 1 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -