
这可能是世界上最硬核的iPod改造
几年前,我从ebay上竞拍下一套成色极好且包装和所有配件都几乎全新的的第二代iPod:

对于iPod爱好者和玩家而言,最常见的改装,莫过于将其中容量有限、耗电量可观,且极易损坏的机械硬盘替换为SD卡或CF卡等闪存介质。
对于iPod Mini而言,直接把原机那块CF Type II规格的机械硬盘替换成普通CF卡,再额外使用硬盘扇区编辑软件修改一下扇区起始参数即可完成改装。

而对于其他使用USB-30pin dock数据线的后期iPod,比如iPod Video和iPod Classic而言,则可以直接使用CE-ZIF规格的SSD,乃至各种廉价转接板实现改装。

即便对品质有莫名其妙的追求,也可以买一块比二手机器还贵的iFlash转接板满足心理自我安慰:

但当无数iPod爱好者上手iPod一代和二代,并打算如法炮制时,却发现困难重重。
首先,iPod前两代机型使用了一块相对比较特殊的东芝1.8寸CF-IDE接口的机械硬盘,容量从5GB到20GB不等:

这玩意儿的接口虽然在协议上走的是ATA,但物理规格却跟CF卡很像:

都是50pin,连针脚间距都完全相同,只不过这块硬盘的前6pin实际上是设置主从盘模式的跳线,实际只有44pin,而其中的40个针脚才是对应IDE/PATA协议。
好在除了iPod之外,还有一些早期的PC,尤其是笔记本电脑使用这种规格的机械硬盘,再加上CF卡自诞生之初就完整支持True-IDE模式以及PATA协议,
因此也催生出后市场上的几种CF-IDE转CF的转接卡/线,例如:


正当这一小撮iPod早期用户尝试将CF卡转接为CF-IDE接口,并寄希望于其能正常工作时,第二个诡异的情况出现了:
正常状态下的iPod根本不识别转接后的CF卡!
这确实不符合逻辑,毕竟CF卡本身是支持ATA协议的,转接线/卡也老老实实把对应针脚进行了导通,原则上iPod理应将CF卡识别为一块硬盘并正常工作。
于是,全球各地的爱好者在十余年间开始了各种假设和瞎猜:
- 早期iPod的硬盘控制器不支持闪存
- Firewire(火线)控制器不支持读写闪存
- 早期iPod有严格的存储设备容量限制
- CF卡对ATA协议的支持不完整
................
但以上猜测 - 即便是考虑到iPod爱好者中不乏相对有一些专业知识背景的人,也基本都属于瞎猜乃至胡说八道的范畴。
在逻辑层面,闪存/CF卡跟机械硬盘并无实质性区别。

iPod Mini也有火线控制器,但却能完美实现闪存改装。
早期iPod最大容量20GB,但即便是2GB的CF卡也无法被这些iPod识别和使用。
CF卡最初的规范就要求完整支持ATA协议和True-IDE模式(而将CF卡装入数码相机或PDA之类的设备时,CF卡工作在闪存/纯介质模式)。
甚至哪怕是从市面上找到某些笔记本使用的40GB的东芝1.8寸CF-IDE接口硬盘,也同样无法被iPod识别和使用。
一开始,我也是被这些网络上的猜测弄得毫无头绪,直到我鬼使神差开始阅读iPod一代和二代使用的主控以及硬盘、火线控制器的datasheet,一切真相才逐渐浮出水面。
首先,正如前文所述,iPod时期的苹果,可能是由于技术实力所限,也可能是单纯脑残,画蛇添足地在iPodOS(是的,官方就叫这个名字)加入了对硬盘类型的判断。
注意,不是对介质种类(机械硬盘或闪存,这个它无法判断)的判断,而是判断安装的存储介质是否为移动设备。
具体到CF卡,固件中包含一个8-bit参数,用来切换其状态:Fixed/Removable media。
早期的CF卡,大致要早到CF卡容量普遍只有32MB~128MB时,Sandisk曾发布过一个命令行小工具:ATCFWCHG,可以一件切换CF卡的工作模式。
但当各路厂家发现Fixed Media模式的CF卡是工控机等工业领域的刚需后,就强制锁死CF卡固件,即便使用SMI主控的量产工具也无法更改这个参数。
而早期的iPod恰好强制要求硬盘/存储介质必须处于Fixed Media工作模式,遇到Removable Media模式的普通消费级CF卡就直接拒绝执行任何写入指令(但读取还能正常执行,后面详细说)。
我是怎么发现这件事的?几年前的某天我在德国某个小镇上的线下跳蚤市场用白菜价买了块64GB的创见工业级CF卡(CF170),突发奇想插进所谓的“cheap adapter”,也就是市面上常见的CF转IDE转接板,iPod居然能在工程模式正常识别CF卡了。进一步查询工业级CF卡跟消费级CF卡的区别,发现除了NAND Flash的类型差异外(SLC/MLC和TLC),逻辑层面就只有上述那个固件的8-bit flag了。
但此时,即便iPod能识别这块CF卡,经Firewire火线接口刷写固件以及同步歌曲的速度也慢得令人发指 - 光是让iTunes识别到iPod以及其容量和已存储的数据,就需要好几分钟时间。
又在网上一番搜刮,发现某个英国的老哥也遇到了类似问题(但他用的是消费级CF卡)。而他的解决方案非常简单粗暴:既然iPod经Firewire无法被iTunes正常识别,那就把CF卡取出来,从机械硬盘里提取出包含固件的那部分扇区,再经各种硬盘克隆工具把这部分扇区强制写入到CF卡里,从而实现整件事的第一小步:iPod换装硬盘后写入iPod OS并正常启动。
但即便用这种方式让iPod正常启动并能顺利读取CF卡中的数据后,这个状态下的iPod依然有以下明显故障:
- 无法保存系统设置,每次重新开机/重启都需要重新执行一次初始化设置
- iPod自动或手动进入休眠模式,唤醒后无法正常播放音乐,整个播放器会卡死,只能强制重启
此时,也是绝大多数,或者说在我沉下心研究这个问题之前,100%的人都止步不前的进度。
在这个状态下,所有人都放弃折腾,转而寻求以下两种方式来让安装了闪存介质的iPod一代和二代勉强工作:
- 找一台iPod Mini,完成歌曲同步,再把iTunes_Control文件夹(保存歌曲的目录)复制到CF卡里,再把CF卡装回老iPod里。此时,这些老iPod外加消费级CF卡,确实能貌似正常播放音乐,但进入休眠并重新唤醒后,继续播放音乐会直接卡死,只能强制重启;以及无法保存任何iPod系统设置,例如时间、背光超时乃至语言设置等。使用工业级CF卡可解决休眠唤醒卡死以及系统设置无法保存的问题,但同步问题依然无解。
- 破坏性改造,通过飞线引出能直接读写闪存模式下CF卡(也可以是SD/microSD卡)的USB接口,并刷入Rockbox来读取并播放存储卡中的音乐。
我在很长一段时间内都是走的第一种方案,毕竟一旦把大多数常听的歌曲存进去之后,就很少会有同步需求。
至于第二种方案,我的主观评价是:有病就去治。
某天,我突发奇想翻开了iPod使用的德州仪器TSB43AA82火线控制器(同时也是硬盘控制器)的官方datasheet,并耐住性子仔细分析,然后有了新发现:

