123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- /* 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
- {
- struct
- {
- bool use_mmio;
- union
- {
- #if defined(__mips__) || defined (__i386__) || defined (__x86_64__)
- grub_port_t port;
- #endif
- struct
- {
- grub_addr_t base;
- /* Access size uses ACPI definition */
- grub_uint8_t access_size;
- } mmio;
- };
- };
- 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);
- struct grub_serial_port *grub_ns8250_spcr_init (void);
- struct grub_serial_port *grub_serial_ns8250_add_port (grub_port_t port,
- struct grub_serial_config *config);
- struct grub_serial_port *grub_serial_ns8250_add_mmio (grub_addr_t addr,
- unsigned int acc_size,
- struct grub_serial_config *config);
- #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);
- struct grub_serial_port *grub_arcserial_add_port (const char *path);
- #endif
- #if defined(__i386__) || defined(__x86_64__)
- extern void grub_pciserial_init (void);
- #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
- extern struct grub_serial_port *grub_serial_ports;
- #define FOR_SERIAL_PORTS(var) FOR_LIST_ELEMENTS((var), (grub_serial_ports))
- #endif
|