Howto Use Greaseweazle (Basics)
Greaseweazle is a device which is able to read various formats of floppy discs (you have to buy it though - I bought from here https://amigastore.eu/en/894-greaseweazle-v4.html, the list is https://github.com/keirf/greaseweazle/wiki/Purchase-a-Greaseweazle). I had to go through a collection of ~200 of old 3,5" floppy discs last year to see what is there, which floppies are good and securely discard data.
After Greaseweazle is connected to USB port, it identifies as:
[36557.105726] usb 1-3: Product: Greaseweazle
[36557.105729] usb 1-3: Manufacturer: Keir Fraser
[36557.105732] usb 1-3: SerialNumber: GWB01431415976C01007A51705
[36557.137575] cdc_acm 1-3:1.0: ttyACM0: USB ACM device
[36557.137603] usbcore: registered new interface driver cdc_acm
[36557.137605] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
Instalation:
- I is written in Python, create virtualenv directory and initialize it. This will create separate Python run environment with separate packages, but Python executable will still be used from a operating system.
damon@rapthalia:~$ sudo apt-get install virtualenv
damon@rapthalia:~$ mkdir greaseweazle
damon@rapthalia:~$ virtualenv greaseweazle
created virtual environment CPython3.13.9.final.0-64 in 115ms
creator CPython3Posix(dest=/home/damon/greaseweazle, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, via=copy, app_data_dir=/home/damon/.local/share/virtualenv)
added seed packages: pip==25.2
activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
damon@rapthalia:~$ cd greaseweazle/
damon@rapthalia:~/greaseweazle$ ls
bin CACHEDIR.TAG lib pyvenv.cfg
- Install Greaseweazle from GitHub repository
damon@rapthalia:~/greaseweazle$ bin/python -m pip install git+https://github.com/keirf/greaseweazle@latest
Collecting git+https://github.com/keirf/greaseweazle@latest
Cloning https://github.com/keirf/greaseweazle (to revision latest) to /tmp/pip-req-build-v10okxbj
Running command git clone --filter=blob:none --quiet https://github.com/keirf/greaseweazle /tmp/pip-req-build-v10okxbj
Running command git checkout -q dcb3d5d9d71b58d51aa22938cf96272a3b507292
Resolved https://github.com/keirf/greaseweazle to commit dcb3d5d9d71b58d51aa22938cf96272a3b507292
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing metadata (pyproject.toml) ... done
Collecting crcmod (from greaseweazle==1.22)
Downloading crcmod-1.7.tar.gz (89 kB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing metadata (pyproject.toml) ... done
Collecting bitarray>=3 (from greaseweazle==1.22)
Downloading bitarray-3.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (34 kB)
Collecting pyserial (from greaseweazle==1.22)
Downloading pyserial-3.5-py2.py3-none-any.whl.metadata (1.6 kB)
Collecting requests (from greaseweazle==1.22)
Downloading requests-2.32.5-py3-none-any.whl.metadata (4.9 kB)
Collecting charset_normalizer<4,>=2 (from requests->greaseweazle==1.22)
Downloading charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (37 kB)
Collecting idna<4,>=2.5 (from requests->greaseweazle==1.22)
Downloading idna-3.11-py3-none-any.whl.metadata (8.4 kB)
Collecting urllib3<3,>=1.21.1 (from requests->greaseweazle==1.22)
Downloading urllib3-2.5.0-py3-none-any.whl.metadata (6.5 kB)
Collecting certifi>=2017.4.17 (from requests->greaseweazle==1.22)
Downloading certifi-2025.10.5-py3-none-any.whl.metadata (2.5 kB)
Downloading bitarray-3.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (339 kB)
Downloading pyserial-3.5-py2.py3-none-any.whl (90 kB)
Downloading requests-2.32.5-py3-none-any.whl (64 kB)
Downloading charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (153 kB)
Downloading idna-3.11-py3-none-any.whl (71 kB)
Downloading urllib3-2.5.0-py3-none-any.whl (129 kB)
Downloading certifi-2025.10.5-py3-none-any.whl (163 kB)
Building wheels for collected packages: greaseweazle, crcmod
Building wheel for greaseweazle (pyproject.toml) ... done
Created wheel for greaseweazle: filename=greaseweazle-1.22-cp313-cp313-linux_x86_64.whl size=191690 sha256=429c6f9c5f4b0e34c047fb7fe5683a747d6706ba116904caf2198c06a2b0fd0b
Stored in directory: /tmp/pip-ephem-wheel-cache-0aa3afkf/wheels/4b/c8/64/11a387022b105eb41e039af11c365222884b8526b7b74074a7
Building wheel for crcmod (pyproject.toml) ... done
Created wheel for crcmod: filename=crcmod-1.7-cp313-cp313-linux_x86_64.whl size=31481 sha256=10a07ab84003abdf241c280e3a8aaf07309c2ec8e969137829fc9904b26f6548
Stored in directory: /home/damon/.cache/pip/wheels/c5/b4/7d/51d3485a8022501c7f7dba78b6c945088ff93d40142c9a96f4
Successfully built greaseweazle crcmod
Installing collected packages: pyserial, crcmod, bitarray, urllib3, idna, charset_normalizer, certifi, requests, greaseweazle
Successfully installed bitarray-3.7.2 certifi-2025.10.5 charset_normalizer-3.4.4 crcmod-1.7 greaseweazle-1.22 idna-3.11 pyserial-3.5 requests-2.32.5 urllib3-2.5.0
- Get some info
damon@rapthalia:~/greaseweazle$ bin/gw info
Host Tools: 1.16.2
Device:
Port: /dev/ttyACM0
Model: Greaseweazle V4.1
MCU: AT32F403A, 216MHz, 224kB SRAM
Firmware: 1.5
Serial: GWB01431415976C01007A51705
USB: Full Speed (12 Mbit/s), 128kB Buffer
Solving Insufficient Bandwidth
I had to use Akasa USB-C dongle to avoid insufficient bandwidth warning when I connected it directly to any USB port in my desktop computer. I could read, but not write.
aaa@rapthalia:~/greaseweazle$ bin/gw bandwidth
Min. / Mean / Max.
Write Bandwidth: 2.039 / 2.046 / 2.048 Mbps
Read Bandwidth: 8.167 / 8.182 / 8.191 Mbps
Estimated Consistent Min. Bandwidth: 1.835 Mbps
-> **WARNING** BELOW REQUIRED MIN.: 4.627 Mbps
After USB-C dongle:
damon@rapthalia:~/greaseweazle$ bin/gw bandwidth
Min. / Mean / Max.
Write Bandwidth: 7.834 / 7.891 / 7.962 Mbps
Read Bandwidth: 6.654 / 6.651 / 6.667 Mbps
Estimated Consistent Min. Bandwidth: 5.989 Mbps
Bad Floppy Drive
Usually happens when a drive activity light is always on or a motor doesn't work.
damon@rapthalia:~/greaseweazle$ bin/gw rpm
Command Failed: GetFluxStatus: No Index
Rewrite Floppy Disc With Random Data
damon@rapthalia:~/greaseweazle$ bin/gw write --format ibm.1440 rfloppy.img
Writing c=0-79:h=0-1
Format ibm.1440
T0.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T0.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T1.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T1.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T2.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T2.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T3.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T3.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T4.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T4.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T5.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T5.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T6.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T6.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T7.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T7.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T8.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T8.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T9.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T9.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T10.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T10.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T11.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T11.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T12.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T12.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T13.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T13.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T14.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T14.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T15.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T15.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T16.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T16.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T17.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T17.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T18.0: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
T18.1: Writing Track (Flux: 200.0ms period, 220.0 ms total, Terminate at index)
Command Failed: GetFluxStatus: Flux Underflow
How to create rfloppy.img? With dd (the capacity of a MS-DOS floppy is 1474560 bytes divided by 512B sector):
dd if=/dev/urandom of=rfloppy.img count=2880 status=progress
2880+0 records in
2880+0 records out
1474560 bytes (1,5 MB, 1,4 MiB) copied, 0,00829037 s, 178 MB/s
Read Floppy Content to Image File
damon@rapthalia:~/greaseweazle$ bin/gw read --format ibm.1440 floppies/99.img |& tee floppies/99.txt
Reading c=0-79:h=0-1 revs=2
Format ibm.1440
** FATAL ERROR:
Track0 signal absent after seek to cylinder 0
# or this
T78.1: Giving up: 5 sectors missing
T79.0: IBM MFM (0/18 sectors) from Raw Flux (42487 flux in 400.49ms)
T79.0: IBM MFM (0/18 sectors) from Raw Flux (106829 flux in 1001.15ms) (Retry #1.1)
T79.0: IBM MFM (0/18 sectors) from Raw Flux (171128 flux in 1601.83ms) (Retry #1.2)
T79.0: IBM MFM (0/18 sectors) from Raw Flux (235161 flux in 2202.52ms) (Retry #1.3)
T79.0: Giving up: 18 sectors missing
T79.1: IBM MFM (18/18 sectors) from Raw Flux (151760 flux in 400.63ms)
Cyl-> 0 1 2 3 4 5 6 7
H. S: 01234567890123456789012345678901234567890123456789012345678901234567890123456789
0. 0: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0. 1: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0. 2: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0. 3: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0. 4: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0. 5: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0. 6: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0. 7: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0. 8: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0. 9: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.10: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.11: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.12: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.13: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.14: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.15: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.16: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.17: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1. 0: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...
1. 1: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXX.......
1. 2: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX...X.X.............
1. 3: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX...................
1. 4: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.....XXXXX.X....................
1. 5: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........X.......................
1. 6: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..X...XXXX......................
1. 7: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.X.XXXX........X.......................
1. 8: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.....XXXXX......................
1. 9: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.X.XXXXXX.XX...................
1.10: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX........
1.11: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..XXX..
1.12: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..
1.13: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
1.14: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
1.15: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
1.16: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
1.17: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
Found 235 sectors of 2880 (8%)
Usually it's not so bad. This command will also save this data to text file.
And that's all.
Add Comment