从能开机到能日常用:PSP Pi Mod 的三代工程迭代
2026/9/4 23:35:09 网站建设 项目流程

PSP Pi mod 在掌机改造圈已经很常见:把 PSP 的旧主板拿掉,换成树莓派,保留原本的外壳、按键、摇杆、屏幕位置,让一台硬件已经老旧的主机获得新的 Linux 软件生态。真正难的并不是第一次开机成功,而是如何让这台改装掌机在 v1、v2、v3 的迭代里越来越接近一台可以日常使用的机器。本文会从这类 PSP Pi mod 项目里最常见的几个工程环节出发,讲清楚每一次“更好”到底改了什么、怎么验证、怎么排错,以及如果你也想做类似的改造,应该按什么顺序推进。

这些内容不只对某一台造价昂贵的改装机有效。换到你自己手里的 PSP 外壳、树莓派版本或目标模拟器平台,思路是一样的:先确定升级主线,再拆成硬件结构、信号链路、电源链路、软件配置和回归验证几个子问题,最后用数据和录像把每次改进固化下来。下面按这个顺序展开。

1. 一版到三版 PSP Pi Mod 到底在升级什么

1.1 一条技术主线:把“能开机”推向“能日常使用”

很多第一次接触 PSP Pi mod 的人会以为,改造项目的目标就是“在外壳里塞进一台树莓派,然后开机进游戏”。实际上,能点亮屏幕只是万里长征第一步。原始 PSP 的电池、按键、摇杆、音量开关、耳机孔、读卡槽,全部都有自己的电气定义和结构约束。把树莓派装进去之后,需要重新解决的不只是空间问题,还有供电、散热、IO 电平、输入映射、关机不掉电、电池电量显示等一堆问题。

所以判断一台 PSP Pi mod 是否“更好”,不能只看它的游戏画面。常见的判断维度包括:

  • 是否还能用原来的电源键和按键组合完成开机、休眠和关机;
  • 电池供电时能否稳定跑完一整局,而不是因为电流不足直接重启;
  • 按键扫描是否有延迟、抖动、串键;
  • 音量调节、屏幕亮度调节是否好用;
  • 机身发热是否还能手持;
  • 拔掉电源或低电量关机时,文件系统会不会损坏;
  • 下一版做改动时,是否只改一个模块,就能回归测试其他功能。

这篇文章谈的就是这些维度,而不是简单地罗列某台机器的零件清单。

1.2 每次迭代通常会改四个子模块

一台 PSP Pi mod 可以拆成四个独立但互相影响的子模块:机械结构、电路连接、电源管理和软件配置。

机械结构负责树莓派、电池、屏幕驱动板、按键排线在 PSP 外壳里的摆放。电路连接负责把这些部件的信号线走到正确的引脚。电源管理要回答充电、放电、低电量保护、多路电压输出各自怎么协调。软件层则需要把按键变成了 Linux 输入事件,把屏幕驱动起来,把关机时序和充电状态接入系统服务。

四个模块的成熟度往往不同。v1 通常用飞线和 3D 打印支架验证功能,v2 会针对发热和结构强度做改进,v3 才开始出现真正的定制承载 PCB,把原来堆在一起的一捆线变成一个可复制的模组。社区里那些“just keeps getting better”的视频,本质上是作者在每个版本都挑出了当前最影响体验的一两个问题并解决掉。

1.3 为什么用 PSP 外壳而不直接买一台开源掌机

这是对这个项目最常见的疑问。直接买一台现成的模拟器掌机当然省事,但 PSP 这类经典设备有两点不可替代:一是外壳结构和按键手感经过了原厂大量测试,改装者不需要从零设计外设布局;二是 4.3 英寸 480x272 的屏幕窗口、肩键位置、摇杆位置都已经固定,做出来的机器有非常强的辨识度。

代价也很明确:原厂 BMP、充电管理不一定能被树莓派直接复用,按键矩阵接口电平也不一定兼容,改装者必须绕过或替换原机主板的部分功能。因此 PSP Pi mod 本质上是一个“结构复用、电子重建”的项目,比直接买开源掌机复杂得多,也更能积累工程经验。

2. 决定硬件选型时真正要看的细节

2.1 树莓派型号选型不能只看性能

在常见 PSP Pi mod 方案里,树莓派型号通常不会优先选择标准尺寸板,因为它们的长宽高都不适合放进掌机壳。常用候选集中在树莓派 Zero 系列和 Compute Module 系列,两者的取舍非常直接。

