diff options
-rw-r--r-- | hw/serial.c | 11 | ||||
-rw-r--r-- | vl.h | 28 |
2 files changed, 29 insertions, 10 deletions
diff --git a/hw/serial.c b/hw/serial.c index 75be4de12e..0250d77fb4 100644 --- a/hw/serial.c +++ b/hw/serial.c @@ -107,6 +107,7 @@ static void serial_update_irq(SerialState *s) static void serial_update_parameters(SerialState *s) { int speed, parity, data_bits, stop_bits; + QEMUSerialSetParams ssp; if (s->lcr & 0x08) { if (s->lcr & 0x10) @@ -124,7 +125,12 @@ static void serial_update_parameters(SerialState *s) if (s->divider == 0) return; speed = 115200 / s->divider; -#if 0 + ssp.speed = speed; + ssp.parity = parity; + ssp.data_bits = data_bits; + ssp.stop_bits = stop_bits; + qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp); +#if 0 printf("speed=%d parity=%c data=%d stop=%d\n", speed, parity, data_bits, stop_bits); #endif @@ -179,7 +185,8 @@ static void serial_ioport_write(void *opaque, uint32_t addr, uint32_t val) break_enable = (val >> 6) & 1; if (break_enable != s->last_break_enable) { s->last_break_enable = break_enable; - qemu_chr_set_serial_break(s, break_enable); + qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_BREAK, + &break_enable); } } break; @@ -200,6 +200,24 @@ void qemu_del_fd_read_handler(int fd); #define CHR_EVENT_BREAK 0 /* serial break char */ #define CHR_EVENT_FOCUS 1 /* focus to this terminal (modal input needed) */ + + +#define CHR_IOCTL_SERIAL_SET_PARAMS 1 +typedef struct { + int speed; + int parity; + int data_bits; + int stop_bits; +} QEMUSerialSetParams; + +#define CHR_IOCTL_SERIAL_SET_BREAK 2 + +#define CHR_IOCTL_PP_READ_DATA 3 +#define CHR_IOCTL_PP_WRITE_DATA 4 +#define CHR_IOCTL_PP_READ_CONTROL 5 +#define CHR_IOCTL_PP_WRITE_CONTROL 6 +#define CHR_IOCTL_PP_READ_STATUS 7 + typedef void IOEventHandler(void *opaque, int event); typedef struct CharDriverState { @@ -207,10 +225,7 @@ typedef struct CharDriverState { void (*chr_add_read_handler)(struct CharDriverState *s, IOCanRWHandler *fd_can_read, IOReadHandler *fd_read, void *opaque); - void (*chr_set_serial_parameters)(struct CharDriverState *s, - int speed, int parity, - int data_bits, int stop_bits); - void (*chr_set_serial_break)(struct CharDriverState *s, int enable); + int (*chr_ioctl)(struct CharDriverState *s, int cmd, void *arg); IOEventHandler *chr_event; void (*chr_send_event)(struct CharDriverState *chr, int event); void *opaque; @@ -223,10 +238,7 @@ void qemu_chr_add_read_handler(CharDriverState *s, IOCanRWHandler *fd_can_read, IOReadHandler *fd_read, void *opaque); void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event); -void qemu_chr_set_serial_parameters(CharDriverState *s, - int speed, int parity, - int data_bits, int stop_bits); -void qemu_chr_set_serial_break(CharDriverState *s, int enable); +int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg); /* consoles */ |