| Parport | |
| +++++++ | |
| The ``parport`` code provides parallel-port support under Linux. This | |
| includes the ability to share one port between multiple device | |
| drivers. | |
| You can pass parameters to the ``parport`` code to override its automatic | |
| detection of your hardware. This is particularly useful if you want | |
| to use IRQs, since in general these can't be autoprobed successfully. | |
| By default IRQs are not used even if they **can** be probed. This is | |
| because there are a lot of people using the same IRQ for their | |
| parallel port and a sound card or network card. | |
| The ``parport`` code is split into two parts: generic (which deals with | |
| port-sharing) and architecture-dependent (which deals with actually | |
| using the port). | |
| Parport as modules | |
| ================== | |
| If you load the `parport`` code as a module, say:: | |
| # insmod parport | |
| to load the generic ``parport`` code. You then must load the | |
| architecture-dependent code with (for example):: | |
| # insmod parport_pc io=0x3bc,0x378,0x278 irq=none,7,auto | |
| to tell the ``parport`` code that you want three PC-style ports, one at | |
| 0x3bc with no IRQ, one at 0x378 using IRQ 7, and one at 0x278 with an | |
| auto-detected IRQ. Currently, PC-style (``parport_pc``), Sun ``bpp``, | |
| Amiga, Atari, and MFC3 hardware is supported. | |
| PCI parallel I/O card support comes from ``parport_pc``. Base I/O | |
| addresses should not be specified for supported PCI cards since they | |
| are automatically detected. | |
| modprobe | |
| -------- | |
| If you use modprobe , you will find it useful to add lines as below to a | |
| configuration file in /etc/modprobe.d/ directory:: | |
| alias parport_lowlevel parport_pc | |
| options parport_pc io=0x378,0x278 irq=7,auto | |
| modprobe will load ``parport_pc`` (with the options ``io=0x378,0x278 irq=7,auto``) | |
| whenever a parallel port device driver (such as ``lp``) is loaded. | |
| Note that these are example lines only! You shouldn't in general need | |
| to specify any options to ``parport_pc`` in order to be able to use a | |
| parallel port. | |
| Parport probe [optional] | |
| ------------------------ | |
| In 2.2 kernels there was a module called ``parport_probe``, which was used | |
| for collecting IEEE 1284 device ID information. This has now been | |
| enhanced and now lives with the IEEE 1284 support. When a parallel | |
| port is detected, the devices that are connected to it are analysed, | |
| and information is logged like this:: | |
| parport0: Printer, BJC-210 (Canon) | |
| The probe information is available from files in ``/proc/sys/dev/parport/``. | |
| Parport linked into the kernel statically | |
| ========================================= | |
| If you compile the ``parport`` code into the kernel, then you can use | |
| kernel boot parameters to get the same effect. Add something like the | |
| following to your LILO command line:: | |
| parport=0x3bc parport=0x378,7 parport=0x278,auto,nofifo | |
| You can have many ``parport=...`` statements, one for each port you want | |
| to add. Adding ``parport=0`` to the kernel command-line will disable | |
| parport support entirely. Adding ``parport=auto`` to the kernel | |
| command-line will make ``parport`` use any IRQ lines or DMA channels that | |
| it auto-detects. | |
| Files in /proc | |
| ============== | |
| If you have configured the ``/proc`` filesystem into your kernel, you will | |
| see a new directory entry: ``/proc/sys/dev/parport``. In there will be a | |
| directory entry for each parallel port for which parport is | |
| configured. In each of those directories are a collection of files | |
| describing that parallel port. | |
| The ``/proc/sys/dev/parport`` directory tree looks like:: | |
| parport | |
| |-- default | |
| | |-- spintime | |
| | `-- timeslice | |
| |-- parport0 | |
| | |-- autoprobe | |
| | |-- autoprobe0 | |
| | |-- autoprobe1 | |
| | |-- autoprobe2 | |
| | |-- autoprobe3 | |
| | |-- devices | |
| | | |-- active | |
| | | `-- lp | |
| | | `-- timeslice | |
| | |-- base-addr | |
| | |-- irq | |
| | |-- dma | |
| | |-- modes | |
| | `-- spintime | |
| `-- parport1 | |
| |-- autoprobe | |
| |-- autoprobe0 | |
| |-- autoprobe1 | |
| |-- autoprobe2 | |
| |-- autoprobe3 | |
| |-- devices | |
| | |-- active | |
| | `-- ppa | |
| | `-- timeslice | |
| |-- base-addr | |
| |-- irq | |
| |-- dma | |
| |-- modes | |
| `-- spintime | |
| .. tabularcolumns:: |p{4.0cm}|p{13.5cm}| | |
| ======================= ======================================================= | |
| File Contents | |
| ======================= ======================================================= | |
| ``devices/active`` A list of the device drivers using that port. A "+" | |
| will appear by the name of the device currently using | |
| the port (it might not appear against any). The | |
| string "none" means that there are no device drivers | |
| using that port. | |
| ``base-addr`` Parallel port's base address, or addresses if the port | |
| has more than one in which case they are separated | |
| with tabs. These values might not have any sensible | |
| meaning for some ports. | |
| ``irq`` Parallel port's IRQ, or -1 if none is being used. | |
| ``dma`` Parallel port's DMA channel, or -1 if none is being | |
| used. | |
| ``modes`` Parallel port's hardware modes, comma-separated, | |
| meaning: | |
| - PCSPP | |
| PC-style SPP registers are available. | |
| - TRISTATE | |
| Port is bidirectional. | |
| - COMPAT | |
| Hardware acceleration for printers is | |
| available and will be used. | |
| - EPP | |
| Hardware acceleration for EPP protocol | |
| is available and will be used. | |
| - ECP | |
| Hardware acceleration for ECP protocol | |
| is available and will be used. | |
| - DMA | |
| DMA is available and will be used. | |
| Note that the current implementation will only take | |
| advantage of COMPAT and ECP modes if it has an IRQ | |
| line to use. | |
| ``autoprobe`` Any IEEE-1284 device ID information that has been | |
| acquired from the (non-IEEE 1284.3) device. | |
| ``autoprobe[0-3]`` IEEE 1284 device ID information retrieved from | |
| daisy-chain devices that conform to IEEE 1284.3. | |
| ``spintime`` The number of microseconds to busy-loop while waiting | |
| for the peripheral to respond. You might find that | |
| adjusting this improves performance, depending on your | |
| peripherals. This is a port-wide setting, i.e. it | |
| applies to all devices on a particular port. | |
| ``timeslice`` The number of milliseconds that a device driver is | |
| allowed to keep a port claimed for. This is advisory, | |
| and driver can ignore it if it must. | |
| ``default/*`` The defaults for spintime and timeslice. When a new | |
| port is registered, it picks up the default spintime. | |
| When a new device is registered, it picks up the | |
| default timeslice. | |
| ======================= ======================================================= | |
| Device drivers | |
| ============== | |
| Once the parport code is initialised, you can attach device drivers to | |
| specific ports. Normally this happens automatically; if the lp driver | |
| is loaded it will create one lp device for each port found. You can | |
| override this, though, by using parameters either when you load the lp | |
| driver:: | |
| # insmod lp parport=0,2 | |
| or on the LILO command line:: | |
| lp=parport0 lp=parport2 | |
| Both the above examples would inform lp that you want ``/dev/lp0`` to be | |
| the first parallel port, and /dev/lp1 to be the **third** parallel port, | |
| with no lp device associated with the second port (parport1). Note | |
| that this is different to the way older kernels worked; there used to | |
| be a static association between the I/O port address and the device | |
| name, so ``/dev/lp0`` was always the port at 0x3bc. This is no longer the | |
| case - if you only have one port, it will default to being ``/dev/lp0``, | |
| regardless of base address. | |
| Also: | |
| * If you selected the IEEE 1284 support at compile time, you can say | |
| ``lp=auto`` on the kernel command line, and lp will create devices | |
| only for those ports that seem to have printers attached. | |
| * If you give PLIP the ``timid`` parameter, either with ``plip=timid`` on | |
| the command line, or with ``insmod plip timid=1`` when using modules, | |
| it will avoid any ports that seem to be in use by other devices. | |
| * IRQ autoprobing works only for a few port types at the moment. | |
| Reporting printer problems with parport | |
| ======================================= | |
| If you are having problems printing, please go through these steps to | |
| try to narrow down where the problem area is. | |
| When reporting problems with parport, really you need to give all of | |
| the messages that ``parport_pc`` spits out when it initialises. There are | |
| several code paths: | |
| - polling | |
| - interrupt-driven, protocol in software | |
| - interrupt-driven, protocol in hardware using PIO | |
| - interrupt-driven, protocol in hardware using DMA | |
| The kernel messages that ``parport_pc`` logs give an indication of which | |
| code path is being used. (They could be a lot better actually..) | |
| For normal printer protocol, having IEEE 1284 modes enabled or not | |
| should not make a difference. | |
| To turn off the 'protocol in hardware' code paths, disable | |
| ``CONFIG_PARPORT_PC_FIFO``. Note that when they are enabled they are not | |
| necessarily **used**; it depends on whether the hardware is available, | |
| enabled by the BIOS, and detected by the driver. | |
| So, to start with, disable ``CONFIG_PARPORT_PC_FIFO``, and load ``parport_pc`` | |
| with ``irq=none``. See if printing works then. It really should, | |
| because this is the simplest code path. | |
| If that works fine, try with ``io=0x378 irq=7`` (adjust for your | |
| hardware), to make it use interrupt-driven in-software protocol. | |
| If **that** works fine, then one of the hardware modes isn't working | |
| right. Enable ``CONFIG_FIFO`` (no, it isn't a module option, | |
| and yes, it should be), set the port to ECP mode in the BIOS and note | |
| the DMA channel, and try with:: | |
| io=0x378 irq=7 dma=none (for PIO) | |
| io=0x378 irq=7 dma=3 (for DMA) | |
| ---------- | |
| philb@gnu.org | |
| tim@cyberelk.net |