Skip to content

Releases: BlueSCSI/BlueSCSI-v2

AS400 Testing

04 Apr 13:44

Choose a tag to compare

AS400 Testing Pre-release
Pre-release

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

Prior build based on b9b0e84

v2026.04.27

28 Apr 00:38

Choose a tag to compare

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

Nightly

25 Feb 04:07

Choose a tag to compare

Nightly Pre-release
Pre-release
build: pin release artifact date to America/Chicago

Restores the timezone fix that was lost during the PlatformIO->CMake
migration (originally 1e884640b).

v2026.04.19-dev

19 Apr 18:52

Choose a tag to compare

v2026.04.19-dev Pre-release
Pre-release

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

01 Mar 15:14

Choose a tag to compare

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

08 Feb 23:12

Choose a tag to compare

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

13 Jan 21:52

Choose a tag to compare

jcs-wifi-speed-test Pre-release
Pre-release
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

27 Oct 20:33

Choose a tag to compare

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

v2025.08.02

02 Aug 16:26

Choose a tag to compare

Known Issues

  • Initiator mode does not work. Use the v2026.02.08 or later instead.

Updating

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

Fixes

  • Re-apply SDIO patch to address timeout issues - Fixes #277 @androda
  • Don't allow users to to get into a bad state on the MacPlus profile @erichelgeson
  • Speedup tape reads and fix tape issues - @morio
  • Fix build issue with Pico2 (non-W) profile - @erichelgeson
  • Remove logs related to USB Thumb drive mode that were confusing to users @erichelgeson

Full changelog: v2025.07.11...v2025.08.02

v2025.07.11

11 Jul 20:43

Choose a tag to compare

NOTE: Docs and release notes are currently being updated. Please be patient while everything is updated.

v2025.07.11

  • Fix #276 - Issue entering initiator mode
  • Fix issue with MacPlus booting
  • Additional 1-2% performance improvement on PicoW

v2025.07.08

  • Bugfix with USB<>SCSI Bridge mode.

v2025.07.07

Updating

Note: You can only use the new SD Bootloader after you flash this release via .uf2.

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

Changes

SD Card Bootloader Added Back

We've restored the ability to update your firmware via SD card. Place the appropriate bin file onto the root of your SD card and power cycle the BlueSCSI.

Note you must flash the .uf2 this release to get the boot loader, then use the .bin files for future updates.

Fixes: #77

Present SD Card as USB Mass Storage

Plugging your BlueSCSI into a computer will now present the SD card as a USB Mass Storage device. This allows you to easily copy files to and from the SD card without needing to remove it from the BlueSCSI.

NOTE: The USB connection speed is USB 1.1. This can be disabled via the ini setting EnableUSBMassStorage=false.

https://github.com/BlueSCSI/BlueSCSI-v2/wiki/USB-Thumb-Drive-Mode

USB -> SCSI Bridge Mode

Want to boot your Windows 11 computer off that old SCSI drive? This will allow you to do that.

Fixes #212, Replaces PR #221.

https://github.com/BlueSCSI/BlueSCSI-v2/wiki/USB-Bridge

Present SCSI Images via USB Mass Storage

Instead of presenting the SD card contents, you can present the images on the BlueSCSI to your computer. This allows you to work with files directly on an image. Note: Your computer must support the file system of that image.

Enable it via: USBMassStoragePresentImages=true

Fixes #13

https://github.com/BlueSCSI/BlueSCSI-v2/wiki/USB-Thumb-Drive-Mode

Fast20 20MB/s SCSI Bus Timings

We now support Fast20 SCSI bus timings, which allow for up to 18MB/s transfer speeds.

See: https://github.com/BlueSCSI/BlueSCSI-v2/wiki/Ultra-SCSI-Fast20-OverClock

Buttons on all hardware

Allow users to hook up to two buttons to any BlueSCSI hardware. It will automatically configure them to any removable drives such as CDs. You will can also manually set them if you have more than two removable drives.

Buttons are available on all hardware revs, see Buttons

Interactive USB Console

You can now interact with the BlueSCSI via a USB Serial connection. Currently, the available commands are: reboot, reboot into bootloader, and reboot into USB Mass Storage mode. This is useful for debugging and development. Ideas for new commands are welcome! This replaces PR #215.

Other

  • Updated frameworks:
    • SdFat 2.2.3 (Fixes #258)
    • Arduino core 4.3.0
  • Bug fixes:
    • Fixed issue with ROM drive overwriting firmware (#98)
    • Fixed PicoW/Pico LED on common firmware
    • Don't warn on non-Apple images, instead check if it's an HFS volume
  • Features
    • Default to 200MHz clock now that it's the default in the PicoSDK
    • No longer auto join any open WiFi SSID. Use ini or the WiFi utilities to join
  • Various other bug fixes and improvements.

Thanks to all the contributors!

And thanks to you for using BlueSCSI.