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

📄 uart.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/* * Cirrus EP7312 Console Driver * * Copyright (c) 2002 by Jay Monkman <jtm@smoothsmoothie.com> * *  The license and distribution terms for this file may be *  found in the file LICENSE in this distribution or at * *  http://www.rtems.com/license/LICENSE. * * *  $Id: uart.c,v 1.1.2.1 2003/09/04 18:43:47 joel Exp $*/#include <bsp.h>                /* Must be before libio.h */#include <rtems/libio.h>#include <termios.h>#include <rtems/bspIo.h>#include <ep7312.h>#include <libchip/serial.h>#include <libchip/sersupp.h>#define NUM_DEVS 1int     uart_poll_read(int minor);static int     uart_first_open(int major, int minor, void *arg);static int     uart_last_close(int major, int minor, void *arg);static int     uart_read(int minor);static int     uart_write(int minor, const char *buf, int len);static void    uart_init(int minor);static void    uart_write_polled(int minor, char c);static int     uart_set_attributes(int minor, const struct termios *t);unsigned long Console_Port_Count = NUM_DEVS;console_data  Console_Port_Data[NUM_DEVS];rtems_device_minor_number  Console_Port_Minor = 0;console_fns uart_fns = {     libchip_serial_default_probe,    uart_first_open,    uart_last_close,    uart_read,    uart_write,    uart_init,    uart_write_polled,    uart_set_attributes,    FALSE};console_tbl Console_Port_Tbl[] = {    {        "/dev/com0",                      /* sDeviceName */        SERIAL_CUSTOM,                    /* deviceType */        &uart_fns,                        /* pDeviceFns */        NULL,                             /* deviceProbe */        NULL,                             /* pDeviceFlow */        16,                               /* ulMargin */        8,                                /* ulHysteresis */        NULL,                             /* pDeviceParams */        (unsigned32)EP7312_UARTCR1,       /* ulCtrlPort1 */        (unsigned32)EP7312_SYSFLG1,       /* ulCtrlPort2 */        (unsigned32)EP7312_UARTDR1,       /* ulDataPort */        0,                                /* getRegister */        0,                                /* setRegister */        0,                                /* getData */        0,                                /* setData */        0,                                /* ulClock */        0                                 /* ulIntVector */    }};static int     uart_first_open(int major, int minor, void *arg) {return 0;}static int     uart_last_close(int major, int minor, void *arg) {return 0;}static int     uart_read(int minor) {    return uart_poll_read(minor);}static void    uart_write_polled(int minor, char c){    uart_write(minor, &c, 1);}static int     uart_set_attributes(int minor, const struct termios *t) {    return 0;}int uart_poll_read(int minor){    volatile unsigned32 *data_reg;    volatile unsigned32 *ctrl_reg1;    volatile unsigned32 *ctrl_reg2;    char        c;    int         err;    data_reg = (unsigned32*)Console_Port_Tbl[minor].ulDataPort;    ctrl_reg1 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort1;    ctrl_reg2 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort2;    if ((*ctrl_reg2 & EP7312_UART_URXFE1) != 0) {        return -1;    }        err  = *data_reg;    c    = err & 0xff;    err &= (EP7312_UART_FRMERR | EP7312_UART_PARERR | EP7312_UART_OVERR);    return c;}static void _BSP_null_char( char c ) {uart_write_polled(0, c);}BSP_output_char_function_type BSP_output_char = _BSP_null_char;static int uart_write(int minor, const char *buf, int len){    volatile unsigned32 *data_reg;    volatile unsigned32 *ctrl_reg1;    volatile unsigned32 *ctrl_reg2;    int i;    char c;    data_reg = (unsigned32*)Console_Port_Tbl[minor].ulDataPort;    ctrl_reg1 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort1;    ctrl_reg2 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort2;    for (i = 0; i < len; i++) {        /* Wait for fifo to have room */        while ((*ctrl_reg2 & EP7312_UART_UTXFF1) != 0) {            continue;        }        c = (char) buf[i];        *data_reg = c;    }        return 1;}static void uart_init(int minor){    volatile unsigned32 *data_reg;    volatile unsigned32 *ctrl_reg1;    volatile unsigned32 *ctrl_reg2;        data_reg = (unsigned32*)Console_Port_Tbl[minor].ulDataPort;    ctrl_reg1 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort1;    ctrl_reg2 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort2;    /*   *ctrl_reg = (BSP_UART_DATA8       |                 BSP_UART_STOP1       |                 BSP_UART_PARITY_NONE |                 EP7312_UART_FIFOEN     |                 BSP_UART_BAUD_9600);    */    *ctrl_reg1 = (EP7312_UART_WRDLEN8    |                 EP7312_UART_FIFOEN     |                 0x17);              /* 9600 baud */    }

⌨️ 快捷键说明

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