Skip to content

Releases: BlueSCSI/BlueSCSI-v2

panel

panel Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Sep 17:40

Nightly

Nightly Pre-release
Pre-release

Choose a tag to compare

@erichelgeson erichelgeson released this 25 Feb 04:07
92db68f
Merge pull request #419 from BlueSCSI/eric/issue323

fix: don't log each error, let caller log instead (#323)

AS400 Testing

AS400 Testing Pre-release
Pre-release

Choose a tag to compare

@erichelgeson erichelgeson released this 04 Apr 13:44

Tag to publish test releases for AS/400 for Ultra/Ultra Wide BlueSCSI.

Docs: https://github.com/BlueSCSI/BlueSCSI-v2/wiki/AS-400-(iSeries)-Support

Based on work from @yyzkevin's BlueSCSI branch in June-2025 https://github.com/yyzkevin/BlueSCSI-v2/tree/as400

v2026.08.17

Choose a tag to compare

@github-actions github-actions released this 17 Aug 16:11

Grab the latest version from the Downloads page.

If you run into any issues please open a Discussion.

Off main betas

  • Front Panel is currently on the "panel" tag - will be rebased on main and a new beta out this week.
  • PowerView SCSI Video is currently on it's own branch and will be merged in next release.
  • SCSI Scanner support is currently on it's own branch.

Updating

BlueSCSI v2

  • Use BlueSCSI_V2_Universal for the Pico/Pico W based BlueSCSI v2. This is the file that used to be named BlueSCSI_V2_DaynaPORT_*.uf2 - same firmware, clearer name. (6133778c - @erichelgeson)
  • Audio builds are provided as a separate BlueSCSI_V2_Audio_SPDIF_*.uf2 due to memory constraints.

BlueSCSI Ultra / Ultra Wide

  • Use the uf2 corresponding to your device.

SD Card (all)

  • Place BlueSCSI_v<version>_<hash>.zip on the root of the SD card.

New Features

  • SCSI printer emulation - Apple LaserWriter IISC - BlueSCSI can now appear on the bus as an Apple Personal LaserWriter SC. Create a PR<id>/ folder on your SD card (for example PR4/) and a printer registers at that SCSI ID; the same folder is where jobs are spooled, as /PR<id>/print_NNNN.bin. The paper size the host selects is recognised and logged. Captured jobs can be converted to a viewable/printable file at https://bluescsi.com/printer. Thanks to demik for the protocol reverse-engineering write-up. (b5cb8b12, 942fe3f6 - @erichelgeson)
  • SCSI IDs 0-15 on Ultra Wide - The Ultra Wide can now present targets on the full 16-bit ID range instead of just 0-7. The ID is still the single character right after the two-letter type prefix, so IDs 10-15 use a hex digit A-F: HDA0_512.img is ID 10, and the per-ID folders are HDA/, CDB/, TPF/ and so on. bluescsi.ini sections stay decimal - [SCSI10] through [SCSI15]. Other boards are unchanged at 0-7. (3dcbba12, c3bde11c - @erichelgeson)
  • WPA3 Wi-Fi (opt-in) - New WiFiSecurity setting selects the security mode used to join a network: WPA2 (default, WPA/WPA2 mixed PSK), WPA2AES, WPA3, or WPA3WPA2. The default is unchanged, so existing configurations behave exactly as before - set this only if your access point requires it. Note that the WPA3 (SAE) modes are not yet as reliable as WPA2: in testing the join occasionally hangs (c46920e8 - @erichelgeson)
  • VHD disk images - .vhd files now load directly as hard disk targets. CHS geometry is taken from the footer unless you override it in bluescsi.ini. Fixed VHDs only. (d7d0ca4c - @erichelgeson)
  • NEC PC-9801-55 support - New System = PC-9801-55 preset for the NEC PC-9801-55 SCSI-1 controller: SCSI-1 mode, 25 sectors/track, 8 heads per cylinder, and a vendor string beginning with NEC as the controller requires. (727fb1c9, 06a22531 - Szymon Rakowski @s-rakowski)
  • Empty removable drives now show up over USB - In USB mass storage (initiator) mode, targets are enumerated from INQUIRY instead of TEST UNIT READY, so an empty Zip, MO, or CD drive appears on your computer like a card reader and gains its capacity when you insert media. (096c42ac - @erichelgeson)
  • Faster USB imaging - Initiator MSC mode now reads ahead 32 sectors instead of 1, tunable with the new InitiatorMSCPrefetchSectors setting. (dbbe55ec, 9dd44a13 - @erichelgeson)

