1 diff --exclude=CVS -upr qemu/hw/parallel.c qemu-sandbox/hw/parallel.c
2 --- qemu/hw/parallel.c 2005-01-23 13:42:59.000000000 -0700
3 +++ qemu-sandbox/hw/parallel.c 2005-03-12 19:00:37.000000000 -0700
8 +#include <sys/ioctl.h>
9 +#include <linux/parport.h>
10 +#include <linux/ppdev.h>
12 //#define DEBUG_PARALLEL
15 #define PARA_CTR_AUTOLF 0x02 /* Auto linefeed complement */
16 #define PARA_CTR_STROBE 0x01 /* Strobe complement */
18 -struct ParallelState {
20 - uint8_t status; /* read only register */
24 - CharDriverState *chr;
27 static void parallel_update_irq(ParallelState *s)
30 @@ -70,29 +64,29 @@ static void parallel_ioport_write(void *
35 + qemu_pp_write_data(s, (uint8_t)val);
36 parallel_update_irq(s);
39 + qemu_pp_write_control(s, (uint8_t)val);
40 if ((val & PARA_CTR_INIT) == 0 ) {
41 - s->status = PARA_STS_BUSY;
42 - s->status |= PARA_STS_ACK;
43 - s->status |= PARA_STS_ONLINE;
44 - s->status |= PARA_STS_ERROR;
45 + s->status = PARA_STS_BUSY;
46 + s->status |= PARA_STS_ACK;
47 + s->status |= PARA_STS_ONLINE;
48 + s->status |= PARA_STS_ERROR;
50 else if (val & PARA_CTR_SELECT) {
51 - if (val & PARA_CTR_STROBE) {
52 - s->status &= ~PARA_STS_BUSY;
53 - if ((s->control & PARA_CTR_STROBE) == 0)
54 - qemu_chr_write(s->chr, &s->data, 1);
56 - if (s->control & PARA_CTR_INTEN) {
60 + if (val & PARA_CTR_STROBE) {
61 + s->status &= ~PARA_STS_BUSY;
62 + if ((s->control & PARA_CTR_STROBE) == 0)
63 + qemu_chr_write(s->chr, &s->data, 1);
65 + if (s->control & PARA_CTR_INTEN) {
70 parallel_update_irq(s);
75 @@ -105,25 +99,25 @@ static uint32_t parallel_ioport_read(voi
80 + ret = qemu_pp_read_data(s);
84 + ret = qemu_pp_read_status(s);
86 if ((s->status & PARA_STS_BUSY) == 0 && (s->control & PARA_CTR_STROBE) == 0) {
87 - /* XXX Fixme: wait 5 microseconds */
88 - if (s->status & PARA_STS_ACK)
89 - s->status &= ~PARA_STS_ACK;
91 - /* XXX Fixme: wait 5 microseconds */
92 - s->status |= PARA_STS_ACK;
93 - s->status |= PARA_STS_BUSY;
95 + /* XXX Fixme: wait 5 microseconds */
96 + if (s->status & PARA_STS_ACK)
97 + s->status &= ~PARA_STS_ACK;
99 + /* XXX Fixme: wait 5 microseconds */
100 + s->status |= PARA_STS_ACK;
101 + s->status |= PARA_STS_BUSY;
104 parallel_update_irq(s);
108 + ret = qemu_pp_read_control(s);
111 #ifdef DEBUG_PARALLEL
112 Only in qemu-sandbox: kqemu
113 Only in qemu-sandbox: qemu-doc.html
114 Only in qemu-sandbox: qemu-img.1
115 Only in qemu-sandbox: qemu-tech.html
116 Only in qemu-sandbox: qemu.1
117 diff --exclude=CVS -upr qemu/vl.c qemu-sandbox/vl.c
118 --- qemu/vl.c 2005-03-13 02:43:36.000000000 -0700
119 +++ qemu-sandbox/vl.c 2005-03-13 07:16:54.000000000 -0700
124 +#include <linux/parport.h>
125 +#include <linux/ppdev.h>
126 #include <linux/if.h>
127 #include <linux/if_tun.h>
129 @@ -1028,10 +1030,14 @@ CharDriverState *qemu_chr_open_null(void
140 + int parport_device;
141 /* for nographic stdio only */
142 IOCanRWHandler *fd_can_read;
143 IOReadHandler *fd_read;
144 @@ -1084,6 +1090,76 @@ static void fd_chr_add_read_handler(Char
148 +uint8_t qemu_pp_read_status(ParallelState *s)
150 + uint8_t ret, status;
151 + FDCharDriver *fd = s->chr->opaque;
153 + if (fd->parport_device) {
154 + ioctl(fd->fd_out, PPRSTATUS, &status);
164 +uint8_t qemu_pp_read_control(ParallelState *s)
166 + uint8_t ret, control;
167 + FDCharDriver *fd = s->chr->opaque;
169 + if (fd->parport_device) {
170 + ioctl(fd->fd_out, PPRCONTROL, &control);
179 +uint8_t qemu_pp_read_data(ParallelState *s)
182 + FDCharDriver *fd = s->chr->opaque;
184 + if (fd->parport_device) {
185 + ioctl(fd->fd_out, PPRDATA, &data);
193 +void qemu_pp_write_data(ParallelState *s, uint8_t val)
196 + FDCharDriver *fd = s->chr->opaque;
198 + if (fd->parport_device) {
199 + data = (uint8_t)val;
200 + ioctl(fd->fd_out, PPWDATA, &data);
206 +void qemu_pp_write_control(ParallelState *s, uint8_t val)
209 + FDCharDriver *fd = s->chr->opaque;
211 + if (fd->parport_device) {
212 + control = (uint8_t)val;
213 + ioctl(fd->fd_out, PPWCONTROL, &control);
218 /* open a character device to a unix fd */
219 CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
221 @@ -1263,6 +1339,24 @@ CharDriverState *qemu_chr_open_stdio(voi
225 +CharDriverState *qemu_chr_open_dev(const char *filename)
229 + fd = open(filename, O_RDWR);
230 + CharDriverState *s = qemu_chr_open_fd(fd, fd);
232 + if (strstr(filename, "parport") != NULL) {
233 + if (ioctl(((FDCharDriver *)s->opaque)->fd_in, PPCLAIM) == 0) {
234 + ((FDCharDriver *)s->opaque)->parport_device = 1;
236 + ((FDCharDriver *)s->opaque)->parport_device = 0;
243 #if defined(__linux__)
244 CharDriverState *qemu_chr_open_pty(void)
246 @@ -1297,11 +1391,14 @@ CharDriverState *qemu_chr_open(const cha
247 return qemu_chr_open_pty();
248 } else if (!strcmp(filename, "stdio")) {
249 return qemu_chr_open_stdio();
253 + return qemu_chr_open_dev(filename);
262 /***********************************************************/
263 diff --exclude=CVS -upr qemu/vl.h qemu-sandbox/vl.h
264 --- qemu/vl.h 2005-03-13 02:43:36.000000000 -0700
265 +++ qemu-sandbox/vl.h 2005-03-13 07:16:54.000000000 -0700
266 @@ -199,6 +199,17 @@ typedef struct CharDriverState {
271 +typedef struct ParallelState {
273 + uint8_t status; /* read only register */
277 + CharDriverState *chr;
281 void qemu_chr_printf(CharDriverState *s, const char *fmt, ...);
282 int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len);
283 void qemu_chr_send_event(CharDriverState *s, int event);
284 @@ -206,6 +217,13 @@ void qemu_chr_add_read_handler(CharDrive
285 IOCanRWHandler *fd_can_read,
286 IOReadHandler *fd_read, void *opaque);
287 void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event);
290 +uint8_t qemu_pp_read_status(ParallelState *s);
291 +uint8_t qemu_pp_read_control(ParallelState *s);
292 +uint8_t qemu_pp_read_data(ParallelState *s);
293 +void qemu_pp_write_data(ParallelState *s, uint8_t data);
294 +void qemu_pp_write_control(ParallelState *s, uint8_t control);
298 @@ -643,8 +661,6 @@ typedef struct SerialState SerialState;
299 SerialState *serial_init(int base, int irq, CharDriverState *chr);
303 -typedef struct ParallelState ParallelState;
304 ParallelState *parallel_init(int base, int irq, CharDriverState *chr);