A programming cable for the Atmel microcontroller is very simple. We just need 3 pins that we can toggle between 0V and 5V, and 1 pin that we can read. In addition, we have a ground reference.
We can do this directly from a parallel port - this just involves connecting the right pins on the parallel port to the right pins on the Mini:
The above design is taken from here. The tool we use for programming, AVRDude, calls this design dapa.
We can use the control signals from a serial port similarly (reset=rts sck=dtr mosi=txd miso=cts). The serial port outputs +-12V, so we need a few zener diodes to transform this to 0V/5V:
Schematic:
My version:
(bigger images attached)
AVRDude calls this design dasa. It also supports dasa2 and dasa3, which are similar, but with slightly different pinouts. dasa2 is reset=!txd sck=rts mosi=dtr miso=cts. dasa3 is reset=!dtr sck=rts mosi=txd miso=cts. I am including the design for dasa, since it is the only one I have used. The claim is that the dasa3 design may have better performance on some serial ports, since DTR was not designed to toggle quickly.
It is possible to use dasa with a USB-to-serial converter, but the performance is very slow[1]. It is possible to use dapa with a USB-to-parallel converter, but the performance will be equally slow. In addition, I've heard the claim that some USB-to-parallel converters are meant solely to drive printers, and do not implement full parallel port functionality, and so would not work.
There are several designs for USB programming cables:
1. USB is moderately high latency (the numbers I've seen for low latency USB devices are order of magnitude is 1-30 ms, depending on device). Assuming AVRDude waits for each operation to finish before the next one, sending one bit requires 3 bit flips (3-90 ms). Sending one byte requires 24 bit flips (24-720ms). This gives ballpark of 1-42 bytes/second. What I saw when using a dasa cable with a USB-to-serial converter (5 bytes/second) was close to the middle of that, so I believe that was my problem. The adapter uses an FTDI USB-to-serial chip, most of which are designed to also be able to bit bang with the RS232 control pins, so I doubt choice of dasa lines was the problem - it ought to be able to flip all of them comparably quickly. The same dasa adapter worked at normal speed when it used an actual motherboard with a serial port.