⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mz85c30.cpp

📁 89c30的驱动源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -