blob: 9e32a4191e1e8cb0762039bbbdf3f09b44f308b5 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Harald Welted16471e2007-12-19 14:14:47 +01002/*
3 * (C) Copyright 2007 OpenMoko, Inc.
4 * Written by Harald Welte <laforge@openmoko.org>
Harald Welted16471e2007-12-19 14:14:47 +01005 */
6
7/*
8 * Boot support
9 */
10#include <common.h>
11#include <command.h>
Jean-Christophe PLAGNIOL-VILLARD52cb4d42009-05-16 12:14:54 +020012#include <stdio_dev.h>
Jean-Christophe PLAGNIOL-VILLARDc1de7a62008-08-31 04:24:55 +020013#include <serial.h>
Harald Welted16471e2007-12-19 14:14:47 +010014
Simon Glass09140112020-05-10 11:40:03 -060015int do_terminal(struct cmd_tbl *cmd, int flag, int argc, char *const argv[])
Harald Welted16471e2007-12-19 14:14:47 +010016{
Harald Welted16471e2007-12-19 14:14:47 +010017 int last_tilde = 0;
Jean-Christophe PLAGNIOL-VILLARD52cb4d42009-05-16 12:14:54 +020018 struct stdio_dev *dev = NULL;
Harald Welted16471e2007-12-19 14:14:47 +010019
20 if (argc < 1)
21 return -1;
22
23 /* Scan for selected output/input device */
Jean-Christophe PLAGNIOL-VILLARD52cb4d42009-05-16 12:14:54 +020024 dev = stdio_get_by_name(argv[1]);
Harald Welted16471e2007-12-19 14:14:47 +010025 if (!dev)
26 return -1;
27
Asherah Connorac382142021-03-10 22:39:24 +110028 if (IS_ENABLED(CONFIG_SERIAL))
29 serial_reinit_all();
30
Harald Welted16471e2007-12-19 14:14:47 +010031 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 */
Asherah Connor5c935eb2021-03-10 22:39:23 +110038 if (stdio_devices[0]->tstc(stdio_devices[0])) {
39 c = stdio_devices[0]->getc(stdio_devices[0]);
Harald Welted16471e2007-12-19 14:14:47 +010040 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 */
Asherah Connor5c935eb2021-03-10 22:39:23 +110048 dev->putc(dev, '~');
Harald Welted16471e2007-12-19 14:14:47 +010049 /* fall-through to print current
50 * character */
51 }
52 }
53 if (c == '~') {
54 last_tilde = 1;
55 puts("[u-boot]");
56 putc(c);
57 }
Asherah Connor5c935eb2021-03-10 22:39:23 +110058 dev->putc(dev, c);
Harald Welted16471e2007-12-19 14:14:47 +010059 }
60
61 /* read from serial port and display on console */
Asherah Connor5c935eb2021-03-10 22:39:23 +110062 if (dev->tstc(dev)) {
63 c = dev->getc(dev);
Harald Welted16471e2007-12-19 14:14:47 +010064 putc(c);
65 }
66 }
67 return 0;
68}
69
70
71/***************************************************/
72
73U_BOOT_CMD(
74 terminal, 3, 1, do_terminal,
Peter Tyser2fb26042009-01-27 18:03:12 -060075 "start terminal emulator",
Harald Welted16471e2007-12-19 14:14:47 +010076 ""
77);