Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | 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/modprobe.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 <arobinso@nyx.net> |