IV.3 Trouble under Linux

The most popular problems under Linux are permission conflicts and wrong (or no) configuration. Problems may even change with the version number of the Linux kernel!
Note that some changes suggested here will lower your systems security against attackers who have login access to your machine. Direct access to hardware ports and security do not mix well.
On some distributions changes in the /dev directory might be detected by periodically run jobs and automatically reverted to the old state.

  1. The boot script aborts with the error message

    ./upload: /dev/ttyS1: Permission denied

    (or something like that).
    You don't have read/write access to the serial port in use (ttyS1).
    If you are the only user of this computer, you can log in as root, and simply allow read/write operations for all users:

        chmod a+rw /dev/ttyS1

    If there are more users who have access to the system, better define a new group called “embedded” (or something) in /etc/group and add all users who need access to this port. Finally do

        chgrp embedded /dev/ttyS1
        chmod o-rw,ug+rw /dev/ttyS1

     
  2. The boot script hangs on any attempt to output an Intel-HEX file to a particular serial port.
    There may be an I/O address or interrupt conflict, or the serial ports are not configured correctly, or not at all.
    Make sure that every serial port uses a base I/O address and an IRQ that does not conflict with any other hardware installed in your system. (For example, port ttyS3 at 0x2e8 conflicts with an 8514 graphics card!) Check the BIOS setup menu for on-board peripherals, as well as the jumper settings of all the legacy (ISA) boards.
    Watch the console output when Linux is booting. There are messages like

    ttyS00 at 0x03f8 (irq = 4) is a 16550A

    A log file is usually kept in /var/log. The file name depends on the Linux distribution and version. Look for boot.msg, bootlog, or something.
    Linux doesn't really auto-probe the serial ports. It assumes standard port addresses and IRQ numbers. If your hardware doesn't match this default configuration, it will not work. In this case you have to configure your serial ports manually with the setserial command, e.g.

        setserial -v /dev/ttyS0 port 0x3f8 irq 4 autoconfig
        setserial -v /dev/ttyS1 port 0x2f8 irq 3 autoconfig
        setserial -v /dev/ttyS2 port 0x3e8 irq 9 autoconfig
        setserial -v /dev/ttyS3 port 0x2e8 irq 10 autoconfig


    Unfortunately the best place where to put these commands, in order to execute them during system boot, depends on the Linux distribution. For most Linux distributions, /etc/init.d/serial is a good choice! SuSE distributions kept it in /sbin/init.d/serial until version 7.0.
    For detailed information on serial port configuration refer to the setserial man-pages and the Serial-HOWTO.
     
  3. The boot script aborts with an error message like

         resetting target system ...
    @@@@@ access denied: /dev/lp0 @@@@@


    on a system with a 2.2.x (or later) kernel, or with

         resetting target system ...
    @@@@@ no root privilege @@@@@


    on a system with a 2.0.x (or earlier) kernel.
    The reset51 program needs root privileges for direct access to I/O ports!
    If you are the only user of this computer, you can log in as root, and simply allow to run reset51 as root for all users:

        chown root reset51
        chmod a+x,u+s reset51


    Once again a warning: don't do this, if your system should have a higher level of security! If there are more users who have access to the system, better define a special group “embedded” (or something) in /etc/group and add all users who need to run reset51. Then disable execution for all other users:

        chown root reset51
        chgrp embedded reset51
        chmod o-x,ug+x,u+s reset51


    This may considerably improve your system security.
  4. The boot script aborts with the error message

         resetting target system ...
    @@@@@ hardware failure: lp0 @@@@@


    although there are two perfectly working printer ports in your PC.
    The reason may be that you run a 2.0.x (or earlier) Linux kernel, which assigns fixed I/O base addresses to the printer port devices: there is no printer port with base address 0x3bc in your system!
    Try /dev/lp1 (0x378) and /dev/lp2 (0x278) as reset devices, and change your boot script accordingly.
  5. The boot script aborts with the error message

         resetting target system ...
    @@@@@ port not found: /dev/lp2 @@@@@


    on a PC with two printer ports and a 2.2.x (or later) kernel.
    There is no entry for /dev/lp2 in /proc/parport/2!

    From version 2.2.0 the Linux kernel provides the parport layer for dynamic printer port assignment, as known from the PC-BIOS. If you have recently updated from a 2.0.x (or earlier) kernel, your previous printer port /dev/lp2 may now simply be called /dev/lp1 in a 2.2.x (or later) system.
    Try /dev/lp1 as reset device, and change your boot script accordingly.
    If this doesn't apply, make sure that
       
    Configure and recompile your kernel respectively, if necessary. For further information refer to the documentation files parport.txt, modules.txt, kmod.txt and README provided with recent kernel sources, or ask a real Linux expert!
    (See also chapter III.4 Shell Script Operation under Linux.)
  6. The boot script aborts with the error message

         resetting target system ...
    ./upload: /dev/ttyS4: Device or resource busy


    The interrupt of the serial interface may already be used by another driver (i.e. printer port, USB).
    Try to find and solve the interrupt conflict. (See items 2 and 5.)