
HP Prime G2等计算器大揭秘:运行Linux、Windows的潜力与实践!
作者最喜欢的计算器之一是 HP 16C,这是面向计算机程序员的逆波兰表达式(RPN)计算器,支持十六进制、二进制、八进制和十进制,还有位运算、掩码、循环移位等实用功能。作者自己没 HP 16C,而是有台 Swiss Micro 的 DM16L,它是 HP 16C 的高品质复刻版,改进之处是采用了两行显示屏。此外,限量版的 HP 16C 收藏版 也即将推出。不过,这些计算器都不能运行 Linux。
但下面这台可以:

真正的计算器上运行 xcalc

控制台截图,部分显示 `fbv` 图像查看器

当然,它能运行 Doom

作者一直以来的最爱,HP-16C
以下将用至少一千字介绍 HP Prime G2 以及其他能运行 Linux 的图形计算器。要是你只想了解作者为 Prime G2 更新的 Linux 移植版本,可跳过这部分内容。
HP Prime G2
HP Prime 是 2013 年上市的图形计算器,2018 年进行了硬件升级(G2 型号)。它配了触摸屏,据作者了解,多数人 对它很满意,觉得它 功能强大 且运算速度快。这里 有该计算器拆解后的图片,这里 有更多相关下载资源。
作者对计算器本身的功能不太感兴趣,因为日常嵌入式编程工作中,HP-16C 更适合做大多数计算。作者关注这款设备,是因网上有人说它能运行 Linux,甚至还有 Windows 10 移植版。
我是 root,向我臣服
作者曾在较旧的 HP 设备上运行过 Linux,且希望对自己拥有的所有设备都有完全的控制权。作者曾写道:
对于自己拥有的设备,我有一条尽量遵守的规则:它们必须允许进行 root 或管理员操作。我二手购买的任天堂 Switch 年代够久,可以进行越狱;我拥有的两台苹果设备(第一代 iPad Air 和第一代 iPhone SE)存在漏洞,让我能获得 root 权限;我购买的所有安卓手机,都是因为其 bootloader 可以解锁。一旦我购买了设备,它就归我所有,由我决定如何使用,而不是由制造商决定。否则,它从工厂出厂的那一刻就成了电子垃圾。
对我来说,能够在设备上开发软件几乎是必备条件。只要能在设备上进行开发,并且愿意投入足够的时间和金钱,就可以重新编写那些缺失的功能,也就是制造商认为无利可图而未提供的功能。
不过,对计算器而言,这不是大问题,因为作者不把它们当通用计算设备。尽管德州仪器(Texas Instruments)后来移除并限制了其设备最初具备的一些功能,像 在计算器上运行汇编代码,Numworks 也 对其计算器进行了限制。这些都与作弊和考试模式有关,所以作者能理解。要是设备不允许用于官方考试,就没人用或买。而 HP Prime 从未支持过汇编(只有一种类似 Basic 的自定义语言 PPL),所以不存在被移除相关功能的问题。有一位 HP 员工 表示:
“目前它没有被锁定,仅用于验证。不过要注意,我们确实有能力对系统进行完全加密和锁定,因为新芯片具备这一功能,并且我们已经测试通过。如果有需要,我们会启用该功能。这是一项公司安全规定(在固件被植入鼠标、键盘或打印机以入侵网络的事件曝光后制定),我们曾争取到豁免权。任何人都别在考试模式上捣乱。”
计算器的硬件规格?
作者觉得,Prime G2 作为计算器,性能强大得离谱。它搭载了 i.MX 6 Ultralite ARM Cortex A7 CPU,配 256 MB DDR3 内存和 512 MB 内部存储。这哪像传统计算器,更像带计算器键盘的小型嵌入式 Linux 机器。
之前的 G1 型号就已配了 400MHz 的 ARM CPU 和 32MB 内存,而 G2 堪比几年前的安卓手机。
作者日常工作接触的咖啡机硬件,用的 i.MX6 模块规格与之类似,它基于 Yocto 系统运行专门的 C++ 和 Qt 应用程序。HP Prime G2 运行的是 FreeRTOS,而 G1 运行的是自定义实时操作系统 Besta OS。
作者仍对这款计算器的规格感到震惊!日常使用中,它响应迅速,和其他计算器比,计算和绘图速度都快得多,而且通过触摸屏能对图形进行缩放,几乎是即时响应。至少,这些强大的硬件规格得到了充分利用。
其他计算器的硬件规格
下面看看其他竞争对手的计算器在规格和 Linux 支持方面的情况。作者尝试查找了荷兰市场上几款计算器的规格。
- TI 84+ CE 配了 48 MHz 的 eZ80 处理器,无法运行 Linux。
- Numworks Graphing Calculator N0110 搭载 216 MHz 的 ARM Cortex-M7 CPU,有 8 MB 存储空间和 256 KB SRAM。作者认为对计算器来说,216 MHz 的主频有些过高,但这只是个人看法。后来的 N0120 型号甚至配了高达 550 MHz 的 ARM Cortex-M7 CPU 和 564KB 的内存,这已达微控制器的内存水平,无法运行 Linux。不过,该计算器的 操作系统是开源的,甚至有一些分支版本,但后期的固件版本似乎被锁定了。这对爱好者来说很遗憾,但可能与作弊和考试模式有关。
- Casio FX-CG50 未公布 CPU 规格,但 这篇文章 称其主频为 118 MHz,这篇文章 指出它采用了定制的 Renesas SH7305 CPU,配备 8 MB 内存和 32 MB ROM,同样无法运行 Linux。不过,也许 这个人 能让它运行起来。
- 作者发现唯一有 Linux 移植版 的计算器是 TI Nspire CX (II) (CAS)。这篇文章 介绍了如何在其上运行 Arch Linux,这里 有更多相关信息。CX-II 配备 396MHz 的 ARM CPU、64MB 内存和 128MB 闪存,虽不如 HP Prime,但也能运行 Linux。
作者最喜欢的 HP-16C 则是另一回事。它并非竞争对手,因为它没图形功能,也不算现代计算器。NUT CPU 详细说明 (A-1LF5-9002-1 - 7/14/81) 显示,11C/12C 的主频为 200 至 230KHz,41C 的主频为 340 至 380KHz。Nonpareii 模拟器中的定义 表明 16C 的主频为 215 kHz,Nelson M. Sicuro 在 2003 年的一篇文章 中提到约为 230 kHz,这个页面 则显示为 220 kHz,而且它只有 203 字节的程序存储空间,可惜无法运行 Linux。
作者没大量收藏计算器,也不是计算器专家。高中和后续涉及数学的学习中,作者会用计算器,至今还留着一台当年的 TI-83,以及一台 HP 11C(HP 16C 的非编程普通版)。作者喜欢 HP 11C 的逆波兰表达式(RPN),因为数学计算时,这种方式更合自己的思维习惯。
HP Prime G2 运行 Linux
针对 G2 型号,有个旧的、不再维护的移植版本,用的是 4.14 内核。链接的 Linux 仓库中已没正确的分支,Buildroot 构建失败,设备树文件也有问题,提供的下载文件无法显示控制台登录界面,所以作者无法使用。不过,它提供了足够信息让作者开始着手更新。作者为自己的 HP Prime G2 更新了移植版本,并做了些改进:
- 优化键盘输入:原版本无法输入数字、竖线、破折号或下划线等字符,作者进行了改进。
- 支持 USB 串口设备:设备可作为 USB 串口设备显示。
- 支持更大的镜像文件:可在内存中运行大于 15MB 的镜像文件。
- 适配新的触摸屏控制器:作者的设备采用了较新的触摸屏控制器 Ilitek ILI211X(因旧的 Goodix GT5688 停产),作者为此编写了内核驱动。
- 支持控制台登录:可以在控制台进行登录。
- X11 服务器正常工作:配备了一些基础应用程序。
- 内置 Doom 游戏:可以流畅运行 Doom 游戏(prboom)。
- 支持设备上的开发:内置了 C 编译器,可在设备上进行开发。
作者用 Software Heritage 重建仓库后,成功完成构建并让它运行起来。作者仅尝试在内存中运行,因为不想对 NAND 进行刷机操作,以免丢失计算器的原始软件。

