Mind Dump, Tech And Life Blog
written by Ivan Alenko
published under license CC4-BY
posted in category Systems Software / Greaseweazle
posted at 22. Oct '25

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:

  1. 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
  1. 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
  1. 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