8 enum Echo_type { Echo_off = 0, Echo_on = 1, Echo_crnl = 2 };
12 // ---------------------------------------------------------------------------
17 static Irq_base *vkey_irq;
21 Vkey::irq(Irq_base *i)
24 // ---------------------------------------------------------------------------
25 IMPLEMENTATION [debug && serial && !ux]:
32 #include "kernel_console.h"
36 static Vkey::Echo_type vkey_echo;
37 static char vkey_buffer[256];
38 static unsigned vkey_tail, vkey_head;
39 static Console *uart = Kconsole::console()->find_console(Console::UART);
43 Vkey::set_echo(Echo_type echo)
53 unsigned nh = (vkey_head + 1) % sizeof(vkey_buffer);
54 unsigned oh = vkey_head;
57 vkey_buffer[vkey_head] = c;
64 if (vkey_echo == Vkey::Echo_crnl && c == '\r')
75 Vkey::add(const char *seq)
109 // disable last branch recording, branch trace recording ...
110 Cpu::cpus.cpu(current_cpu()).debugctl_disable();
114 int c = uart->getchar(false);
121 ret = 0; // break into kernel debugger
127 case KEY_CURSOR_UP: hit |= add("\033[A"); break;
128 case KEY_CURSOR_DOWN: hit |= add("\033[B"); break;
129 case KEY_CURSOR_LEFT: hit |= add("\033[D"); break;
130 case KEY_CURSOR_RIGHT: hit |= add("\033[C"); break;
131 case KEY_CURSOR_HOME: hit |= add("\033[1~"); break;
132 case KEY_CURSOR_END: hit |= add("\033[4~"); break;
133 case KEY_PAGE_UP: hit |= add("\033[5~"); break;
134 case KEY_PAGE_DOWN: hit |= add("\033[6~"); break;
135 case KEY_INSERT: hit |= add("\033[2~"); break;
136 case KEY_DELETE: hit |= add("\033[3~"); break;
137 case KEY_F1: hit |= add("\033OP"); break;
138 case KEY_BACKSPACE: hit |= add(127); break;
139 case KEY_TAB: hit |= add(9); break;
140 case KEY_ESC: hit |= add(27); break;
141 case KEY_RETURN: hit |= add(13); break;
142 default: hit |= add(c); break;
149 // Hmmm, we assume that a console with the UART flag set is of type Uart
150 if (Config::serial_esc == Config::SERIAL_ESC_IRQ)
151 static_cast<Uart*>(uart)->enable_rcv_irq();
153 // reenable debug stuff (undo debugctl_disable)
154 Cpu::cpus.cpu(current_cpu()).debugctl_enable();
163 if (vkey_tail != vkey_head)
164 return vkey_buffer[vkey_tail];
173 if (vkey_tail != vkey_head)
174 vkey_tail = (vkey_tail + 1) % sizeof(vkey_buffer);
177 //----------------------------------------------------------------------------
178 IMPLEMENTATION [!debug || !serial || ux]:
182 Vkey::set_echo(Echo_type)
195 //----------------------------------------------------------------------------
196 IMPLEMENTATION [debug && (!serial || ux)]:
198 #include "kernel_console.h"
204 return Kconsole::console()->getchar(0);
207 //----------------------------------------------------------------------------
208 IMPLEMENTATION [!debug && serial]:
210 #include "kernel_console.h"
211 #include "kernel_uart.h"
213 static Console *uart = Kconsole::console()->find_console(Console::UART);
219 return uart->getchar(false);
222 //----------------------------------------------------------------------------
223 IMPLEMENTATION[!debug && !serial]:
230 //----------------------------------------------------------------------------
231 IMPLEMENTATION[!debug || !serial]:
235 Vkey::check_(int = -1)