RTS/CTS flow control.
+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>
* grub-core/lib/libgcrypt/cipher/idea.c (mul_inv): Remove signed
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
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_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);
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
0x22, 3, 0, 0, 0);
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;
}
stop_bits[port->config.stop_bits]);
if (status != GRUB_EFI_SUCCESS)
port->broken = 1;
+
+ status = efi_call_2 (port->interface->set_control_bits, port->interface,
+ port->config.rtscts ? 0x4002 : 0x2);
+
port->configured = 1;
}
| stop_bits[port->config.stop_bits]);
grub_outb (status, port->port + UART_LCR);
- /* On Loongson machines serial port has only 3 wires. */
-#ifndef GRUB_MACHINE_MIPS_LOONGSON
- /* Enable the FIFO. */
- grub_outb (UART_ENABLE_FIFO_TRIGGER1, port->port + UART_FCR);
+ if (port->config.rtscts)
+ {
+ /* Enable the FIFO. */
+ grub_outb (UART_ENABLE_FIFO_TRIGGER1, port->port + UART_FCR);
- /* Turn on DTR and RTS. */
- grub_outb (UART_ENABLE_DTRRTS, port->port + UART_MCR);
-#else
- /* Enable the FIFO. */
- grub_outb (UART_ENABLE_FIFO_TRIGGER14, port->port + UART_FCR);
+ /* Turn on DTR and RTS. */
+ grub_outb (UART_ENABLE_DTRRTS, port->port + UART_MCR);
+ }
+ else
+ {
+ /* Enable the FIFO. */
+ grub_outb (UART_ENABLE_FIFO_TRIGGER14, port->port + UART_FCR);
- /* Turn on DTR, RTS, and OUT2. */
- grub_outb (UART_ENABLE_DTRRTS | UART_ENABLE_OUT2, port->port + UART_MCR);
-#endif
+ /* Turn on DTR, RTS, and OUT2. */
+ grub_outb (UART_ENABLE_DTRRTS | UART_ENABLE_OUT2, port->port + UART_MCR);
+ }
/* Drain the input buffer. */
endtime = grub_get_time_ms () + 1000;
OPTION_WORD,
OPTION_PARITY,
OPTION_STOP,
- OPTION_BASE_CLOCK
+ OPTION_BASE_CLOCK,
+ OPTION_RTSCTS
};
/* Argument options. */
{"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},
{"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}
};
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 (! grub_strcmp (state[OPTION_STOP].arg, "1"))
grub_efi_parity_type_t parity,
grub_uint8_t word_len,
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);
grub_efi_status_t (*write) (struct grub_efi_serial_io_interface *this,
grub_efi_uintn_t *buf_size,
grub_serial_parity_t parity;
grub_serial_stop_bits_t stop_bits;
grub_uint64_t base_clock;
+ int rtscts;
};
struct grub_serial_port
{
#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,