Linux 系统里,原版本的键盘只能输入橙色标记的字母,无法输入破折号、下划线、数字或竖线等字符。作者最初做了个替代键盘映射,用 loadkeys 在启动时配置,但在 X11 环境中不起作用。于是,作者直接对内核的键盘驱动 (`imx_keypad.c`) 打补丁,让它能发送正确的按键信号。该补丁会拦截按键码,若按下 ALT 键,就发送不同的按键码,具体映射可参考 `input-event-codes.h` 文件。
用 Alpha 键(ALT)能输入数字和其他一些特殊字符。但按下 ALT 键与 COS 或 TAN 键组合时,无法发送按键码,作者没深入研究这问题,而是用其他按键替代,这可能和键盘 矩阵 有关。
原版本的 `uuu` 脚本只能在内存中启动最大 15MB 的 Linux 镜像。作者通过修改内核配置、`uuu` 脚本和 U-Boot 中的偏移量,现在能在内存中运行最大 130MB 的镜像。
原版本启动后没登录屏幕,作者通过在初始化脚本中配置 `getty` 解决了这问题。
原版本和一些俄语文章(这里、这里 和 这里)中用 Goodix 内核驱动实现了触摸屏功能,但在作者的构建中无法工作。它显示触摸屏位于 I2C 总线 1 的地址 `0x14`,但 `i2cdetect` 未检测到该地址,却在 `0x26` 地址发现了个未知设备。调试时发现,触摸屏幕时,该设备的数据结构会变化。
大量调试和查看原始 I2C 消息后,作者发现该设备和 `Illitek ILI211X` 设备类似。较新的内核 有对应的驱动,`ILI211X_DATA_SIZE` 与作者在 I2C 上观察到的 43 字节数据包、`0x5a` 起始字节以及 `0x26` 地址相匹配,另一个使用该驱动的 imx6 设备树 也证实了这点。
HP 恢复屏幕显示触摸屏固件版本为 `ilitek-03`,这也是个线索。旧内核没针对该型号的驱动,只有针对旧协议的驱动。作者基于较新内核的驱动编写了内核驱动,并去除了所有非必要功能,如多点触摸和手指压力检测。此外,作者还做了个校准工具 `fbtouch_test`,因为屏幕右下角有显示问题。后来,作者在 一个法国论坛帖子 中发现,因 Goodix 触摸屏停产,HP 换了屏幕。

