Merge branch 'master' of git://git.denx.de/u-boot
[platform/kernel/u-boot.git] / cmd / terminal.c
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
15 int do_terminal(cmd_tbl_t * 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         serial_reinit_all();
29         printf("Entering terminal mode for port %s\n", dev->name);
30         puts("Use '~.' to leave the terminal and get back to u-boot\n");
31
32         while (1) {
33                 int c;
34
35                 /* read from console and display on serial port */
36                 if (stdio_devices[0]->tstc()) {
37                         c = stdio_devices[0]->getc();
38                         if (last_tilde == 1) {
39                                 if (c == '.') {
40                                         putc(c);
41                                         putc('\n');
42                                         break;
43                                 } else {
44                                         last_tilde = 0;
45                                         /* write the delayed tilde */
46                                         dev->putc('~');
47                                         /* fall-through to print current
48                                          * character */
49                                 }
50                         }
51                         if (c == '~') {
52                                 last_tilde = 1;
53                                 puts("[u-boot]");
54                                 putc(c);
55                         }
56                         dev->putc(c);
57                 }
58
59                 /* read from serial port and display on console */
60                 if (dev->tstc()) {
61                         c = dev->getc();
62                         putc(c);
63                 }
64         }
65         return 0;
66 }
67
68
69 /***************************************************/
70
71 U_BOOT_CMD(
72         terminal,       3,      1,      do_terminal,
73         "start terminal emulator",
74         ""
75 );