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

📄 mc68681.c

📁 motorola自己开发的针对coldfire 5272的Dbug bootloader程序
💻 C
字号:
/*
 * File:		mc68681.c
 * Purpose:		Polled-mode driver for the MC68681 DUART.
 *
 * Notes:
 *
 * Author:		Eric DeVolder
 * Date:
 *
 * Modifications:
 *
 */


#include "mc68681p.h"

/***********************************************************/
void
mc68681_init (MC68681 *mc68681, int baud)
{
	/*
	 * This routine initializes the MC68681 using the given
	 * baud rate and 8N1 settings with no IRQs.
	 */

#if 0
	/* On the IDP, the IRQ of the MC68681 is routed through the PIT */
	/* Initialte the PIT */
	*(BYTE *)(0x00C00003) = 0x00;
	*(BYTE *)(0x00C00007) = 0x18;
	*(BYTE *)(0x00C0000F) = 0x00;
	*(BYTE *)(0x00C0001F) = 0x82;
	*(BYTE *)(0x00C00017) = 0xF8;
	*(BYTE *)(0x00C00003) = 0x20;
#endif

	/* Turn off all interrupts */
	MC68681_WR_IMR(mc68681,MC68681_IR_NO_INTERRUPTS);
	/* mc68681->IR = IR_NO_INTERRUPTS; */

	/* Configure Channel A for `baud', 8N1, null-modem */
	MC68681_WR_CH1_CR(mc68681, MC68681_CR_TX_DISABLED);
	MC68681_WR_CH1_CR(mc68681, MC68681_CR_RX_DISABLED);
	MC68681_WR_CH1_CR(mc68681, MC68681_CR_RESET_TX);
	MC68681_WR_CH1_CR(mc68681, MC68681_CR_RESET_RX);
	MC68681_WR_CH1_CR(mc68681, MC68681_CR_RESET_MR);
	/* mc68681->CH1.COMMAND = CMD_TX_DISABLED; */
	/* mc68681->CH1.COMMAND = CMD_RX_DISABLED; */
	/* mc68681->CH1.COMMAND = CMD_RESET_TX; */
	/* mc68681->CH1.COMMAND = CMD_RESET_RX; */
	/* mc68681->CH1.COMMAND = CMD_RESET_MR; */

	MC68681_WR_CH1_MR(mc68681, 0
	/* mc68681->CH1.MODE = ( 0 */		/* mode register 1 */
		| MC68681_MR1_PARITY_NONE
		| MC68681_MR1_BITS_8
		) ;
	MC68681_WR_CH1_MR(mc68681, 0
	/* mc68681->CH1.MODE = ( 0 */		/* mode register 2 */
		| MC68681_MR2_STOP_BITS_1
		) ;

	switch (baud)
	{
		case 19200:
			MC68681_WR_CH1_CSR(mc68681, MC68681_CSR_19200_BPS);
			/*mc68681->CH1.STATUS = CSR_19200_BPS;*/	/* write is CSR */
			break;
		case 9600:
		default:
			MC68681_WR_CH1_CSR(mc68681, MC68681_CSR_9600_BPS);
			/*mc68681->CH1.STATUS = CSR_9600_BPS;*/		/* write is CSR */
			break;
	}
	MC68681_WR_ACR(mc68681, MC68681_ACR_BRG_SET_2);
	/* mc68681->ACR = ACR_BRG_SET_2; */
	MC68681_WR_OPCR(mc68681, 0);
	/* mc68681->OPCR = 0x00; */
	
	/* Configure Channel B for 9600 baud, 8N1, null-modem */
	MC68681_WR_CH2_CR(mc68681, MC68681_CR_TX_DISABLED);
	MC68681_WR_CH2_CR(mc68681, MC68681_CR_RX_DISABLED);
	MC68681_WR_CH2_CR(mc68681, MC68681_CR_RESET_TX);
	MC68681_WR_CH2_CR(mc68681, MC68681_CR_RESET_RX);
	MC68681_WR_CH2_CR(mc68681, MC68681_CR_RESET_MR);
	/* mc68681->CH2.COMMAND = CMD_TX_DISABLED; */
	/* mc68681->CH2.COMMAND = CMD_RX_DISABLED; */
	/* mc68681->CH2.COMMAND = CMD_RESET_TX; */
	/* mc68681->CH2.COMMAND = CMD_RESET_RX; */
	/* mc68681->CH2.COMMAND = CMD_RESET_MR; */

	MC68681_WR_CH2_MR(mc68681, 0
	/* mc68681->CH2.MODE = ( 0 */		/* mode register 1 */
		| MC68681_MR1_PARITY_NONE
		| MC68681_MR1_BITS_8
		) ;
	MC68681_WR_CH2_MR(mc68681, 0
	/* mc68681->CH2.MODE = ( 0 */		/* mode register 2 */
		| MC68681_MR2_STOP_BITS_1
		) ;

	MC68681_WR_CH2_CSR(mc68681, MC68681_CSR_9600_BPS);
	/* mc68681->CH2.STATUS = CSR_9600_BPS;	*/	/* write is CSR */

	/* Enable the transmitters and receivers */
	MC68681_WR_CH1_CR(mc68681, MC68681_CR_RX_ENABLED);
	/* mc68681->CH1.COMMAND = CMD_RX_ENABLED; */
	MC68681_WR_CH1_CR(mc68681, MC68681_CR_TX_ENABLED);
	/* mc68681->CH1.COMMAND = CMD_TX_ENABLED; */
}

/***********************************************************/
int
mc68681_in_char (MC68681 *mc68681)
{
	/* wait for receiver ready */
	while (!(MC68681_RD_CH1_SR(mc68681) & MC68681_SR_RXRDY))
		;
	return /* mc68681->CH1.BUFFER; */ MC68681_RD_CH1_BR(mc68681);
}

/***********************************************************/
void
mc68681_out_char (MC68681 *mc68681, int c)
{
	/* wait for transmitter ready */
	while (!(MC68681_RD_CH1_SR(mc68681) & MC68681_SR_TXRDY))
		;
	MC68681_WR_CH1_BR(mc68681,c);
}

/***********************************************************/
int
mc68681_char_present (MC68681 *mc68681)
{
	return (MC68681_RD_CH1_SR(mc68681) & MC68681_SR_RXRDY);
}



/***********************************************************/
int
mc68681_in_char2 (MC68681 *mc68681)
{
	/* wait for receiver ready */
	while (!(MC68681_RD_CH2_SR(mc68681) & MC68681_SR_RXRDY))
		;
	return /* mc68681->CH2.BUFFER; */ MC68681_RD_CH2_BR(mc68681);
}

/***********************************************************/
void
mc68681_out_char2 (MC68681 *mc68681, int c)
{
	/* wait for transmitter ready */
	while (!(MC68681_RD_CH2_SR(mc68681) & MC68681_SR_TXRDY))
		;
	MC68681_WR_CH2_BR(mc68681,c);
}

/***********************************************************/
int
mc68681_char_present2 (MC68681 *mc68681)
{
	return (MC68681_RD_CH2_SR(mc68681) & MC68681_SR_RXRDY);
	/* return (mc68681->CH2.STATUS & STAT_RXRDY); */
}

/***********************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -