mirror of https://github.com/xemu-project/xemu.git
Change the usb-serial product ID to a more widely recognised value (Samuel Thibault).
Implement chr_close callback for "stdio" so that it can be closed and reopened. Free chr devices after they're closed. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3927 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
db380c066d
commit
a11d070e38
|
@ -486,7 +486,7 @@ USBDevice *usb_serial_init(const char *filename)
|
||||||
{
|
{
|
||||||
USBSerialState *s;
|
USBSerialState *s;
|
||||||
CharDriverState *cdrv;
|
CharDriverState *cdrv;
|
||||||
unsigned short vendorid = 0x0403, productid = 0xFF00;
|
unsigned short vendorid = 0x0403, productid = 0x6001;
|
||||||
|
|
||||||
while (*filename && *filename != ':') {
|
while (*filename && *filename != ':') {
|
||||||
const char *p;
|
const char *p;
|
||||||
|
|
|
@ -1594,7 +1594,7 @@ Standard USB keyboard. Will override the PS/2 keyboard (if present).
|
||||||
Serial converter. This emulates an FTDI FT232BM chip connected to host character
|
Serial converter. This emulates an FTDI FT232BM chip connected to host character
|
||||||
device @var{dev}. The available character devices are the same as for the
|
device @var{dev}. The available character devices are the same as for the
|
||||||
@code{-serial} option. The @code{vendorid} and @code{productid} options can be
|
@code{-serial} option. The @code{vendorid} and @code{productid} options can be
|
||||||
used to override the default 0403:FF00. For instance,
|
used to override the default 0403:6001. For instance,
|
||||||
@example
|
@example
|
||||||
usb_add serial:productid=FA00:tcp:192.168.0.2:4444
|
usb_add serial:productid=FA00:tcp:192.168.0.2:4444
|
||||||
@end example
|
@end example
|
||||||
|
|
29
vl.c
29
vl.c
|
@ -2050,6 +2050,20 @@ static void fd_chr_update_read_handler(CharDriverState *chr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fd_chr_close(struct CharDriverState *chr)
|
||||||
|
{
|
||||||
|
FDCharDriver *s = chr->opaque;
|
||||||
|
|
||||||
|
if (s->fd_in >= 0) {
|
||||||
|
if (nographic && s->fd_in == 0) {
|
||||||
|
} else {
|
||||||
|
qemu_set_fd_handler2(s->fd_in, NULL, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qemu_free(s);
|
||||||
|
}
|
||||||
|
|
||||||
/* open a character device to a unix fd */
|
/* open a character device to a unix fd */
|
||||||
static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
|
static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
|
||||||
{
|
{
|
||||||
|
@ -2069,6 +2083,7 @@ static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
|
||||||
chr->opaque = s;
|
chr->opaque = s;
|
||||||
chr->chr_write = fd_chr_write;
|
chr->chr_write = fd_chr_write;
|
||||||
chr->chr_update_read_handler = fd_chr_update_read_handler;
|
chr->chr_update_read_handler = fd_chr_update_read_handler;
|
||||||
|
chr->chr_close = fd_chr_close;
|
||||||
|
|
||||||
qemu_chr_reset(chr);
|
qemu_chr_reset(chr);
|
||||||
|
|
||||||
|
@ -2155,6 +2170,7 @@ static void stdio_read(void *opaque)
|
||||||
/* init terminal so that we can grab keys */
|
/* init terminal so that we can grab keys */
|
||||||
static struct termios oldtty;
|
static struct termios oldtty;
|
||||||
static int old_fd0_flags;
|
static int old_fd0_flags;
|
||||||
|
static int term_atexit_done;
|
||||||
|
|
||||||
static void term_exit(void)
|
static void term_exit(void)
|
||||||
{
|
{
|
||||||
|
@ -2184,11 +2200,20 @@ static void term_init(void)
|
||||||
|
|
||||||
tcsetattr (0, TCSANOW, &tty);
|
tcsetattr (0, TCSANOW, &tty);
|
||||||
|
|
||||||
atexit(term_exit);
|
if (!term_atexit_done++)
|
||||||
|
atexit(term_exit);
|
||||||
|
|
||||||
fcntl(0, F_SETFL, O_NONBLOCK);
|
fcntl(0, F_SETFL, O_NONBLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void qemu_chr_close_stdio(struct CharDriverState *chr)
|
||||||
|
{
|
||||||
|
term_exit();
|
||||||
|
stdio_nb_clients--;
|
||||||
|
qemu_set_fd_handler2(0, NULL, NULL, NULL, NULL);
|
||||||
|
fd_chr_close(chr);
|
||||||
|
}
|
||||||
|
|
||||||
static CharDriverState *qemu_chr_open_stdio(void)
|
static CharDriverState *qemu_chr_open_stdio(void)
|
||||||
{
|
{
|
||||||
CharDriverState *chr;
|
CharDriverState *chr;
|
||||||
|
@ -2196,6 +2221,7 @@ static CharDriverState *qemu_chr_open_stdio(void)
|
||||||
if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
|
if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
|
||||||
return NULL;
|
return NULL;
|
||||||
chr = qemu_chr_open_fd(0, 1);
|
chr = qemu_chr_open_fd(0, 1);
|
||||||
|
chr->chr_close = qemu_chr_close_stdio;
|
||||||
qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, chr);
|
qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, chr);
|
||||||
stdio_nb_clients++;
|
stdio_nb_clients++;
|
||||||
term_init();
|
term_init();
|
||||||
|
@ -3418,6 +3444,7 @@ void qemu_chr_close(CharDriverState *chr)
|
||||||
{
|
{
|
||||||
if (chr->chr_close)
|
if (chr->chr_close)
|
||||||
chr->chr_close(chr);
|
chr->chr_close(chr);
|
||||||
|
qemu_free(chr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
|
|
Loading…
Reference in New Issue