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

📄 uart_405.c

📁 完整的Bell实验室的嵌入式文件系统TFS
💻 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 + -