1 |
1275 |
phoenix |
HAYES ESP DRIVER VERSION 2.1
|
2 |
|
|
|
3 |
|
|
A big thanks to the people at Hayes, especially Alan Adamson. Their support
|
4 |
|
|
has enabled me to provide enhancements to the driver.
|
5 |
|
|
|
6 |
|
|
Please report your experiences with this driver to me (arobinso@nyx.net). I
|
7 |
|
|
am looking for both positive and negative feedback.
|
8 |
|
|
|
9 |
|
|
*** IMPORTANT CHANGES FOR 2.1 ***
|
10 |
|
|
Support for PIO mode. Five situations will cause PIO mode to be used:
|
11 |
|
|
1) A multiport card is detected. PIO mode will always be used. (8 port cards
|
12 |
|
|
do not support DMA).
|
13 |
|
|
2) The DMA channel is set to an invalid value (anything other than 1 or 3).
|
14 |
|
|
3) The DMA buffer/channel could not be allocated. The port will revert to PIO
|
15 |
|
|
mode until it is reopened.
|
16 |
|
|
4) Less than a specified number of bytes need to be transferred to/from the
|
17 |
|
|
FIFOs. PIO mode will be used for that transfer only.
|
18 |
|
|
5) A port needs to do a DMA transfer and another port is already using the
|
19 |
|
|
DMA channel. PIO mode will be used for that transfer only.
|
20 |
|
|
|
21 |
|
|
Since the Hayes ESP seems to conflict with other cards (notably sound cards)
|
22 |
|
|
when using DMA, DMA is turned off by default. To use DMA, it must be turned
|
23 |
|
|
on explicitly, either with the "dma=" option described below or with
|
24 |
|
|
setserial. A multiport card can be forced into DMA mode by using setserial;
|
25 |
|
|
however, most multiport cards don't support DMA.
|
26 |
|
|
|
27 |
|
|
The latest version of setserial allows the enhanced configuration of the ESP
|
28 |
|
|
card to be viewed and modified.
|
29 |
|
|
***
|
30 |
|
|
|
31 |
|
|
This package contains the files needed to compile a module to support the Hayes
|
32 |
|
|
ESP card. The drivers are basically a modified version of the serial drivers.
|
33 |
|
|
|
34 |
|
|
Features:
|
35 |
|
|
|
36 |
|
|
- Uses the enhanced mode of the ESP card, allowing a wider range of
|
37 |
|
|
interrupts and features than compatibility mode
|
38 |
|
|
- Uses DMA and 16 bit PIO mode to transfer data to and from the ESP's FIFOs,
|
39 |
|
|
reducing CPU load
|
40 |
|
|
- Supports primary and secondary ports
|
41 |
|
|
|
42 |
|
|
|
43 |
|
|
If the driver is compiled as a module, the IRQs to use can be specified by
|
44 |
|
|
using the irq= option. The format is:
|
45 |
|
|
|
46 |
|
|
irq=[0x100],[0x140],[0x180],[0x200],[0x240],[0x280],[0x300],[0x380]
|
47 |
|
|
|
48 |
|
|
The address in brackets is the base address of the card. The IRQ of
|
49 |
|
|
nonexistent cards can be set to 0. If an IRQ of a card that does exist is set
|
50 |
|
|
to 0, the driver will attempt to guess at the correct IRQ. For example, to set
|
51 |
|
|
the IRQ of the card at address 0x300 to 12, the insmod command would be:
|
52 |
|
|
|
53 |
|
|
insmod esp irq=0,0,0,0,0,0,12,0
|
54 |
|
|
|
55 |
|
|
The custom divisor can be set by using the divisor= option. The format is the
|
56 |
|
|
same as for the irq= option. Each divisor value is a series of hex digits,
|
57 |
|
|
with each digit representing the divisor to use for a corresponding port. The
|
58 |
|
|
divisor value is constructed RIGHT TO LEFT. Specifying a nonzero divisor value
|
59 |
|
|
will automatically set the spd_cust flag. To calculate the divisor to use for
|
60 |
|
|
a certain baud rate, divide the port's base baud (generally 921600) by the
|
61 |
|
|
desired rate. For example, to set the divisor of the primary port at 0x300 to
|
62 |
|
|
4 and the divisor of the secondary port at 0x308 to 8, the insmod command would
|
63 |
|
|
be:
|
64 |
|
|
|
65 |
|
|
insmod esp divisor=0,0,0,0,0,0,0x84,0
|
66 |
|
|
|
67 |
|
|
The dma= option can be used to set the DMA channel. The channel can be either
|
68 |
|
|
1 or 3. Specifying any other value will force the driver to use PIO mode.
|
69 |
|
|
For example, to set the DMA channel to 3, the insmod command would be:
|
70 |
|
|
|
71 |
|
|
insmod esp dma=3
|
72 |
|
|
|
73 |
|
|
The rx_trigger= and tx_trigger= options can be used to set the FIFO trigger
|
74 |
|
|
levels. They specify when the ESP card should send an interrupt. Larger
|
75 |
|
|
values will decrease the number of interrupts; however, a value too high may
|
76 |
|
|
result in data loss. Valid values are 1 through 1023, with 768 being the
|
77 |
|
|
default. For example, to set the receive trigger level to 512 bytes and the
|
78 |
|
|
transmit trigger level to 700 bytes, the insmod command would be:
|
79 |
|
|
|
80 |
|
|
insmod esp rx_trigger=512 tx_trigger=700
|
81 |
|
|
|
82 |
|
|
The flow_off= and flow_on= options can be used to set the hardware flow off/
|
83 |
|
|
flow on levels. The flow on level must be lower than the flow off level, and
|
84 |
|
|
the flow off level should be higher than rx_trigger. Valid values are 1
|
85 |
|
|
through 1023, with 1016 being the default flow off level and 944 being the
|
86 |
|
|
default flow on level. For example, to set the flow off level to 1000 bytes
|
87 |
|
|
and the flow on level to 935 bytes, the insmod command would be:
|
88 |
|
|
|
89 |
|
|
insmod esp flow_off=1000 flow_on=935
|
90 |
|
|
|
91 |
|
|
The rx_timeout= option can be used to set the receive timeout value. This
|
92 |
|
|
value indicates how long after receiving the last character that the ESP card
|
93 |
|
|
should wait before signalling an interrupt. Valid values are 0 though 255,
|
94 |
|
|
with 128 being the default. A value too high will increase latency, and a
|
95 |
|
|
value too low will cause unnecessary interrupts. For example, to set the
|
96 |
|
|
receive timeout to 255, the insmod command would be:
|
97 |
|
|
|
98 |
|
|
insmod esp rx_timeout=255
|
99 |
|
|
|
100 |
|
|
The pio_threshold= option sets the threshold (in number of characters) for
|
101 |
|
|
using PIO mode instead of DMA mode. For example, if this value is 32,
|
102 |
|
|
transfers of 32 bytes or less will always use PIO mode.
|
103 |
|
|
|
104 |
|
|
insmod esp pio_threshold=32
|
105 |
|
|
|
106 |
|
|
Multiple options can be listed on the insmod command line by separating each
|
107 |
|
|
option with a space. For example:
|
108 |
|
|
|
109 |
|
|
insmod esp dma=3 trigger=512
|
110 |
|
|
|
111 |
|
|
The esp module can be automatically loaded when needed. To cause this to
|
112 |
|
|
happen, add the following lines to /etc/modules.conf (replacing the last line
|
113 |
|
|
with options for your configuration):
|
114 |
|
|
|
115 |
|
|
alias char-major-57 esp
|
116 |
|
|
alias char-major-58 esp
|
117 |
|
|
options esp irq=0,0,0,0,0,0,3,0 divisor=0,0,0,0,0,0,0x4,0
|
118 |
|
|
|
119 |
|
|
You may also need to run 'depmod -a'.
|
120 |
|
|
|
121 |
|
|
Devices must be created manually. To create the devices, note the output from
|
122 |
|
|
the module after it is inserted. The output will appear in the location where
|
123 |
|
|
kernel messages usually appear (usually /var/adm/messages). Create two devices
|
124 |
|
|
for each 'tty' mentioned, one with major of 57 and the other with major of 58.
|
125 |
|
|
The minor number should be the same as the tty number reported. The commands
|
126 |
|
|
would be (replace ? with the tty number):
|
127 |
|
|
|
128 |
|
|
mknod /dev/ttyP? c 57 ?
|
129 |
|
|
mknod /dev/cup? c 58 ?
|
130 |
|
|
|
131 |
|
|
For example, if the following line appears:
|
132 |
|
|
|
133 |
|
|
Oct 24 18:17:23 techno kernel: ttyP8 at 0x0140 (irq = 3) is an ESP primary port
|
134 |
|
|
|
135 |
|
|
...two devices should be created:
|
136 |
|
|
|
137 |
|
|
mknod /dev/ttyP8 c 57 8
|
138 |
|
|
mknod /dev/cup8 c 58 8
|
139 |
|
|
|
140 |
|
|
You may need to set the permissions on the devices:
|
141 |
|
|
|
142 |
|
|
chmod 666 /dev/ttyP*
|
143 |
|
|
chmod 666 /dev/cup*
|
144 |
|
|
|
145 |
|
|
The ESP module and the serial module should not conflict (they can be used at
|
146 |
|
|
the same time). After the ESP module has been loaded the ports on the ESP card
|
147 |
|
|
will no longer be accessible by the serial driver.
|
148 |
|
|
|
149 |
|
|
If I/O errors are experienced when accessing the port, check for IRQ and DMA
|
150 |
|
|
conflicts ('cat /proc/interrupts' and 'cat /proc/dma' for a list of IRQs and
|
151 |
|
|
DMAs currently in use).
|
152 |
|
|
|
153 |
|
|
Enjoy!
|
154 |
|
|
Andrew J. Robinson
|