使用 Open Firmware 设置硬件默认值

Using Open Firmware to set hardware defaults

我知道就开放固件和旧硬件寻求建议是不可能的..

我已经成功地在 PowerBook G4 上安装并启动了 Mac OS 9(不受支持)。由于 OS9 无法在不受支持的硬件上管理冷却,机器在使用约 1 小时后变得相当热。

我已经成功地使用 Open Firmware 和以下代码从启动时打开了风扇:

" fan" open-dev constant fan-ih

" fans-on" fan-ih $call-method

这会全速运行风扇,但我只希望它们 运行 达到 50%,或者更改它们启动时的硬件温度限制。

但是,我不知道如何使用任何例程。有很多选项看起来可以修改,但问题是找出正确的语法来覆盖默认值。例如 'set-speed' 和 '.set-speed' 在使用 'see' 方法时给出非常不同的输出并且没有给出太多关于可以编辑的内容的指示:

> see .speed
1 read-speed cr " TACH1 = " type .d 2 read-speed cr " TACH2 = " type .d 3 read-speed cr " TACH3 = " type .d 4 read-speed cr " TACH4 = type .d ; ok
> see set-speed
>r 40 dup read-reg 8 andc write-reg case
    1 of
      5c dup read-reg e0 or write-reg 30 r> write-reg
      endof
    2 of
      5d dup read-reg e0 or write-reg 31 r> write-reg
      endof
    3 of
      5e dup read-reg e0 or write-reg 32 r> write-reg
      endof
    dup of
      5e dup read-reg e0 or write-reg 32 r> write-reg
      endof
  endcase
; ok
> see set-speeds
1 over set-speed 2 over set-speed 3 swap set-speed

如有任何帮助,我们将不胜感激!

在 Forth 和 Open Firmware 中,以句点开头的单词名称(发音为点)表明该单词将打印某些内容。 例如,要打印(并删除)参数堆栈中的顶部数字,我们调用的词是 。 (是的,那是句号,而且是第四个字)

所以.speed的意思是“打印速度信息。 1 read-speed 读取 tach1 的速度,并将值放入参数堆栈。

cr " TACH1 = " type 打印一个马车 return 和字符串 TACH1 =

.d 打印 read-speed 入栈的值。 d 表示以十进制打印值。

set-speed 看起来需要 3 个参数(在调用 set-speed 之前在命令行输入它们)。 (速度转速编号地址?)所以看起来你输入的最后一个参数(当你调用 set-speed 时它将位于参数堆栈的顶部)是某种地址,但我有点不清楚这是什么。 所以调用 set-speed 可能是这样的: 1组速度 2 设置速度

我是从你展示的反编译中推断出来的。

我认为这不是足够的信息,(我对这些东西很生疏)但它可能会让你走得更远。

也许你可以显示输出:

请参阅 read-reg

见写入寄存器

这可能有点帮助。

我基本同意 Randy 的观点,但在我看来 set-speed 有两个参数。堆栈的顶部是一些与所需速度相关的值,下面是风扇编号(1、2 或 3)。

在 Forth 堆栈图表示法中,这些词将被描述为:

.speed  ( -- )  \ Display the speeds of all the fans
set-speed  ( fan# speed -- )  \ Set the speed of one fan
set-speeds  ( speed -- )  \ Set  the speeds of all the fans

.speed 显示的数字与可用作 set-speed 和 set-speeds 的速度参数的数字相同,这是一个合理的猜测。如果这是正确的,那么下面的咒语可以用来将速度减半:

" fan" open-dev constant fan-ih
" fans-on" fan-ih $call-method
TACH1 = <some number>
TACH2 = <some number>
TACH3 = <some number>

为了论证,假设

decimal 46 2 / "set-speeds" fan-ih $call-method

很有可能所有粉丝的速度都减半

使用 select-dev 之类的词可以更简化地编写此代码,具体取决于 Apple OFW 实现的便利词,但以上使用只有标准要求的单词,因此它在不同的实现中都是可靠的。

如果要查找所有与fan control相关的词,可以这样写:

dev fan
words

然后用反编译它们见

您可以通过将命令放入 nvramrc 来自动设置风扇速度。

非常感谢米奇和兰迪!我无法在评论中正确设置格式,所以我将其作为答案发布。 我已经设法使用以下脚本让它工作:

\ comment
cr
dev /cpus/PowerPC,G4@0
80010201 encode-int " cpu-version" property
device-end
dev fan
" fan" open-dev constant fan-ih
1 3B6 " set-speed" fan-ih $call-method
2 3B6 " set-speed" fan-ih $call-method
device-end
boot hd:,\:tbxi

然后我将启动设备更改为以下,以便它在启动时自动加载: setenv boot-device hd:\bootscript

非常感谢,非常感谢!很高兴有这台PowerBook 运行 Mac OS 9,太快了!会继续努力的。

看起来不错。 dev fan 和后续的 device-end 行是不必要但无害的,因为 open-dev$call-method 不需要在设备节点上下文中工作。第一个 dev /cpus/PowerPC,G4@0 和它的关闭 device-end 是必要的,因为 属性 确实必须从设备节点内部完成。 享受吧!