触摸屏正常工作
调试中,作者发现用 `modprobe` 加载 USB 串口支持的内核模块会让设备死机。于是,作者把该模块编译进内核,解决了崩溃问题,现在能通过串口连到计算器。
因触摸屏功能正常,作者还集成了 X11 和一些程序。登录控制台后,输入 `startx` 就能启动 `twm` 窗口管理器,同时启动 `xeyes`、`xclock` 和 `xcalc` 等程序。鼠标和键盘输入正常,长按屏幕会被识别为右键单击。在计算器上运行 `xcalc` 是不是很有趣呢?
为增加趣味性,作者还加了 `tcc`(Tiny C 编译器)。毕竟,如果不能在计算器上编译自己的代码,那还算什么好计算器呢?在 `/root` 目录下有个简单的 `hello.c` 示例文件,你能自行编译(`tcc hello.c -o hello`)并运行(`./hello`)。
源代码可在作者的 GitHub 上获取:
为方便用户,作者还提供了 预构建的下载文件,不用编译整个项目就能直接运行。Buildroot 和 Linux 的编译过程耗时久,而且随时间推移可能出问题。用预构建的下载文件,你能马上开始体验。
在 HP Prime G2 上运行 Linux 的步骤
注意:你得打开计算器,这可能导致设备损坏且无法恢复,无法再启动 HP 原厂软件。请谨慎操作。
- 从 这里 下载预构建的软件包,并解压到一个文件夹。
- 从 这里 下载 `uuu` 工具。
- 打开计算器(拧下背部的 4 颗螺丝,用小撬棒或吉他拨片打开外壳),通过 USB 连到电脑,在短路照片中标记的两个焊盘的同时按下 RESET 按钮:

