释放 Gumstix DSP

作者 James McColl

为了一个高级设计项目,我所在的团队需要在一个嵌入式计算机上处理快速傅里叶变换。具体来说,我选择使用 Gumstix Overo Fire 是因为它集成了数字信号处理器 (DSP),它将快速傅里叶变换作为德州仪器 API 的一部分。在研究这个项目时,我发现 Gumstix 上 DSP 的激活是一个相对未被探索的领域。因此,通过结合 BeagleBoard 上的 DSPBridge、Gumstix Developer 和 PIXHAWK 项目网站的方法,我找到了这种为 Gumstix Overo Fire 编译支持 DSP 的 Linux-2.6.33 内核的方法。

Overo Fire 配备了三个处理器:ARM Cortex-A8 CPU、POWERVR SGX 和 C64x+ 数字信号处理器内核。虽然 ARM 提供通用处理,但数字信号处理器可用于执行更多数学密集型计算。因此,本文的目的是描述如何为 Gumstix Overo Fire 编译 Linux 2.6.33 内核,以便为未来的项目利用 DSP 的额外处理能力。

预编译软件包安装

转到 DSPBridge 项目 Wiki (www.omappedia.org/wiki/DSPBridge_Project),并按照说明从 DSPBridge git 存储库中检索 kernel-dspbridge 和 userspace-dspbridge 软件包,但不要发出任何make命令,如网页上的教程中所述。

从德州仪器网站下载并安装 Code Sourcery 工具套件(特别是 CodeSourcery G++ Lite 2008q3-72)以及 bios_setuplinux_5_33_04.bin 和 ti_cgt_c6000_6.0.7_setup_linux_x86.bin 软件包。德州仪器工具需要德州仪器的用户帐户才能下载。将两个德州仪器工具安装在同一目录下将有助于稍后配置 $DEPOT 变量。

编译 Gumstix 的 DSP 镜像所需的另一个工具是来自 Steve's Beagles U-boot git 存储库的 u-boot。使用以下命令

git clone git://gitorious.org/u-boot-omap3/mainline.git u-boot-omap3 
cd u-boot-omap3 
git checkout --track -b omap3-dev origin/omap3-dev 

或者,转到 www.sakoman.com/cgi-bin/gitweb.cgi?p=u-boot.git;a=summary 并从那里下载软件包。

接下来,更改到新安装的 u-boot 目录并发出make tools命令,以便编译 mkimage,稍后将使用它来创建 uImage。确保为 Overo Gumstix 配置文件安装了 OpenEmbedded 和 bitbake 编程套件。使用 Linux 2.6.33 内核的默认配置作为新的启用 DSP 的内核的起始配置。有关 OpenEmbedded 和 bitbake 的安装说明,请访问 www.gumstix.org/software-development/open-embedded/61-using-the-open-embedded-build-system.html

最后,创建一个带有可启动 Gumstix 镜像的 SDRAM 卡。有关创建可启动 SDRAM 卡的说明,请访问 www.gumstix.org/create-a-bootable-microsd-card.html

设置编译环境

要设置编译环境,请使用以下命令将 CROSS_COMPILE 变量指向 Code Sourcery 工具套件

export CROSS_COMPILE= <path to tool suite>/CodeSourcery/
↪Sourcery_G++_Lite/bin/arm-none-linux-gnueabi- 

并使用以下命令设置 DEPOT 变量

export DEPOT=<path to TI tools>/ 

此外,使用以下命令将设备的架构设置为 ARMexport ARCH=arm,并使用以下命令将 u-boot 目录和交叉编译器添加到路径中

PATH=<path to u-boot directory>/u-boot-omap3/
↪tools:<path to tool suite>/CodeSourcery/
Sourcery_G++_Lite/bin:$PATH

export PATH 
编译内核

在编译内核之前,将 git 存储库从当前分支重置为 Linux 2.6.33 内核,使其与 Gumstix 配置文件兼容。(在撰写本文时,默认的 DSPbridge 设置为 Linux 2.6.37。)首先,发出git branch命令并检出当前的 DSPbridge 分支。现在,发出

git reset - -hard 85343cd5491260881b34ab7bb7cdc8fdeef078e4

分支重置后,检查 Makefile 顶部是否有正确的 Linux 信息。为了最大限度地减小内核大小,请在输出目录中构建内核,本文的其余部分将该目录称为生产目录。现在,将 Gumstix 的默认配置从 OpenEmbedded 复制到生产目录中作为 .config 文件。这样做的目的是在添加 DSPbridge 库之前配置 Gumstix 的基本结构。该命令应如下所示

cp <path to openembedded>/org.openembedded.dev/recipes/
↪linux/linux-omap3-2.6.33/Overo/defconfig
<path to "production" directory>/.config 

接下来,发出make oldconfig命令,该命令用于使用新选项更新当前的 .config 文件。通常,对问题的默认响应是可以接受的,但图 1 中突出显示的情况除外。

Breaking Free the Gumstix DSP

图 1. 在...期间所做的更改make oldconfig

请注意,图 1 中的省略号用于指示为了显示目的而中断输出。现在,发出make menuconfig命令,该命令将在终端中启动一个配置界面,如图 2 所示。

Breaking Free the Gumstix DSP

图 2. 导航到设备驱动程序

导航到设备驱动程序选项(也在图 2 中显示),按 Enter 键,然后导航到图形支持选项(图 3),然后按 Enter 键。

Breaking Free the Gumstix DSP

图 3. 导航到图形支持

