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

📄 mz85c30.cpp

📁 89c30的驱动源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	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 + -