在此帖子中,我为覆盆子PI型号4 B创建了一个软盘控制器。
如果有一个批评,我比任何其他关于PI的批评更频繁地听到,它是“我希望我的覆盆子PI有一个软盘驱动器”。这真的很令人震惊,PI没有普遍的34针软盘标题,我们都知道和爱。您应该如何接口Tandon TM100-2A或TeaC FD-55BR甚至是尖端人物,您的索尼MFP290 3.5“高密度驱动器?
所以我沿着raspbery pi和软盘驱动器之间的缺失链接设置了这一点。
我过去几次使用WD37C65软盘控制器IC,最值得作为RC2014计算机的软盘接口项目的一部分。我以前使用过RC2014的Romwbw Cp / M分布以及作为其一部分包含的软盘驱动器。所以我很好地了解这个芯片,并决定前进并利用它为我的覆盆子PI项目。
WD37C65是一款很大的单芯片解决方案,组合软盘控制器,数据分离器和控制锁存器。它实际上具有三种不同的芯片选择,一个用于控制器,一个用于DOR(磁盘操作寄存器?),一个用于DCR(磁盘配置寄存器?)。您可以轻松地将其与一流的复古驱动器连接,从基本的360KB软盘驱动器到1.44 MB的高密度驱动器。是的,我很确定在RC2014上工作时,我也将它接入一些旧的8“Qume驱动器。有几个可选数据速率,您可以编程每扇区数量,头部数,扇区数和字节数。控制器可以与中断一起使用,也可以使用轮询。这是一个伟大的老式IC。
电路真的很简单,只有一个IC,WD37C65控制器。该IC直接连接到34针软盘头部。还有一些有关的软盘驱动器状态线大约几十个,类似索引传感器和写保护传感器。有一个16 MHz振荡器,提供了控制器需求的时钟。
大多数控制器线直接界面到PI。 LD,WR,CS,A0等的线路是严格的PI到控制器信号,并且PI和控制器都兼容,即使PI是3.3V设备,控制器是5V设备。
数据总线,D0-D7有点争议。当PI将PI写入控制器(3.3V - &GT为5V)时,信号电平兼容,但是当控制器将数据写入PI(5V-3.3V)时不一定兼容。在业余爱好者级设备上做那种东西时,我经常投入一些电流限制电阻。这是电阻网络RN3的目的。在我的视频中,我实际上测试了它直接有线,并且既不损坏PI也没有控制器,尽管这样做可能会有风险。据我所知,没有大量的真实研究与5V设备相互作用,除了很多人说“不要这样做”。对于下次修订本板,我可能会切换到使用适当的电平转换器IC并消除争议。
我将两个额外的标题放在电路板上,一个用于I2C,另一个标题,另一个用于串行。这些适合我已经为董事会计划的使用情况。
正如您所看到的,这是一款非常简单的单芯片帽子。 16针灰色的东西是分流器。这是我在视频中使用的配置。由于我在设计部分中提到,由于PI和控制器IC之间的电平差异,这里可能在这里使用DIP电阻网络(隔离,而不是公共汽车)或离散电阻中的焊料。
软盘标题位于底部。如果你像我这样笼罩着笼罩的标题,那么在中间的小镂空中,它会让你倒退你的软电缆。
桶千斤顶是可选的,如果你是桶杰克的人,允许你从桶千斤顶提供5VDC而不是PI的USB-C标题。如果你是那些现代USB-C的人之一,那么只需使用USB-C。
我在Python中写了一个用户模式驱动程序,其中包含一些IO函数的C扩展。这呈现了一些挑战:
Raspbian不是一个实时操作系统。无法保证您的用户模式进程不会被中断。
当传输数据(即读取扇区或写入扇区)时,软盘控制器希望在13ms(标准密度)或26ms(高密度)内传输的每个字节。如果您不及时传输字节,则控制器没有放置下一个字节 - 磁盘正在旋转! - 并将宣布超支。
这两个共同意味着用户模式软盘驱动程序可能偶尔溢出。没有问题,当我们得到一个超支时,我们可以重试。它确实对性能产生了不利影响,并且在读取高密度磁盘时比读取低密度磁盘时的问题更差。
https://www.raspberypi.org/forums/viewtopic.php?t=228727可以使用一些技术来减轻问题。通过将核心致力于软盘驱动程序,您将从通用用途中丢失核心,但您还会减少Linux在Inopportune时间中中断软盘驱动程序的可能性。仍然可能发生中断,但不太常见,并且与与其他进程共享核心时的不利影响较少。
最终解决方案是编写内核驱动程序。我过去写了内核模块。也许这是我会再做的事情,但我没有立即计划这样做。
以下是我在视频中的Short Demo中执行的命令列表:
#格式化Diskettesudo python ./fdtool.py --media 360格式#写入dos 3.10图像到diskcat dos310_1.img | sudo python ./fdtool.py --realtime - pincpu 3 - media 360 --disk write#阅读第一个扇区并在terminalsudo python中显示它./fdtool.py --realtime - pincpu 3 --media 360阅读| hexdump -c#读取整个磁盘并在TerminalSudo Python中显示它./fdtool.py --realtime - pincpu 3 --media 360 --disk读取| exdump -c.
请注意,sudo与--realtime - pincpu 3参数,并将软盘控制器固定到CPU核心#3。它也需要将isolcpus = 3添加到/boot/cmdline.txt。它将在没有sudo的情况下工作,而没有钉扎参数,但你将获得更多的中断,需要更多的重试。
我的github存储库在https://github.com/sbelectronics/smb-pi-lib包含我常用代码的库,包括软盘驱动程序和驱动程序的C扩展。 romwbw cp / m组装软盘驱动程序,fd.asm,作为我的大部分学习如何编程WD37C65以及编写Python驱动程序的基础。 https://www.raspberypi.org/forums/viewtopic.php?t=228727包含有关PI上的实时调度的有用信息,这些信息有助于提高性能并减少重试计数。