📄 uart_405.c
字号:
#include "config.h"#include "devices.h"#include "stddefs.h"#include "ether.h"#define UARTA ((struct uart405 *)0xef600300)#define UARTB ((struct uart405 *)0xef600400)#define DLAB 0x80#define THRE 0x20 /* Transmit Holding Register Empty */#define DRDY 0x01 /* Data ready */struct uart405 { union { vuchar data; /* DATA_REG */ vuchar dllsb; /* DL_LSB (when DLAB is set in linectl reg) */ } b0; union { vuchar inte; /* INT_ENABLE */ vuchar dlmsb; /* DL_MSB when DLAB is set in linectl reg) */ } b1; vuchar fifoctl; /* FIFO_CONTROL */ vuchar linectl; /* LINE_CONTROL */ vuchar modemctl; /* MODEM_CONTROL */ vuchar linestat; /* LINE_STATUS */ vuchar modemstat; /* MODEM_STATUS */ vuchar scratch; /* SCRATCH */};voidInit405DUART(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 */}uchargetDlLsb(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);}voidsetBaud(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 */}voidInit405UART(int baud){ Init405DUART(UARTA,getDlLsb(baud)); Init405DUART(UARTB,getDlLsb(baud));}intgotachar405_A(){ if (UARTA->linestat & DRDY) return(1); return(0);}intgetchar405_A(){ while(!gotachar405_A()); return((int)(UARTA->b0.data));}intrputchar405_A(char c){ UARTA->b0.data = c; while(!(UARTA->linestat & THRE)); return(0);}intgotachar405_B(){ if (UARTB->linestat & DRDY) return(1); return(0);}intgetchar405_B(){ while(!gotachar405_B()); return((int)(UARTB->b0.data));}intrputchar405_B(char c){ UARTB->b0.data = c; while(!(UARTB->linestat & THRE)); return(0);}inttty0init(ulong baud){ extern int InitUART(int); InitUART(baud); Init405DUART(UARTA,getDlLsb(baud)); return(0);}inttty0read(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);}inttty0write(char *buf,int cnt){ int i; for(i=0;i<cnt;i++) rputchar405_A(buf[i]); return(cnt);}inttty0ctrl(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);}inttty1init(ulong baud){ Init405DUART(UARTB,getDlLsb(baud)); return(0);}inttty1read(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);}inttty1write(char *buf,int cnt){ int i; for(i=0;i<cnt;i++) rputchar405_B(buf[i]); return(cnt);}inttty1ctrl(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 + -