📄 mz85c30.cpp
字号:
dwFlags = pSerial->m_serialPara.dwFlags;
bMedium = pSerial->m_serialPara.bMedium;
bCharSize = pSerial->m_serialPara.bCharSize;
dwBaud = pSerial->m_dwBaud;
wr_ctrl(pSerial, REG_TXRX_CTL,0);
wr_ctrl(pSerial, REG_CLKMODE, CLKMOD_RX_BRG|CLKMOD_TX_BRG|CLKMOD_TRC_BRG|CLKMOD_TRC_OUT);
i = TXRX_X16;
if(dwFlags&SPARENB)
{
i |= TXRX_PARITY;
if(!(dwFlags&SPARODD))
i|=TXRX_EVEN;
}
i |= (dwFlags&C2STOPB)?TXRX_2STOP:TXRX_1STOP;
wr_ctrl(pSerial, REG_TX_RX, (BYTE)i);
wBaudDiv = (DWORD)(SER_CLK_FREQ/(dwBaud<<5)) - 2;
wr_ctrl(pSerial, REG_CTL, CTL_PCLK4);
/*设置波特率*/
wr_ctrl(pSerial, REG_BRG_LO, LOBYTE(wBaudDiv));
wr_ctrl(pSerial, REG_BRG_HI, HIBYTE(wBaudDiv));
wr_ctrl(pSerial, REG_CTL, 0x3);
wr_ctrl(pSerial, REG_CTL, 0x73);
wr_ctrl(pSerial, REG_CTL, 0x83);
i = 0x23;
if(dwFlags&HWFC)
i |= CTL_DTR;
wr_ctrl(pSerial, REG_CTL, (BYTE)i);
i = RXMODE_ENABLE;
i |= width2bits[((pSerial->m_serialPara.bCharSize-1)&3)]<<6;
if(dwFlags&HWFC)
i |= RXMODE_AUTOCTS;
pSerial->m_bRxdMode = i;
wr_ctrl(pSerial, REG_RX_MODE, (BYTE)i);
if(GetIdentify() != WM_HOST)
{
if((bMedium == SPMODEM)||(bMedium == RADIO)||(bMedium == PBTELEPHONE))
pSerial->m_bTxdMode = TXMODE_ENABLE;
else
pSerial->m_bTxdMode = TXMODE_ENABLE|TXMODE_RTS;
}
else
{
if((bMedium == SPMODEM)||(bMedium == RADIO)||(bMedium == PBTELEPHONE))
pSerial->m_bTxdMode = TXMODE_ENABLE|TXMODE_DTR;
else
pSerial->m_bTxdMode = TXMODE_ENABLE|TXMODE_DTR|TXMODE_RTS;
}
pSerial->m_bTxdMode |= width2bits[((bCharSize-5)&3)]<<5;
wr_ctrl(pSerial, REG_TX_MODE, pSerial->m_bTxdMode);
wr_ctrl(pSerial, REG_CMD, CMD_RESET_INTS);
wr_ctrl(pSerial, REG_INT_CTL, INTCTL_MIE|INTCTL_NV);
}
BYTE rd_ctrl(CSerial* pSerial, BYTE regnum)
{
DWORD dwMask;
BYTE value;
if(pSerial == NULL)
return 0;
dwMask = splx(MAX_ILEV);
if(regnum == REG_STAT)
value = inportb(pSerial->m_baseAddr.dwCmdAddr);
else if(regnum == REG_RX_BUF)
value = inportb(pSerial->m_baseAddr.dwDataAddr);
else
{
outportb(pSerial->m_baseAddr.dwCmdAddr, regnum);
slow1(5);
value = inportb(pSerial->m_baseAddr.dwCmdAddr);
}
splx(dwMask);
return(value & 0xff);
}
BYTE rd_ctrl(DWORD PortAddr, BYTE regnum)
{
DWORD dwMask;
BYTE value;
dwMask = splx(MAX_ILEV);
inportb(PortAddr);
outportb(PortAddr, regnum);
slow1(5);
value = inportb(PortAddr);
splx(dwMask);
return(value & 0xff);
}
/***********************************************************************/
/* wr_ctrl: Write to a Z85C30 control register */
/* */
/* INPUTS: ChipPtr: SCC channel struct */
/* regnum: register number to write to */
/* value: what to write */
/* */
/***********************************************************************/
void wr_ctrl(WORD nOffset, BYTE regnum, BYTE value)
{
DWORD dwMask;
if(nOffset >= MAX_85C30_NUM)
return;
dwMask = splx(MAX_ILEV);
if(regnum == REG_CMD)
outportb(baseAddr[nOffset].dwCmdAddr, value);
else if (regnum == REG_TX_BUF)
outportb(baseAddr[nOffset].dwDataAddr, value);
else
{
outportb(baseAddr[nOffset].dwCmdAddr, regnum);
slow1(5);
outportb(baseAddr[nOffset].dwCmdAddr, value);
}
splx(dwMask);
}
void wr_ctrl(CSerial* pSerial, BYTE regnum, BYTE value)
{
DWORD dwMask;
if(pSerial == NULL)
return;
dwMask = splx(MAX_ILEV);
if(regnum == REG_CMD)
outportb(pSerial->m_baseAddr.dwCmdAddr, value);
else if (regnum == REG_TX_BUF)
outportb(pSerial->m_baseAddr.dwDataAddr, value);
else
{
outportb(pSerial->m_baseAddr.dwCmdAddr, regnum);
slow1(5);
outportb(pSerial->m_baseAddr.dwCmdAddr, value);
}
splx(dwMask);
}
void slow1(DWORD dwDelay)
{
DWORD a = 0;
while(dwDelay--)
a++;
}
#if( (MT_MODULE == MT_DF1711) || (MT_MODULE == MT_MMI360) )
void Z85c30_new_isr(DWORD dwArg)
{
DWORD imask;
imask= splx(MAX_ILEV);
OnChipInt(0);
splx(imask);
}
#endif
#if (MT_MODULE == MT_DF1331)
void Z85c30_new_isr(DWORD dwArg)
{
DWORD imask;
imask= splx(MAX_ILEV);
OnChipInt(1);
splx(imask);
}
#endif
/*---------------------------------------------------------------*/
/* Z85c30A_new_isr 三片85C30的中断入口处理程序 */
/*-------------------------------------------------------------- */
#if(MT_MODULE == MT_DF1710)
void Z85c30_new_isr(DWORD dwArg)
{
DWORD imask;
BYTE flag;
DWORD intcount;
imask = splx(MAX_ILEV);
for(intcount=0;intcount<50;intcount++)
/* avoid dead loop,if encounter hardware interfere */
{
/*读共享中断标志寄存器*/
flag = ~(inportb(SHARE_VECTOR_BASE));
/*清除未用的高四位*/
flag &= 0x0f;
/*没有中断标志,退出循环*/
if(!flag)
break;
else
{
/*第一片85C30产生中断*/
if(flag & SHARE_VECTOR_CHIP1)
OnChipInt(0);
#if (MT_MODULE == MT_DF1710)
/*第二片85C30发生中断*/
if(flag&SHARE_VECTOR_CHIP2)
OnChipInt(1);
#endif
/*第三片85C30发生中断*/
if(flag&SHARE_VECTOR_CHIP3)
OnChipInt(2);
/*第四片85C30发生中断*/
if(flag&SHARE_VECTOR_CHIP4)
OnChipInt(3);
} /* end of else */
}/* end of for */
outportb(SHARE_VECTOR_BASE,0xff);
splx(imask);
}
#endif
void OnChipInt(DWORD nChip)
{
WORD nAOffset, nBOffset;
WORD nChannel;
CSerial* pSerial;
DWORD dwACmd, dwBCmd;
static BYTE ivec;
void (*ptr[3])(CSerial* pSerial) = {z85c30_txd, z85c30_status, z85c30_rxd};
if(nChip >= MAX_85C30_CHIP)
return;
nAOffset = GetPortOffset(Z85C30_DRV, nChip, M85C30_CHNNEL_A);
nBOffset = GetPortOffset(Z85C30_DRV, nChip, M85C30_CHNNEL_B);
dwACmd = baseAddr[nAOffset].dwCmdAddr;
dwBCmd = baseAddr[nBOffset].dwCmdAddr;
wr_ctrl(nAOffset, REG_INT_CTL, 0x02);
while(1)
{
if(rd_ctrl(dwACmd, REG_INT_PEND))
{
ivec = rd_ctrl(dwBCmd, REG_MOD_B);
ivec >>= 1;
if (ivec <= 3)
nChannel = M85C30_CHNNEL_B;
else
{
ivec &= 0x03;
nChannel = M85C30_CHNNEL_A;
}
pSerial = GetSerial(Z85C30_DRV, nChip, nChannel);
if(ivec==3)
wr_ctrl(pSerial, REG_CMD, CMD_RESET_ERRS);
else
ptr[ivec](pSerial);
wr_ctrl(pSerial, REG_CMD, CMD_RESET_IUS);
}
else
break;
}
wr_ctrl(pSerial, REG_INT_CTL, INTCTL_MIE|0x02);
}
void z85c30_txd(CSerial* pSerial)
{
BYTE bData;
if(pSerial == NULL) /*未打开串口*/
return;
if(!pSerial->ReadFromBuf(bData))
{
pSerial->SerialTxdCtr(FALSE);////发送完毕
M30IsrFlag |= 0x1;
}
else
wr_ctrl(pSerial, REG_TX_BUF, bData);
}
void z85c30_rxd(CSerial* pSerial)
{
BYTE bData;
if(pSerial == NULL)
return;
while(1)
{
if(rd_ctrl(pSerial,REG_STAT)&STAT_AVAIL)
{
bData = rd_ctrl(pSerial, REG_RX_BUF);
pSerial->WriteToBuf(bData);
M30IsrFlag |= 0x2;
}
else
break;
}
}
void z85c30_status(CSerial* pSerial)
{
BYTE bMode;
if(pSerial == NULL)
return;
bMode = pSerial->m_serialPara.bMode;
if(bMode & ASYNCMODE)
{
do
{
wr_ctrl(pSerial, REG_CMD, CMD_RESET_ERRS);
wr_ctrl(pSerial, REG_CMD, CMD_RESET_INTS);
}
while(rd_ctrl(pSerial,REG_STAT)&STAT_BREAK);
}
while(rd_ctrl(pSerial, REG_STAT)&STAT_AVAIL)
rd_ctrl(pSerial, REG_RX_BUF);
wr_ctrl(pSerial, REG_CMD, CMD_RESET_INTS);
}
void Sync_Hunt(WORD wPort)
{
CSerial* pSerial;
BYTE bMode;
pSerial = CSerial::GetSerial(wPort);
if(pSerial == NULL || !pSerial->IsOpen())
return;
bMode = pSerial->m_serialPara.bMode;
if(bMode & SYNCMODE)
wr_ctrl(pSerial, REG_RX_MODE, RXMODE_8BITS|RXMODE_HUNT_MOD|RXMODE_ENABLE);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -