USBSID-Pico:将真实的Commodore 64音效连接至现代USB接口

Hacker News Top 工具

摘要

USBSID-Pico是一个开源硬件项目,它利用树莓派Pico微控制器将真实的Commodore 64 SID芯片与现代支持USB的设备连接,以实现地道的复古音频回放。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/09/03 17:59

# USBSID-Pico:将真正的Commodore 64音效带入现代USB时代 来源:https://smallrun.net/blog/loud/usbsid-pico-sids-on-usb ## [](https://www.youtube.com/watch?v=nh0SxO1y6I0) 对于我们许多复古爱好者来说,Commodore 64的MOS Technology SID芯片(6581和8580)被认为是音频史上最具标志性的声音芯片之一。 现代软件模拟虽然接近,但无法真正替代真实复古硬件的模拟滤波器和温暖的失真效果。 我是LouD (https://github.com/LouDnl)(意为响度),我创建了**USBSID-Pico**,旨在通过USB(CDC/WebUSB/WebSerial)、MIDI、ASID,并在未来可能支持WiFi和蓝牙,将真实的SID芯片直接连接到现代工作站、手机和媒体播放器。 该开发板基于Raspberry Pi Pico微控制器系列(rp2040和rp2350),可作为最多两个(即将支持四个)物理SID芯片或现代硬件替代品的灵活控制器。 以下是我(据我所记得的)旅程,以及尝试创建一个项目构建日志的尝试,详细记录了从早期原型到如今为(至少部分)爱好者提供复古音频体验的开源硬件的起点与演变。 ## 起源 在我记忆所及之处,我就对事物的运作原理充满兴趣。 从父母购买的第一台Commodore 64,到家里拥有的第一台XT电脑,再到我青少年时期购买的第一台奔腾电脑,直到今天(并持续至今)我作为一名软件工程师工作。 科技让我着迷,因此当有机会时,我喜欢将其拆开,探究其工作原理,然后进行“改进”并重新组装,并不(起初)在意它是否还能工作。 我算不上音乐家,但确实喜欢聆听各种音乐,当然包括芯片音乐;-) 受我哥哥启发——他维修Commodore 64以及其他设备——一个新的项目想法在我脑海中浮现。我想看看能否创建一个SID播放设备,以便聆听我已在电脑上收听的SID曲调,甚至可能通过真实的SID芯片播放它们。 大约在2024年2月/3月,我偶然发现一个GitHub仓库,可以创建一个基于Raspberry Pi Pico的名为SIDPod (https://github.com/henrikenblom/SIDPod)的SID播放器。 我欣赏它使用微控制器播放SID文件的简洁性,因此我当然必须构建一个。 SIDPod测试版 向SIDPod闪存添加更多SID文件的方式促使我尝试在现有出色设计上添加SD卡,这催生了SIDPod-SDCard (https://github.com/LouDnl/SIDPod-SDCard)。 SIDPod-SDCard测试版 2024年4月初,我仍未对结果感到满意,发现了ESP32-SIDView (https://github.com/tobozo/ESP32-SIDView)。 这似乎是一个不错的SIDPod替代播放器,额外的好处是支持真实SID芯片! 构建一个成为合乎逻辑的下一步,但当时我没有任何真实的SID芯片,因此必须找到一个。 SIDKICK-pico (https://github.com/frntc/SIDKICK-pico)是我找到的第一个SID替代品,没有原理图,但可以订购。 凭借一些业余硬件逆向工程经验,我重新绘制了原理图,并弄清了Pico到DIP-28的引脚排列,以便在面包板上使用。 ESP32-SIDView测试版 对于上图中可见的杂乱接线,我感到不满意,必须整理一下。 ESP32-SIDView整理测试版 在让ESP32-SIDView工作方面遇到一些问题后,我通过GitHub联系了其开发者tobozo (https://github.com/tobozo)。我们在GitHub上就这个项目交换了无数消息。后来我们转到另一个平台继续交流(并且至今仍如此),谈论他和我的项目、编码、猫、日常生活等。这个GitHub issue促成了一段——如果我可以这么说——很棒的数字友谊。 同时,我也发现了SidBerry (https://github.com/gianlucag/SidBerry)。一个基于Linux的控制台应用程序,可通过Raspberry Pi(非Pico)的GPIO引脚播放SID曲调。 带SKPico的RPI面包板扩展板 2024年5月初,SidBerry与Raspberry Pi的结合最终促成了FTDI USBSID的诞生,这是我首次尝试创建USB控制的SID设备。为此,我使用了一块我已拥有的用于逆向工程的FTDI FT223HL (https://github.com/arm8686/FT2232HL-Board)分线板。 在此期间,我获得了v0.1 SIDKICK-pico和2个半坏的MOS6581。 FTDI USBSID 创建自己的硬件支持板也意味着要创建软件支持。 回忆起来,以下是相关链接: 1. SidBerry的FTDI版本 (https://github.com/LouDnl/SidBerry/tree/b53fc092ab34bf39ff06d2e8d2aaac02f5c7c377) 2. Vice 3.8的FTDI版本 (https://github.com/LouDnl/vice-svn-mirror-usbsid/tree/Vice-3.8-FTDIUSBSID) ## 项目 使用FTDI分线板带来了许多限制。 它不是一个微控制器,因此所有的GPIO写入和输入/输出切换都必须在驱动程序中完成,并且使用FTDI生态系统并非我真正喜欢的。 到2024年5月底,对这些限制的厌倦促使我创建了USBSID-Pico (https://github.com/LouDnl/USBSID-Pico),实际上当时名为PicoUSBSID。一个支持单个SID的洞洞板版本。 PicoUSBSID单SID版本 2024年6月中旬,我在同一洞洞板上增加了双SID支持。 PicoUSBSID双SID版本 在tobozo (https://github.com/tobozo)的持续支持和鼓励下(谢了哥们),第一个真正的USBSID-Pico v0.1开发板诞生了,这导向了第一个v1.0开发板。 接下来的是一段令人难以置信的创意之旅,掌握新技能,提升现有技能,学习新事物并结交新朋友(以及树敌?)。 我与许多新朋友和群体交谈并会面,几乎不可能在这里全部列出,但我在结尾的致谢中至少尝试列出了一些启发过我的人。 **关键技术亮点(v1.0):** 1. **双SID固定电压插座支持**(6581或8580 MOS芯片以及如Swinke SID、FPGASID和ARMSID等硬件替代品)。 2. **多协议连接**:通过原生USB、WebUSB(浏览器播放)、USB-MIDI和ASID流协议。 3. **跨平台支持**:涵盖Windows、macOS、Linux、Android和AmigaOS。 4. **OSHWA开源硬件认证**(NL000035 (https://certification.oshwa.org/nl000035.html))。 5. **原理图和PCB设计开源提供**:通过GitHub仓库 (https://github.com/LouDnl/USBSID-Pico)和PCBWay (https://www.pcbway.com/project/shareproject/USBSID_Pico_c99c9748.html)使社区能够自行组装。 **v1.3升级:** 1. **混合SID配置**:允许同时混合不同芯片代际(例如,在插座1中配对12V 6581,在插座2中配对9V 8580)。 2. **硬件音频切换**:添加了数字开关,可直接在开发板上切换单声道和真立体声(插座1左声道,插座2右声道)输出。 3. **OSHWA开源硬件认证**(NL000045 (https://certification.oshwa.org/nl000045.html))。 4. **原理图和PCB设计开源提供**:通过GitHub仓库 (https://github.com/LouDnl/USBSID-Pico)和PCBWay (https://www.pcbway.com/project/shareproject/USBSID_Pico_v1_3_05f2b88e.html)使社区能够自行组装。 **v1.5升级:** 1. **100%无跳线电压控制**:自动检测并设置正确的供电电压(9V vs 12V),保护稀有的SID硅片免受过压损坏。 2. **自动切换**:根据插座电压,滤波电容、音频分路电阻和数字增强电阻会自动启用和禁用。 3. **扩展尺寸**:略微加宽开发板尺寸,以容纳可选的**双ZIF(零插拔力)插座**。 4. **更好的兼容性**:增加了足够的间距,以容纳更大的硬件替代品(如FPGASID)而不产生机械干扰。 5. **升级的音频保护**:当音频插孔未插入插头时,通过添加下拉电阻提供额外的音频输入保护,并在音频输入处添加了ESD二极管。 6. **原理图开源提供**:通过GitHub仓库 (https://github.com/LouDnl/USBSID-Pico)使社区能够自行修复。 **专业版路线图功能(待定):** 1. 四SID支持(支持**4个硬件SID芯片**的插座)。 2. 用于录音室录制的高级音频路由和更低的底噪。 3. 专用MIDI输入端口 ## 硬件时间线 自启动此项目以来,发生了许多事情。为了让你了解从v0.1开始的(硬件)开发过程,这里有一个简要的时间线。 1. 2024年5月:单SID洞洞板版本。 2. 2024年6月:双SID洞洞板版本。 3. 2024年7月:v0.1未发布迭代版本。 4. 2024年8月:v0.2未发布迭代版本,修订了音频输出。 5. 2024年10月:v1.0经过几次印刷电路板迭代后,**USBSID-Pico v1.0**正式发布。 6. 2025年2月:v1.1废弃迭代版本。 7. 2025年3月:v1.2未发布迭代版本。 8. 2025年4月:v1.3正式发布硬件修订版,支持混合SID类型,并基于社区反馈优化了音频配置选项。 9. 2026年3月:v1.4未发布迭代版本。 10. 2026年7月:v1.5正式发布硬件修订版,通过消除危险的手动跳线配置彻底改变了开发板的易用性,并为可选的ZIF插座增加了更多板上空间。 11. **音量子板**:一个可选的配件PCB,即插即用于v1.5+开发板(在v1.3上需要小改动),可独立控制左右音频音量。它有自己独立的硬件修订线,并以CC BY-SA 4.0许可。 12. **外壳**:社区为每个PCB修订版设计了外壳,从卡带风格的外壳到双板Commodore 64外壳,所有内容都收集在仓库的`cases/目录中`。 13. **2026年底/2027年初**:USBSID-Pro开发(目标)——**USBSID-Pro**正在开发中,专为音乐家、音频制作人和SID芯片音乐纯粹主义者设计。 ## 固件 开发用于搭载微控制器的全新独特PCB,自然也需要为这些微控制器开发固件。 选择好要使用的微控制器后,你实际上需要深入了解其SDK。这伴随着利弊;你需要深入研究该微控制器的SDK,但这也会限制你对其他微控制器的视野。或者至少,这是我的经验,主要是因为时间宝贵,你无法同时做所有事情;-) ## 双核,各司其职 在深入了解时钟和总线技巧之前,了解Pico上的两个ARM核心如何分工是有帮助的。 核心0*始终*处理所有USB相关任务:CDC、WebUSB、MIDI,以及配置管理。 另一方面,核心1有多个任务:它运行MIDI引擎、板载模拟器(用于SID播放或需要时的Cynthcart)、用户触发的SID测试,以及在未执行其他任务时处理VU表。当核心1忙于处理板载模拟器时,VU表会被转移到核心0。 两个核心都可以进行SID总线写入,因为实际的写入操作被移交给下文所述执行时序关键工作的DMA/PIO。 在两个核心之间平衡任务并依赖DMA/PIO,使得USB流量、MIDI处理或配置保存可以在不触及周期精确的总线时序的情况下发生。如果它们共享一个核心,一个时序不佳的USB中断可能会导致SID时钟抖动,这正是下文所述PIO卸载所要解决的问题。 ## 技术深入探讨:通过rp2040/rp2350 PIO实现精确SID时钟与总线管理 通过USB控制复古MOS声音硬件时的主要挑战是**时序精度**。MOS 6581和8580 SID芯片不使用异步寄存器接口;它们依赖严格的相位时钟来驱动内部的开关电容模拟滤波器、声音包络发生器和数模转换器。 SID时钟线上的任何抖动或频率漂移都会导致可闻的音调漂移、刺耳的滤波器阶跃或破碎的采样播放(Digiplay)。 为了解决这个问题而不牺牲系统响应能力,**USBSID-Pico**利用了Raspberry Pi Pico系列(rp2040和rp2350)内置的硬件**可编程I/O(PIO)**状态机和直接内存访问(DMA)。 ### 1. 生成低抖动1 MHz系统时钟 在标准的PAL Commodore 64计算机中,SID时钟运行在**0.985248 MHz**(或NTSC系统的**1.022727 MHz**)。现代USB控制器通常使用CPU位操作或标准PWM生成器来近似此频率,但来自USB流量的CPU中断可能导致周期滑移。 USBSID-Pico将主时钟生成完全委托给一个专用的PIO状态机: 1. **抖动消除**:由于PIO状态机独立于ARM Cortex核心运行,无论CPU上运行着繁重的USB数据包传输、MIDI处理还是配置任务,时钟信号都能保持完全周期精确。 2. **灵活的频率控制**:PIO分数时钟分频器允许动态配置时钟输出。固件可以无缝生成标准1.000 MHz方波,精确锁定到PAL/NTSC C64频率,或为自定义硬件替代品调整时钟。 3. **外部时钟回退**:在v1.0开发板上,如果存在外部振荡器(例如,通过跳线选择),PIO状态机可以动态切换到读取并传递外部信号。 ### 2. 使用DMA实现周期精确的总线同步 除了驱动主时钟外,向真实SID芯片写入值还需要遵循相对于PHI2的精确时序窗口。寄存器写入需要在PHI2高电平期间的特定持续时间窗口内设置**地址总线(A0-A5)**、**数据总线(D0-D7)**,并将**芯片选择(C̅S̅)**和**写使能(W̅E̅)**拉低。 USBSID-Pico将**PIO状态机与DMA缓冲区**结合使用,以实现确定性的低延迟总线周期,仅产生一个时钟周期的开销: 1. **缓冲区排队**:寄存器写入数据包(来自WebUSB、ASID或USB-MIDI)几乎直接从USB堆栈放入DMA缓冲区。 2. **总线控制**:PIO状态机2控制RW和两个C̅S̅引脚。 3. **并行引脚映射**:第三个PIO状态机使用单个时钟周期内映射的`SET`和`OUT`引脚目标,同时处理8位数据总线和6位地址总线。 4. **死区时间与建立时间控制**:第四个状态机程序通过触发PIO特定的中断来在断言C̅S̅和驱动数据之间插入精确的周期延迟(`[delay]`预操作),这些中断触发上述两个状态机,从而保证满足芯片的建立时间和保持时间要求,而不会使主处理器停滞。 一个值得注意的要点:所有这些仅在`-O3`优化级别下成立。降低优化级别,编译器会在DMA/PIO交接处生成足够的额外开销,重新引入时序余量,这会在嵌入式SID播放器和Cynthcart中表现为破碎的采样播放。因此,对于此固件而言,`-O3`不是“可有可无”的;它是**支撑性的**。 你说周期精确?证明它!Wonderland XIII (https://www.youtube.com/watch?v=z4dil3tpabU) Wonderland XIII 结束曲 by Censor Design (2016) (在USBSID-Pico上使用MOS6582演奏) ### 3. VU表反馈 并非固件的所有内容都是关于正确地将字节放入SID总线,有时你也只是希望开发板看起来是“活的”。 板载LED(Pico/Pico 2)以及在带有板载WS2812的黑色克隆板上的RGB LED,都充当由SID1(默认)声音数据驱动的VU表,这些数据直接从通过的寄存器写入中计算得出。哪些声音馈送VU表...

相似文章

Tidy PSU – PD-64 C64 PSU 为Commodore 64带来USB PD支持

Hacker News Top

PD-64是一个紧凑型USB PD替代电源,适用于Commodore 64,通过USB PD适配器和小型平面变压器提供5V直流和9V交流,具备多重安全保护。该项目在GitHub上开源,提供原理图和3D文件。

我打造了一个袖珍Macintosh

Jeff Geerling

使用运行Pico Micro Mac固件的Raspberry Pi Pico打造了一个袖珍Macintosh,具备VGA输出和USB键盘/鼠标。