📄 etr232i.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 TMR0SIZE 0xF533
#define MULTIPLIER 1143L
struct GPIOPos
{
unsigned int RegIdx;
unsigned int PosIdx;
};
struct GPIOPos Tab[8] = { { 0, 0 }, { 0, 10 }, { 0, 15 }, { 1, 9 },
{ 1, 10 }, { 1, 11 }, { 1, 12 }, { 1, 13 } };
// Valid bits: Dir[0], Dir[1], ... Dir[7]
// Dir[i] = 0: output
// Dir[i] = 1: input (default setting)
unsigned char GPIODirCfg( unsigned char Dir )
{
unsigned int i1, i2, i3;
unsigned int DirReg[2], ModeReg[2];
// get current setting:
ModeReg[0] = inport( PIOMODE0 );
DirReg[0] = inport( PIODIR0 );
ModeReg[1] = inport( PIOMODE1 );
DirReg[1]= inport( PIODIR1 );
for( i1=0; i1<8; i1++ )
{
i2 = 1<<Tab[i1].PosIdx;
i3 = 1<<i1;
if( Dir&i3 ) // set as input
{
ModeReg[Tab[i1].RegIdx] &= ~i2;
DirReg[Tab[i1].RegIdx] |= i2;
}
else // set as output
{
ModeReg[Tab[i1].RegIdx] |= i2;
DirReg[Tab[i1].RegIdx] &= ~i2;
}
}
outport( PIOMODE0, ModeReg[0] );
outport( PIODIR0, DirReg[0] );
outport( PIOMODE1, ModeReg[1] );
outport( PIODIR1, DirReg[1] );
return 0;
}
// Valid bits: Value[0], Value[1], ... Value[7]
void GPIOWrite( unsigned char Value )
{
unsigned int i1, i2, i3;
unsigned int DatReg[2];
disable( );
// default value
DatReg[0] = inport(PIODATA0);
DatReg[1] = inport(PIODATA1);
for( i1=0; i1<8; i1++ )
{
i2 = 1<<Tab[i1].PosIdx;
i3 = 1<<i1;
if( Value&i3 ) // set as 1
DatReg[Tab[i1].RegIdx] |= i2;
else // set as 0
DatReg[Tab[i1].RegIdx] &= ~i2;
}
outport( PIODATA0, DatReg[0] );
outport( PIODATA1, DatReg[1] );
enable( );
}
// return input status
unsigned char GPIORead( )
{
unsigned int i1, i2, i3, i4;
unsigned int DatReg[2];
unsigned char ub1;
// current value
DatReg[0] = inport( PIODATA0 ) & inport( PIODIR0 );
DatReg[1] = inport( PIODATA1 ) & inport( PIODIR1 );
i4 = 0;
for( i1=0; i1<8; i1++ )
{
i2 = 1<<Tab[i1].PosIdx;
i3 = 1<<i1;
if( DatReg[Tab[i1].RegIdx]&i2 ) // set as 1
i4 |= i3;
else // set as 0
i4 &= ~i3;
}
return (unsigned char)i4;
}
// BitIdx = 0, 1, ...7
unsigned int GPIOSetBit( int BitIdx, int L10 )
{
unsigned int i1, i2;
unsigned int DatReg[2];
disable( );
// current value
DatReg[0] = inport( PIODATA0 );
DatReg[1] = inport( PIODATA1 );
i2 = 1<<Tab[BitIdx].PosIdx;
if( L10 ) DatReg[Tab[BitIdx].RegIdx] |= i2;
else DatReg[Tab[BitIdx].RegIdx] &= ~i2;
if( Tab[BitIdx].RegIdx == 0 ) outport( PIODATA0, DatReg[0] );
else outport( PIODATA1, DatReg[1] );
enable( );
return 0;
}
// L10 = 0, 1
void GPRS_STB( int L10 )
{
unsigned int DatReg;
disable( );
// get current value
DatReg = inport( PIODATA0 );
if( L10 ) DatReg |= 0x2000;
else DatReg &= 0xdfff;
outport( PIODATA0, DatReg );
enable( );
}
// return = 0, 1
unsigned int GPRS_PWR( )
{
unsigned int DatReg;
// get current value
DatReg = inport( PIODATA0 ) & inport( PIODIR0 );
if( DatReg&0x0008 ) return 1;
return 0;
}
// L10 = 0, 1
void GPRS_AUX( int L10 )
{
if( L10 ) outportb( 0x23, 0x03 );
else outportb( 0x23, 0x01 );
}
void NB_Delay( unsigned int milliseconds )
{
unsigned long stop;
unsigned int cur, prev;
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 );
}
}
// timer1's input clock = 1.142857MHz
int SetTMR1( unsigned Divider )
{
unsigned ub1;
ub1 = Divider / 2;
outport( 0xff5a, ub1 );
ub1 = Divider - ub1;
outport( 0xff5c, ub1 );
}
void SysReboot( )
{
disable( );
outport( 0xff28, 0x07fd ); // mask all interrupts
asm db 0xea
asm dw 0xfff0
asm dw 0xf000
}
unsigned int WDTReg = 0;
////////////////////////////////////////////////////////
// watchdog duration time = 1exp2(ExpNum)/24.0MHz
// ExpNum = 0: disable WDT
// ExpNum = 25, 26: enable WDT
////////////////////////////////////////////////////////
int SetWDT( int ExpNum )
{
switch( ExpNum )
{
case 25: WDTReg = 0xc040; break; // enable WDT
case 26: WDTReg = 0xc080; break; // enable WDT
default: WDTReg = 0; // disable WDT
}
outport( WDTCTRL, 0x3333 ); // keyed sequence for writing
outport( WDTCTRL, 0xCCCC );
outport( WDTCTRL, WDTReg );
outport( WDTCTRL, 0x5555 ); // keyed sequence for reading
outport( WDTCTRL, 0xAAAA );
if( inport(WDTCTRL)&0x8000 ) return 1;
return 0;
}
int ReloadWDT( )
{
// outport( WDTCTRL, 0x3333 ); // keyed sequence for writing
// outport( WDTCTRL, 0xCCCC );
// outport( WDTCTRL, WDTReg );
outport( WDTCTRL, 0x5555 ); // keyed sequence for reading
outport( WDTCTRL, 0xAAAA );
if( inport(WDTCTRL)&0x8000 ) return 1;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -