* grub-core/term/serial.c: Add option for enabling/disabling
RTS/CTS flow control.
This commit is contained in:
parent
2dc1eb6cbf
commit
9f8acdaa5d
8 changed files with 48 additions and 17 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2013-11-08 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* b/grub-core/term/serial.c: Add option for enabling/disabling
|
||||||
|
RTS/CTS flow control.
|
||||||
|
|
||||||
2013-11-08 Vladimir Serbinenko <phcoder@gmail.com>
|
2013-11-08 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/lib/libgcrypt/cipher/idea.c (mul_inv): Remove signed
|
* grub-core/lib/libgcrypt/cipher/idea.c (mul_inv): Remove signed
|
||||||
|
|
|
@ -91,11 +91,13 @@ real_config (struct grub_serial_port *port)
|
||||||
|
|
||||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||||
GRUB_FTDI_MODEM_CTRL,
|
GRUB_FTDI_MODEM_CTRL,
|
||||||
GRUB_FTDI_MODEM_CTRL_DTRRTS, 0, 0, 0);
|
port->config.rtscts ? GRUB_FTDI_MODEM_CTRL_DTRRTS : 0,
|
||||||
|
0, 0, 0);
|
||||||
|
|
||||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||||
GRUB_FTDI_FLOW_CTRL,
|
GRUB_FTDI_FLOW_CTRL,
|
||||||
GRUB_FTDI_FLOW_CTRL_DTRRTS, 0, 0, 0);
|
port->config.rtscts ? GRUB_FTDI_FLOW_CTRL_DTRRTS : 0,
|
||||||
|
0, 0, 0);
|
||||||
|
|
||||||
divisor = get_divisor (port->config.speed);
|
divisor = get_divisor (port->config.speed);
|
||||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||||
|
|
|
@ -125,7 +125,7 @@ real_config (struct grub_serial_port *port)
|
||||||
0x22, 3, 0, 0, 0);
|
0x22, 3, 0, 0, 0);
|
||||||
|
|
||||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||||
1, 0, 0x61, 0, 0);
|
1, 0, port->config.rtscts ? 0x61 : 0, 0, 0);
|
||||||
port->configured = 1;
|
port->configured = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,10 @@ do_real_config (struct grub_serial_port *port)
|
||||||
stop_bits[port->config.stop_bits]);
|
stop_bits[port->config.stop_bits]);
|
||||||
if (status != GRUB_EFI_SUCCESS)
|
if (status != GRUB_EFI_SUCCESS)
|
||||||
port->broken = 1;
|
port->broken = 1;
|
||||||
|
|
||||||
|
status = efi_call_2 (port->interface->set_control_bits, port->interface,
|
||||||
|
port->config.rtscts ? 0x4002 : 0x2);
|
||||||
|
|
||||||
port->configured = 1;
|
port->configured = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,20 +107,22 @@ do_real_config (struct grub_serial_port *port)
|
||||||
| stop_bits[port->config.stop_bits]);
|
| stop_bits[port->config.stop_bits]);
|
||||||
grub_outb (status, port->port + UART_LCR);
|
grub_outb (status, port->port + UART_LCR);
|
||||||
|
|
||||||
/* On Loongson machines serial port has only 3 wires. */
|
if (port->config.rtscts)
|
||||||
#ifndef GRUB_MACHINE_MIPS_LOONGSON
|
{
|
||||||
/* Enable the FIFO. */
|
/* Enable the FIFO. */
|
||||||
grub_outb (UART_ENABLE_FIFO_TRIGGER1, port->port + UART_FCR);
|
grub_outb (UART_ENABLE_FIFO_TRIGGER1, port->port + UART_FCR);
|
||||||
|
|
||||||
/* Turn on DTR and RTS. */
|
/* Turn on DTR and RTS. */
|
||||||
grub_outb (UART_ENABLE_DTRRTS, port->port + UART_MCR);
|
grub_outb (UART_ENABLE_DTRRTS, port->port + UART_MCR);
|
||||||
#else
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
/* Enable the FIFO. */
|
/* Enable the FIFO. */
|
||||||
grub_outb (UART_ENABLE_FIFO_TRIGGER14, port->port + UART_FCR);
|
grub_outb (UART_ENABLE_FIFO_TRIGGER14, port->port + UART_FCR);
|
||||||
|
|
||||||
/* Turn on DTR, RTS, and OUT2. */
|
/* Turn on DTR, RTS, and OUT2. */
|
||||||
grub_outb (UART_ENABLE_DTRRTS | UART_ENABLE_OUT2, port->port + UART_MCR);
|
grub_outb (UART_ENABLE_DTRRTS | UART_ENABLE_OUT2, port->port + UART_MCR);
|
||||||
#endif
|
}
|
||||||
|
|
||||||
/* Drain the input buffer. */
|
/* Drain the input buffer. */
|
||||||
endtime = grub_get_time_ms () + 1000;
|
endtime = grub_get_time_ms () + 1000;
|
||||||
|
|
|
@ -47,7 +47,8 @@ enum
|
||||||
OPTION_WORD,
|
OPTION_WORD,
|
||||||
OPTION_PARITY,
|
OPTION_PARITY,
|
||||||
OPTION_STOP,
|
OPTION_STOP,
|
||||||
OPTION_BASE_CLOCK
|
OPTION_BASE_CLOCK,
|
||||||
|
OPTION_RTSCTS
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Argument options. */
|
/* Argument options. */
|
||||||
|
@ -60,6 +61,7 @@ static const struct grub_arg_option options[] =
|
||||||
{"parity", 'r', 0, N_("Set the serial port parity."), 0, ARG_TYPE_STRING},
|
{"parity", 'r', 0, N_("Set the serial port parity."), 0, ARG_TYPE_STRING},
|
||||||
{"stop", 't', 0, N_("Set the serial port stop bits."), 0, ARG_TYPE_INT},
|
{"stop", 't', 0, N_("Set the serial port stop bits."), 0, ARG_TYPE_INT},
|
||||||
{"base-clock", 'b', 0, N_("Set the base clock."), 0, ARG_TYPE_STRING},
|
{"base-clock", 'b', 0, N_("Set the base clock."), 0, ARG_TYPE_STRING},
|
||||||
|
{"rtscts", 'f', 0, N_("Enable/disable RTS/CTS."), "on|off", ARG_TYPE_STRING},
|
||||||
{0, 0, 0, 0, 0, 0}
|
{0, 0, 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -237,6 +239,17 @@ grub_cmd_serial (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
N_("unsupported serial port parity"));
|
N_("unsupported serial port parity"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (state[OPTION_RTSCTS].set)
|
||||||
|
{
|
||||||
|
if (grub_strcmp (state[OPTION_PARITY].arg, "on") == 0)
|
||||||
|
config.rtscts = 1;
|
||||||
|
if (grub_strcmp (state[OPTION_PARITY].arg, "off") == 0)
|
||||||
|
config.rtscts = 0;
|
||||||
|
else
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("unsupported serial port flow"));
|
||||||
|
}
|
||||||
|
|
||||||
if (state[OPTION_STOP].set)
|
if (state[OPTION_STOP].set)
|
||||||
{
|
{
|
||||||
if (! grub_strcmp (state[OPTION_STOP].arg, "1"))
|
if (! grub_strcmp (state[OPTION_STOP].arg, "1"))
|
||||||
|
|
|
@ -1244,7 +1244,8 @@ struct grub_efi_serial_io_interface
|
||||||
grub_efi_parity_type_t parity,
|
grub_efi_parity_type_t parity,
|
||||||
grub_uint8_t word_len,
|
grub_uint8_t word_len,
|
||||||
grub_efi_stop_bits_t stop_bits);
|
grub_efi_stop_bits_t stop_bits);
|
||||||
void (*set_control_bits) (void);
|
grub_efi_status_t (*set_control_bits) (struct grub_efi_serial_io_interface *this,
|
||||||
|
grub_efi_uint32_t flags);
|
||||||
void (*get_control_bits) (void);
|
void (*get_control_bits) (void);
|
||||||
grub_efi_status_t (*write) (struct grub_efi_serial_io_interface *this,
|
grub_efi_status_t (*write) (struct grub_efi_serial_io_interface *this,
|
||||||
grub_efi_uintn_t *buf_size,
|
grub_efi_uintn_t *buf_size,
|
||||||
|
|
|
@ -68,6 +68,7 @@ struct grub_serial_config
|
||||||
grub_serial_parity_t parity;
|
grub_serial_parity_t parity;
|
||||||
grub_serial_stop_bits_t stop_bits;
|
grub_serial_stop_bits_t stop_bits;
|
||||||
grub_uint64_t base_clock;
|
grub_uint64_t base_clock;
|
||||||
|
int rtscts;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct grub_serial_port
|
struct grub_serial_port
|
||||||
|
@ -159,8 +160,11 @@ grub_serial_config_defaults (struct grub_serial_port *port)
|
||||||
{
|
{
|
||||||
#ifdef GRUB_MACHINE_MIPS_LOONGSON
|
#ifdef GRUB_MACHINE_MIPS_LOONGSON
|
||||||
.speed = 115200,
|
.speed = 115200,
|
||||||
|
/* On Loongson machines serial port has only 3 wires. */
|
||||||
|
.rtscts = 0,
|
||||||
#else
|
#else
|
||||||
.speed = 9600,
|
.speed = 9600,
|
||||||
|
.rtscts = 1,
|
||||||
#endif
|
#endif
|
||||||
.word_len = 8,
|
.word_len = 8,
|
||||||
.parity = GRUB_SERIAL_PARITY_NONE,
|
.parity = GRUB_SERIAL_PARITY_NONE,
|
||||||
|
|
Loading…
Reference in a new issue