Lines Matching refs:port
40 This file implements the bi-directional parallel-port
80 #define PORT_DEV "/dev/port"
90 #define PIO_IOPORT 0 /* rel. addr io port */
92 #define PIO_STAT 1 /* rel. addr status port */
96 #define PIO_CTRL 2 /* rel. addr control port */
120 int fd; /* >= 0 when using /dev/port */
122 u_int in_use; /* port in use? */
126 static PortRec port[] =
134 static inline int pio_wait (const Port port, u_char val, u_char mask);
135 static inline void pio_ctrl (const Port port, u_char val);
136 static inline void pio_delay (const Port port);
137 static inline void pio_init (const Port port);
138 static void pio_reset (const Port port);
139 static int pio_write (const Port port, const u_char * buf, int n);
140 static int pio_read (const Port port, u_char * buf, int n);
144 pio_wait (const Port port, u_char val, u_char mask)
150 DBG (DL60, "wait on port 0x%03lx for %02x mask %02x\n",
151 port->base, (int) val, (int) mask);
160 stat = sanei_inb (port->base + PIO_STAT);
172 if ((port->max_time_seconds>0) && (time(NULL)-start >= port->max_time_seconds))
186 pio_ctrl (const Port port, u_char val)
188 DBG (DL60, "ctrl on port 0x%03lx %02x %02x\n",
189 port->base, (int) val, (int) val ^ PIO_CTRL_NINIT);
200 sanei_outb (port->base + PIO_CTRL, val);
206 pio_delay (const Port port)
208 sanei_inb (port->base + PIO_STAT); /* delay */
214 pio_init (const Port port)
216 pio_ctrl (port, PIO_CTRL_IE);
221 pio_reset (const Port port)
229 sanei_outb (port->base + PIO_CTRL,
232 pio_init (port);
240 pio_write (const Port port, const u_char * buf, int n)
246 pio_wait (port, PIO_STAT_BUSY, PIO_STAT_BUSY); /* busy */
247 pio_ctrl (port, PIO_CTRL_DIR | PIO_CTRL_IE); /* praeoutput */
248 pio_wait (port, PIO_STAT_NACKNLG, PIO_STAT_NACKNLG); /* acknlg */
249 pio_ctrl (port, PIO_CTRL_DIR); /* output */
255 pio_wait (port, PIO_STAT_BUSY, PIO_STAT_BUSY); /* busy */
257 pio_wait (port, PIO_STAT_BUSY | PIO_STAT_NACKNLG,
262 sanei_outb (port->base + PIO_IOPORT, *buf);
264 pio_delay (port);
265 pio_delay (port);
266 pio_delay (port);
267 pio_ctrl (port, PIO_CTRL_DIR | PIO_CTRL_NSTROBE); /* outputstrobe */
269 pio_delay (port);
270 pio_delay (port);
271 pio_delay (port);
272 pio_ctrl (port, PIO_CTRL_DIR); /* output */
274 pio_delay (port);
275 pio_delay (port);
276 pio_delay (port);
282 pio_wait (port, PIO_STAT_BUSY, PIO_STAT_BUSY); /* busy */
284 pio_wait (port, PIO_STAT_BUSY | PIO_STAT_NACKNLG,
288 pio_ctrl (port, PIO_CTRL_DIR | PIO_CTRL_IE); /* praeoutput */
294 pio_read (const Port port, u_char * buf, int n)
300 pio_wait (port, PIO_STAT_BUSY, PIO_STAT_BUSY); /* busy */
301 pio_ctrl (port, PIO_CTRL_IE); /* input */
308 pio_wait (port, PIO_STAT_BUSY, PIO_STAT_BUSY); /* busy */
310 pio_wait (port, PIO_STAT_BUSY, PIO_STAT_BUSY | PIO_STAT_NACKNLG);
313 pio_ctrl (port, PIO_CTRL_IE | PIO_CTRL_NSTROBE); /* inputstrobe */
315 pio_delay (port);
316 pio_delay (port);
317 pio_delay (port);
318 pio_ctrl (port, PIO_CTRL_IE); /* input */
320 pio_wait (port, PIO_STAT_BUSY, PIO_STAT_BUSY); /* busy */
322 pio_wait (port, PIO_STAT_BUSY, PIO_STAT_BUSY | PIO_STAT_NACKNLG);
326 *buf = sanei_inb (port->base + PIO_IOPORT);
331 pio_wait (port, PIO_STAT_BUSY, PIO_STAT_BUSY); /* busy */
332 pio_ctrl (port, PIO_CTRL_IE); /* input */
338 Open the device, <dev> must contain a valid port number (as string).
361 /* read port number */
369 DBG (1, "sanei_pio_open: `%s' is not a valid port number\n", dev);
382 for (n = 0; n < NELEMS (port); n++)
383 if (port[n].base == base)
386 if (NELEMS (port) <= n)
393 if (port[n].in_use)
395 DBG (1, "sanei_pio_open: port 0x%03lx is already in use\n", base);
399 port[n].base = base;
400 port[n].fd = -1;
401 port[n].max_time_seconds = 10;
402 port[n].in_use = 1;
404 if (sanei_ioperm (port[n].base, 3, 1))
406 DBG (1, "sanei_pio_open: cannot get io privilege for port 0x%03lx\n",
407 port[n].base);
412 pio_reset (&port[n]);
430 Port p = port + fd;
432 if ((0 > fd) || (NELEMS (port) <= fd))
452 if ((0 > fd) || (NELEMS (port) <= fd))
455 if (!port[fd].in_use)
458 return pio_read (&port[fd], buf, n);
464 if ((0 > fd) || (NELEMS (port) <= fd))
467 if (!port[fd].in_use)
470 return pio_write (&port[fd], buf, n);