tty.c
来自「eCos操作系统源码」· C语言 代码 · 共 205 行
C
205 行
//// TTY support code//struct uart { unsigned char control; unsigned char _fill0[3]; unsigned char mode; unsigned char _fill1[3]; unsigned char baud; unsigned char _fill2[3]; unsigned char status; unsigned char _fill3[3]; unsigned char TxRx; unsigned char _fill4[3]; unsigned char modem_control; unsigned char _fill5[3+8]; unsigned char modem_status; unsigned char _fill6[3];};// Serial control#define SCR_MIE 0x80 // Modem interrupt enable#define SCR_EIE 0x40 // Error interrupt enable#define SCR_TIE 0x20 // Transmit interrupt enable#define SCR_RIE 0x10 // Receive interrupt enable#define SCR_FCT 0x08 // Flow type 0=>software, 1=>hardware#define SCR_CLK 0x04 // Clock source 0=internal, 1=external#define SCR_TEN 0x02 // Transmitter enabled#define SCR_REN 0x01 // Receiver enabled// Serial mode#define SMR_DIV(x) ((x)<<4) // Clock divisor#define SMR_STOP 0x08 // Stop bits 0=>one, 1=>two#define SMR_STOP_1 0x00#define SMR_STOP_2 0x08#define SMR_PARITY 0x04 // Parity mode 0=>even, 1=odd#define SMR_PARITY_EVEN 0x00#define SMR_PARITY_ODD 0x04#define SMR_PARITY_ON 0x02 // Parity checked#define SMR_PARITY_OFF 0x00#define SMR_LENGTH 0x01 // Character length#define SMR_LENGTH_8 0x00#define SMR_LENGTH_7 0x01// Serial status#define SSR_MSS 0x80 // Modem status has changed#define SSR_OE 0x40 // Overrun error#define SSR_FE 0x20 // Framing error#define SSR_PE 0x10 // Parity error#define SSR_TxActive 0x08 // Transmitter is active#define SSR_RxActive 0x04 // Receiver is active#define SSR_TxEmpty 0x02 // Tx buffer is empty#define SSR_RxFull 0x01 // Rx buffer contains data// Modem control#define SMR_CFG 0x08 // Configuration 0=>normal, 1=>null#define SMR_MSU 0x04 // Modem status update 1=>enable#define SMR_DTR 0x02 // Assert DTR#define SMR_RTS 0x01 // Assert RTS#define GP4020_UART1 0xE0018000#define GP4020_UART2 0xE0019000//// Initialize a TTY port//static void_tty_init(volatile struct uart *uart){ uart->mode = SMR_STOP_1 | SMR_PARITY_OFF | SMR_LENGTH_8; uart->baud = 0x15; // Magic for 57600 uart->modem_control = SMR_DTR | SMR_RTS; uart->control = SCR_TEN | SCR_REN;}//// Output a character to a TTY port//static void_tty_putc(volatile struct uart *uart, char c){ // Wait for space for character do { } while ((uart->status & SSR_TxEmpty) == 0); uart->TxRx = c;}//// Read a character from a TTY port//static char_tty_getc(volatile struct uart *uart){ do {#if 0 if ((uart->status & 0xF0) != 0) { tty_puts("\nErr = "); tty_puthex(uart->TxRx, 2); }#endif } while ((uart->status & SSR_RxFull) == 0); return uart->TxRx;}//// Initialize the TTY ports//volatile struct uart *uarts[] = { (volatile struct uart *)GP4020_UART1, (volatile struct uart *)GP4020_UART2};voidtty_init(void){#if 0 tty_puts("\nUart: "); tty_puthex(uart->control, 2); tty_puts(", "); tty_puthex(uart->mode, 2); tty_puts(", "); tty_puthex(uart->baud, 2); tty_puts(", "); tty_puthex(uart->TxRx, 2); tty_puts("\n"); tty_puts("\nStat at "); tty_puthex(&uart->status, 8); tty_puts("\n");#endif _tty_init(uarts[0]); _tty_init(uarts[1]);}//// Write a character to the selected TTY//voidtty_putc(int chan, char c){ _tty_putc(uarts[chan], c);}//// Read a character from the selected TTY//chartty_getc(int chan){ return _tty_getc(uarts[chan]);}//// Display a string on the selected TTY//voidtty_puts(int chan, char *s){ char c; while ((c = *s++) != '\0') { if (c == '\n') { tty_putc(chan, '\r'); } tty_putc(chan, c); }}//// Read characters into a buffer, terminated by a '\n' character// Note: the '\n' character is not stored//inttty_getline(int chan, char *buf){ char c; int len = 0; while (((c = tty_getc(chan)) != '\n') && (c != '\r')) { tty_putc(chan, c); *buf++ = c; len++; } *buf = '\0'; return len;}//// Display a number in hex//voidtty_puthex(int chan, unsigned long val, int length){ char hex[] = "0123456789ABCDEF"; char str[16]; char *s = &str[length+3]; int i; *--s = '\0'; for (i = 0; i < length; i++) { *--s = hex[(val & 0x0F)]; val >>= 4; } *--s = 'x'; *--s = '0'; tty_puts(chan, s);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?