111
100
grub_outb (c, serial_settings.port + UART_TX);
115
serial_translate_key_sequence (void)
141
{('1' | ('~' << 8)), 1},
142
{('3' | ('~' << 8)), 4},
143
{('5' | ('~' << 8)), 7},
144
{('6' | ('~' << 8)), 3}
150
/* The buffer must start with "ESC [". */
151
if (input_buf[0] != '\e' || input_buf[1] != '[')
154
for (i = 0; i < ARRAY_SIZE (three_code_table); i++)
155
if (three_code_table[i].key == input_buf[2])
157
input_buf[0] = three_code_table[i].ascii;
159
grub_memmove (input_buf + 1, input_buf + 3, npending - 1);
165
short key = input_buf[3] | (input_buf[4] << 8);
167
for (i = 0; i < ARRAY_SIZE (four_code_table); i++)
168
if (four_code_table[i].key == key)
170
input_buf[0] = four_code_table[i].ascii;
172
grub_memmove (input_buf + 1, input_buf + 4, npending - 1);
179
fill_input_buf (const int nowait)
183
for (i = 0; i < 10000 && npending < sizeof (input_buf); i++)
187
c = serial_hw_fetch ();
190
input_buf[npending++] = c;
192
/* Reset the counter to zero, to wait for the same interval. */
200
/* Translate some key sequences. */
201
serial_translate_key_sequence ();
206
103
/* Convert speed to divisor. */
207
104
static unsigned short
208
105
serial_get_divisor (unsigned int speed)
300
169
/* In Yeeloong serial port has only 3 wires. */
301
170
#ifndef GRUB_MACHINE_MIPS_YEELOONG
302
171
/* Enable the FIFO. */
303
grub_outb (UART_ENABLE_FIFO, serial_settings.port + UART_FCR);
172
grub_outb (UART_ENABLE_FIFO_TRIGGER1, serial_settings.port + UART_FCR);
174
/* Turn on DTR and RTS. */
175
grub_outb (UART_ENABLE_DTRRTS, serial_settings.port + UART_MCR);
177
/* Enable the FIFO. */
178
grub_outb (UART_ENABLE_FIFO_TRIGGER14, serial_settings.port + UART_FCR);
305
180
/* Turn on DTR, RTS, and OUT2. */
306
grub_outb (UART_ENABLE_MODEM, serial_settings.port + UART_MCR);
181
grub_outb (UART_ENABLE_DTRRTS | UART_ENABLE_OUT2,
182
serial_settings.port + UART_MCR);
309
185
/* Drain the input buffer. */
310
while (grub_serial_checkkey () != -1)
311
(void) grub_serial_getkey ();
186
while (serial_hw_fetch () != -1);
313
188
/* FIXME: should check if the serial terminal was found. */
315
190
return GRUB_ERR_NONE;
318
/* The serial version of putchar. */
320
grub_serial_putchar (grub_uint32_t c)
322
/* Keep track of the cursor. */
325
/* The serial terminal does not have VGA fonts. */
328
/* Better than nothing. */
331
case GRUB_TERM_DISP_LEFT:
335
case GRUB_TERM_DISP_UP:
339
case GRUB_TERM_DISP_RIGHT:
343
case GRUB_TERM_DISP_DOWN:
347
case GRUB_TERM_DISP_HLINE:
351
case GRUB_TERM_DISP_VLINE:
355
case GRUB_TERM_DISP_UL:
356
case GRUB_TERM_DISP_UR:
357
case GRUB_TERM_DISP_LL:
358
case GRUB_TERM_DISP_LR:
380
if (ypos < TEXT_HEIGHT - 1)
389
if (xpos >= TEXT_WIDTH)
403
grub_serial_getcharwidth (grub_uint32_t c __attribute__ ((unused)))
408
193
static grub_uint16_t
409
grub_serial_getwh (void)
194
grub_serial_getwh (struct grub_term_output *term __attribute__ ((unused)))
196
const grub_uint8_t TEXT_WIDTH = 80;
197
const grub_uint8_t TEXT_HEIGHT = 24;
411
198
return (TEXT_WIDTH << 8) | TEXT_HEIGHT;
415
grub_serial_getxy (void)
417
return ((xpos << 8) | ypos);
421
grub_serial_gotoxy (grub_uint8_t x, grub_uint8_t y)
423
if (x > TEXT_WIDTH || y > TEXT_HEIGHT)
425
grub_error (GRUB_ERR_OUT_OF_RANGE, "invalid point (%u,%u)", x, y);
430
grub_terminfo_gotoxy (x, y, &grub_serial_term_output);
439
grub_serial_cls (void)
442
grub_terminfo_cls (&grub_serial_term_output);
449
grub_serial_setcolorstate (const grub_term_color_state state)
454
case GRUB_TERM_COLOR_STANDARD:
455
case GRUB_TERM_COLOR_NORMAL:
456
grub_terminfo_reverse_video_off (&grub_serial_term_output);
458
case GRUB_TERM_COLOR_HIGHLIGHT:
459
grub_terminfo_reverse_video_on (&grub_serial_term_output);
468
grub_serial_setcursor (const int on)
471
grub_terminfo_cursor_on (&grub_serial_term_output);
473
grub_terminfo_cursor_off (&grub_serial_term_output);
201
struct grub_terminfo_input_state grub_serial_terminfo_input =
203
.readkey = serial_hw_fetch
206
struct grub_terminfo_output_state grub_serial_terminfo_output =
476
211
static struct grub_term_input grub_serial_term_input =
478
213
.name = "serial",
479
.checkkey = grub_serial_checkkey,
480
.getkey = grub_serial_getkey,
214
.init = grub_terminfo_input_init,
215
.checkkey = grub_terminfo_checkkey,
216
.getkey = grub_terminfo_getkey,
217
.data = &grub_serial_terminfo_input
483
220
static struct grub_term_output grub_serial_term_output =
485
222
.name = "serial",
486
.putchar = grub_serial_putchar,
487
.getcharwidth = grub_serial_getcharwidth,
223
.putchar = grub_terminfo_putchar,
488
224
.getwh = grub_serial_getwh,
489
.getxy = grub_serial_getxy,
490
.gotoxy = grub_serial_gotoxy,
491
.cls = grub_serial_cls,
492
.setcolorstate = grub_serial_setcolorstate,
493
.setcursor = grub_serial_setcursor,
225
.getxy = grub_terminfo_getxy,
226
.gotoxy = grub_terminfo_gotoxy,
227
.cls = grub_terminfo_cls,
228
.setcolorstate = grub_terminfo_setcolorstate,
229
.setcursor = grub_terminfo_setcursor,
230
.flags = GRUB_TERM_CODE_TYPE_ASCII,
231
.data = &grub_serial_terminfo_output,
232
.normal_color = GRUB_TERM_DEFAULT_NORMAL_COLOR,
233
.highlight_color = GRUB_TERM_DEFAULT_HIGHLIGHT_COLOR,