diff --exclude=CVS -upr qemu/hw/parallel.c qemu-sandbox/hw/parallel.c --- qemu/hw/parallel.c 2005-01-23 13:42:59.000000000 -0700 +++ qemu-sandbox/hw/parallel.c 2005-03-12 19:00:37.000000000 -0700 @@ -22,6 +22,9 @@ * THE SOFTWARE. */ #include "vl.h" +#include +#include +#include //#define DEBUG_PARALLEL @@ -43,15 +46,6 @@ #define PARA_CTR_AUTOLF 0x02 /* Auto linefeed complement */ #define PARA_CTR_STROBE 0x01 /* Strobe complement */ -struct ParallelState { - uint8_t data; - uint8_t status; /* read only register */ - uint8_t control; - int irq; - int irq_pending; - CharDriverState *chr; -}; - static void parallel_update_irq(ParallelState *s) { if (s->irq_pending) @@ -70,29 +64,29 @@ static void parallel_ioport_write(void * #endif switch(addr) { case 0: - s->data = val; + qemu_pp_write_data(s, (uint8_t)val); parallel_update_irq(s); break; case 2: + qemu_pp_write_control(s, (uint8_t)val); if ((val & PARA_CTR_INIT) == 0 ) { - s->status = PARA_STS_BUSY; - s->status |= PARA_STS_ACK; - s->status |= PARA_STS_ONLINE; - s->status |= PARA_STS_ERROR; + s->status = PARA_STS_BUSY; + s->status |= PARA_STS_ACK; + s->status |= PARA_STS_ONLINE; + s->status |= PARA_STS_ERROR; } else if (val & PARA_CTR_SELECT) { - if (val & PARA_CTR_STROBE) { - s->status &= ~PARA_STS_BUSY; - if ((s->control & PARA_CTR_STROBE) == 0) - qemu_chr_write(s->chr, &s->data, 1); - } else { - if (s->control & PARA_CTR_INTEN) { - s->irq_pending = 1; - } - } + if (val & PARA_CTR_STROBE) { + s->status &= ~PARA_STS_BUSY; + if ((s->control & PARA_CTR_STROBE) == 0) + qemu_chr_write(s->chr, &s->data, 1); + } else { + if (s->control & PARA_CTR_INTEN) { + s->irq_pending = 1; + } + } } parallel_update_irq(s); - s->control = val; break; } } @@ -105,25 +99,25 @@ static uint32_t parallel_ioport_read(voi addr &= 7; switch(addr) { case 0: - ret = s->data; + ret = qemu_pp_read_data(s); break; case 1: - ret = s->status; + ret = qemu_pp_read_status(s); s->irq_pending = 0; if ((s->status & PARA_STS_BUSY) == 0 && (s->control & PARA_CTR_STROBE) == 0) { - /* XXX Fixme: wait 5 microseconds */ - if (s->status & PARA_STS_ACK) - s->status &= ~PARA_STS_ACK; - else { - /* XXX Fixme: wait 5 microseconds */ - s->status |= PARA_STS_ACK; - s->status |= PARA_STS_BUSY; - } + /* XXX Fixme: wait 5 microseconds */ + if (s->status & PARA_STS_ACK) + s->status &= ~PARA_STS_ACK; + else { + /* XXX Fixme: wait 5 microseconds */ + s->status |= PARA_STS_ACK; + s->status |= PARA_STS_BUSY; + } } parallel_update_irq(s); break; case 2: - ret = s->control; + ret = qemu_pp_read_control(s); break; } #ifdef DEBUG_PARALLEL Only in qemu-sandbox: kqemu Only in qemu-sandbox: qemu-doc.html Only in qemu-sandbox: qemu-img.1 Only in qemu-sandbox: qemu-tech.html Only in qemu-sandbox: qemu.1 diff --exclude=CVS -upr qemu/vl.c qemu-sandbox/vl.c --- qemu/vl.c 2005-03-13 02:43:36.000000000 -0700 +++ qemu-sandbox/vl.c 2005-03-13 07:16:54.000000000 -0700 @@ -46,6 +46,8 @@ #include #endif #else +#include +#include #include #include #include @@ -1028,10 +1030,14 @@ CharDriverState *qemu_chr_open_null(void return chr; } + + + #ifndef _WIN32 typedef struct { int fd_in, fd_out; + int parport_device; /* for nographic stdio only */ IOCanRWHandler *fd_can_read; IOReadHandler *fd_read; @@ -1084,6 +1090,76 @@ static void fd_chr_add_read_handler(Char } } +uint8_t qemu_pp_read_status(ParallelState *s) +{ + uint8_t ret, status; + FDCharDriver *fd = s->chr->opaque; + + if (fd->parport_device) { + ioctl(fd->fd_out, PPRSTATUS, &status); + ret = status; + } else { + ret = s->status; + } + + return ret; +} + + +uint8_t qemu_pp_read_control(ParallelState *s) +{ + uint8_t ret, control; + FDCharDriver *fd = s->chr->opaque; + + if (fd->parport_device) { + ioctl(fd->fd_out, PPRCONTROL, &control); + ret = control; + } else { + ret = s->control; + } + + return ret; + +} +uint8_t qemu_pp_read_data(ParallelState *s) +{ + uint8_t ret, data; + FDCharDriver *fd = s->chr->opaque; + + if (fd->parport_device) { + ioctl(fd->fd_out, PPRDATA, &data); + ret = data; + } else { + ret = s->data; + } + + return ret; +} +void qemu_pp_write_data(ParallelState *s, uint8_t val) +{ + uint8_t data; + FDCharDriver *fd = s->chr->opaque; + + if (fd->parport_device) { + data = (uint8_t)val; + ioctl(fd->fd_out, PPWDATA, &data); + } else { + s->data = val; + } +} + +void qemu_pp_write_control(ParallelState *s, uint8_t val) +{ + uint8_t control; + FDCharDriver *fd = s->chr->opaque; + + if (fd->parport_device) { + control = (uint8_t)val; + ioctl(fd->fd_out, PPWCONTROL, &control); + } else { + s->control = val; + } +} /* open a character device to a unix fd */ CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out) { @@ -1263,6 +1339,24 @@ CharDriverState *qemu_chr_open_stdio(voi return chr; } +CharDriverState *qemu_chr_open_dev(const char *filename) +{ + int fd = 0; + + fd = open(filename, O_RDWR); + CharDriverState *s = qemu_chr_open_fd(fd, fd); + + if (strstr(filename, "parport") != NULL) { + if (ioctl(((FDCharDriver *)s->opaque)->fd_in, PPCLAIM) == 0) { + ((FDCharDriver *)s->opaque)->parport_device = 1; + } else { + ((FDCharDriver *)s->opaque)->parport_device = 0; + } + } + + return s; +} + #if defined(__linux__) CharDriverState *qemu_chr_open_pty(void) { @@ -1297,11 +1391,14 @@ CharDriverState *qemu_chr_open(const cha return qemu_chr_open_pty(); } else if (!strcmp(filename, "stdio")) { return qemu_chr_open_stdio(); - } else -#endif + } else { + return qemu_chr_open_dev(filename); + } +#else { return NULL; } +#endif } /***********************************************************/ diff --exclude=CVS -upr qemu/vl.h qemu-sandbox/vl.h --- qemu/vl.h 2005-03-13 02:43:36.000000000 -0700 +++ qemu-sandbox/vl.h 2005-03-13 07:16:54.000000000 -0700 @@ -199,6 +199,17 @@ typedef struct CharDriverState { void *opaque; } CharDriverState; + +typedef struct ParallelState { + uint8_t data; + uint8_t status; /* read only register */ + uint8_t control; + int irq; + int irq_pending; + CharDriverState *chr; +} ParallelState; + + void qemu_chr_printf(CharDriverState *s, const char *fmt, ...); int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len); void qemu_chr_send_event(CharDriverState *s, int event); @@ -206,6 +217,13 @@ void qemu_chr_add_read_handler(CharDrive IOCanRWHandler *fd_can_read, IOReadHandler *fd_read, void *opaque); void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event); + + +uint8_t qemu_pp_read_status(ParallelState *s); +uint8_t qemu_pp_read_control(ParallelState *s); +uint8_t qemu_pp_read_data(ParallelState *s); +void qemu_pp_write_data(ParallelState *s, uint8_t data); +void qemu_pp_write_control(ParallelState *s, uint8_t control); /* consoles */ @@ -643,8 +661,6 @@ typedef struct SerialState SerialState; SerialState *serial_init(int base, int irq, CharDriverState *chr); /* parallel.c */ - -typedef struct ParallelState ParallelState; ParallelState *parallel_init(int base, int irq, CharDriverState *chr); /* i8259.c */