现在,通过突出显示选项并按 N 键来取消选择图形支持中的所有选项。(背光和 LCD 驱动程序支持无法禁用,但所有其他选项都可以禁用,如图 4 所示。)

Breaking Free the Gumstix DSP

图 4. 取消选择图形支持选项

如果保留选择这些驱动程序,则在核心目录的内核中制作 uImage 时会导致编译错误。通过禁用它们,内核应该可以编译。

接下来,发出make uImage命令并等待编译结束。这将编译一个特殊包装的 zImage,u-boot 在 Gumstix 的启动过程中使用它。

然后,发出make modules命令来编译所有内核模块。这完成了编译所有必要的库以激活内核端的 DSP。

现在,压缩包含编译后的 uImage 和内核模块的生产目录,以便部署到 Gumstix 上。递归复制将不起作用,因为它会破坏新编译的 uImage 和模块内部的多个链接。首选方法是使用 tarball 压缩目录tar cvjf <生产目录>.tar.bz2 <生产目录>.

编译用户空间文件

按照 DSPBridge 项目(位于 www.omappedia.org/wiki/DSPBridge_Project)上的说明编译用户空间文件将起作用,只要 $DEPOT、$CROSS_COMPILE 和修改后的 $PATH 变量在终端中如前所述设置即可。发出make all命令以获取完整的 DSPBridge 项目示例、MPU API 和 DSPBridge 库。

将新内核部署到 SDRAM 卡

Gumstix 可启动 SDRAM 卡应分为两个分区:一个包含 MLO、U-BOOT.bin 和 uImage,另一个包含根文件系统 (rootfs)。

使用为 Gumstix Overo Fire 配置的可启动 SDRAM 卡,重新格式化包含当前 rootfs 的部分。接下来,转到 cumulus.gumstix.org/images/angstrom/factory/ 并从工厂镜像下载 Gumstix 的 rootfs-booted-Overo-201004270808.tar.bz2 软件包。现在,将 rootfs-booted-Overo-201004270808.tar.bz2 解压缩到 SDRAM 卡上的 rootfs 分区中。

在 rootfs-booted-Overo-201004270808.tar.bz2 软件包完全解压缩后,将生产目录解压缩到 rootfs 分区中。如果将生产目录解压缩到分区中创建了一个新目录,请将新目录中的所有文件移出到与 rootfs-booted-Overo-201004270808.tar.bz2 文件相同的目录中。这应该在生产目录内留下两个目录:usr 和 lib 目录。递归地将这些目录的内容复制到解压缩的 rootfs-booted-Overo-201004270808.tar.bz2 的 usr 和 lib 目录中。现在删除 rootfs-booted-Overo-201004270808.tar.bz2 的 boot/ 目录中的 uImage-2.6.33,并将新的 uImage 从 arch/arm/boot 目录复制到该目录。最后,更改目录到 SDRAM 卡的可启动分区。按照 Gumstix 网站教程,此目录应命名为 FAT。删除 uImage 并将新的 uImage 从 arch/arm/boot 目录复制到该目录。现在卸载 SDRAM 卡并将其放入 Gumstix 中,然后从 SDRAM 卡启动。

部署 DSPBridge 用户空间文件

一旦新内核完成启动序列,请为 root 用户添加密码,并将用户空间 DSPBridge 目录的 target/ 目录的内容安全复制到 Gumstix。(目录应为 dspbridge/ 和 lib/。)接下来,递归地将 lib/ 目录的内容复制到 Gumstix 的根 /lib/ 目录,然后重新启动 Gumstix。Gumstix 重新启动后,输入 dspbridge/ 目录并发出./ping.out命令以接收图 5 中显示的错误。

Breaking Free the Gumstix DSP

图 5. DSP 错误消息

这意味着库已正确安装,并且已检测到 DSP 设备。现在,通过发出以下命令加载 DSP 的基本镜像./cexec.out ddspbase_tiomap3430.dof64P./cexec.out dynbase_tiomap3430.dof64P命令。(要了解区别,请阅读 DSPBridge 项目 Wiki 底部的说明。)

接下来,使用以下命令注册基本镜像./dynreg.out -r <sample>dyn_3430.dll64P对于您要运行的测试。例如,使用以下命令注册 ping 示例 DSP 程序./dynreg.out -r pingdyn_3430.dll64P命令,并使用以下命令执行它./ping.out. 输出应如图 6 所示。

Breaking Free the Gumstix DSP

图 6. 的结果ping.out

此输出证明内核已成功编译,并带有 Gumstix Overo Fire 的用户空间文件,并且库已集成到 rootfs 中。最后,这证明 DSP 正在运行,因为 DSP 对 ping 程序的响应。现在,带有新编译内核的 Gumstix 可以用作涉及 DSP 的项目的试验台。我希望本教程有助于理解和实施编译支持 DSP 的 Gumstix Overo Fire 的 Linux 2.6.33。

资源

BeagleBoard/DSP Howto: elinux.org/BeagleBoard/DSP_Howto

Gumstix 开发者中心: gumstix.org

DSPBridge 项目: www.omappedia.org/wiki/DSPBridge_Project

ETH PIXHAWK: MAV 计算机视觉 Wiki 教程: pixhawk.ethz.ch/wiki/tutorials/start

James McColl 是美国西点军校计算机科学专业的学员,这是他在大学里做出的最佳决定,他从未后悔。请将评论发送至 jim.mccoll.11@gmail.com

加载 Disqus 评论