- 作者用了 iFixit 镊子来短路这两个微小的焊盘。
- 用 `uuu` 脚本在内存中启动 Linux:
uuu ./run_linux_in_ram.uu- 几秒后,你该能看到登录提示。可以用 `root` 用户无密码登录。输入 `startx` 启动图形界面,输入 `sh ./doom.sh` 启动 Doom 游戏。
作者没测试过任何 NAND 刷机脚本,使用时请自行承担风险。配备 Goodix 触摸屏的设备应该还能正常工作,但作者没法测试。如果你有这样的设备,请测试并反馈结果。
HP Prime G1 运行 Linux
关于 Prime G1,这里 有个论坛主题和截图,这个移植版本 有实际的源代码和现代的 6.x 内核。因作者没 G1 硬件,无法测试这个版本。该移植版本不提供可下载的镜像,你得自己构建,构建说明在页面上,但有些复杂。注意,这是专门针对 G1 硬件版本的。作者曾尝试自己构建这个版本,看是否有代码老化或链接失效的问题,令人惊讶的是,整个过程仍比较顺利。
构建步骤
- 克隆所有 4 个仓库:
mkdir prime-linuxcd prime-linuxgit clone https://github.com/Repeerc/Linux-For-HPPrime-V2git clone https://github.com/Repeerc/hpprimev2_linux_loadergit clone https://github.com/Repeerc/Kernel-6.1.35-HP-Prime-V2_G1git clone https://github.com/Repeerc/buildroot_hpprimev2- 构建加载器:
cd hpprimev2_linux_loadermkdir buildcd buildcmake ..makecp BOOT1.ROM ../../- 要是遇到 `error: unknown type name 'caddr_t'` 这样的错误,把代码中的 `caddr_t` 类型替换为 `void`,因为现代编译器不再支持该类型。
- 构建内核:
cd ../../cd Kernel-6.1.35-HP-Prime-V2_G1make ARCH=arm CROSS_COMPILE=arm-none-eabi- hpprimev2_defconfigmake ARCH=arm CROSS_COMPILE=arm-none-eabi- zImage -j8cp arch/arm/boot/zImage ../../- 构建 `buildroot`:
cd ../../cd buildroot_hpprimev2make hpprimev2_defconfigmakecp output/images/rootfs.jffs2 ../../- 打包所有文件:
cd ../../cp BOOT1.ROM Linux-For-HPPrime-V2/cp zImage Linux-For-HPPrime-V2/cp rootfs.jffs2 Linux-For-HPPrime-V2/cd Linux-For-HPPrime-V2/bash ./mkimg.sh- 将 `BOOT1.ROM` 和 `LINUX.DAT` 刷入计算器:
- 用 `usbtool.exe`,将计算器置于恢复模式(`RESET + Symb`),选择自动更新,然后点击更新。
在线文档 显示,该操作可能无法在 USB3 端口上完成。
以下是作者在网上找到的一些截图:
2017 年论坛主题中的 Prime G1 截图:

Prime G1 运行 X 会话:

Prime G1 也有 Doom 移植版:

运行 Windows?
要是你有这方面需求,有人 为 Windows 10 移植了 UEFI(源代码)。看看这张最具元意味的图片,真正的计算器上运行 Windows 的 `calc.exe`:

作者没找到可下载的镜像,博客文章中的一些 Twitter 链接已失效,所以无法亲自测试这个版本。以下是更多截图:
启动加载器失败:

启动屏幕:

打印对话框:

记事本:

标签: arm , articles , calculator , casio , doom , electronics , embedded , hardware , hp , kernel , linux , prime , rpn , swissmicros , texas-instruments , windows


被折叠的 条评论
为什么被折叠?



