Configure word length

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-07-18 15:07:59 +02:00
parent 91d135a12c
commit fd5b663793
5 changed files with 19 additions and 22 deletions

View file

@ -45,6 +45,12 @@
#define UART_ODD_PARITY 0x08 #define UART_ODD_PARITY 0x08
#define UART_EVEN_PARITY 0x18 #define UART_EVEN_PARITY 0x18
/* The type of word length. */
#define UART_5BITS_WORD 0x00
#define UART_6BITS_WORD 0x01
#define UART_7BITS_WORD 0x02
#define UART_8BITS_WORD 0x03
/* The type of the length of stop bit. */ /* The type of the length of stop bit. */
#define UART_1_STOP_BIT 0x00 #define UART_1_STOP_BIT 0x00
#define UART_2_STOP_BITS 0x04 #define UART_2_STOP_BITS 0x04

View file

@ -53,7 +53,7 @@ typedef enum
struct grub_serial_config struct grub_serial_config
{ {
unsigned speed; unsigned speed;
unsigned short word_len; int word_len;
grub_serial_parity_t parity; grub_serial_parity_t parity;
grub_serial_stop_bits_t stop_bits; grub_serial_stop_bits_t stop_bits;
}; };
@ -84,12 +84,6 @@ grub_err_t grub_serial_register (struct grub_serial_port *port);
void grub_serial_unregister (struct grub_serial_port *port); void grub_serial_unregister (struct grub_serial_port *port);
/* The type of word length. */
#define UART_5BITS_WORD 0x00
#define UART_6BITS_WORD 0x01
#define UART_7BITS_WORD 0x02
#define UART_8BITS_WORD 0x03
/* Set default settings. */ /* Set default settings. */
static inline grub_err_t static inline grub_err_t
grub_serial_config_defaults (struct grub_serial_port *port) grub_serial_config_defaults (struct grub_serial_port *port)
@ -101,7 +95,7 @@ grub_serial_config_defaults (struct grub_serial_port *port)
#else #else
.speed = 9600, .speed = 9600,
#endif #endif
.word_len = UART_8BITS_WORD, .word_len = 8,
.parity = GRUB_SERIAL_PARITY_NONE, .parity = GRUB_SERIAL_PARITY_NONE,
.stop_bits = GRUB_SERIAL_STOP_BITS_1 .stop_bits = GRUB_SERIAL_STOP_BITS_1
}; };

View file

@ -104,7 +104,8 @@ do_real_config (struct grub_serial_port *port)
/* Set the line status. */ /* Set the line status. */
status |= (parities[port->config.parity] status |= (parities[port->config.parity]
| port->config.word_len | stop_bits[port->config.stop_bits]); | (port->config.word_len - 5)
| stop_bits[port->config.stop_bits]);
grub_outb (status, port->port + UART_LCR); grub_outb (status, port->port + UART_LCR);
/* In Yeeloong serial port has only 3 wires. */ /* In Yeeloong serial port has only 3 wires. */
@ -185,6 +186,9 @@ serial_hw_configure (struct grub_serial_port *port,
&& config->stop_bits != GRUB_SERIAL_STOP_BITS_2) && config->stop_bits != GRUB_SERIAL_STOP_BITS_2)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unsupported stop bits"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "unsupported stop bits");
if (config->word_len < 5 || config->word_len > 8)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unsupported word length");
port->config = *config; port->config = *config;
port->configured = 0; port->configured = 0;

View file

@ -187,18 +187,7 @@ grub_cmd_serial (grub_extcmd_t cmd, int argc, char **args)
config.speed = grub_strtoul (state[2].arg, 0, 0); config.speed = grub_strtoul (state[2].arg, 0, 0);
if (state[3].set) if (state[3].set)
{ config.word_len = grub_strtoul (state[3].arg, 0, 0);
if (! grub_strcmp (state[3].arg, "5"))
config.word_len = UART_5BITS_WORD;
else if (! grub_strcmp (state[3].arg, "6"))
config.word_len = UART_6BITS_WORD;
else if (! grub_strcmp (state[3].arg, "7"))
config.word_len = UART_7BITS_WORD;
else if (! grub_strcmp (state[3].arg, "8"))
config.word_len = UART_8BITS_WORD;
else
return grub_error (GRUB_ERR_BAD_ARGUMENT, "bad word length");
}
if (state[4].set) if (state[4].set)
{ {

View file

@ -100,7 +100,8 @@ 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_USBSERIAL_DATA_CTRL, GRUB_USBSERIAL_DATA_CTRL,
parities[port->config.parity] parities[port->config.parity]
| stop_bits[port->config.stop_bits] , 0, 0, 0); | stop_bits[port->config.stop_bits]
| port->config.word_len, 0, 0, 0);
port->configured = 1; port->configured = 1;
} }
@ -155,6 +156,9 @@ usbserial_hw_configure (struct grub_serial_port *port,
&& config->stop_bits != GRUB_SERIAL_STOP_BITS_2) && config->stop_bits != GRUB_SERIAL_STOP_BITS_2)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unsupported stop bits"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "unsupported stop bits");
if (config->word_len < 5 || config->word_len > 8)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unsupported word length");
port->config = *config; port->config = *config;
port->configured = 0; port->configured = 0;