» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

无语 ps3做频谱仪

PS3 fab-to-lab,第 1 部分: 从 Sony PLAYSTATION 3 构建 Linux 实验设备
如何在基于 Cell/B.E. 的频谱分析器上生成并分析信号

级别: 中级

Lewin Edwards (sysadm@zws.com), 设计工程师, Freelance


2007 年 7 月 26 日

如何将 Cell Broadband Engine™(Cell/B.E.)从一个现成的 Sony® PLAYSTATION® 3(PS3)上取下来,用它来构造一个基于 Linux® 的实验设备呢(也就是,将现有的产品 Cell/B.E. 还原成实验设备)?在本系列文章中,Lewin Edwards 将向您展示如何从游戏控制台转到音频带宽频谱分析器和函数生成器。首先,他将介绍本项目的设计内容,然后在您开始着手在 Cell/B.E. 处理器上生成并分析信号时详细介绍用户接口的实现。
Cell Broadband Engine(Cell/B.E.)处理器已经在游戏类和网络数据处理类的应用程序方面吸引了大量的注意力。然而,这种技术实际上还有很多其他有争议的有趣用法。

在本系列文章中,我们将使用一个现成的 PLAYSTATION 3(PS3)— 上的 Cell/B.E. 处理器 — 来构建一个 Linux 托管的实验设备,即一个简单的音频带宽频谱分析器和函数生成器。

在本系列文章的第 1 部分中,我们将介绍本项目的设计内容,并开始详细介绍用户接口的实现。

设置

我所使用的硬件和软件是一个 60GB 的 PS3,上面运行的系统是 Yellow Dog Linux 5.0(YDL)。我使用了一个标准的 NTSC 电视机作为输出设备,还向系统中增加了一个 vanilla USB 键盘和鼠标以及一个 Griffin iMic(稍后将对这些外围设备作更详细的介绍)。

我们在此处执行的所有操作都应该与 20GB 的 PS3 兼容,也应该与所有其他的 Linux 发行版兼容(在撰写本文时惟一的另外一个发行版是 Fedora Core 5 for PowerPC®)。选择使用 YDL 完全是因为它不易引起冲突 — Terra Soft 装配起来后允许它在 PS3 上使用,另外 它还包括了启动、进行开发过程所需的硬件,以及我们打算使用的一些硬件。

如果您更喜欢使用其他 PowerPC Linux 发行版,可以随意使用 — 但是您需要下载本文没有提及的一些其他组件。类似地,我选择 iMic 也是因为它可以得到 PowerPC Linux 的良好支持 — 您可以自由地使用任何 USB 音频输入设备,但是如何寻找驱动程序就留给读者作为练习了。另外,还请注意您并不需要购买一个 PS3 游戏控制器;您可以使用一个 USB 键盘来控制 Sony 的操作系统(至少安装 Linux 是足够的,此后就不需要与 GameOS 再进行任何交互了)。

有关所提到的产品的链接,请参看 参考资料 一节的内容。如果您计划按照本文的介绍来构建并测试示例代码,开始还应该阅读 Jonathan Bartlett 撰写的文章,其中介绍了如何在 PS3 上安装 Linux(请参看 参考资料)。这是记录非常完备的文档,与我了解的其他 Linux 相比,其安装非常简单;不过还没有插入一张 DVD 并单击 “Go” 按钮这么简单。有些手工处理是相当必要的。

如果您并不希望自己购买一个 PS3,也可以在 Cell 模拟器中构建大部分代码,不过这样做似乎没什么道理,除非您希望编写一个前端来仿真音频输入/输出设备(可以使用 .WAV 文件)和图形显示设备。

基本原理

现在您可能会问:在这种应用程序中使用 Cell/B.E. 处理器背后的基本原理是什么?最近,工程师常常需要能够从 PC 中控制测试设备,并将获得的所有测试数据传回计算机,以便导入 Mathcad 或 Matlab 之类的分析软件中。随着复杂性的不断增加,以及分析仪器以 PC 为中心这个特性的强化,几乎所有现代的单独实验设备中实际上都存在一种常见趋势:都是基于嵌入式 PC 并且前端中增加了很多定制功能。

例如,数字示波镜可能会包含一个非常低端的处理器,它在一个通用的操作系统上运行 —— 这个处理器可以处理用户接口、网络、大容量存储设备等。一个或多个数字信号处理器(DSP)耦合起来可以构成速度很快的模拟-数字转换器(ASC),用来执行信号获取、预处理、触发器生成等操作。

将多种功能封装到一个包中

使用 Cell/B.E. 处理器,您可以将大部分功能封装到一个芯片中 —— 在基本的体系结构中,您已经有一个主处理器(PPE)和 8 个类似于 DSP 的协处理器(SPE)。另外,芯片还包括了所有必需的管道技术以便随意移动少量的 DMA 数据而且无需设计任何其他硬件。

主要设计意图是软件开发人员应该使用 PPE 将输入流中的数据块发往 SPE,在 SPE 中进行真正的数据计算,然后将结果发回输出设备。

工具依然是熟悉的工具

一旦您带领自己的开发团队理解了 SPE 编程接口(非常容易理解)之后,就可以使用我们熟悉的工具来开发整个系统了。因此,您最终可以成功开发一个实验设备,其特性几乎都是由软件定义的,无需涉及任何通用的 DSP 工具链、复杂的 DMA 体系结构、ASIC 或 FPGA 编程。

稍加定制

注意尽管从零开始的 Cell/B.E. 硬件设计的确是非凡的,但是从现有的 Cell/B.E. 参考设计开始开发一个专用应用程序所需的硬件定制却相当少(因为设备的很多重要属性都可以用软件实现)。这个事实之下所掩盖的是另外一个事实:一些重要的功能升级能够以简单的软件更新的形式销售给用户,而不需要开发和验证任何新硬件。

这看起来似乎是一个非常大的优点,因此如果在不久的将来出现基于 Cell/B.E. 的频谱分析器、波形合成器或其他复杂设备(例如基站模拟器),我也不会有丝毫奇怪。

例子

在这个具体的例子中,我们将首先来了解几点您需要知道的事情:

Linux 在哪里?
防止整套设备出现混乱
使用显示设备
文本渲染代码
寻找内部的 Linux

在围绕 PS3 构造一个应用程序时,您会受到 PS3 硬件和软件设计的严格限制 —— 具体来说,Sony 已经从大部分硬件中删除了 Linux。采用完全定制的设计 — 甚至只采用普通的基于 Cell/B.E. 的主板(附有包含数据获取/输出硬件的定制 PCI Express 卡)— 也会灵活得多。

然而,为了让 iMic 具有适度的性能,我们在本系列文章中的目标是处理两个并行的(立体声)44.1kHz 的 16 位数据流,这就意味着要实现 22.05kHz 的音频带宽。

噢!太热了!

开始之前,请先看一条重要提示:PS3 硬件设计用来在电视机上或娱乐中心使用,而不是在工作台上使用。它会产生大量的热量,这些热量由一个风扇排出,它将风从靠近 Blu-Ray 驱动器的单元的后端吹出,并吹出设备后部。

当我第一次将 PS3 拆开时,我将它放在工作台上靠近笔记本的地方运行,PS3 的风扇将风吹进了笔记本的排气孔里面,最终导致笔记本过热而关机了。因此我建议您把 PS3 竖起来运行(这样 PLAYSTATION 3 文字就是竖立着的;设备底部有几个脚可以帮助稳定)。这种方式运行时,设备似乎最凉。

值一千行代码的图片

采用这种方式并安装 Linux 之后,您需要解决的第一个任务是如何使用显示设备。PS3 上 Linux 安装的默认显示配置取决于您的安装方法。如果您正在使用一个普通的 NTSC 或 PAL 电视机(而不是 HDTV 或连接到监视器的 VGA 转换器),就无法使用 YDL 的图形安装模式,因为它会试图设置一个更高的扫描分辨率。