Bug Fixes

  • Fixed issue when a CD drive with no cue sheet is probed for audio - Windows 98 probes CD drives with a zero-length PLAY AUDIO. (e76ac240 - @erichelgeson)
  • Fixed SCSI-3 drives rejecting every command in initiator mode - SCSI-3 targets take the LUN from the IDENTIFY message rather than the CDB, and reject anything selected without one. BlueSCSI now selects with ATN and sends IDENTIFY before each command, so these drives can be imaged or mounted over USB. Set InitiatorIdentify = No in [SCSI] to restore the old behavior. (50d6544b - @erichelgeson)
  • Fixed cue sheets not matching their bin file after renaming - A .cue that references castles.bin already matched a BlueSCSI-prefixed CD3_castles.bin, but only when the separator was an underscore. Any non-alphanumeric separator now matches, so CD3 castles.bin works too. (cf23ef1f - @erichelgeson)
  • Fixed data corruption on 256-byte sector images - Direct SD reads addressed the card in whole 512-byte sectors, so an unaligned position or length was silently truncated. 256-byte-per-sector images are usually unaligned and were corrupted by this. (4d5a28ea - @erichelgeson, Per Mårtensson)
  • Fixed USB mass storage mode being refused on Pico W - Pico W hardware flashed with non-network firmware was assumed to be a plain Pico, so GPIO24 was read as VBUS. On a W that pin belongs to the WiFi module and reads low, and USB mass storage mode was refused with nothing logged. Pico W detection now runs in every build. (87e8de71 - @erichelgeson)
  • Fixed watchdog reboot when imaging 2048-byte-sector drives - MO drives made the USB read/write callbacks return zero, which TinyUSB retried forever until the watchdog rebooted the board. Chunks smaller than the target's sector size are now served correctly. (discussion #396, 922de3e4 - @erichelgeson)
  • Fixed wrong data served when imaging several targets over USB - The read-ahead buffer is shared by all targets but was not checked against the target it was filled from, so one drive could be served another drive's sectors. (fc44fb74, 6b60ac22 - @erichelgeson)
  • Fixed removable media being ejected or stalled during load - In USB mass storage mode BlueSCSI no longer sends START STOP UNIT on its own - during the scan or to a not-ready target - which could eject or stall Zip and MO media while it was being inserted. Start/stop is left to the host, which drives it through its own mass storage callback. Eject is now only issued to devices that actually report removable media (CD/MO/removable disk), using the peripheral type and RMB bit captured at scan time, and no longer forces the immediate bit. (3e46bef2, dd65dfe5, 576b9c73 - @erichelgeson, ported from #304)
  • Fixed USB drive flapping to zero size on media change - While media is loading or being swapped the last known capacity is reported instead of 0 blocks, and stale read-ahead data is discarded when the sector size changes. (2607d9ea, 096c42ac - @erichelgeson)
  • Fixed aborted commands from misread bus phases in initiator mode - Initiator signal switching could read as a phantom DATA OUT phase or an invalid phase and abort the command in progress. Phase reads are now confirmed with a second sample. (e4540e33, 12372d5a - @erichelgeson)
  • Fixed synchronous write hang - PIO instruction memory is shared between subsystems, and on Pico W the WiFi driver left too little room for the SCSI accelerator. The accelerator's sync_write program failed to load. (9fd63bb0, 2c263b4f, 2738f159 - @erichelgeson)
  • Fixed WiFi reported as available on an Ultra with no RM2 installed - The RM2 module is optional on Ultra, now reported only once the module has answered the boot-time check. (49641ce8 - @erichelgeson)
  • Fixed WiFi silently dead on Ultra at higher clock speeds - The RM2 is reached over a bus whose divider scales with the system clock, and past the WifiRM2 speed grade the module stops answering - measured working at 150MHz. (9ef11456 - @erichelgeson)
  • Fixed MODE SELECT accepting truncated parameter lists - A parameter list too short for the header, block descriptor, or page it claims to describe now returns PARAMETER LIST LENGTH ERROR per SCSI-2 8.2.8, instead of applying buffer contents the host never transferred. (500ceda6 - @erichelgeson)
  • Fixed two Ultra Wide SCA bugs - With no images on the card, the RAW fallback resolved the strapped SCA ID but then opened the raw disk on the hard-coded fallback ID, so the drive appeared on the wrong ID with another ID's settings. (b8c2a440 - @erichelgeson)
  • Reduced USB task priority on RP2040 - The background USB task now runs at the lowest interrupt priority, so the SCSI-critical interrupts (DMA buffer swap, selection detect) always preempt it. (c7838f0c - @erichelgeson)

New INI Settings

[SCSI] Section

Setting Default Description
System - New value PC-9801-55 for the NEC PC-9801-55 SCSI-1 controller and first-party derivatives. (727fb1c9, 06a22531 - @s-rakowski)
InitiatorMSCPrefetchSectors 32 Sectors read ahead in USB mass storage (initiator) mode. Ignored when InitiatorMSCDisablePrefetch is set. (dbbe55ec - @erichelgeson)
WiFiSecurity WPA2 Security mode used to join a network: WPA2 (WPA/WPA2 mixed PSK), WPA2AES (refuses TKIP), WPA3 (SAE only), or WPA3WPA2. An unrecognised value logs a warning and falls back to WPA2. (c46920e8 - @erichelgeson)
InitiatorIdentify Yes Select with ATN and send IDENTIFY before each command in initiator mode. Required by SCSI-3 targets; set to No for prior behavior. (50d6544b - @erichelgeson)

Other Changes

  • Release artifact dates are pinned to America/Chicago so the date in the filename no longer depends on the build machine's timezone. (90c36acf - @erichelgeson)
  • Firmware size reports are posted on pull requests from forks again, and the build comment now links the PR's firmware artifact so it can be downloaded and tested directly. (8a9cb584, d55bb482 - @erichelgeson)
  • Build toolchain: nixpkgs bumped, pioasm added to the dev shell, and pico-sdk-internal moved to v2.2.0-UltraSupport-rel3. (17fde58a, 9fd63bb0 - @erichelgeson)

Contributors

...

Read more

v2026.04.27

Choose a tag to compare

@github-actions github-actions released this 28 Apr 00:38

This release brings a new build system, a much simpler firmware update flow, broader SCSI command coverage, and a long list of fixes across CD-ROM, CD audio, tape, DaynaPORT, initiator mode, and the Ultra/Ultra Wide hardware.

Important

Users should use the uf2 update method for this release to get the latest boot loader improvements.

New Features

Firmware update & logging

  • Universal firmware ZIPfirmware_update() scans the SD card root for BlueSCSI_v*.zip, extracts the target-specific .bin, and hands it to the bootloader. Same ZIP works for every board. (cb61c37@erichelgeson)
  • Shared bootloader log — a 2 KB NOLOAD region at the top of RAM survives the reset from bootloader into main firmware, so firmware-update log lines are no longer lost. (cb61c37@erichelgeson)
  • lastlog.txt — previous session's log.txt is renamed to lastlog.txt on first boot before the new log starts, so the prior run is always recoverable. (cb61c37@erichelgeson)

BlueSCSI Toolbox

  • SET_WORKING_DIR (subcommand 0x02) — Toolbox clients can point file operations at the SD card root (or any directory) for firmware uploads and file management. (24bbc20@erichelgeson)
  • GET_WORKING_DIR (subcommand 0x03) — returns the currently effective directory as a null-terminated string so clients can display it. (25fdaa6@erichelgeson)
  • New capability flag CAP_SET_WORKING_DIR (bit 2, 0x04) lets clients detect support. (24bbc20, 25fdaa6@erichelgeson)

Important

BlueSCSI Toolbox developers should consider these new features as a preview.

SCSI commands

  • READ(12)/WRITE(12), READ(16)/WRITE(16), READ CAPACITY(16) — proper dispatch for the 12- and 16-byte disk commands. (c4f8a73@reinauer)
  • VERIFY(10/12/16) — medium scan (BYTCHK=0) and byte-compare (BYTCHK=1) both implemented. (c4f8a73@reinauer)
  • WRITE AND VERIFY(10/12/16) — data is written and re-read to confirm the sectors match. (c4f8a73@reinauer)
  • MODE SENSE Verify Error Recovery page (07h) — optional SCSI-2 §9.3.3.8 page 07h (page length 0Ah, verify retry count 1, other fields zero), returned only in SCSI-2 mode. Some vintage OSes expect this page when requesting all pages (0x3F). (318a1c1@erichelgeson)
  • MODE SENSE Notch and Partition page (0Ch) — optional SCSI-2 §9.3.3.5 page 0Ch with all fields zero, indicating a non-notched drive. Returned only for SCSI-2 direct-access devices (excluded from optical and sequential). (1e1a1a5@erichelgeson)
  • Trace log coverage for new commands — SCSI trace output shows names for Read16, Write16, Verify16, WriteVerify16, ServiceActionIn16, Write12, Verify12, WriteVerify12. (8bcc3c8@PetteriAimonen)

Initiator mode

  • Fixed VHD image output — with InitiatorVHD=1 in bluescsi.ini, imaged drives are saved as Microsoft Fixed VHD files with a conforming 512-byte footer, directly mountable in Windows/QEMU/VirtualBox. (e7ebcab@erichelgeson)
  • Wide bus scans SCSI IDs 8-15 — on wide builds, initiator mode scans all 16 IDs. Imaged filenames encode the target ID as a single character: 0-9 for IDs 0-9, A-F for 10-15 (e.g. a drive at ID 11 becomes HDB0_imaged.hda). (7d17253@morio)
  • Skip non-block SCSI peripheral types — only block-style peripherals (direct-access, optical, CD-ROM, etc.) are cloned now; printers, scanners, processors and other non-block targets are skipped, and the full peripheral type name is logged. (5d19165@morio)

Diagnostics

  • Hardware stack overflow protection (RP2350)MSPLIM is set on both cores with 32 bytes of exception-frame headroom; overflows now crash-dump instead of corrupting RAM. (20823c9@erichelgeson)
  • Enhanced hardfault logging — CFSR/HFSR/MMFAR/BFAR are decoded into human-readable fault conditions on RP2350. (20823c9@erichelgeson)
  • SD card OID decoded in log — the card identification line now prints the 2-byte OID as ASCII alongside the resolved manufacturer name, making it easier to identify the exact card in a user's log. (ad1494a@erichelgeson)
  • SCSI trace shows opcode hexCOMMAND: log lines now print the opcode byte alongside the decoded name, e.g. ---- COMMAND: 0x12 (Inquiry) and ---- COMMAND: 0xDE (Unknown), so unknown opcodes are immediately actionable instead of requiring you to correlate with the next OUT hex dump. (c785237@p0dalirius)
  • Debug log mask covers wide IDs 8-15g_scsi_log_mask is now uint32_t and defaults to all bits for S2S_MAX_TARGETS, so per-ID debug logging works on wide builds with IDs 8-15. (5ab53a0@morio)

Bug Fixes

CD-ROM & CD audio

  • SPDIF crash on multi-BIN CUE sheets (#353)selectImageFile() no longer allocates FastSeek for metadata-only opens, and doReadTOC / doReadFullTOC / doReadTrackInformation stop audio before switching BIN files. (8b06063@erichelgeson)
  • SPDIF reported wrong LBA on READ SUB-CHANNEL / PLAY AUDIO (#353) — the audio position math now accounts for each track's file_offset and data_start, so multi-BIN CUEs and tracks with unstored PREGAP report correct LBAs. (a2835e6@erichelgeson)
  • SPDIF PLAY AUDIO seek wrong for tracks with PREGAPdoPlayAudio now uses data_start instead of track_start, fixing audio on discs like Tatsujin Ou (FM Towns) where Track 2 has PREGAP 00:02:00. (b2f2fda@erichelgeson)
  • Track boundary correctness — added cdrom_track_end_lba so READ CD splits transfers at track boundaries on multi-track discs instead of conflating BIN file size with track extent. (8f7e389@reinauer / @erichelgeson)
  • READ HEADER (0x44) — parses LBA from CDB bytes 2-5 instead of always returning data for LBA 0; audio-track mode is written to the correct variable. (8f7e389@reinauer / @erichelgeson)
  • READ CD I/O errorsseek() / read() failures now return CHECK CONDITION with MEDIUM ERROR / CIRC UNRECOVERED ERROR instead of silently returning corrupt data. (8f7e389@reinauer / @erichelgeson)
  • WRITE AND VERIFY (0x2E) — returns ILLEGAL REQUEST on CD-ROM instead of silently performing an unverified write. (8f7e389@reinauer / @erichelgeson)
  • getTrackFromLBA() without track_end_lba — corrected fallback for discs where the track end isn't known up-front. (389ce31@PetteriAimonen)
  • Stale cdrom_track_end_lba across image changes — reset on CUE sheet reload and folder-based CD init. (b250f35@erichelgeson)
  • Audio playback after CD change — stale cached trackinfo from the previous disc no longer causes read errors on the next disc; doSeek's audio call is guarded by bin_container.isOpen(). (b2ea073@morio)
  • Audio with multiple CD-ROM drives — new play command stops all audio (id=0xFF) and reloads the cue when the audio owner changes; audio_last_status indexes by owner, not by passed id. Bus reset also stops audio. Applied to both I2S and SPDIF. (87cbe5b@morio)
  • Audio array sizing for wide SCSI — 8-entry audio arrays now sized for 16-target wide boards; ID masks corrected. (5611fc4@morio)
  • Eject wrapping on multi-BIN/CUE — eject button now compares the container directory name instead of the inner BIN filename, so multi-BIN discs wrap back to the first image. (30ed064@morio)

Tape drive

  • SPACE now uses absolute position and signed 24-bit count — per SCSI-2 §10.2.11, SPACE is relative to the current position and the count is two's-complement (negative = reverse). Previous code used an unsigned count and set tape_pos = count (absolute). (79432e3@erichelgeson)
  • Variable-block READ underlength/overlength conditions — conditions were swapped. Per SCSI-2 §10.2.4 overlength is not an error; only underlength errors, and only when SILI is clear. (e4d81d4@erichelgeson)
  • READ BLOCK LIMITS bad LSB bytedata[5] duplicated data[4], reporting min=0x0202 for 512-byte blocks. (7bdd5a8@erichelgeson)
  • SPACE CDB byte extraction — was reading a 32-bit count across CDB[2-5] including the control byte. Now a proper 24-bit extract from CDB[2-4]. (7bdd5a8@erichelgeson)
  • Variable-block READ/WRITE with transfer length 0 — per SCSI-2 §10.2.4 and §10.2.14, a zero transfer length is explicitly "not considered an error"; no data shall be transferred and the tape position is unchanged. (b6ed6b1@erichelgeson)

DaynaPORT / network

  • AppleTalk slow under Virtual Memory on System 7 (#346) — multi-packet READ(6) is now gated on CDB byte 5 bit 6 (polled mode = 1 packet, blind mode = batched). Bus hold time stays short when the host's VM pager also needs bus access. Transfer size now respects the host's allocation length in CDB[3-4]. (7c20579@erichelgeson)
  • Global INI strings no longer break DaynaPORT/AmigaWiFi — vendor/product/revision set under [SCSI] in bluescsi.ini are skipped for network devices, which require specific IDs for their drivers. Per-device [SCSIn] overrides still apply. (9f795a7@morio)
  • WiFi (DaynaPORT) restored on CMake build — after the PlatformIO → CMake migration, CYW43 compiled from source needs PICO_CYW43_SUPPORTED=1, CYW43_WARN=//, cyw43_arch_poll() in platform_poll(), and our own cyw43_tcpip_link_status(). Tested on Pico 1W / Pico 2W with open and WPA2 networks. (4af22d7@erichelgeson)
  • Ultra / Ultra Wide WiFi with GCC 14 — custom board headers and pico-sdk-internal v2.2.0-UltraSupport-rel2 work around a pico-sdk write-buffer ordering bug on Cortex-M33 that broke CYW43 SPI on Ultra hardware. (b0e1a4e, 79df606@erichelgeson)

Initiator mode

  • USB MSC initiator no longer overrides hardware switch — when the SD card is absent, the hardware initiator switch setting is respected instead of being forced by USB MSC. (290f513@erichelgeson)
  • **U...
Read more

v2026.04.19-dev

v2026.04.19-dev Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 19 Apr 18:52

BlueSCSI-v2 Release Notes — v2026.04.19-dev (prerelease)

This release brings a new build system, a much simpler firmware update flow, broader SCSI command coverage, and a long list of fixes across CD-ROM, CD audio, tape, DaynaPORT, initiator mode, and the Ultra/Ultra Wide hardware.

Important

Users should use the uf2 update method for this release to get the latest boot loader improvements.

New Features

Firmware update & logging

  • Universal firmware ZIPfirmware_update() scans the SD card root for BlueSCSI_v*.zip, extracts the target-specific .bin, and hands it to the bootloader. Same ZIP works for every board. (cb61c37@erichelgeson)
  • Shared bootloader log — a 2 KB NOLOAD region at the top of RAM survives the reset from bootloader into main firmware, so firmware-update log lines are no longer lost. (cb61c37@erichelgeson)
  • lastlog.txt — previous session's log.txt is renamed to lastlog.txt on first boot before the new log starts, so the prior run is always recoverable. (cb61c37@erichelgeson)

BlueSCSI Toolbox

  • SET_WORKING_DIR (subcommand 0x02) — Toolbox clients can point file operations at the SD card root (or any directory) for firmware uploads and file management. (24bbc20@erichelgeson)
  • GET_WORKING_DIR (subcommand 0x03) — returns the currently effective directory as a null-terminated string so clients can display it. (25fdaa6@erichelgeson)
  • New capability flag CAP_SET_WORKING_DIR (bit 2, 0x04) lets clients detect support. (24bbc20, 25fdaa6@erichelgeson)

SCSI commands

  • READ(12)/WRITE(12), READ(16)/WRITE(16), READ CAPACITY(16) — proper dispatch for the 12- and 16-byte disk commands. (c4f8a73@reinauer)
  • VERIFY(10/12/16) — medium scan (BYTCHK=0) and byte-compare (BYTCHK=1) both implemented. (c4f8a73@reinauer)
  • WRITE AND VERIFY(10/12/16) — data is written and re-read to confirm the sectors match. (c4f8a73@reinauer)
  • MODE SENSE Verify Error Recovery page (07h) — optional SCSI-2 §9.3.3.8 page 07h (page length 0Ah, verify retry count 1, other fields zero), returned only in SCSI-2 mode. Some vintage OSes expect this page when requesting all pages (0x3F). (318a1c1@erichelgeson)
  • MODE SENSE Notch and Partition page (0Ch) — optional SCSI-2 §9.3.3.5 page 0Ch with all fields zero, indicating a non-notched drive. Returned only for SCSI-2 direct-access devices (excluded from optical and sequential). (1e1a1a5@erichelgeson)
  • Trace log coverage for new commands — SCSI trace output shows names for Read16, Write16, Verify16, WriteVerify16, ServiceActionIn16, Write12, Verify12, WriteVerify12. (8bcc3c8@PetteriAimonen)

Initiator mode

  • Fixed VHD image output — with InitiatorVHD=1 in bluescsi.ini, imaged drives are saved as Microsoft Fixed VHD files with a conforming 512-byte footer, directly mountable in Windows/QEMU/VirtualBox. (e7ebcab@erichelgeson)

Diagnostics

  • Hardware stack overflow protection (RP2350)MSPLIM is set on both cores with 32 bytes of exception-frame headroom; overflows now crash-dump instead of corrupting RAM. (20823c9@erichelgeson)
  • Enhanced hardfault logging — CFSR/HFSR/MMFAR/BFAR are decoded into human-readable fault conditions on RP2350. (20823c9@erichelgeson)
  • SD card OID decoded in log — the card identification line now prints the 2-byte OID as ASCII alongside the resolved manufacturer name, making it easier to identify the exact card in a user's log. (ad1494a@erichelgeson)

Bug Fixes

CD-ROM & CD audio

  • SPDIF crash on multi-BIN CUE sheets (#353)selectImageFile() no longer allocates FastSeek for metadata-only opens, and doReadTOC / doReadFullTOC / doReadTrackInformation stop audio before switching BIN files. (8b06063@erichelgeson)
  • SPDIF reported wrong LBA on READ SUB-CHANNEL / PLAY AUDIO (#353) — the audio position math now accounts for each track's file_offset and data_start, so multi-BIN CUEs and tracks with unstored PREGAP report correct LBAs. (a2835e6@erichelgeson)
  • SPDIF PLAY AUDIO seek wrong for tracks with PREGAPdoPlayAudio now uses data_start instead of track_start, fixing audio on discs like Tatsujin Ou (FM Towns) where Track 2 has PREGAP 00:02:00. (b2f2fda@erichelgeson)
  • Track boundary correctness — added cdrom_track_end_lba so READ CD splits transfers at track boundaries on multi-track discs instead of conflating BIN file size with track extent. (8f7e389@reinauer / @erichelgeson)
  • READ HEADER (0x44) — parses LBA from CDB bytes 2-5 instead of always returning data for LBA 0; audio-track mode is written to the correct variable. (8f7e389@reinauer / @erichelgeson)
  • READ CD I/O errorsseek() / read() failures now return CHECK CONDITION with MEDIUM ERROR / CIRC UNRECOVERED ERROR instead of silently returning corrupt data. (8f7e389@reinauer / @erichelgeson)
  • WRITE AND VERIFY (0x2E) — returns ILLEGAL REQUEST on CD-ROM instead of silently performing an unverified write. (8f7e389@reinauer / @erichelgeson)
  • getTrackFromLBA() without track_end_lba — corrected fallback for discs where the track end isn't known up-front. (389ce31@PetteriAimonen)
  • Stale cdrom_track_end_lba across image changes — reset on CUE sheet reload and folder-based CD init. (b250f35@erichelgeson)
  • Audio playback after CD change — stale cached trackinfo from the previous disc no longer causes read errors on the next disc; doSeek's audio call is guarded by bin_container.isOpen(). (b2ea073@morio)
  • Audio with multiple CD-ROM drives — new play command stops all audio (id=0xFF) and reloads the cue when the audio owner changes; audio_last_status indexes by owner, not by passed id. Bus reset also stops audio. Applied to both I2S and SPDIF. (87cbe5b@morio)
  • Audio array sizing for wide SCSI — 8-entry audio arrays now sized for 16-target wide boards; ID masks corrected. (5611fc4@morio)
  • Eject wrapping on multi-BIN/CUE — eject button now compares the container directory name instead of the inner BIN filename, so multi-BIN discs wrap back to the first image. (30ed064@morio)

Tape drive

  • SPACE now uses absolute position and signed 24-bit count — per SCSI-2 §10.2.11, SPACE is relative to the current position and the count is two's-complement (negative = reverse). Previous code used an unsigned count and set tape_pos = count (absolute). (79432e3@erichelgeson)
  • Variable-block READ underlength/overlength conditions — conditions were swapped. Per SCSI-2 §10.2.4 overlength is not an error; only underlength errors, and only when SILI is clear. (e4d81d4@erichelgeson)
  • READ BLOCK LIMITS bad LSB bytedata[5] duplicated data[4], reporting min=0x0202 for 512-byte blocks. (7bdd5a8@erichelgeson)
  • SPACE CDB byte extraction — was reading a 32-bit count across CDB[2-5] including the control byte. Now a proper 24-bit extract from CDB[2-4]. (7bdd5a8@erichelgeson)
  • Variable-block READ/WRITE with transfer length 0 — per SCSI-2 §10.2.4 and §10.2.14, a zero transfer length is explicitly "not considered an error"; no data shall be transferred and the tape position is unchanged. (b6ed6b1@erichelgeson)

DaynaPORT / network

  • AppleTalk slow under Virtual Memory on System 7 (#346) — multi-packet READ(6) is now gated on CDB byte 5 bit 6 (polled mode = 1 packet, blind mode = batched). Bus hold time stays short when the host's VM pager also needs bus access. Transfer size now respects the host's allocation length in CDB[3-4]. (7c20579@erichelgeson)
  • Global INI strings no longer break DaynaPORT/AmigaWiFi — vendor/product/revision set under [SCSI] in bluescsi.ini are skipped for network devices, which require specific IDs for their drivers. Per-device [SCSIn] overrides still apply. (9f795a7@morio)
  • WiFi (DaynaPORT) restored on CMake build — after the PlatformIO → CMake migration, CYW43 compiled from source needs PICO_CYW43_SUPPORTED=1, CYW43_WARN=//, cyw43_arch_poll() in platform_poll(), and our own cyw43_tcpip_link_status(). Tested on Pico 1W / Pico 2W with open and WPA2 networks. (4af22d7@erichelgeson)
  • Ultra / Ultra Wide WiFi with GCC 14 — custom board headers and pico-sdk-internal v2.2.0-UltraSupport-rel2 work around a pico-sdk write-buffer ordering bug on Cortex-M33 that broke CYW43 SPI on Ultra hardware. (b0e1a4e, 79df606@erichelgeson)

Initiator mode

  • USB MSC initiator no longer overrides hardware switch — when the SD card is absent, the hardware initiator switch setting is respected instead of being forced by USB MSC. (290f513@erichelgeson)
  • Ultra initiator mode on some drives — timing tweak so initiator mode works against drives that were previously flaky on Ultra hardware. (2007324@androda)

SCSI core

  • WRITE to read-only media returns DATA_PROTECT — per SCSI-2 §9.1.12 and Table 69, WRITE PROTECTED (ASC 0x2700) pairs with sense key DATA_PROTECT (0x07), not ILLEGAL_REQUEST (0x05). Some hosts branch on the sense key to distinguish "bad CDB" from "media write-protected" and retried incorrectly. (b9bd4af@erichelgeson)
  • REQUEST SENSE Valid bit only when Information field is meaningful — Valid (0x80) was set unconditionally and the Information field was always populated with transfer.lba, even for sense keys like ILLEGAL_REQUEST or UNIT_ATTENTION where no block address applies. Per SPC-2 §7.20, only MEDIUM_ERROR, HARDWARE_ERROR, and ABORTED_COMMAND now report Valid=1 with the LBA; other keys return error code 0x70 with a zeroed Information field. (f7feb1d@erichelgeson)
  • MODE SENSE reserved CDB byte 3 — non-zero values in the reserved byte (SPC-3+ SUBPAGE CODE) are now rejected p...
Read more

v2026.03.01

Choose a tag to compare

@github-actions github-actions released this 01 Mar 15:14

BlueSCSI v2026.03.01-RC2 - #MARCHintosh

Happy #MARCHintosh to all who celebrate!

If you run into any issues please open a Discussion.

This is Release Candidate 2 for all versions of BlueSCSI v2 and Ultra/Ultra Wide.

This release delivers the WiFi performance optimizations from @jcs and AmigaNET support from @RobSmithDev that were planned for RC2, along with several bug fixes and quality-of-life improvements.

Updating

BlueSCSI v2

  • Use BlueSCSI Universal for the Pico/PicoW based BlueSCSI.
  • Seperate Audio Builds are available for the Pico 1 due to memory constraints are provided as a separate uf2s.

BlueSCSI Ultra/Ultra Wide

  • Use the uf2 corresponding to your device.

SD Card

  • Use .bin file corresponding to your device.

New Features

  • AmigaNET Network Adapter - New Amiga-optimized network adapter emulation with batch/bulk transfers for increased speed. Configured using image files prefixed with AM instead of NE. Includes workarounds for Amiga SCSI hardware/ROM quirks. (3d74562 - @RobSmithDev)
  • DaynaPORT Multi-Packet Transfers - DaynaPORT now sends multiple network packets in a single SCSI READ(6) and correctly parses multiple outgoing packets in a WRITE(6), matching real DaynaPORT SCSI/Link-3 behavior. This dramatically improves EtherTalk transfer rates by eliminating 2-second ATP timeouts caused by dropped combined packets. (e7d9629 - @jcs)
  • WiFi Reconnection on Link Loss - When the WiFi connection drops, the firmware now automatically reconnects using exponential backoff (10s, 20s, 40s, 80s, 160s) with a 5-attempt cap. Reconnection only runs during BUS_FREE phase to avoid interfering with SCSI operations. (98b922a - @erichelgeson)
  • Log Non-Default INI Settings - Non-default INI settings are now logged at startup, making it easier to diagnose configuration issues. (123d610 - @erichelgeson)
  • Ultra Expansion PCB Template - New PCB template for Ultra expansion boards. (5469312 - @androda)

Bug Fixes

  • Fixed SD card firmware update failure for non-Ultra targets - A float printf call in the bootloader pulled in 8.6KB of libc, pushing the Ultra bootloader over 128KB and bumping the global bootloader size to 256KB. This caused old 128KB bootloaders on Pico/Pico2 to fail with "Invalid firmware file". Fixed by casting to int, restoring all bootloaders to 128KB. Fixes #334. (3899308 - @erichelgeson)
  • Fixed hang from bad CUE sheet - When a CUE sheet references a non-existent or mismatched BIN file, the device was configured with 0-size image data causing every host read to fail and hang the Mac during boot. Fixes #331. (2866afd - @erichelgeson)
  • CUE FILE reference validation - CUE sheets are now validated at load time to ensure the FILE reference matches the actual BIN filename, rejecting mismatches early with a clear log message. (3c0a4b7 - @erichelgeson)
  • Fixed Toolbox LIST_CDS creating directories - BlueSCSI Toolbox LIST_CDS no longer creates CD directories on the SD card as a side effect, which could cause SCSI ID conflicts on next power-on. Fixes #325. (baec358 - @erichelgeson)
  • Fixed Ultra RM2 module detection - Updated platform framework and fixed define reference for Ultra RM2. (ab3aacf - @androda)

Refactoring

  • Shared WiFi handlers - Extracted common WiFi command handling from network.c and AmigaWIFI.c into shared code, reducing duplication. (2fab328 - @erichelgeson)
  • Removed outbound packet queue - DaynaPORT packets are now sent immediately upon receipt from the host, eliminating the outbound queue. (e7d9629 - @jcs)

Contributors

@androda @erichelgeson @jcs @RobSmithDev

v2026.02.08

Choose a tag to compare

@github-actions github-actions released this 08 Feb 23:12

BlueSCSI v2026.02.08-RC1 - Superb Owl

If you run into any issues please open a Discussion.

This is a release candidate for all versions of BlueSCSI v2 and Ultra/Ultra Wide.

There will be an Release Candidate 2 as well merging in the recent Wi-Fi optimizations from @jcs wifi-speed and @RobSmithDev #317. ✔️

Known Issues

Issues we plan to address in RC2:

  • Ultra RM2 module not detected due to missing platform update

Updating

BlueSCSI v2

  • Use BlueSCSI v2 for the Pico/PicoW based BlueSCSI.
  • Audio Builds are available and due to memory constraints are provided as a separate uf2s.

BlueSCSI Ultra/Ultra Wide

  • Use the uf2 corresponding to your device.

SD Card

  • Use .bin file.

Future

We have a much nicer update system in the works with one uf2 for all - stay tuned!

New Features

  • CD Audio Output - BlueSCSI can now output CD audio over S/PDIF or I2S depending on model. Supported on Pico, Pico 2, and Ultra/Ultra Wide. DAC required. (6b10879, b63afa7 - @androda)
  • BlueSCSI Toolbox Performance Boost - File transfers are now up to 11.5x faster thanks to larger transfer buffers. Fully backwards compatible with existing BlueSCSI Toolbox clients. (41ecbe9 - @erichelgeson)
  • BlueSCSI Toolbox Metadata API - New API for retrieving device metadata through the Toolbox interface. (279d991 - @erichelgeson)
  • Improved Fragmented Image Performance - Enabled FastSeek for fragmented disk images, improving read performance on fragmented SD cards. (01ebebd - Ian Scott @polpo)
  • Arbitrary Sector Size Imaging - Initiator mode now supports imaging drives with non-standard sector sizes (e.g., 520-byte sectors used by some enterprise drives). (a342253 - @erichelgeson)
  • Configurable SCSI Timing Delays - New INI settings allow fine-tuning SCSI bus timing for compatibility with picky devices like EMU EMAX, Akai samplers, and SGI workstations. (700b28f - @erichelgeson)
  • Configurable Initiator Start Sector - Initiator mode can now begin imaging from a specified starting sector on a per-device basis. (1751310 - @androda)
  • USB Device Name - BlueSCSI now correctly identifies itself as "BlueSCSI" when connected via USB, using standard Pico SDK product IDs. (b104c1e - @erichelgeson)
  • Multi-bin CUE Handling - Directories with a mix of .bin and .cue files now correctly associate .bin files with their .cue sheets automatically. (ea61cbf - @erichelgeson)

BlueSCSI Ultra / Ultra Wide

More information about BlueSCSI Ultra/Ultra Wide can be found at https://bluescsi.com/ultra

  • Initial 16-bit Wide SCSI support - Hardware-accelerated 16-bit wide SCSI bus with synchronous transfer speeds up to 20MHz, wide bus negotiation, and dual-core optimized parity generation. (7fbcc34 - @PetteriAimonen, @morio)
  • Ultra and Ultra Wide board support - Full support for the new BlueSCSI Ultra (RP2350-based) and Ultra Wide (16-bit SCSI) hardware platforms. (2ed8fdc - @androda)
  • Wide SCSI (16-bit) data transfers - Ultra Wide supports full 16-bit wide SCSI data transfers with hardware-accelerated DMA. (2ed8fdc, ee85a89 - @androda)
  • Wide initiator mode - Initiator mode works on Ultra Wide with automatic bus width negotiation. Can image both 8-bit and 16-bit SCSI devices. (ec19528, ee85a89 - @androda, @PetteriAimonen , @morio)
  • Fixed DMA state crash on Ultra Wide - Resolved a race condition in the 16-bit DMA accelerator that caused crashes after 6-byte SCSI commands. (b75b27e - @PetteriAimonen)
  • Fixed initiator mode on Ultra - Corrected a typo that prevented initiator mode from functioning on Ultra boards. (d691d7c - @erichelgeson)
  • Bus width reset on SCSI bus reset - Ultra Wide now correctly resets to 8-bit bus width when a SCSI bus reset occurs, then re-negotiates wide transfers. (b0268dc - @erichelgeson)
  • SCA drive bay support - Ultra Wide boards can now be installed in SCA (80-pin) drive bays with proper signal handling and LED control. (14e6acc, d8f8d5c - @androda)
  • Hardware initiator/USB mode switch - Ultra and Ultra Wide boards support a hardware switch to toggle between initiator and USB MSC modes without changing INI settings. (ec19528 - @androda)
  • SCA detection limited to Wide boards - SCA drive bay detection is now correctly restricted to Ultra Wide hardware only. (196c87b - @erichelgeson)
  • Improved sync negotiation logging - Synchronous transfer negotiation is only logged when speed increases, reducing log noise. (5f321c6 - @erichelgeson)
  • Fixed GPIO assignments - Corrected GPIO pin number assignments for Ultra hardware. (c285331 - @androda)
  • Dynamic DMA channel allocation - I2S audio and Wide SCSI DMA channels are now dynamically allocated to avoid conflicts. (22b15a3, 0a546f8 - @androda)

BlueSCSI v2

  • S/PDIF audio output support - New build targets (BlueSCSI_Pico_Audio_SPDIF and BlueSCSI_Pico_2_Audio_SPDIF) enable S/PDIF digital audio output on any desktop 50-pin BlueSCSI v2 board. Works on both Pico (RP2040) and Pico 2 (RP2350) boards. (6b10879, b63afa7 - @androda)
  • S/PDIF setup failure handling - Graceful recovery when S/PDIF hardware initialization fails. (49dc901 - @androda)
  • Network and audio coexistence - Reduced network packet queue size to accommodate S/PDIF memory requirements, allowing both networking and audio to work simultaneously. (5117441 - @erichelgeson)
  • Removed Arduino dependencies - Migrated from Arduino framework to native TinyUSB and Pico SDK for USB, timing, and peripheral access. (7dc5476, fc518b8, 59de2dd - @erichelgeson)
  • Voltage regulation fix - Properly set voltage regulator for clock speeds above 200MHz. (c75ba7d - @erichelgeson)

Bug Fixes

  • Fixed SCSI timing accuracy - The 100ns timing delay now correctly scales across all supported clock speeds (125-252MHz) instead of producing inconsistent 44-88ns delays. (23b69a7 - @erichelgeson)
  • Fixed SCSI timings out of spec - Corrected bus timing values that were outside the SCSI specification. (bb9a504 - @erichelgeson)
  • Fixed multi-bin CUE track boundaries - Corrected track boundary calculation for multi-bin CUE files where each track is in a separate .bin file with stored pregap. (e85043e - @erichelgeson)
  • Fixed integer underflow in cue parsing - Allows Mac Decent II to parse correctly (fda07d95 - @erichelgeson)
  • Fixed initiator mode on Pico W / DaynaPORT builds - Resolved a conflict between the WiFi driver and SCSI initiator mode that caused initiator failures on Pico W boards. (63d643b - @erichelgeson)
  • Fixed X68000 SASI compatibility - Corrected command descriptor block length for X68000 SASI drives. (9903f2c - @erichelgeson)
  • Fixed BSY signal handling - BlueSCSI no longer incorrectly asserts BSY when reading the REQ line. (cafa219 - @androda)
  • Fixed SEL output pin handling - Improved SCSI selection phase signal output. (9ac34e9 - @androda)
  • Fixed freeze on startup without SD card - BlueSCSI no longer hangs on boot when no SD card is inserted. (4792e18 - @androda)
  • Unit Tests - Helps us developers catch issues before releases. 26 test suites with 2287 assertions. (@erichelgeson)

New INI Settings

[SCSI] Section

Setting Default Description
PhaseChangeDelay 100 (SCSI-1) / 0 (SCSI-2) Delay in microseconds after SCSI phase transitions. EMU EMAX needs 100. SGI O2 may need 15. (700b28f - @erichelgeson)
DataPhaseDelay 400 (SCSI-1) / 0 (SCSI-2) Delay in microseconds before entering data phases. Required by Akai S1000/S3000 samplers. (700b28f - @erichelgeson)
BusFreeDelay 2 (SCSI-1) / 0 (SCSI-2) Delay in microseconds when entering bus free state. (700b28f - @erichelgeson)
SCAModelLEDEnable false Enable LED control for SCA drive bay installations (Ultra Wide SCA only). (d8f8d5c - @androda)

[SCSI0] - [SCSI7] Sections

Setting Default Description
InitiatorStartSector 0 Starting sector for disk imaging in initiator mode. Set per SCSI ID. (1751310 - @androda)

jcs-wifi-speed-test

jcs-wifi-speed-test Pre-release
Pre-release

Choose a tag to compare

network: Send multiple packets in a READ(6), read multiple in WRITE(6)

The Macintosh DaynaPORT driver will combine multiple outgoing
packets in a single SCSI WRITE(6), so we have to be able to parse
them properly or we'll drop traffic.  This was the cause of the
abysmal EtherTalk transfer rate; the Mac was combining the atp-rel
of the first block transfer and the atp-req of the next one in the
same SCSI transaction but we were only processing the first one.
This caused the Mac to have to wait about 2 seconds to timeout from
the server not responding to the next atp-req and then send it again
in its own SCSI WRITE(6).

A real DaynaPORT SCSI/Link-3 will also send multiple network packets
in a single SCSI READ(6) so we can do the same to get a minor speed
increase, provided we pause in between packets as the real DaynaPORT
does so the Macintosh driver doesn't lose data.  We can combine as
much data as we want but we arbitrarily limit it to about 3KB of
data so we don't tie up the SCSI bus too long.  The two pause
durations (one after each packet's size and flags are sent, and one
in between packets) were chosen to line up with what a real
DaynaPORT SCSI/Link-3 does as seen on my Ancot SCSI-bus Analyzer.

Unfortunately the READ(6) change allowing us to send multiple
packets will break other driver implementations but since they were
all written to incorrect specs, they would need to change to work
with a real DaynaPORT SCSI/Link-3 anyway.  This also removes the
hacky Amiga code that was shoved in here but maybe that driver can
be corrected...

v2025.10.27

Choose a tag to compare

@github-actions github-actions released this 27 Oct 20:33

Updating

https://github.com/BlueSCSI/BlueSCSI-v2/wiki/Updating-Firmware

New

  • Add kiosk mode functionality for museum and demonstration setups. - @fstark
  • Added BOMs for other manufacturers #278 - @gutbomb
  • Give the user more information when using WiFi - @morio
  • Add support for CD data track MODE2/2352 - @morio
  • Increase buffers now that we have more room. - @erichelgeson

Fixes

  • Framework Updates
  • Dont fallback to raw if in initiator mode - @erichelgeson
  • Make build_bootloader output more actionable - @erichelgeson
  • Respond to a non standard read subchannel CDB - @morio
  • RP2350: Ensure that code flash is in 4-bit mode after boot. - @PetteriAimonen
  • Fix "Seek to .. failed" error with prefetch close to end of drive. - @PetteriAimonen
  • Standardized board system clock frequencies - @morio
  • Fix onboard eject button on SD card reinsert - @morio
  • fix SD card bootloader being slow - @PetteriAimonen
  • Fix Read Defect Data response - @PetteriAimonen
  • Fix CLEAR_ROM crash - @morio
  • Fix >64 kB writes when using non-power-of-2 sector sizes. - @PetteriAimonen
  • Fix timings at 155.25MHz on Pico2W - @morio
  • RP2040: Free RAM by optimizing which functions go to Flash/RAM - @PetteriAimonen
  • Decrease bootloader flash usage - @morio
  • Add dev shell.nix - @erichelgeson

Full changelog: v2025.08.02...v2025.10.27

Two new contributors this release - @gutbomb and @fstark