2 * Copyright (c) 2011 The Chromium OS Authors.
4 * SPDX-License-Identifier: GPL-2.0+
8 * This provide a test serial port. It provides an emulated serial port where
9 * a test program and read out the serial output and inject serial input for
16 #include <linux/compiler.h>
20 * serial_buf: A buffer that holds keyboard characters for the
24 * serial_buf_write == serial_buf_read -> empty buffer
25 * (serial_buf_write + 1) % 16 == serial_buf_read -> full buffer
27 static char serial_buf
[16];
28 static unsigned int serial_buf_write
;
29 static unsigned int serial_buf_read
;
31 static int sandbox_serial_init(void)
37 static void sandbox_serial_setbrg(void)
41 static void sandbox_serial_putc(const char ch
)
46 static void sandbox_serial_puts(const char *str
)
48 os_write(1, str
, strlen(str
));
51 static unsigned int increment_buffer_index(unsigned int index
)
53 return (index
+ 1) % ARRAY_SIZE(serial_buf
);
56 static int sandbox_serial_tstc(void)
58 const unsigned int next_index
=
59 increment_buffer_index(serial_buf_write
);
63 if (next_index
== serial_buf_read
)
64 return 1; /* buffer full */
66 count
= os_read_no_block(0, &serial_buf
[serial_buf_write
], 1);
68 serial_buf_write
= next_index
;
69 return serial_buf_write
!= serial_buf_read
;
72 static int sandbox_serial_getc(void)
76 while (!sandbox_serial_tstc())
79 result
= serial_buf
[serial_buf_read
];
80 serial_buf_read
= increment_buffer_index(serial_buf_read
);
84 static struct serial_device sandbox_serial_drv
= {
85 .name
= "sandbox_serial",
86 .start
= sandbox_serial_init
,
88 .setbrg
= sandbox_serial_setbrg
,
89 .putc
= sandbox_serial_putc
,
90 .puts
= sandbox_serial_puts
,
91 .getc
= sandbox_serial_getc
,
92 .tstc
= sandbox_serial_tstc
,
95 void sandbox_serial_initialize(void)
97 serial_register(&sandbox_serial_drv
);
100 __weak
struct serial_device
*default_serial_console(void)
102 return &sandbox_serial_drv
;