对比项Zero 系列Compute Module 系列
典型尺寸小巧,适合直接塞进掌机核心板很小,但需要搭配载板
GPIO 数量够用,但引脚密集取决于载板设计和引出的接口
性能余量适合轻量模拟和 2D 游戏更强配置适合需要更多算力的场景
供电需求较低,对电池压力小高负载下需要更稳的供电链路
集成难度相对简单,适合初版验证能做出整洁成品,但改动难度更高

具体选哪一个,建议先看你手上 PSP 型号的内部空间,再查对应树莓派型号的外形尺寸和电源需求。不要只看 CPU 型号,还要考虑模块高度、天线位置、排线弯曲半径和散热器厚度。很多改造做到一半才发现树莓派装得下,但屏幕排线没有空间走,或者电池和主板叠放之后厚度超出后盖,这些都是选型阶段要算好的。

2.2 原装屏幕、按键和摇杆该如何接入

PSP 原装屏幕不是 HDMI 输入,驱动方式比较特殊。能不能直接用,取决于是否找得到对应的驱动转接板或资料适配;不同 PSP 型号的屏幕排线定义很可能不同。很多 PSP Pi mod 会改用第三方小尺寸 HDMI 或 MIPI 屏,再通过定制支架贴合在原先屏幕窗口,这可以大幅降低驱动难度,但会牺牲原屏的观感和待机功耗,需要改装者自己权衡。

按键方面,PSP 的按键本质上是一个矩阵电路。把它接进树莓派时需要注意电压问题:树莓派 GPIO 工作在 3.3V,按键矩阵只是通断信号,但排线附近可能有原机其他电路,直接把原机接口输出接到 GPIO 之前,要先确认电位和是否共地。

摇杆比方向键更麻烦一些,因为它是模拟信号,通常需要树莓派外接 ADC 或使用自带模拟输入的微控制器作为协处理,再把结果通过串口或 USB 上报给树莓派。越早确定这一条信号通路,后续软件层就越容易写。

2.3 电源链路是 v1 最容易出问题的地方

改装掌机最常见的故障不是“开机失败”,而是“低电量瞬间系统崩溃”或“插电后树莓派反复重启”。原因是树莓派对 5V 电压波动的容忍范围有限,而 PSP 原装电池和充电管理电路并不是为树莓派设计的。

在硬件迭代中,最好一开始就把电源抽象成下面几个问题:

  • 电池电压是多少伏,厂商默认终止电压和保护电压是多少;
  • 哪一路给树莓派供电,哪一路给屏幕背光供电;
  • 是否共地;
  • 从电池到树莓派 USB 输入之间有没有低压差稳压器;
  • 拔掉外接电源那一瞬间,背光电流会不会把 5V 拉到安全阈值以下;
  • 低电量保护触发后,系统是否来得及执行关机脚本。

在这几个问题没有搞清楚前,不要急着用飞线把 5V 直接接上去。推荐先用可调电源限流供电,逐步加大负载,观察电流曲线和电压跌落,再决定是否需要增加电容和稳压模块。

3. 电路实现:先让按键矩阵把键值可靠送到系统

3.1 手工飞线、洞洞板和承载 PCB 的差别

v1 阶段几乎所有 PSP Pi mod 都长得很乱。飞线直连的好处是改起来快,问题是你很难从一团焊点里判断是哪根线虚焊。洞洞板能把线整理得稍微清楚一些,但高密度双面走线仍然很考验耐心。到了 v3 阶段,常见做法是把按键接口、屏幕排线接口、电池接口、GPIO 接口、稳压电路全部放到一块定制 PCB 上,树莓派通过排针或板对板连接器插在 PCB 上。

PCB 这一阶段不一定要自己从零画复杂的 4 层板,简单的两层板加接口标签就足够。关键是每个接口都要标注端子编号和信号名,不然过两周回来维护时,你会忘了 J3 排线是屏幕还是按键。

3.2 用一个最小矩阵扫描程序验证按键通路

PSP 按键很多,逐根 GPIO 读取非常浪费引脚,常见做法是矩阵扫描:把按键排成行和列,每次拉低一行,再去读所有列,如果读到低电平,说明该行该列交叉位置有按键被按下。下面是一段用于理解原理的示意代码,实际项目里需要根据你的引脚定义修改行和列。

import time import RPi.GPIO as GPIO ROWS = [5, 6, 13] COLS = [19, 26] # 实际 PSP 按键数量更多,这里只做最小演示 KEY_MAP = { (0, 0): "cross", (0, 1): "circle", (1, 0): "square", (1, 1): "triangle", } GPIO.setmode(GPIO.BCM) for row in ROWS: GPIO.setup(row, GPIO.OUT, initial=GPIO.HIGH) for col in COLS: GPIO.setup(col, GPIO.IN, pull_up_down=GPIO.PUD_UP) def scan_matrix(): pressed = [] for row_index, row_pin in enumerate(ROWS): GPIO.output(row_pin, GPIO.LOW) time.sleep(0.0005) for col_index, col_pin in enumerate(COLS): if GPIO.input(col_pin) == GPIO.LOW: key = KEY_MAP.get((row_index, col_index)) if key: pressed.append(key) GPIO.output(row_pin, GPIO.HIGH) time.sleep(0.005) return pressed while True: key_list = scan_matrix() if key_list: print(key_list)

这段代码适合接好线后先验证按键通断,不建议直接把它作为最终驱动。原因是它缺少按键去抖、长按判断、重复上报和系统输入事件转换。也就是说,能打印出cross只代表硬件链路通了,想让模拟器识别,还需要把结果上抛到 Linux 输入子系统。

3.3 手动接线阶段最容易踩的电气坑

  • 按键矩阵的一侧直接接 5V 引脚,会把 GPIO 打坏;正确的排查方式是先用万用表确认触点一侧没有错误电压。
  • 树莓派和屏幕驱动板没有共地,结果按键和信号全部不稳定;接好 GND 后再测试。
  • 扫描频率太快或没有延时,导致按键按下瞬间被漏读;每行切换后保留几百微秒的电平稳定时间。
  • 多根排线靠得太近,按键动作影响屏幕显示;这是信号干扰,优先缩短线长并让按键线和屏幕线分边走。

4. 系统层配置:把整机变成一个可靠的 Linux 掌机

4.1 系统镜像和基础启动配置

硬件接线完成后,软件配置的总体目标只有一个:开机自动进入模拟器前端,按键能被识别,关机不掉文件系统。对 PSP Pi mod 来说,一般不建议用完整桌面版镜像,它占空间大、启动慢、内存开销高。在零系列或计算模块上,更合适的基座是精简版镜像加 RetroPie、RecalBox、Lakka 之类的开源前端,或者自己手动安装轻量级桌面和启动器。

这里涉及一个原则:越面向功能的精简系统,越容易做快速迭代。因为你可以把精力集中在按键映射、网络配置、音频输出和关机脚本上。

修改任何系统配置前,先养成备份习惯:

sudo cp /boot/config.txt /boot/config.txt.bak.$(date +%s) sudo nano /boot/config.txt

常见启动配置里,需要确认三块内容:第一是屏幕或显示驱动相关的dtoverlay;第二是音频输出的默认设备是否指向你的声卡;第三是是否关闭不必要的蓝牙、WiFi 节能策略,以减少对音频和按键的干扰。不要直接照抄别人的config.txt,同一型号树莓派、不同屏幕驱动板、不同系统版本,配置都可能不同。

4.2 用一个 GPIO 安全关机服务防止低电量丢数据

树莓派在掌机里最怕的是直接断电。游戏存档写入一半时断电,轻则存档损坏,重则文件系统异常。解决思路是用一个硬件关机按键或电量报警信号触发系统正常关机。

下面示例的思路是:把低电报警信号或物理关机键接在一个 GPIO 上,平时引脚被外壳电阻拉高,触发时拉低,脚本等待 800ms 确认不是抖动,然后执行系统关机。

#!/usr/bin/env python3 import time import subprocess import RPi.GPIO as GPIO SHUTDOWN_PIN = 26 LOW_BATTERY_PIN = 5 GPIO.setmode(GPIO.BCM) GPIO.setup(SHUTDOWN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(LOW_BATTERY_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) def should_poweroff(): # 物理关机键被拉低,或电池板输出低电量信号 if GPIO.input(SHUTDOWN_PIN) == GPIO.LOW: time.sleep(0.8) return GPIO.input(SHUTDOWN_PIN) == GPIO.LOW if GPIO.input(LOW_BATTERY_PIN) == GPIO.LOW: return True return False while True: GPIO.wait_for_edge( SHUTDOWN_PIN if True else LOW_BATTERY_PIN, GPIO.FALLING, bouncetime=200 ) if should_poweroff(): subprocess.run(["systemctl", "poweroff"])

把脚本放到/usr/local/bin/psp-pi-power.py后,用 systemd 让它开机自启:

[Unit] Description=PSP Pi Safe Shutdown [Service] ExecStart=/usr/bin/python3 /usr/local/bin/psp-pi-power.py Restart=always [Install] WantedBy=multi-user.target

保存为/etc/systemd/system/psp-pi-power.service,然后执行:

sudo systemctl daemon-reload sudo systemctl enable --now psp-pi-power sudo systemctl status psp-pi-power

这一步对整机稳定性的提升非常明显。至少能保证在低电量或手动关机时,系统有足够时间卸载文件系统和关闭进程。

4.3 把扫描结果上报成 Linux 输入事件

只会在终端打印cross是不够的,模拟器默认只读取/dev/input/event*。如果不想深入内核,可以用 evdev 的 UInput 接口创建一个虚拟手柄,把矩阵扫描结果转成标准按键事件。这个方案的好处是硬件层和输入事件层解耦,后续想换按键电路,不需要改模拟器配置。

示意代码如下:

import time from evdev import UInput, ecodes as e # 虚拟手柄,名称可以自定义 ui = UInput( events={ e.EV_KEY: [ e.BTN_SOUTH, # cross e.BTN_EAST, # circle e.BTN_NORTH, # triangle e.BTN_WEST, # square ] }, name="psp-pi-pad" ) def report_key(linux_key, pressed): ui.write(e.EV_KEY, linux_key, 1 if pressed else 0) ui.syn() # 把上一节的 cross 映射成 BTN_SOUTH report_key(e.BTN_SOUTH, True) time.sleep(0.1) report_key(e.BTN_SOUTH, False)

在完整实现里,你需要把矩阵扫描线程的结果翻译成按键事件,并处理长按、连按和多个按键同时按下的场景。测试时先使用模拟器自带的输入配置页做自动识别,确认按键名正确,再进游戏验证延迟。

5. 验证一台改进后的 PSP Pi Mod 好不好用

5.1 每个版本出版前先跑同一套最小用例

很多改装视频会给人一种“改完就成功”的错觉。实际项目和开发软件一样,每次改动后都要回归测试。最简单的方法是在电脑上维护一个本地测试清单,包含十到二十项固定操作。

测试项建议覆盖三块:

  • 开机序列:按电源键开机后能否 20 秒内进入前端;关机键是否生效;
  • 输入序列:方向键、四个主按键、肩键、音量键、开始/选择键逐一按下是否映射正确,同时按两个键是否产生串键;
  • 电源压力:满电量无线连接打 30 分钟,记录温度、电流、是否低电量误关机。

无论 v1 还是 v3,都跑同一套测试,这样你才能量化地说“这一版比上一版启动快两秒”或“扬声器不再有滋滋声”。

5.2 用命令和工具留下可比较的数据

简单的手感问题用文字不够准确,要尽量留下数据。Linux 下可以通过jstestevtest直接查看手柄事件:

sudo apt install joystick evtest jstest /dev/input/js0

正常输出会显示类似这样的信息:

Driver version is 2.1.0. Joystick (psp-pi-pad) has 6 axes and 12 buttons.

按键按下时,对应 Button 的值会从 0 变成 1,模拟摇杆的 Axis 会在 -32767 到 32767 之间变化。如果某个轴只能输出 0 和 1,说明摇杆被映射成了数字按键而不是模拟量,需要回到驱动层检查。

功耗和温度可以用 USB 电流表、万用表和热电偶记录。每次记录尽量固定条件:屏幕亮度 80%、音量 50%、运行同一款游戏、WiFi 打开。否则你很难区分温度上升是因为版本改动还是因为环境温度升高。

5.3 视频记录的意义在于追踪回归,而不是展示成果

标题里的视频元素其实反映了很多改机作者的工作习惯。视频不只是展示成果,而是一种精细的回归证据。上一版按键存在迟滞,录下来;这一版调整了扫描代码,再录一段同样按键节奏的画面,两段视频放在一起,问题是否解决一目了然。

这里建议在保存录像时使用统一命名规范,比如v3-test-input-20250107.mp4v3-test-power-15min.csv。如果只有一个视频文件名,几天后很难回忆起这个片段对应哪次修改。数据文件建议统一放在一个test-logs目录,并按版本建立子目录。这套习惯能让你的“更好”有依据。

6. 常见故障排查表和迭代方向

6.1 先看现象,再查链路,最后改配置

结合这类 PSP Pi mod 项目常遇到的问题,可以用下面这张表作为排查入口。