TI这颗控制器,遇到CF卡就会放弃原本正常的Bulky data interface,自动降级为PIO读写模式。
但即便是PIO模式,理论上也应该有大约11MB/s的读写速度,不至于连刷个固件都要等半小时,必定还有其他幺蛾子。
接下来的细节就不在datasheet里能找到了。
拆开iPod,配合早期iPod的PP5002主控的有限资料,我进一步发现,iPod在PIO模式下,由于磁盘控制器无法像DMA模式下那样直接读写,因此需要依赖外部MCU,也就是iPod的主控芯片来执行读写指令。
而iPod主控走PIO模式读写时,会先将数据缓存到一颗夏普的,容量为1MB(8Mb)的RAM芯片中:

也就是说,在更换了CF卡的老iPod上,整个读写流程变成了下述过程:
- TI的火线/硬盘主控接到读写指令,发现是CF卡,于是降级为PIO模式,将指令传输给iPod主控。
- iPod主控收到读写指令以及数据后,将数据分割为1MB大小,并存入读写RAM中。
- iPod主控发起flush指令,让RAM内的数据写入CF卡,并清空RAM,进入下一个读写循环。
- 每个读写循环总共需要大约3秒时间来完成所有操作,而由于PIO模式下的读写缓存(RAM)只有1MB大小,因此1MB/3,平均每秒只能读写300KB左右的数据。
- 由于同步期间还需要读取数据,因此这个1MB缓存还会被读取的数据占用,整体的写入时间会被进一步拉长。
问题已经十分清楚了,但这种硬件架构层面的问题,我自己肯定是搞不定的,于是我三年前尝试给知乎以及B站一些粉丝量巨大的专业人士发私信求助,但无一例外均没有收到任何回复。
无奈,我在reddit上发了三篇帖子,把分析过程和结论写了出来,希望有人能设计一块主动式转接板,绕过上述限制。



意料之中,这三篇帖子在三年时间里都只有零星点赞,回复也极少,更不用说有人提解决方案了。
不过就在前几天,突然有另一个用户在iPod社区的帖子里@我。
一开始我以为这又是一个认为依然存在某种成品转接线/卡可以适配早期iPod的天真用户,毕竟这类群体时不时就会给我发私信“展示”他们的发现,例如:



但这一次情况似乎彻底不同,因为这个用户发表的帖子,标题是:
1st/2nd Gen iPod flash mod WITH full speed syncing over FireWire
如果光看标题,这依然极有可能是一篇每隔一段时间就会冒出来的“破坏性”改装,类似前面提到的飞线外接接口+Rockbox固件方案。
但开篇第一张图就打破了我的猜测:

