| /* serial.h - serial device interface */ |
| /* |
| * GRUB -- GRand Unified Bootloader |
| * Copyright (C) 2010 Free Software Foundation, Inc. |
| * |
| * GRUB is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation, either version 3 of the License, or |
| * (at your option) any later version. |
| * |
| * GRUB is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with GRUB. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| #ifndef GRUB_SERIAL_HEADER |
| #define GRUB_SERIAL_HEADER 1 |
| |
| #include <grub/types.h> |
| #if defined(__mips__) || defined (__i386__) || defined (__x86_64__) |
| #include <grub/cpu/io.h> |
| #endif |
| #include <grub/usb.h> |
| #include <grub/list.h> |
| #include <grub/term.h> |
| #ifdef GRUB_MACHINE_IEEE1275 |
| #include <grub/ieee1275/ieee1275.h> |
| #endif |
| #ifdef GRUB_MACHINE_ARC |
| #include <grub/arc/arc.h> |
| #endif |
| |
| struct grub_serial_port; |
| struct grub_serial_config; |
| |
| struct grub_serial_driver |
| { |
| grub_err_t (*configure) (struct grub_serial_port *port, |
| struct grub_serial_config *config); |
| int (*fetch) (struct grub_serial_port *port); |
| void (*put) (struct grub_serial_port *port, const int c); |
| void (*fini) (struct grub_serial_port *port); |
| }; |
| |
| /* The type of parity. */ |
| typedef enum |
| { |
| GRUB_SERIAL_PARITY_NONE, |
| GRUB_SERIAL_PARITY_ODD, |
| GRUB_SERIAL_PARITY_EVEN, |
| } grub_serial_parity_t; |
| |
| typedef enum |
| { |
| GRUB_SERIAL_STOP_BITS_1, |
| GRUB_SERIAL_STOP_BITS_1_5, |
| GRUB_SERIAL_STOP_BITS_2, |
| } grub_serial_stop_bits_t; |
| |
| struct grub_serial_config |
| { |
| unsigned speed; |
| int word_len; |
| grub_serial_parity_t parity; |
| grub_serial_stop_bits_t stop_bits; |
| grub_uint64_t base_clock; |
| int rtscts; |
| }; |
| |
| struct grub_serial_port |
| { |
| struct grub_serial_port *next; |
| struct grub_serial_port **prev; |
| char *name; |
| struct grub_serial_driver *driver; |
| struct grub_serial_config config; |
| int configured; |
| int broken; |
| |
| /* This should be void *data but since serial is useful as an early console |
| when malloc isn't available it's a union. |
| */ |
| union |
| { |
| #if defined(__mips__) || defined (__i386__) || defined (__x86_64__) |
| grub_port_t port; |
| #endif |
| struct |
| { |
| grub_usb_device_t usbdev; |
| int configno; |
| int interfno; |
| char buf[64]; |
| int bufstart, bufend; |
| struct grub_usb_desc_endp *in_endp; |
| struct grub_usb_desc_endp *out_endp; |
| }; |
| struct grub_escc_descriptor *escc_desc; |
| #ifdef GRUB_MACHINE_IEEE1275 |
| struct |
| { |
| grub_ieee1275_ihandle_t handle; |
| struct ofserial_hash_ent *elem; |
| }; |
| #endif |
| #ifdef GRUB_MACHINE_EFI |
| struct grub_efi_serial_io_interface *interface; |
| #endif |
| #ifdef GRUB_MACHINE_ARC |
| struct |
| { |
| grub_arc_fileno_t handle; |
| int handle_valid; |
| }; |
| #endif |
| }; |
| grub_term_output_t term_out; |
| grub_term_input_t term_in; |
| }; |
| |
| grub_err_t EXPORT_FUNC(grub_serial_register) (struct grub_serial_port *port); |
| |
| void EXPORT_FUNC(grub_serial_unregister) (struct grub_serial_port *port); |
| |
| /* Convenience functions to perform primitive operations on a port. */ |
| static inline grub_err_t |
| grub_serial_port_configure (struct grub_serial_port *port, |
| struct grub_serial_config *config) |
| { |
| return port->driver->configure (port, config); |
| } |
| |
| static inline int |
| grub_serial_port_fetch (struct grub_serial_port *port) |
| { |
| return port->driver->fetch (port); |
| } |
| |
| static inline void |
| grub_serial_port_put (struct grub_serial_port *port, const int c) |
| { |
| port->driver->put (port, c); |
| } |
| |
| static inline void |
| grub_serial_port_fini (struct grub_serial_port *port) |
| { |
| port->driver->fini (port); |
| } |
| |
| /* Set default settings. */ |
| static inline grub_err_t |
| grub_serial_config_defaults (struct grub_serial_port *port) |
| { |
| struct grub_serial_config config = |
| { |
| #ifdef GRUB_MACHINE_MIPS_LOONGSON |
| .speed = 115200, |
| /* On Loongson machines serial port has only 3 wires. */ |
| .rtscts = 0, |
| #else |
| .speed = 9600, |
| .rtscts = 1, |
| #endif |
| .word_len = 8, |
| .parity = GRUB_SERIAL_PARITY_NONE, |
| .stop_bits = GRUB_SERIAL_STOP_BITS_1, |
| .base_clock = 0 |
| }; |
| |
| return port->driver->configure (port, &config); |
| } |
| |
| #if defined(__mips__) || defined (__i386__) || defined (__x86_64__) |
| void grub_ns8250_init (void); |
| char *grub_serial_ns8250_add_port (grub_port_t port); |
| #endif |
| #ifdef GRUB_MACHINE_IEEE1275 |
| void grub_ofserial_init (void); |
| #endif |
| #ifdef GRUB_MACHINE_EFI |
| void |
| grub_efiserial_init (void); |
| #endif |
| #ifdef GRUB_MACHINE_ARC |
| void |
| grub_arcserial_init (void); |
| const char * |
| grub_arcserial_add_port (const char *path); |
| #endif |
| |
| struct grub_serial_port *grub_serial_find (const char *name); |
| extern struct grub_serial_driver grub_ns8250_driver; |
| void EXPORT_FUNC(grub_serial_unregister_driver) (struct grub_serial_driver *driver); |
| |
| #ifndef GRUB_MACHINE_EMU |
| extern void grub_serial_init (void); |
| extern void grub_serial_fini (void); |
| #endif |
| |
| #endif |