问题现象常见原因检查方式处理建议
插电没反应,电流表显示为 0充电接口、电池保护板或电源开关断开用万用表从电源入口逐段量电压先确认 5V 是否到达主控,再补焊或更换线材
开机卡在开机画面镜像损坏、存储卡接触不良、config 配置冲突查看存储卡在另一台设备上能否正常挂载优先重新烧录镜像,逐行检查 config.txt 改动
按键按下但偶发漏键矩阵扫描速度太快或线材松动用上一节扫描程序连续按住按键 10 秒看输出降低扫描周期,增加去抖,重新压紧排线
两个按键同时按会串键列线或行线短路,或扫描逻辑没有处理多键用万用表检查相邻排线间阻值检查焊点飞线,代码中用按键状态表记录多键状态
游戏过程突然重启电池瞬时电流不足,5V 跌落接可调电源观察大负载时电压是否低于 4.8V增加稳压电容,或更换低内阻电池
低电量没有自动关机电量报警信号没有接到 GPIO,或脚本未运行systemctl status psp-pi-power查看服务状态重新确认报警线电平和脚本触发条件
屏幕开机后有波纹或花屏屏幕排线和按键线互相干扰开机后转动排线位置看现象是否变化分开走线,给关键信号加屏蔽,缩短线长
音量键调节生效但耳机无声声卡默认设备不是输出设备aplay -l查看声卡设备编号调整 asound.conf 默认声道

排查原则是沿着信号链路从输入到输出逐级确认:先量电源,再看接线,然后看系统日志,最后才动软件映射。不要一上来就重刷镜像,否则真正的硬件问题会被掩盖。

6.2 后续版本还能扩展的方向

当基础功能稳定后,一个 PSP Pi mod 项目通常还有不少改进空间。常见方向包括:加入 ULPI 或 I2C 电量计,让系统能读取真实剩余电量并显示在界面上;使用外部微控制器统一管理按键、摇杆和电源状态,降低树莓派 GPIO 负担;优化散热结构,在高负载下把温度控制在手持舒适范围;调整整机重量配平,让握持手感接近原装掌机。

如果追求更强的性能,可以从 Zero 系升级到性能更高的 Compute Module 并重新设计载板,但这会带来更大的发热和电流需求,属于整机重新设计,而不只是换一块板子。

7. 落到自己项目里的工程建议

7.1 三个容易走弯路的坑

第一,不要低估迭代成本。改装项目很容易在 v1 阶段堆积大量临时方案,比如用胶带固定飞线、用软件曲线解决硬件缺陷。如果每代版本都保留临时方案,后续工作量会指数级上升。建议在任何临时方案上标记一个到期时间,并明确下一版要替换成什么正式结构。

第二,不要围绕模拟器配置做改造。配置模拟器当然能让画面和手感变好,但把时间全部花在调菜单上,系统一旦要更换镜像或存储卡,所有经验都会失效。更值得投入的是通用层:按键如何作为输入事件上报、电源如何可靠切换、温度如何采集。这些知识在更换前端后仍然可用。

第三,不要为了追求视频效果隐藏风险。很多改机展示只录操作顺利的部分,不展示存储卡损坏和过热重启。如果你在写自己的项目笔记,建议把失败过程也记录下来,因为它往往比成功画面更能帮助下一版优化。

7.2 可复用的版本发布前检查清单

下面是一份可以直接用于 PSP Pi mod 项目的发布前清单,建议每完成一个版本都逐项确认:

  • 整机能从冷启动进入前端,时间与上一版对比有记录;
  • 电源键能执行安全关机,低电量信号能触发系统关闭;
  • 十字键、主按键、肩键、音量键全部映射正常;
  • 两个按键同时按下不串键,长按不会误触发重复动作;
  • 屏幕亮度调节有效,显示无花屏,关闭背光后可正常恢复;
  • 扬声器和耳机至少有一条输出链路正常;
  • 电池从满电到低电量全程无意外重启;
  • 高负载运行 30 分钟后机身温度可以接受;
  • 存储卡镜像有备份,系统关键配置在版本控制或备份目录中;
  • 测试视频和数据文件已按版本归档;
  • 所有飞线焊点已经固定,并再次检查没有裸露焊点和尖锐边缘。

7.3 软件和内容版权边界

这一类改装项目最终都会涉及运行哪些程序的问题。建议所有软件包、模拟器前端和使用的系统镜像都从项目官方源或可信分发渠道获取。需要自备内容时,优先使用明确允许使用的自制程序、开放协议游戏或你持有的合法内容。不要为了还原“开机即玩”效果而去下载来路不明的镜像或资源,隐藏脚本和恶意硬件后门在掌机改装场景里同样存在。

玩 PSP Pi mod 真正值钱的部分,是你能独立完成结构适配、信号接入、电源管理和软件集成这一整套闭环。守住内容合规的边界,这个项目才能长期迭代下去,也才值得拿出更多精力继续改进。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询