File: parallel.c

package info (click to toggle)
faumachine 20100527-2
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 53,836 kB
  • ctags: 20,552
  • sloc: ansic: 179,550; asm: 3,645; makefile: 3,611; perl: 2,103; sh: 1,529; python: 600; xml: 563; lex: 210; vhdl: 204
file content (120 lines) | stat: -rw-r--r-- 2,341 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* $Id: parallel.c,v 1.23 2009-01-28 14:38:00 potyra Exp $ 
 *
 * Copyright (C) 2004-2009 FAUmachine Team <info@faumachine.org>.
 * This program is free software. You can redistribute it and/or modify it
 * under the terms of the GNU General Public License, either version 2 of
 * the License, or (at your option) any later version. See COPYING.
 */

#include "compiler.h"

/* ==================== RUNTIME_RM ==================== */
#ifdef RUNTIME_RM

CODE16;

#include "assert.h"
#include "fixme.h"
#include "io.h"
#include "var.h"
#include "parallel.h"

void
bios_17_xxxx(struct regs *regs)
{
	if (AH < 3 && DX == 0) {	/* FIXME VOSSI */
		uint16_t addr;
		uint16_t timeout;
		uint8_t val8;

		addr = var_get(addr_par[DX]);
		timeout = var_get(par_tmout[DX]) << 8;

		if (AH == 0x00) {
			outb(AL, addr);
			val8 = inb(addr + 2);
			outb(val8 | 0x01, addr + 2);	/* Send strobe. */
			asm ("nop");
			outb(val8 & ~0x01, addr + 2);
			while ((inb(addr + 1) & 0x40) == 0x40 && timeout) {
				timeout--;
			}

		} else if (AH == 0x01) {
			val8 = inb(addr + 2);
			outb(val8 & ~0x04, addr + 2);	/* Send init. */
			asm ("nop");
			outb(val8 | 0x40, addr + 2);

		} else { assert(AH == 0x02);
			/* Do nothing... */
		}

		AH = inb(addr + 1);
		val8 = ~AH & 0x48;
		AH &= 0xb7;
		AH |= val8;
		if (! timeout) {
			AH |= 0x01;
		}
		F &= ~(1 << 0);	/* Clear carry. */

	} else {
		/* Unsupported. */
		F |= 1 << 0;	/* Set carry. */
	}
}

void
bios_0f(struct regs *regs)
{
	/* Might be spurious interrupt *or* parallel port interrupt. */
	eoi();
}

#endif /* RUNTIME_RM */
/* =================== REAL-MODE INIT ========================= */
#ifdef INIT_RM

CODE16;

#include "io.h"
#include "var.h"

static void
detect_parport(uint16_t *nr, uint8_t timeout, uint16_t port)
{
	/* Clear input mode. */
	outb(inb(port + 2) & 0xdf, port + 2);

	outb(0xaa, port);
	if (inb(port) != 0xaa) {
		/* No parallel port found. */
		return;
	}

	var_put(addr_par[*nr], port);
	var_put(par_tmout[*nr], timeout);

	(*nr)++;
}

void
parallel_init(void)
{
	uint16_t nr;
	uint16_t equipment;

	/* Detect parallel ports. */
	nr = 0;
	detect_parport(&nr, 0x14, 0x378);
	detect_parport(&nr, 0x14, 0x278);

	/* Set equipment byte. */
	equipment = var_get(sys_conf);
	equipment &= ~(3 << 14);
	equipment |= nr << 14;
	var_put(sys_conf, equipment);
}

#endif /* INIT_RM */