?? sysserial.c
字號:
/***************************************************************************************************/
#include "vxWorks.h"
#include "iv.h"
#include "tyLib.h"
#include "intLib.h"
#include "rngLib.h"
#include "sysserial.h"
#include "pc.h"
unsigned char old_intmas1_reg=0;
unsigned char old_intmas2_reg=0;
unsigned char COM_INT_LVL[ComMaxNO]={COM1_INT_LVL,
COM2_INT_LVL,
COM3_INT_LVL,
COM4_INT_LVL,
COM5_INT_LVL,
COM6_INT_LVL,
};
/*unsigned int PortAddr[ComMaxNO]={0x3e8,0x2e8,0x3a8,0x2a8,0x2f8,0x3f8};*/
unsigned int PortAddr[ComMaxNO]={COM1_BASE_ADR,
COM2_BASE_ADR,
COM3_BASE_ADR,
COM4_BASE_ADR,
COM5_BASE_ADR,
COM6_BASE_ADR,
};
/*unsigned int PortAddr[ComMaxNO]={0x3f8,0x2f8,0x300,0x308,0x310,0x318};*/
RING_ID comR_ring_id[ComMaxNO];
RING_ID comS_ring_id[ComMaxNO];
int portsending[ComMaxNO];
int com_intNum[ComMaxNO]={0,0,0,0,0,0};
/***************************
*
*
****************************/
void Comautotest()
{
}
/*int ComPollInit(int iPortNo,unsigned long lBautrate);
int ComPollSendstr(int iPortNo,unsigned char *str,unsigned int strlen);
unsigned int ComPollRecvData(int iPortNo,char *str);
int ComIntInit(int iPortNo,unsigned long lBautrate);
*/
int ComPollInit(int iPortNo,unsigned long lBautrate)
{
int iDiviValue=115200L/lBautrate;
unsigned char chLbr;
unsigned char chMbr;
unsigned char f;
if(iPortNo>=ComMaxNO)return 0;
sysOutByte((PortAddr[iPortNo]+com_lineclt),0x03);
sysOutByte((PortAddr[iPortNo]+com_lineclt),(0x80|sysInByte(PortAddr[iPortNo] + com_lineclt)));
chLbr=iDiviValue&0xff;
chMbr=(iDiviValue>>8)&0xff;
sysOutByte(PortAddr[iPortNo],chLbr);
sysOutByte(PortAddr[iPortNo]+1,chMbr);
sysOutByte(PortAddr[iPortNo]+com_lineclt,(0x7f&sysInByte(PortAddr[iPortNo] + com_lineclt)));
sysOutByte(PortAddr[iPortNo]+ com_intenable,0x0);
sysOutByte(PortAddr[iPortNo]+ com_modemclt,0x03);
portsending[iPortNo]=0;
comR_ring_id[iPortNo]=rngCreate(ComMaxData);
if(comR_ring_id[iPortNo]==NULL){printf("Error: can not create ring\n");return 0;}
comS_ring_id[iPortNo]=rngCreate(ComMaxData);
if(comR_ring_id[iPortNo]==NULL){printf("Error: can not create ring\n");return 0;}
return 1;
}
int ComPollSendstr(int iPortNo,unsigned char *str,unsigned int strlen)
{
unsigned char f;
unsigned ifor1=0;
if(iPortNo>=ComMaxNO)return 0;
for(ifor1=0;ifor1<strlen;ifor1++)
{
f=sysInByte(PortAddr[iPortNo] + com_lineflag);
while((f&0x20)==0)f=sysInByte(PortAddr[iPortNo] + com_lineflag);
sysOutByte(PortAddr[iPortNo]+com_dataport,str[ifor1]);
}
return 1;
}
unsigned int ComPollRecvData(int iPortNo,char *str)
{
unsigned int strlen=0;
if(iPortNo>=ComMaxNO)return 0;
/*if((sysInByte(PortAddr[iPortNo] + com_lineflag)&0x01)!=0x01)return FALSE;*/
while((sysInByte(PortAddr[iPortNo] + com_lineflag)&0x01)==0x01)
str[strlen++]=sysInByte(PortAddr[iPortNo]);
/*if(strlen>0){semGive(comdataSemId);
printf("Com%dR> len=%d!!!!\n",iPortNo+1,strlen);
}*/
return strlen;
}
int ComIntInit(int iPortNo,unsigned long lBautrate)
{
int iDiviValue=115200L/lBautrate;
unsigned char chLbr;
unsigned char chMbr;
unsigned char f;
if(iPortNo>=ComMaxNO)return 0;
sysOutByte(PortAddr[iPortNo]+com_lineclt,0x03);
sysOutByte(PortAddr[iPortNo]+com_lineclt,(0x80|sysInByte(PortAddr[iPortNo] + com_lineclt)));
chLbr=iDiviValue&0xff;
chMbr=(iDiviValue>>8)&0xff;
sysOutByte(PortAddr[iPortNo],chLbr);
sysOutByte(PortAddr[iPortNo]+1,chMbr);
sysOutByte(PortAddr[iPortNo]+com_lineclt,(0x7f&sysInByte(PortAddr[iPortNo] + com_lineclt)));
ComIntEnable(iPortNo);
/*sysOutByte(PortAddr[iPortNo]+ com_intenable,0x0);
sysOutByte(PortAddr[iPortNo]+ com_modemclt,0x03);*/
portsending[iPortNo]=0;
comR_ring_id[iPortNo]=rngCreate(ComMaxData);
if(comR_ring_id[iPortNo]==NULL){printf("Error: can not create ring\n");return 0;}
comS_ring_id[iPortNo]=rngCreate(ComMaxData);
if(comS_ring_id[iPortNo]==NULL){printf("Error: can not create ring\n");return 0;}
return 1;
}
void ComIntHandle_com(int iPortNo)
{
int intflag=0;
int lockKey;
char str[2];
int receive_flag=0;
receive_flag=0;
if(iPortNo>=ComMaxNO)return 0;
lockKey = intLock ();
intflag=sysInByte(PortAddr[iPortNo]+com_intflag);
while((intflag&0x06)!=0)
{
switch (intflag)
{
case 2:
com_intNum[iPortNo]++;
if(rngIsEmpty(comS_ring_id[iPortNo])==FALSE)
{
rngBufGet(comS_ring_id[iPortNo],str,1);
sysOutByte(PortAddr[iPortNo]+com_dataport,str[0]);
portsending[iPortNo]=1;
}
else
{
portsending[iPortNo]=0;
}
break;
case 4:
str[0]=sysInByte(PortAddr[iPortNo]+com_dataport);
if(rngFreeBytes(comR_ring_id[iPortNo])>0)
{
if(rngBufPut(comR_ring_id[iPortNo],str,1)<1)
{logMsg("Put flow!\n");}
receive_flag=1;
}
break;
define: break;
}
intflag=sysInByte(PortAddr[iPortNo]+com_intflag);
}
/*sysOutByte(intcommand1,0x20);*/
intUnlock (lockKey);
}
int ComIntEnable(int iPortNo)
{
int lockKey;
if(iPortNo>=ComMaxNO)return 0;
lockKey = intLock ();
/*sysOutByte(PortAddr[iPortNo]+com_lineclt,0x03);*/
/*sysIntDisablePIC (COM1_INT_LVL);*/
if(intConnect(INUM_TO_IVEC(0x20+COM_INT_LVL[iPortNo]),ComIntHandle_com,iPortNo)==ERROR)
{printf("Error: connect int\n");}
/*else
sysIntEnablePIC (COM1_INT_LVL);*/
sysOutByte(PortAddr[iPortNo]+com_modemclt,0x0b);
sysOutByte(PortAddr[iPortNo]+com_intenable,0x03);
/*old_intmas1_reg=sysInByte(intmask1);
old_intmas2_reg=sysInByte(intmask2);
sysOutByte(intmask1,0x0);
sysOutByte(intmask2,0x0);*/
intUnlock (lockKey);
return 1;
}
void ComIntsendtouch(iPortNo)
{
unsigned char f;
char str[2];
unsigned ifor1=0;
unsigned int strlen=10;
if(iPortNo>=ComMaxNO)return 0;
if(rngIsEmpty(comS_ring_id[iPortNo])==FALSE)
if(portsending[iPortNo]==0)
{
/*printf("touch ");*/
rngBufGet(comS_ring_id[iPortNo],str,1);
f=sysInByte(PortAddr[iPortNo] + com_lineflag);
while((f&0x20)==0)f=sysInByte(PortAddr[iPortNo] + com_lineflag);
sysOutByte(PortAddr[iPortNo]+com_dataport,str[0]);
}
}
int comwrite(int iPortNo,char *str,int len)
{
if(iPortNo>=ComMaxNO)return 0;
if(rngFreeBytes(comS_ring_id[iPortNo])>=len)
{
/*printf("send!\n");*/
/*printf("COM%dS> len=%d\n",iPortNo+1,len);*/
/*if(iPortNo>1)
{
ComPollSendstr(iPortNo,str,len);
}
else*/
{
rngBufPut(comS_ring_id[iPortNo],str,len);
ComIntsendtouch(iPortNo);
}
return len;
}
return 0;
}
int comread(int iPortNo,char *str,int Maxlen)
{
if(iPortNo>=ComMaxNO)return 0;
if(rngIsEmpty(comR_ring_id[iPortNo])==FALSE)
{
return rngBufGet(comR_ring_id[iPortNo],str,Maxlen);
}
return 0;
}
int comtakeRTS(int iPortNo)
{
if(iPortNo>=ComMaxNO)return 0;
sysOutByte(PortAddr[iPortNo]+com_modemclt,0x0a);
return 1;
}
int comclearRTS(int iPortNo)
{
if(iPortNo>=ComMaxNO)return 0;
sysOutByte(PortAddr[iPortNo]+com_modemclt,0x08);
return 1;
}
int comgetCTS(int iPortNo)
{
char mask=0;
if(iPortNo>=ComMaxNO)return 0;
mask=sysInByte(PortAddr[iPortNo]+com_modemflag);
/*if get CTS*/
if(mask&0x10)return 1;
else return 0;
}
int comsetcheck(int iPortNo)
{
if(iPortNo>=ComMaxNO)return 0;
sysOutByte(PortAddr[iPortNo]+com_lineclt,(0x7f&sysInByte(PortAddr[iPortNo] + com_lineclt)));
sysOutByte(PortAddr[iPortNo]+com_lineclt,0x1b);
return 1;
}
void comShow(void)
{
int iPortNo=0;
printf("intNum:\n");
for(iPortNo=0;iPortNo<ComMaxNO;iPortNo++)
printf("%d ",com_intNum[iPortNo]);
printf("\n");
}
/************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -