III.4 Shell Script Operation under Linux

If serial I/O is only used for program upload, shell script operation may be the most convenient way of testing with the shortest turn-around cycles. The sample script file below, shows the principles of operating BOOT-51 from a PC, running under Linux, with shell commands:

  #!/bin/sh
  stty 9600 sane clocal -crtscts -hupcl </dev/ttyS1     # until stty 1.16
  # stty -F /dev/ttyS1 9600 sane clocal -crtscts -hupcl # stty 2.0 or later
  reset51 /dev/lp0
  sleep 1
  asem $1.a51
  echo “U” >/dev/ttyS1
  cp $1.hex /dev/ttyS1
  echo “G 8000” >/dev/ttyS1

In this example, serial I/O is done over serial port /dev/ttyS1, and the target system can be reset over printer port /dev/lp0.
First of all, the serial port /dev/ttyS1 is initialized to the desired baudrate of 9600 Baud, 8 data bits, 1 stop bit, no parity and no handshake with the stty command. (If your stty is version 2.0 or later, better use the new command syntax with the -F option, as shown in commentary!)
Then the reset51 program provided is executed to reset the target system via printer port /dev/lp0. After that, the sleep command waits until BOOT-51 has recovered from reset, fully output its sign-on message, and is ready for a command.
Now ASEM-51 is invoked to assemble the application program.
When finished, the BOOT-51 upload command 'U' is echoed to /dev/ttyS1, and the Intel-HEX file is also simply copied to that serial port.
Finally the application program is started at address 8000H with the command 'echo “G 8000” >/dev/ttyS1'.
To test an application program myprog.a51 with the above shell script (stored in a file test51), simply type

test51 myprog

at the shell prompt, and see what you get.
Of course this was only a minimized example! In general you will not only have to modify serial port, baudrate, reset port, and start address for your local requirements, but also to do something for plausibility checking and error handling.
For this, the more sophisticated script file boot has been provided. It allows an easy change of all configuration parameters with any ASCII editor. For further information see the commentary inside boot.
In principle, boot contains only those configuration data! (The actual work is done by another script upload provided, which is invoked by boot. If your stty command is version 2.0 or later, better use the script file upload.new instead!)
A program myprog.a51 can now be assembled, uploaded and started with

boot myprog

To get the boot script running, ensure that you have full read/write access to the serial port used as upload device!
If a printer port is employed as reset device, the reset51 program requires root privileges!   (see below)

Finally, the reset51 program provided, may be worth a detailed explanation: When invoked, reset51 forms a reset pulse of the duration <pulsewidth> at the D0 and D1 outputs of a PC printer <port>, or at the DTR output of a serial <port>:

reset51 /dev/<port> [<pulsewidth>] <

Legal <port> values are:        lp0, lp1, lp2,
ttyS0, ttyS1, ttyS2, ttyS3,
cua0, cua1, cua2, cua3,
null

Under Linux with kernels 2.0.x the printer ports are assigned to fixed I/O base addresses (lp0 = 3BCH, lp1 = 378H, lp2 = 278H).
From kernel 2.2.0, the parport layer has been introduced, providing dynamic printer port assignment. If your 2.2.x kernel doesn't contain parport layer support or the /proc file system, you should recompile it respectively. This should also make PCI bus printer ports available as reset devices.
reset51 can only handle the four standard PC serial ports ttyS0 thru ttyS3. (However, the boot script described above should also work with non-standard serial ports, because it operates them with the stty command only!)
The serial ports ttyS0 and cua0 are equivalent, and so are ttyS1 and cua1, and so on.
If /dev/null is specified as <port>, reset51 delays only for <pulsewidth> ms.

The optional parameter <pulsewidth> is the duration of the reset pulse in ms.
Legal values are:    1   <=   <pulsewidth>   <=   65535.    (default is 50)
When invoked without parameters, a help screen is displayed.
In case of error, reset51 returns the exit code 1, 0 otherwise.
When executed, reset51 forms a positive pulse at D0 (pin 2), and a negative pulse at D1 (pin 3) of a PC printer port, or a ”high” pulse (-12 V !!!) at the DTR output of a serial port respectively.
If the default pulse width of 50 ms is too short to reset the MCS-51 board, specify a greater pulse width.

Since reset51 needs direct access to I/O ports, it requires root privileges! To make it available for all users, set the owner to “root” and set the ”set-user-id”-bit:

chown root reset51
chmod u+s reset51

For shell script operation, a reset line is highly recommended! If you don't have it, you will always have to press the reset button of the target system, before invoking the boot script. Since this may easily be forgotten, it is better to automate this step.