这是一块之前从未出现过的转接板,正面是一片Lattice的FPGA。
正文也直接提到了我在三年前提出的那个想法:

这个reddit用户顺着我之前的思路重新把TI TSB43AA82控制器的datasheet和与之相关的所有reference design文档全读了一遍,并在我之前的结论之上又发现了两个新问题:


因此,iPod一代和二代(其实也包括三代)无法使用普通转接板,直接用CF卡替换机械硬盘的原因,或者说替换后的故障现象,是以下总共3个独立问题导致的:
- iPodOS强制要求存储介质是Fixed Media,否则就拒绝读写。
- 由于TSB43AA82缺乏读写CRC校验和特性,因此遇到强制要求提供CRC校验结果的正常存储设备(市面上绝大部分机械硬盘和闪存卡),这些存储设备就会拒绝工作在UDMA模式,而此时TSB43AA82只能回退到PIO模式工作。而苹果当年跟东芝合作,定制了硬盘固件,允许硬盘在读写时忽略CRC校验和的需求。
- 本来iPod的PP5002主控集成的硬盘控制器也能工作在DMA模式下(用于正常播放时读写磁盘),但由于设计缺陷,信号稳定性很差,其UDMA写入操作有一定概率导致磁盘文件系统损坏。
而这块基于FPGA的主动式转接板,主要就是针对上述三个问题进行的“欺骗”和修复:
- 将任意CF卡伪装成Fixed Media。
- 在每一条读写指令末尾,伪造一份符合CF卡主控预期的CRC校验指令,从而让CF卡与TSB43AA82通信时(火线接口同步数据或磁盘模式读写),一直工作在UDMA2模式。
- 欺骗PP5002主控,让主控以为存储介质只支持PIO模式,从而绕过可能导致文件系统损坏的UDMA读写指令。
原理搞懂了,这个毫无硬件工程背景的哥们儿(大概率只是个普通程序员,或者是研究协议方面的人),硬是生啃PCB设计和FPGA编程,把能用的转接板以及FPGA固件折腾了出来,自己手动焊接了一块能用的原型成品,然后第一时间把设计文档发给我了一份。(为此他还搞了一套廉价电子放大镜、一套热风枪)
但问题是,我跟他一样,完全没有硬件领域的教育背景,也没有热风枪焊台和电子放大镜,甚至我都不打算买这些玩意儿(占地方,平时用不上)。
于是对着这堆Gerbers、kicad、jed和BOM文件,我也被迫开始学习一些必要的入门知识,最终在嘉立创上成功下单PCB生产订单,然后在淘宝上买了各种转接板需要的元器件和Lattice专用的编程器。
说实话,我在焊接方面的经验,可能也就比转接板作者略微好一点(据他说,这是他第一次焊这类引脚密集的PCB),我至少有过多次给路由器和MP3换内存和闪存芯片的经验。
但在面对TQFP-100以及CF卡槽这种有大量引脚的东西时,我心里也没任何把握。
不过在咨询了几个老手之后,得到几条建议:
- 正式焊接之前,先找几块废板练练拖焊
- 别舍不得助焊剂
- 针脚连锡之后用吸锡带处理
在两块光猫PCB的NAND Flash上练了两次之后,我开始着手转接板的焊接。
其实之前我也想过直接用嘉立创的SMT服务,但一方面是嘉立创提供不了有些元器件(特别是CF-IDE接口),另一方面也是收费非常贵(裸板生产大概10元/片,含元器件后的生产成本飙升到100元/片)。
最终还是决定自己手动焊接。

从最终的结果来看,出乎意料的是,FPGA芯片的焊接一次成功,反而是那些比半颗米还小些的电容电阻消耗了我绝大多数时间。
最终,在经历了无数次自我怀疑(电容电阻到底焊没焊好)之后,这块板子终于顺利刷入了FPGA固件:


又再次经历了对于CF卡槽引脚到底有没有虚焊的多次自我怀疑后(事实证明确实有几个引脚虚焊),这块板子终于能在iPod上正常工作了:

之后又跟开发者老哥沟通了几个我发现的bug后(主要是跟兼容性相关,实际上是由底层FPGA程序中的硬编码参数相关),最终得到了一版基本完美的固件。
至此,在iPod一代和二代发售26年后,第一次有这么一款外挂配件能彻底解决iPod本身的硬件设计缺陷,并让闪存(目前只能是CF卡)在这些iPod中完全正常工作。



现在回顾这块转接板的诞生经历,从三年前那几篇有些无奈和无助的reddit帖子,到三年后出现一个依然具备互联网精神的白衣骑士,两个人花了大量时间,只为让一款20多年前上市的,存在潜在硬件bug的经典产品能继续发光发热,这本身几乎只能出现在梦里。
在如今这个快节奏、所有人都压力巨大、内卷以及充满戾气的全球环境中,依然还有一小撮人保留了最初的互联网精神:互利、互助、共享,只为解决一个毫无经济利益、只因兴趣爱好而起的问题,并最终由两个毫无硬件开发知识背景的人跨国合作捣鼓出来可用的成品,不得不说也算是一个小小的奇迹。