修改并行源以使用 /dev/usb/lp0 而不是基本 I/O 地址 0x378

修改并行源以使用 /dev/usb/lp0 而不是基本 I/O 地址 0x378

我有一个非常旧的 MP3 播放器,名为 Diamond Rio。它有一个带 25 针并行适配器的并行接口。 Debian 软件包 rio 看起来可以与设备通信(https://packages.debian.org/sid/rio)但它被硬编码为使用旧式基本 I/O 地址 0x278、0x378。

我没有剩下带有专用并行端口的计算机。我购买了 USB 转并行适配器,但该设备显示为 /dev/usb/lp0。

有没有一种直接的方法来修改 rio 程序(我有源代码)以与新的 /dev/tty/lp0 设备交互,而不是现在不存在的硬编码寄存器地址 0x278、0x378?

答案1

最简单的方法是创建一个垫片在代码中。更改 rio.cpp 中OUTPORT和的定义INPORT,以便它们指向您的覆盖函数。

写入 BASE_PORT(默认为 0x378)就像写入 USB 模拟设备一样简单。

但是读取状态端口(数据从设备接收到主机一次半字节,请检查 rio.txt 了解所有详细信息)可能会比较棘手,因为实际的并行端口状态可能由 USB 适配器(重新)解释。而且您仍然需要找到访问控制端口的方法。适配器是为打印而设计的,而不是为位敲击而设计的。

另一种选择是 PCI 并行端口卡。

或者添加另一层,例如 Arduino,然后转到程序->USB->Arduino->并行。由于 arduino 只会传递字节,具体取决于您的连接方式,Firmadata 库就足够了(无需在 Arduino 上进行编程)。但即使不是,您为 Arduino 编写的程序也会非常简单。

Arduino 曾经有过 DB25 扩展板,你可能会幸运地找到一个。但是一个Arduino+DB25突破也会同样有效,并允许您进行原型设计。

这是我的建议,在 rio 的源代码上添加一个垫片OUTPUTINPORT通过 USB 与 Arduino 进行通信,然后直接读取/写入并行线。

答案2

那么,您基本上必须重新实现所有通信堆栈。通过写入某些地址来对 IBM PC 并行端口控制器执行的操作根本不适用于 USB 设备中的控制器,该控制器也不是内存映射设备。

老实说:从代码中了解 rio 协议的工作原理。将代码直接写入控制器内存的所有位置替换为与 /dev/usb/lp0 执行正确操作的代码;这是唯一的方法。 Linux内核记录了lp接口,所以它不是ioctl很难,但您可能必须自己找出正确的s。

我自己没用过(从来不需要它),但是自由1284可能会让这变得更容易,并且可以从您最喜欢的操作系统的包管理器中轻松安装。

一般来说,完成此操作后,不会现有代码还剩下很多,请查看 rio.cpp。该代码只是对 PC 硬件做出了不再正确的假设。作为回报,通过实际使用 Linux 的 LP 端口驱动程序基础设施,您将确保相同的程序在您的 x86 PC、运行 linux 的 macbook、您的 Android 手机上运行(假设内核已启用 lp,但我实际上可以想象一下,情况确实如此),而您的 RaspberryPi:它在 Linux 上运行,而不再仅在 IBM PC 硬件上运行。

这值得吗?可能不会。并口时代的 MP3 播放器听起来很糟糕,因为它们的芯片甚至无法处理可接受的 MP3 比特率(你能想象 64 kb/s 立体声曾经是“高质量”吗?让我不寒而栗。这些东西能做的最好的事情是 128 kb/s,这仍然相当……糟糕。),并且因为内部内存量无法容纳相关量的可接受质量的音频。并不是说您想通过并行端口传输相关量的数据!
他们早餐吃电池,而且他们的用户界面非常简陋。

现在,我几乎可以肯定您不会这样做,因为这是您唯一能买得起的 MP3 播放器;您已经购买了 USB-LPT 适配器,而且它的价格通常至少与“新”MP3 播放器一样昂贵(即使这些播放器本身已经相当过时)。
因此,你这样做可能是出于历史或怀旧的原因,所以我有什么资格来评判。

相关内容