📄 mz85c30.cpp
字号:
#include "system.h"
#include "dbase.h"
#include "serial.h" /*上层串口映射函数定义*/
#include "mz85c30.h" /*MC85C30寄存器定义*/
#include "portdrv.h"
DWORD M30IsrFlag;
#if (MZ85C30==YES)
#if (MT_MODULE == MT_DF1710)
#define MZ85C30_VECTOR SHARE_INT_VECTOR
static const TBaseAddr baseAddr[MAX_85C30_NUM] =
{
{PORT_85C301AC_BASE,PORT_85C301AD_BASE},
{PORT_85C301BC_BASE,PORT_85C301BD_BASE},
{PORT_85C302AC_BASE,PORT_85C302AD_BASE},
{PORT_85C302BC_BASE,PORT_85C302BD_BASE},
{PORT_85C303AC_BASE,PORT_85C303AD_BASE},
{PORT_85C303BC_BASE,PORT_85C303BD_BASE},
{PORT_85C304AC_BASE,PORT_85C304AD_BASE},
{PORT_85C304BC_BASE,PORT_85C304BD_BASE}
};
#endif
#if(MT_MODULE == MT_DF1331)
#define MZ85C30_VECTOR SHARE_INT_CHIP2
static const TBaseAddr baseAddr[MAX_85C30_NUM] =
{
{PORT_85C301BC_BASE,PORT_85C301BD_BASE},
{PORT_85C301AC_BASE,PORT_85C301AD_BASE},
{PORT_85C302BC_BASE,PORT_85C302BD_BASE},
{PORT_85C302AC_BASE,PORT_85C302AD_BASE},
{PORT_85C303BC_BASE,PORT_85C303BD_BASE},
{PORT_85C303AC_BASE,PORT_85C303AD_BASE},
{PORT_85C304AC_BASE,PORT_85C304AD_BASE},
{PORT_85C304BC_BASE,PORT_85C304BD_BASE}
};
#endif
#if(MT_MODULE == MT_DF1730)
static const TBaseAddr baseAddr[MAX_85C30_NUM] =
{
{0x280000,0x280001},
{0x280002,0x280003}
};
#endif
#if( (MT_MODULE == MT_DF1711) || (MT_MODULE == MT_MMI360) )
#define MZ85C30_VECTOR SV_MZ85C30
static const TBaseAddr baseAddr[MAX_85C30_NUM] =
{
{PORT_85C301AC_BASE,PORT_85C301AD_BASE},
{PORT_85C301BC_BASE,PORT_85C301BD_BASE},
};
#endif
static const DWORD width2bits[4]={0,2,1,3};
BOOL Z85C30InitFlag = FALSE;
void Z85C30_Init()
{
int i;
Z85C30InitFlag = TRUE;
for(i=0;i<MAX_85C30_NUM;i++)
ResetChip(i);
}
DWORD Z85C30_Open(WORD wPort, TSerialMap portInfo)
{
CSerial* pSerial;
DWORD dwMask;
BYTE bMode;
static DWORD InstallVectorFlag=0;
pSerial = CSerial::GetSerial(wPort);
if(pSerial == NULL)
{
LogError("Z85C30_Open",FILE_LINE, "Open Port Error!");
return ERR_SERIAL_INIT;
}
if(!Z85C30InitFlag)
{
LogError("Z85C30_Open",FILE_LINE, "This Drive not initial");
return ERR_SERIAL_INIT;
}
/*检查端口是否非法*/
if(portInfo.nPort >= MAX_85C30_NUM)
{
LogError("Z85c3_open",FILE_LINE,"port invalidate");
return ERR_SERIAL_CHANNEL;
}
if(portInfo.nChannel > MAX_85C30_CHANNEL)
{
LogError("Z85C30_Open",FILE_LINE,"channel error");
return ERR_SERIAL_CHANNEL;
}
if(portInfo.nChip > MAX_85C30_CHIP)
{
LogError("Z85C30_Open",FILE_LINE,"chip error");
return ERR_SERIAL_CHANNEL;
}
pSerial->m_PortInfo = portInfo;
pSerial->m_baseAddr = baseAddr[portInfo.nPort];
ResetChannel(pSerial); /*复位通道*/
wr_ctrl(pSerial, REG_IVEC, 0); /*初始化中断向量寄存器*/
bMode = pSerial->m_serialPara.bMode;
dwMask = splx(MAX_ILEV);
if(bMode & SYNCMODE) /*同步通信方式初始化*/
z85c30_Init_Sync(pSerial);
else
z85c30_Init_Async(pSerial);
/*设置中断向量*/
#if ((MT_MODULE == MT_DF1710)|(MT_MODULE == MT_DF1331))
if(!InstallVectorFlag)
{
InstallVectorFlag = TRUE;
SetIntrReq(MZ85C30_VECTOR,(DWORD)Z85c30_new_isr,0);
EnableIntrReq(SHARE_INT_CHIP2);
}
#else if( (MT_MODULE == MT_DF1711) || (MT_MODULE == MT_MMI360) )
if(!InstallVectorFlag)
{
InstallVectorFlag = TRUE;
DF_SetIntVector(MZ85C30_VECTOR, Z85c30_new_isr,0);
DF_EnableInt(MZ85C30_VECTOR);
}
#endif
(void)splx(dwMask);
return ERR_SUCCESS;
}
DWORD Z85C30_RxInt(WORD wPort, BYTE bFlag)
{
CSerial* pSerial;
BYTE q;
DWORD dwMask;
pSerial = CSerial::GetSerial(wPort);
if(pSerial == NULL)
return ERR_SERIAL_CHANNEL;
q = pSerial->m_bIntMode;
dwMask = splx(0);
if(bFlag)
q |= INT_ENA_RX;
else
q &= ~INT_ENA_RX;
wr_ctrl(pSerial,REG_INT_ENA, q); /** WR1 **/
pSerial->m_bIntMode = q;
splx(dwMask);
return ERR_SUCCESS;
}
BOOL Z85C30_WriteAChar(WORD wPort, BYTE bData)
{
CSerial* pSerial;
pSerial = CSerial::GetSerial(wPort);
if(pSerial == NULL)
return FALSE;
if(pSerial->ReadFromBuf(bData))
wr_ctrl(pSerial, REG_TX_BUF, bData);
return TRUE;
}
DWORD Z85C30_TxInt(WORD wPort, BYTE bFlag)
{
CSerial* pSerial;
BYTE q;
DWORD dwMask;
BYTE bData;
BYTE bStatus;
pSerial = CSerial::GetSerial(wPort);
if(pSerial == NULL)
return ERR_SERIAL_CHANNEL;
dwMask = splx(MAX_ILEV);
q = pSerial->m_bIntMode;
if(bFlag)
q |= INT_ENA_TX;
else
q &= ~INT_ENA_TX;
wr_ctrl(pSerial, REG_INT_ENA, q); /** WR1 **/
pSerial->m_bIntMode = q;
if(bFlag)
{
bStatus = rd_ctrl(pSerial,REG_STAT) & STAT_EMPTY;
if(pSerial->GetCanSendNum() && bStatus)
{
if(pSerial->ReadFromBuf(bData))
wr_ctrl(pSerial, REG_TX_BUF, bData);
}
}
splx(dwMask);
return ERR_SUCCESS;
}
DWORD Z85C30_ModemIn(WORD wPort)
{
CSerial* pSerial;
BYTE status,modret;
pSerial = CSerial::GetSerial(wPort);
if(pSerial == NULL)
return 0;
status = NULL;
modret = NULL;
status = rd_ctrl(pSerial, REG_STAT)&(STAT_DCD|STAT_CTS);
if(status & STAT_DCD)
modret |= MODEM_DCD;
if(status & STAT_CTS)
modret |= MODEM_CTS;
return modret;
}
DWORD Z85C30_ModemOut(WORD wPort, BYTE bOut, BYTE bFlag)
{
CSerial* pSerial;
DWORD dwMask;
pSerial = CSerial::GetSerial(wPort);
if(pSerial == NULL)
return ERR_SERIAL_OPEN;
dwMask = splx(MAX_ILEV);
if(bFlag)
{
if(bOut & MODEM_DTR)
pSerial->m_bTxdMode |= TXMODE_DTR;
if(bOut & MODEM_RTS)
pSerial->m_bTxdMode |= TXMODE_RTS;
}
else
{
if(bOut & MODEM_DTR)
pSerial->m_bTxdMode &= ~(TXMODE_DTR);
if(bOut & MODEM_RTS)
pSerial->m_bTxdMode &= ~(TXMODE_RTS);
}
wr_ctrl(pSerial, REG_TX_MODE, pSerial->m_bTxdMode);
splx(dwMask);
return ERR_SUCCESS;
}
void ResetChannel(CSerial* pSerial)
{
WORD nChannel;
nChannel = pSerial->m_PortInfo.nChannel;
wr_ctrl(pSerial, REG_INT_CTL, (nChannel)?0x40:0x80);
}
void ResetChip(WORD nChip)
{
//wr_ctrl(dwAddr, REG_INT_CTL, 0xc0);
DWORD imask;
imask = splx(MAX_ILEV);
outportb(baseAddr[nChip].dwCmdAddr, REG_INT_CTL);
slow1(5);
outportb(baseAddr[nChip].dwCmdAddr, 0xc0);
splx(imask);
}
void z85c30_Init_Sync(CSerial* pSerial)/////同步
{
if(pSerial == NULL)
return;
DWORD i,dwMask;
WORD wStartCode;
DWORD dwBaud;
wStartCode = pSerial->m_serialPara.wStartCode;
dwBaud = pSerial->m_dwBaud;
dwMask = splx(MAX_ILEV);
wr_ctrl(pSerial, REG_IVEC,0);
wr_ctrl(pSerial, REG_TX_RX,TXRX_16BIT_SYNC);
wr_ctrl(pSerial, REG_TXRX_CTL,0);
wr_ctrl(pSerial, REG_SDLC_ADR, (BYTE)(wStartCode>>8));
wr_ctrl(pSerial, REG_SDLC_FLG, (BYTE)(wStartCode&0xff));
/**接收时钟:DPLL;发送时钟:RTXc;TRxC BRG source (0x66) */
wr_ctrl(pSerial, REG_CLKMODE, CLKMOD_RX_DPL|CLKMOD_TRC_BRG|CLKMOD_TRC_OUT);
wr_ctrl(pSerial, REG_EXT_CTL,0);
i = (SER_CLK_FREQ/(dwBaud*64))-2;
wr_ctrl(pSerial, REG_BRG_LO, (BYTE)(i&0xff));
wr_ctrl(pSerial, REG_BRG_HI, (BYTE)(i>>8));
wr_ctrl(pSerial, REG_CTL,0x3);
wr_ctrl(pSerial, REG_CTL,0x73);
wr_ctrl(pSerial, REG_CTL,0x83);
wr_ctrl(pSerial, REG_CTL,0x23);
/*----------------------------------------------------*/
/* Enable the transmitter */
/*----------------------------------------------------*/
pSerial->m_bTxdMode = TXMODE_ENABLE|TXMODE_DTR|TXMODE_RTS;
pSerial->m_bTxdMode |= 3<<5; /* 8 bit char TX */
wr_ctrl(pSerial, REG_TX_MODE, (BYTE)pSerial->m_bTxdMode);
/*-----------------------------------------------------------------*/
/* Enable the receiver */
/*-----------------------------------------------------------------*/
i = RXMODE_ENABLE|RXMODE_HUNT_MOD;
i |= 3<<6;
pSerial->m_bRxdMode = i;
wr_ctrl(pSerial, REG_RX_MODE, (BYTE)pSerial->m_bRxdMode);/* WR3 */
wr_ctrl(pSerial, REG_CMD, CMD_RESET_INTS);
wr_ctrl(pSerial, REG_INT_CTL, INTCTL_MIE|0x02);
splx(dwMask);
}
void z85c30_Init_Async(CSerial* pSerial)/////异步
{
DWORD dwFlags;
DWORD dwBaud;
WORD wBaudDiv;
BYTE i;
BYTE bMedium;
BYTE bCharSize;
if(pSerial == NULL)
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -