PSP 编程
以前写的一篇老文章,其中有些说法应当更新了。
首先推荐下面几篇文章:
Wikipedia上对PSP的介绍
PSP的硬件详尽参数与实际性能
PSP菜鸟学堂
简单地说,PSP(PlayStation Portable)是索尼公司04年底推出的一款掌上游戏机。PSP配置两个333兆赫主频的CPU,支持很好的3D处理功能,大容量的UMD电影和游戏光碟(1.8G),Memory Stick Pro Duo(目前可以支持数个G的容量), 无线网络(支持网络对战)和红外线连接(多机直接连接),可以播放音乐浏览图片,继承了PS2手柄的设计。这款机器本身已经是游戏界的传奇,但这还不是故事的全部。
PSP的UMD光盘技术是垄断的,UMD无法被PC上的光驱读写,所以想要看电影或者玩游戏必须购买正版UMD光盘(非常昂贵,通常是30多美元),而且用户无法从USB口刷新PSP的操作系统。但是,在PSP推出半年之后也就是去年五月份这种局面有了改变,有hacker发现PSP Firmware1.0版本可以运行Memory Stick Pro Due中用户自己写的程序,这样用户就得到了kernel级别的系统运行权限,这种用户自制的程序被称为Homebrew(翻译成中文指“家中土产的”)程序。随后,一些hacker在很短时间写出了将UMD光碟Rip成iso并保存在Memory Stick Pro Duo上的程序,以及将Memory Stick Pro Duo上的iso文件虚拟为系统UMD的“虚拟光驱”软件,这样用户就可以从网上下载iso文件(通常是数百兆)到自己的PSP上玩而不用花钱购买正版游戏和电影。更重要的是,用户可以自己编写游戏或者用程序来实现PSP没有的功能,比如有的程序可以将PSP变成红外遥控器,支持数千种设备,下次你到bar里就不用忍受一百年不换的无聊的电视频道了 ![]()
这种局面并不会直接影响PSP的销路,但是会影响游戏出版公司的利润,所以会间接影响到索尼的利润并可能引来官司,所以索尼推出了1.50版本的Firmware禁止运行用户自己编写的程序,并且利用firmware的新特性来吸引用户升级。但是好景不长,hacker们发现了这个1.50firmware中显示程序图标导致内存溢出的一个bug,这个bug使得homebrew又成为可能,甚至有hacker写了程序将1.0版本的homebrew程序转化成1.50版本。
接着,可以想象的是,Sony又在网站上提供了1.51,1.52版本的firmware堵上了这个漏洞,吸引用户下载新版本,并且在1.5中有一个network update功能让用户能直接用PSP从网络更新系统。“叛乱”似乎平定了,虽然1.0和1.5的PSP已经卖出去不少并且homebrew的程序已经广为告知。
但是,hacker们还在盯着。Sony推出了2.0版本。这个版本支持一些新的功能,比如允许用户自己设定桌面壁纸,添加了网络浏览器等等。但是fancy的功能和膨胀的代码终于让hacker再次发现了漏洞,一个查看图片的bug导致内存溢出从而可以欺骗2.0的系统以运行1.5版本的系统安装文件!于是2.0的PSP被降级到1.5。
然后Sony推出了2.01, 2.5, 2.6版本的firmware,堵上漏洞,并用新特性来吸引用户升级。然后,hacker们又发现游戏Grand Theft Auto: Liberty City Story中的一个溢出漏洞可以导致用户运行盗版游戏(不过这次不能降级了,也不能支持homebrew程序),看来,现在应该被责备的轮到游戏出版商了 ![]()
目前最新的版本是2.7,尚未找到漏洞。
本文接下来的篇幅会谈谈如何购买PSP,设置引导游戏iso的软件(Game Loader),以及如何在Ubuntu Linux配置homebrew的编程环境。
购买
1.0(firmware)版本的PSP仅仅在日本发行过,现在很少见。目前能买到的新PSP是2.7版本,199美元,有时可以找到deal,150多美元。不过2.01,2.5,2.6,2.7版本的PSP目前无法运行Homebrew程序,所以如果你想要hack PSP,请购买2.0及其以前的二手PSP。因为可以运行盗版游戏,所以二手的旧版PSP(有些附带几张游戏光盘)一般要200多美元甚至300美元以上,比新的还贵。在ebay上偶尔能买到300圆以下的新的2.0及其以前版本的PSP,不过我觉得没必要,二手的足够了。我的二手的2.0版是从craigslist上找的,150美元,那个美国哥们对他的PSP保养得很好(买了一年几乎没玩过),随机附赠的《蜘蛛侠》的电影UMD都没有打开。
如果你买到的是1.5版本,那么请直接阅读下一节。如果是1.51或者1.52版本的PSP,请先升级到2.0:在qj.net上下载2.0美版或者日版的升级用的EBOOT.PBP,放在PSP/GAME/UPDATE/文件夹下面,然后进入菜单的game->memory stick运行2.0updater即可。将2.0降级到1.5可以参考下面的网页
Game Loader的安装和使用
请google。
设置Homebrew的编译系统PSPSDK
编译软件首先要有编译器,比如Linux和cygwin中的C语言编译器。这节的目的就是怎样在Ubuntu Linux下配置为PSP设计的C编译器psp-gcc,注意这个psp-gcc生成的是PSP中可执行的目标代码,和Linux中的gcc相互独立完全不同,他们的头文件和库文件放在两个互不相干的位置。我们知道C语言有很强的从一个操作系统移植到另一个操作系统的能力,就是说PC上的C程序源代码基本可以由psp-gcc编译得到PSP的可执行代码!
设置PSPSDK方法很简单:
到pspsdk的svn下载那个toolchain.sh脚本,以root权限运行这个脚本(因为需要往/usr/local/pspsdk里写东西),它会自动下载源文件和patch文件,自动patch,编译并最后安装。整个过程需要较长时间,可以去喝杯咖啡。pspsdk就安装在了/usr/local/pspsdk文件夹中,/usr/local/pspsdk/psp/sdk/sample下面是一些例子,你可以试试make :
-
make 会生成1.0需要的EBOOT.PBP文件
make kxploit 会生成1.5需要的两个文件夹 xxx和xxx%
make SCEkxploit 和make kxploit 一样,不过两个文件名称为 __SCE__xxx和%__SCE__xxx,这利用了fat文件格式的一个bug,这样,那个%__SCE__xxx文件夹在PSP的game菜单中就不会显示为corrupted。
这样就安装好了PSPSDK,具体使用方法请到PSPSDK的官方主页,也可以从sample下面的例子得到启发。有了PSPSDK这个基本的编译环境之后,已经可以让你编写homebrew程序。不过有的程序需要一些额外的library,这些library可以从pspsdk的svn中下载:
比如zlib
svn co svn://svn.pspsdk.org/psp/trunk/zlib
下载完成后进入目录,首先阅读README.PSP或者README等帮助文件,上面详细说明了需要怎样编译和安装。需要强调的是这些库之间有依存关系,先后安装是有顺序的。下面是我成功安装的库,以及补充说明(排在后面的库可能依赖前面的库,前面的库不依赖后面的库):
zlib
libpng (依赖zlib,我试过其中的例子screenshot可以编译在PSP上运行)
jpeg
mikmodlib (不要安装那个libmikmod,两者不一样,libmikmod导致cpplibs无法编译通过,另外make install就可以安装而make可能会失败,因为作者对make的知识很烂
)
cpplibs (sample 可以通过,但是需要在makefile的编译链接库选项中加入 -ljpeg,这是一个bug)
libogg
freetype
libTremor
libvorbis
aalib (sample “aafire” 可以编译运行,但是 其中的aastdin.c 文件头部要加入一行 #include 因为其中使用了fd_set这个structure,但这个structure定义在sys/fd_set.h中,在sys/select.h中如果检测到不是cgywin就不会自动include sys/fd_set.h,这是一个bug)
prxtool (这是一个本地PC上使用的prx工具)
pspgl (tests 和 test-vfpu 都可以通过, test-q3 没试过不知道)
编译pspgl的tests注意
-
首先要export环境变量
export PSP_REVISION=1.50
export PSP_MOUNTDIR to a directory,比如tests/PSP
然后修改tools/psp-install,注释掉一些语句用新语句替换:
# LONG=”$IMGDIR”_________________________________1
LONG=__SCE__”$IMGDIR”
BASE=`echo “$LONG” | sed -e “s/\(.\{6\}\).*/\1/”`
# SHORT=”$BASE”~1%
SHORT=%__SCE__”$IMGDIR”
else
# LONG=”$IMGDIR”
LONG=__SCE__”$IMGDIR”
# SHORT=”$IMGDIR%”
SHORT=%__SCE__”$IMGDIR”
修改tools/psp-install,注释掉两句:
# while [ ! -d $(PSP_MOUNTDIR)/psp/game ]; do mount $(PSP_MOUNTDIR); sleep 1; done
PSP_MOUNTDIR=$(PSP_MOUNTDIR) \
$(PSP_INSTALL) $(INSTALLFLAGS) $
SDL (没试 samples)
SDL_gfx (没试 samples)
然后,你可以试试pspsdk svn中其他的好东东,发现什么好玩的请告诉我。
阅读(2788 次)

十二月 30th, 2006 at 10:45 上午
[…] 然后去 Denis 的论坛下载一个PSP Homebrew程序 Map This!,关于PSP Homebrew见我的一篇文章。下载地图请使用in7ane写的一个Windows程序Google Maps download,这个程序目前可以下载google/msn/ask/yahoo/baidu/map2go的地图,并保存为GPSFS格式。注意那个0.3版本的Map This!并不支持GPSFS格式的地图,仅仅支持图片格式和zip压缩包。你可以在Map This! 0.3那个帖子稍后的跟帖中找到更新的测试版,支持GPSFS格式(但不支持zip格式了)。GPSFS格式的好处在于无论是传输到PSP上还是载入都很快。 […]
十二月 30th, 2006 at 10:50 上午
[…] check this article for setting up PSP programming environment under Linux. […]