This software will help you to capture the parallel port data using a small kernel module for Linux. But wait, not only Linux, it also works for Windows, if you use it in a Qemu Virtual Machine under Linux!.
The parallel port sniffer kernel module will create a virtual port for every “real” parallel port in your machine and act like a bridge, re-passing all the commands sent to the virtual port to the real one and capturing the data in real time. The generated output is in the Open Bench Logic Sniffer format and ready to be analyzed with tools like Logic Sniffer which has tools to analyze some known protocols like 1-Wire, I2C, JTAG, SPI, UART, etc.
Once the module is built for your kernel and loaded, it will create one character device for every real parallel port with the name
/dev/parportsnif*. Just as a side note, the name parportsnif was deliberately chose, because Qemu only accepts names starting with “parport” to be parallel port!
The output will be sent to
/proc/parportlog. Currently there is one output for all the ports, which will mess things up if you use the sniffer in more than one parallel port at the same time, so please make sure to use only one sniffer at the time. There is a limit of 10000 lines of output that are kept in memory because it is not a good idea to keep allocating memory indefinitely on the kernel, this means that you need to keep flushing the output (
cat /dev/parportlog) so you don’t miss any signal change.
How to build and load the kernel module
First build the kernel object, using the provided
If you have any printer that might be using the parallel port, it is recommended to unload the
lp module with the following command:
~$ sudo rmmod lp
Then proceed to load the sniffer module:
~$ sudo insmod ./parportsnif.ko
Now you have one
/dev/parportsnif* corresponding to each of your
Additionally you must have the
/proc/parportlog file created.
I’ve included a small C program called
test.c that will turn all the data bits on and off a couple times. This can be used to test the resulting output file.
Note that you may need to edit the file and change the
/dev/parportsnif0 to your appropriate port number.
Then build using the following command:
~$ gcc test.c -o test
Before running the test program, you need to start capturing the output, you can use the
tee commands to check the output on the terminal and save an output file at the same time:
~$ cat /proc/parportlog | tee dump.ols
Then run the test program:
~$ sudo ./test
The generated output in the
dump.ols will look like this:
;Rate: 1000000 ;Channels: 32 0000000055@100137 00000000AA@200220 0000000055@300344 00000000AA@400439 0000000000@500556 # [1330005184.245259999] 0 CLOSE
How to use it with Qemu / Windows
With Qemu you need to specify a parameter called
-parallel to specify the
/dev/parportsnif* (where * is the port number of course). Also, you may need to change the parportsnif* permissions, e.g.
chmod 777 /dev/parportsnif0.
If you use the QtEmu front-end (like me), you can use the “Additional QEMU Options” in the Settings screen:
Since the format of the capture is made for logic analyzer devices, each entry has a specific point in time (emulating a 1Mhz logic analyzer), and the base time is taken when the port is opened for the first time. Qemu will open the parallel port sniffer when Windows is starting, you will receive a lot of signal changes on the port from Windows itself (maybe looking for a printer or something like that), and then you will run the program that you really want to capture and analyze. So, your final file will have the first two lines of header that starts with “#” and a few entries at the beginning that you may want to delete (Windows initialization). You can use the
rebase.py script provided to set the timing to the beginning of the time-line.
To Rodrigo Zechin Rosauro who helped me to develop this module!!!
Released under GPL! Download Parallel Port Sniffer source code