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

📄 uart_405.c

📁 umon bootloader source code, support mips cpu.
💻 C
字号:
#include "config.h"
#include "devices.h"
#include "stddefs.h"
#include "ether.h"
#include "uart_405.h"

void
Init405DUART(struct uart405 *uart, uchar dllsb)
{
	uchar	tmp;

	uart->linectl = DLAB;			/* set DLAB bit */
	uart->b0.dllsb = dllsb;			/* Set baud */
	uart->b1.dlmsb = 0x00;
	uart->linectl = 0x03;			/* 8-bits, no parity */
	uart->fifoctl = 0x00;			/* fifo disabled */
	uart->modemctl = 0x03;			/* DTR/RTS */
	tmp = uart->linestat;			/* clear line stat */
	tmp = uart->b0.data;			/* read receive buffer */
	uart->scratch = 0x00;			/* set scratch pad */
	uart->b1.inte = 0x00;			/* no ints used */
}

uchar
getDlLsb(int baud)
{
	uchar	dllsb;

	switch(baud) {
		case 115200:
			dllsb = BRD_115200;
			break;
		case 57600:
			dllsb = BRD_57600;
			break;
		case 38400:
			dllsb = BRD_38400;
			break;
		case 19200:
			dllsb = BRD_19200;
			break;
		default:
		case 9600:
			dllsb = BRD_9600;
			break;
	}
	return(dllsb);
}

void
setBaud(struct uart405 *uart, int baud)
{
	uchar	tmp;

	tmp = uart->linectl;				/* Save linectl reg */
	uart->linectl = DLAB;				/* set DLAB bit */
	uart->b0.dllsb = getDlLsb(baud);	/* Set baud */
	uart->b1.dlmsb = 0x00;
	uart->linectl = tmp;				/* Restore linectl reg */
}

void
Init405UART(int baud)
{
	Init405DUART(UARTA,getDlLsb(baud));
	Init405DUART(UARTB,getDlLsb(baud));
}

int
gotachar405_A()
{
	if (UARTA->linestat & DRDY)
		return(1);
	return(0);
}

int
getchar405_A()
{
	while(!gotachar405_A());
	return((int)(UARTA->b0.data));
}

int
rputchar405_A(char c)
{
	UARTA->b0.data = c;
	while(!(UARTA->linestat & THRE));
	return(0);
}

int
gotachar405_B()
{
	if (UARTB->linestat & DRDY)
		return(1);
	return(0);
}

int
getchar405_B()
{
	while(!gotachar405_B());
	return((int)(UARTB->b0.data));
}

int
rputchar405_B(char c)
{
	UARTB->b0.data = c;
	while(!(UARTB->linestat & THRE));
	return(0);
}

int
tty0init(ulong baud)
{
	extern int InitUART(int);

	InitUART(baud);
	Init405DUART(UARTA,getDlLsb(baud));
	return(0);
}

int
tty0read(char *buf,int cnt)
{
	int i;

	for(i=0;i<cnt;i++) {
		while(!gotachar405_A()) {
#if INCLUDE_ETHERNET
			pollethernet();
#endif
		}
		buf[i] = getchar405_A();
	}
	return(cnt);
}

int
tty0write(char *buf,int cnt)
{
	int i;

	for(i=0;i<cnt;i++)
		rputchar405_A(buf[i]);
	return(cnt);
}

int
tty0ctrl(int func,ulong arg0,ulong arg1)
{
	switch(func) {
		case GOTACHAR:
			return(gotachar405_A());
			break;
		case SETBAUD:
			setBaud(UARTA,(int)arg0);
			break;
		case INIT:
			Init405DUART(UARTA,getDlLsb(arg0));
			break;
		default:
			return(-1);
	}
	return(0);
}

int
tty1init(ulong baud)
{
	Init405DUART(UARTB,getDlLsb(baud));
	return(0);
}

int
tty1read(char *buf,int cnt)
{
	int i;

	for(i=0;i<cnt;i++) {
		while(!gotachar405_B()) {
#if INCLUDE_ETHERNET
			pollethernet();
#endif
		}
		buf[i] = getchar405_B();
	}
	return(cnt);
}

int
tty1write(char *buf,int cnt)
{
	int i;

	for(i=0;i<cnt;i++)
		rputchar405_B(buf[i]);
	return(cnt);
}

int
tty1ctrl(int func,ulong arg0,ulong arg1)
{
	switch(func) {
		case GOTACHAR:
			return(gotachar405_B());
			break;
		case SETBAUD:
			setBaud(UARTB,(int)arg0);
			break;
		case INIT:
			Init405DUART(UARTB,getDlLsb(arg0));
			break;
		default:
			return(-1);
	}
	return(0);
}


⌨️ 快捷键说明

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