因此,默认的 Linux 安装是没有提供 X 包的,它使用的是 TV 分辨率的屏幕。对于本系列文章来说,您可以通过编辑 /etc/kboot.conf — 来修改这种行为,您可能会希望在 RGB 模式中运行,对于 NTSC 用户来说是 480i,对于 PAL/SECAM 用户来说是 576i。对于这两种设置所给出的屏幕大小,freamebuffer 设备都会报告分辨率为 576x384 像素;稍后会对此作更多介绍。

这个引导时特定的 framebuffer 视频模式可以通过引导启动程序 kboot 传递给内核的参数进行设置。(注意这种视频模式设置只有在 ps3fb framebuffer 设备加载之后才会进行检查,因为这是一个内核参数。启动和初始化 ps3fb 设备这两个时刻之间的视频模式是您在 Sony GameOS 菜单中设置的;默认情况下,它采用的是您的 PS3 购买地的交错式 SDTV 分辨率)。kboot 的设置保存在 /etc/kboot.conf 中 — 下面介绍我是如何对自己的系统进行配置的。这些配置都是直接从 YDL 安装程序所生成的配置中取过来的,我只是修改了视频模式:

default=ydl
timeout=10
root=/dev/sda1
ydl='/dev/sda1:/vmlinux-2.6.16-20061110.ydl.2ps3
initrd=/dev/sda1:/initrd-2.6.16-20061110.ydl.2ps3.img root=/dev/sda3
init=/sbin/init video=ps3fb:mode:33 rhgb'



对 kboot.conf 所做的修改会在下次重新启动时立即生效;您不需要执行任何特殊操作将新配置告诉引导程序。

如果您正在使用电视机,并且所在的位置是欧洲,那么就可能希望以 38 模式运行;这样可以在上面的清单中简单地将 mode:33 修改为 mode:38 即可。如果感兴趣,可以使用 ps3videomode -h 命令查看所有的可用模式清单。您也可以使用 ps3videomode -v <number> 命令动态地体验各种模式。

现在我们已经完成了将像素写入空白显存所需要执行的操作了。

PS3 视频子系统受到了 Sony GameOS “系统管理程序” 的严格保护,它不能在其他 Linux 上显示出来。尚不清楚它们之所以这样做有多大程度是由于害怕有人会在某些特定情况下复制 PS3 游戏,或者能够看到一个 HD 视频内容的未加密字节;或者有多大程度上是由于 Sony 需要开发一种方法向 Linux 公开视频接口,而不需要对外公布有关 GPU 的任何注册表级文档(研究标明这可能会产生 GPL 的副作用,例如需要公布与 nVidia 达成的非公开协议所隐藏的代码)。

不管动机如何,ps3fb 视频设备的工作方式与其他 Linux framebuffer 都有些不同,这既是一个缺点,又是一个优点。参考资料 中给出了有关它的工作方式的详细文档,不过上面对讨厌的 bug 却只字未提。您需要了解的内容简单总结如下:

通常,framebuffer 设备都会让您直接访问显卡内存。
使用 ps3fb 设备,您的应用程序会写入主存(offscreen)缓冲区。对于垂直方向上的每个空格来说,管理程序都会采用 DMA 方式将自己的缓冲区读到 GPU 的内存中,然后将 GPU 的可视页刷新为与垂直空格信号同步的数据。
对于这个系统来说,优点是您永远都不需要担心更新屏幕内容时在一帧中间导致动画产生 “撕裂” 效应。
ps3fb 还提供了一些 ioctl 命令,让您可以按照一种单缓冲区模式来显示自己的屏幕,此时您可以停止周期性的中断,并在应用程序认为合适的时机显式地将新的视频数据写入 GPU(当然,这依然要通过系统管理程序)。X 就使用了这种模式。
我刚才提到的那个讨厌的 bug 是指标准模式信息查询 ioctl 并不能正常工作,至少对于电视分辨率来说是如此。正如前面介绍的一样,NTSC 和 PAL 分辨率都会报告 576x384 像素的虚拟/物理大小。这甚至都不正确;NTSC 屏幕的实际宽度是 720 像素,而高度(由映射和日益累积变大的 RAM 边缘决定)实际上大约是 480 行,不过 framebuffer 控制台看起来在 400 行就停止了,480 行距离整个扫描区域的屏幕底部还有一段距离,至少对于默认的视频配置来说是如此。

因此,如果您简单地编译并运行通用 framebuffer 代码,它并不能显式地理解 PS3 会这样中断。我的解决方案是强制代码相信自己是在一个 720x400 像素的屏幕上运行的,这看起来似乎可以很好地工作。如果您正在使用 NTSC 电视机之外的其他设备作为输出设备,可能会希望进行这种修改;不过尽管代码能够正常操作,但是可能不会产生一个清晰的显示输出。

PS3 输出的另外一点非常怪异的事情是整个扫描区域的颜色是上一次扫描线的最后一个像素的输出颜色。关于这一点,我认为是 RAMDAC 对于每个 DMA 循环都有一个像素插销,当光栅超过 framebuffer 区域时,这个插销就会闭合,直到垂直空白间隔出现位置,此时会重新加载一个黑色的像素值。另外一种可能是这种现象是由于系统管理软件中的某种竞争所导致的。

本文提及这个问题的惟一原因是如果您在屏幕上画了一个矩形,它触及了屏幕的左边缘,就会看到这个矩形的颜色扩展到了整个扫描区域,而矩形的左上角却不是这样(由于这个角是从上一条扫描线的末尾继承的颜色)。即使在低分辨率的电视机上,这种现象也很容易注意到;我不希望您将这个问题报告为我代码的一个 bug,因为这根本不是我的 bug!

让它变得清晰

您的工具所需要的另外一个特性是文本渲染代码。我没有手工编写字符生成器结构,而是借用了 Linux 内核中的 font_acorn_8x8.c 中的代码(这是 framebuffer 驱动程序树的一部分)。注意:这是合法的,因为我此处提供的样例代码是 GPL 许可的。如果您需要在不公开源代码的发行版中使用的字符集,就需要自己再进行一些搜索工作了。例如,Red Hat 的 eCos 操作系统就包含了一个您可以使用的字符集。Linux 字体的优点是已经包含了您可能使用的所有 ASCII 字符。

现在我们可以开始来查看样例代码了,它包含了前面介绍的初始化工作,以及处理单个像素、填充矩形和渲染文本的函数。main.c 中的样例代码会在屏幕上画几个彩色的条,以及几行多种颜色的文本,还会在控制台上打印一些可能有用的调试信息。您会发现上面介绍的所有图形原语都在 graphics.c 和 graphics.h 中,或多或少都能从文档中看到解释。

键盘警告

当您运行样例代码时需要注意的最后一点警告是:建议您不要使用键盘连接到 PS3 上进行编辑;而应该通过 ssh 进行开发(YDL 安装中默认包括了完整的 ssh 守护进程;您不需要配置任何东西)。这样您可以在 ssh 控制台上运行应用程序,同时可以在标准输出设备上看到有用的调试信息,而不会弄乱 PS3 的 framebuffer 中正在显示的图形。

惊奇!功能完善的图形接口!

如果您一直遵循本文的介绍进行了实验,现在就获得了一个可以在 PPE 上运行的功能完善的图形接口,它有一些非常有用的基础原语,可以在更高级的项目中使用。

在下一篇文章中,我们将介绍如何使用 iMic 来搜集模拟数据流,并展示如何使用一个 SPE 将系统转换成一个有用的音频分析器。

http://www.ibm.com/developerwork ... 1/index.html#N1007C


TOP

10台ps3结合运算能力超过超级电脑



TOP

很好,很强大,等天师今后再加上PS3的功能。
我们继续玩我们的游戏机去……


TOP

等天师近来给大家讲解~~~~~~~:D

TOP

干点啥不好 谁会用ps3做频谱分析

TOP

搞不明白这类炒作有什么意义
平面媒体100%绝对主导的年代里,也许能忽悠不少人吧

TOP

彪悍的神机不需要解释

TOP

“神机”果然名不虚传,不过我想在中间加个字就更贴切了。:D :D :D

TOP

anything but game console

果然是

play beyond

TOP

发新话题
     
官方公众号及微博