1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * (C) Copyright 2007 OpenMoko, Inc. 4 * Written by Harald Welte <laforge@openmoko.org> 5 */ 6 7/* 8 * Boot support 9 */ 10#include <common.h> 11#include <command.h> 12#include <stdio_dev.h> 13#include <serial.h> 14 15int do_terminal(struct cmd_tbl *cmd, int flag, int argc, char *const argv[]) 16{ 17 int last_tilde = 0; 18 struct stdio_dev *dev = NULL; 19 20 if (argc < 1) 21 return -1; 22 23 /* Scan for selected output/input device */ 24 dev = stdio_get_by_name(argv[1]); 25 if (!dev) 26 return -1; 27 28 if (IS_ENABLED(CONFIG_SERIAL)) 29 serial_reinit_all(); 30 31 printf("Entering terminal mode for port %s\n", dev->name); 32 puts("Use '~.' to leave the terminal and get back to u-boot\n"); 33 34 while (1) { 35 int c; 36 37 /* read from console and display on serial port */ 38 if (stdio_devices[0]->tstc(stdio_devices[0])) { 39 c = stdio_devices[0]->getc(stdio_devices[0]); 40 if (last_tilde == 1) { 41 if (c == '.') { 42 putc(c); 43 putc('\n'); 44 break; 45 } else { 46 last_tilde = 0; 47 /* write the delayed tilde */ 48 dev->putc(dev, '~'); 49 /* fall-through to print current 50 * character */ 51 } 52 } 53 if (c == '~') { 54 last_tilde = 1; 55 puts("[u-boot]"); 56 putc(c); 57 } 58 dev->putc(dev, c); 59 } 60 61 /* read from serial port and display on console */ 62 if (dev->tstc(dev)) { 63 c = dev->getc(dev); 64 putc(c); 65 } 66 } 67 return 0; 68} 69 70 71/***************************************************/ 72 73U_BOOT_CMD( 74 terminal, 3, 1, do_terminal, 75 "start terminal emulator", 76 "" 77); 78