File indexing completed on 2025-05-11 08:22:49
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <bsp.h> /* Must be before libio.h */
0012 #include <rtems/libio.h>
0013 #include <termios.h>
0014 #include <rtems/bspIo.h>
0015
0016 #include <ep7312.h>
0017 #include <libchip/serial.h>
0018 #include <libchip/sersupp.h>
0019
0020 #define NUM_DEVS 1
0021 int uart_poll_read(int minor);
0022
0023 static int uart_first_open(int major, int minor, void *arg);
0024 static int uart_last_close(int major, int minor, void *arg);
0025 static int uart_read(int minor);
0026 static ssize_t uart_write(int minor, const char *buf, size_t len);
0027 static void uart_init(int minor);
0028 static void uart_write_polled(int minor, char c);
0029 static int uart_set_attributes(int minor, const struct termios *t);
0030
0031 unsigned long Console_Configuration_Count = NUM_DEVS;
0032
0033 const console_fns uart_fns =
0034 {
0035 libchip_serial_default_probe,
0036 uart_first_open,
0037 uart_last_close,
0038 uart_read,
0039 uart_write,
0040 uart_init,
0041 uart_write_polled,
0042 uart_set_attributes,
0043 FALSE
0044 };
0045 console_tbl Console_Configuration_Ports[] = {
0046 {
0047 "/dev/com0",
0048 SERIAL_CUSTOM,
0049 &uart_fns,
0050 NULL,
0051 NULL,
0052 16,
0053 8,
0054 NULL,
0055 (uint32_t)EP7312_UARTCR1,
0056 (uint32_t)EP7312_SYSFLG1,
0057 (uint32_t)EP7312_UARTDR1,
0058 0,
0059 0,
0060 0,
0061 0,
0062 0,
0063 0
0064 }};
0065
0066 static int uart_first_open(int major, int minor, void *arg) {return 0;}
0067 static int uart_last_close(int major, int minor, void *arg) {return 0;}
0068 static int uart_read(int minor)
0069 {
0070 return uart_poll_read(minor);
0071 }
0072
0073 static void uart_write_polled(int minor, char c)
0074 {
0075 uart_write(minor, &c, 1);
0076 }
0077
0078 static int uart_set_attributes(int minor, const struct termios *t)
0079 {
0080 return 0;
0081 }
0082
0083 int uart_poll_read(int minor)
0084 {
0085 volatile uint32_t *data_reg;
0086 volatile uint32_t *ctrl_reg2;
0087 char c;
0088 int err;
0089
0090 data_reg = (uint32_t *)Console_Port_Tbl[minor]->ulDataPort;
0091 ctrl_reg2 = (uint32_t *)Console_Port_Tbl[minor]->ulCtrlPort2;
0092
0093 if ((*ctrl_reg2 & EP7312_UART_URXFE1) != 0) {
0094 return -1;
0095 }
0096
0097 err = *data_reg;
0098 c = err & 0xff;
0099 err &= (EP7312_UART_FRMERR | EP7312_UART_PARERR | EP7312_UART_OVERR);
0100
0101 return c;
0102 }
0103
0104 static ssize_t uart_do_write(
0105 volatile uint32_t *uartdr,
0106 const char *buf,
0107 size_t len,
0108 volatile uint32_t *sysflg
0109 )
0110 {
0111 size_t i;
0112
0113 for (i = 0; i < len; i++) {
0114
0115 while ((*sysflg & EP7312_UART_UTXFF1) != 0) {
0116 continue;
0117 }
0118
0119 *uartdr = buf[i];
0120 }
0121
0122 return len;
0123 }
0124
0125 static ssize_t uart_write(int minor, const char *buf, size_t len)
0126 {
0127 volatile uint32_t *data_reg;
0128 volatile uint32_t *ctrl_reg2;
0129
0130 data_reg = (uint32_t *)Console_Port_Tbl[minor]->ulDataPort;
0131 ctrl_reg2 = (uint32_t *)Console_Port_Tbl[minor]->ulCtrlPort2;
0132
0133 return uart_do_write(data_reg, buf, len, ctrl_reg2);
0134 }
0135
0136 static void uart_init(int minor)
0137 {
0138 volatile uint32_t *ctrl_reg1;
0139
0140 ctrl_reg1 = (uint32_t *)Console_Port_Tbl[minor]->ulCtrlPort1;
0141
0142
0143
0144
0145
0146
0147
0148 *ctrl_reg1 = (EP7312_UART_WRDLEN8 |
0149 EP7312_UART_FIFOEN |
0150 0x17);
0151
0152 }
0153
0154
0155
0156
0157 static void _BSP_null_char(char c)
0158 {
0159 uart_do_write(EP7312_UARTDR1, &c, 1, EP7312_SYSFLG1);
0160 }
0161
0162 static int _BSP_get_char(void)
0163 {
0164 return uart_poll_read(0);
0165 }
0166
0167 BSP_output_char_function_type BSP_output_char = _BSP_null_char;
0168
0169 BSP_polling_getchar_function_type BSP_poll_char = _BSP_get_char;