在卡上结合 uClinux 和 Asterisk

作者:David Rowe

本文介绍了如何构建一个带有四个模拟(FXO 或 FXS)端口的嵌入式 Asterisk IP-PBX。总零件成本约为 500 美元,这与基于 PC/PCI 卡的 Asterisk 解决方案相比具有竞争力。嵌入式解决方案具有体积小、低功耗和无移动部件的优势。图 1 是 PBX 硬件运行的照片。

Combine uClinux and Asterisk on a Card

图 1. Digi-Key Blackfin STAMP 开发卡

PBX 基于 Blackfin STAMP 开发卡构建,可从 Digi-Key 现成购买,价格约为 225 美元。Blackfin 是一款功能强大的 DSP 芯片,运行 uClinux。Blackfin STAMP 卡的顶部是一个子板,其中包含接口硬件和 SD 卡插槽。子板插入 FXO 或 FXS 模块,每个端口一个。在本例中,左侧有两个 FXS 模块,右侧有两个 FXO 模块。每个 LED 的颜色指示插入模块的类型。

以下是电话术语的简要回顾

  • FXO 端口连接到电话线和交换机。

  • FXS 端口连接到模拟电话听筒。

图 2 是 PBX 硬件和软件组件的框图。SIP 电话或模拟电话可用作听筒(分机),通过 LAN 连接到 IP PBX。外部呼叫可以通过互联网或模拟 FXO 端口路由。IP 电话之间的内部呼叫通过 LAN 路由。

Combine uClinux and Asterisk on a Card

图 2. 示例 PBX 配置

PBX 支持在 x86 PC 上运行的 Asterisk 的大多数功能。由于没有硬盘,SD 卡用于语音邮件存储。

为什么要将 Asterisk 移植到 uClinux/Blackfin?

我拥有开发计算机电话硬件的历史,并且一直想构建一个小型嵌入式盒子,将主机处理器、DSP、线路接口硬件和软件结合在一起。这是我一直想解决的问题!

关于 Blackfin 处理器芯片,有一些非常酷的事情

  1. 大多数嵌入式处理器的缺点是它们不够强大。Blackfin 是一款功能强大的主机处理器 DSP——也就是说,它可以同时在同一处理器上运行 uClinux、Asterisk 和 G729 等编解码器。标准的 500MHz Blackfin 以大约 1,000 DSP-MIPs 的速度运行,这对于编解码器、回声消除等来说已经足够了。

  2. 通常需要大量的努力和硬件成本才能将电话硬件接口到主机处理器(通常是 PC),例如 PCI 桥接芯片。Blackfin 使这一切变得容易,因为它内置了许多不错的接口,例如串行端口、SPI 和 DMA 控制器,所有这些都与核心处理器紧密集成。

  3. Blackfin 芯片物超所值,每个芯片的价格从 4.95 美元起(BF531,1 万件起订),这使得低成本嵌入式电话硬件成为现实。这使得构建包括模拟或 E1/T1 线路接口的 IP PBX 的成本远低于同类 PC-PCI 卡解决方案。

  4. 最棒的是,有一个开源社区开发了 GPL 硬件(STAMP 板系列)。

开源硬件

该项目的硬件设计是开放的——原理图和 PCB 布局可供任何人免费下载、复制和修改。

硬件设计已根据 GPL 发布。尽管对于 GPL 应用于硬件的可辩护性存在一些争议,但关键思想与开源软件类似——硬件设计是言论自由意义上的自由,并且存在一个社区共同致力于扩展和增强这些设计。知识产权 (IP) 为了所有人的共同利益而共享。

该社区松散地组织在自由电话项目下,它由私人黑客、研究人员和几家公司组成,他们正在为该项目捐赠时间和其他资源。正在开发一系列硬件设计,例如,模拟和 ISDN 接口硬件以及 DSP 主板设计。重要的软件开发工作也在进行中,例如,开放式回声消除软件和硬件驱动程序。

该项目的输出是高质量、专业设计的电话硬件,可供所有人免费使用。硬件开发与软件略有不同——硬件设计/测试周期要长得多(例如,一个错误可能意味着需要制造一块新板),当然,制作硬件设计的“副本”需要花钱。但是,开放硬件的好处与开放软件类似

  • 同行评审是尽早发现错误的好方法,从而大大节省开发时间。

  • 重用开放设计使创新产品能够快速开发,并且错误数量非常少。

  • 来自世界各地的人们的讨论和贡献导致产品质量远高于一家公司在其自己的实验室中开发的产品。

  • 使用开放硬件,个人或小型公司可以在不需要大型公司资源的情况下构建复杂的电话产品。

  • 我最喜欢的部分——你可以与一个由才华横溢的硬件和软件人员组成的社区一起工作!一些最聪明、最优秀的人才似乎自然而然地迁移到开放项目。

正在开发在开放硬件环境内运作的商业模式。例如,一家赞助我们努力的公司拥有基于低成本电话硬件的服务模式——维护硬件 IP 的所有权并不是其商业计划的关键部分。

开放硬件对于小型本地企业也非常有利,并允许发展中国家在当地建立自己的产品——克服关税壁垒并建立当地高科技产业。

一个真正开放的硬件/软件项目

此 PBX 运行开源软件 (Asterisk),在开源操作系统 (uClinux) 上运行。操作系统、驱动程序和应用程序是使用 GNU gcc 工具链构建的。

硬件设计是开放的,并且是使用开源工具设计的。原理图输入是使用 gschem 执行的,PCB 布局是使用名为 PCB 的程序开发的——两者都包含在 gEDA 开源电子设计工具包中。

Verilog 用于在子板上实现一些可编程逻辑。Verilog 是一种用于描述电子电路中逻辑的语言。Verilog 代码是使用 Icarus Verilog 开发的,它也是 gEDA 包的一部分。

图 3 显示了项目的高级工作流程。正如您所见,硬件、软件甚至用于设计硬件的工具都是开放的。

Combine uClinux and Asterisk on a Card

图 3. 用于创建项目的工作流程

组装硬件

让我们开始将所有东西组装在一起。

第一步是将您所需的模块组合插入到子卡中。例如,对于家用 PBX,您可能只需要一个 FXO 和两个 FXS 模块;对于办公室,您可能需要四个 FXO 模块。在图 1 中,加载了两个 FXO 和两个 FXS 模块。

下一步是将子卡/模块组件插入 Blackfin STAMP 卡中。硬件组装基本就完成了。作为快速测试,尝试给 STAMP 通电,它应该可以毫无问题地启动。目前不会发生太多其他事情,因为我们需要编译和下载软件。

构建软件

该软件是在 Linux 主机 PC 上构建的,然后使用 FTP(由一些 shell 和 Expect 脚本驱动)下载到 Blackfin STAMP 板。以下是步骤

下载并安装 Blackfin gcc 工具链。此步骤的详细说明位于 blackfin.uclinux.org 网站上。

您需要最新 Blackfin STAMP uClinux 发行版(uClinux-dist RPM 或 tarball)的编译版本。在构建之前,使用以下命令设置以下配置make menuconfig:

  • 内核破解:启动参数—root=/dev/mtdblock0 rw。这使根文件系统可读写,这允许我们将 Asterisk 需要的许多文件添加到根文件系统。

  • Blackfin 选项:写回缓存——这使 DSP 密集型操作(如 Speex 编解码器)的速度提高了大约每个编解码器实例 10%。

  • 自定义供应商/用户设置:Flash 工具——MTD Utils 已关闭,因为它会破坏 uClinux-dist 编译(至少在我的机器上)。

  • 我修改了文件:uClinux-dist/vendors/AnalogDevices/BF537-STAMP/rc 以设置主机名并启用 dhcpcd。

Blackfin uClinux-dist 文档中包含构建 uClinux 的通用说明。阅读这些说明并构建 uClinux。如果您的构建成功,将创建一个 uClinux-dist/images 目录,其中包含 uClinux 映像。

下载 uCasterisk tarball,然后

$ tar xvzf uCasterisk-0.1.6.tar.gz
$ cd uCasterisk-0.1.6

在 .config 文件中,检查

BR2_TOOLCHAIN_DIR="/opt/uClinux/bfin-uclinux/bin"
BR2_KERNEL_SOURCE="/opt/uClinux-dist/linux-2.6.x"

指向您的工具链和目标内核源。

然后,输入

$ make

下载、修补和制作您需要的所有不同软件包。有关其他有用的选项,请参阅顶层 Makefile。

下载和测试

现在,将 Asterisk 和所有支持文件下载到 Blackfin STAMP

$ ./scripts/install_all stamp

其中 stamp 是您的 STAMP 卡的主机名。驱动程序安装时会有一些暂停,并且子板上的 LED 应该亮起,指示已自动检测到 FXS/FXO 模块。

下一步是为您的 FXO 和 FXS 模块组合配置 Asterisk。Asterisk 配置是一个很大的主题,对于初学者来说可能令人生畏。为了帮助您入门,我们开发了一些基本的配置文件。

现在假设您已加载两个 FXS 模块和两个 FXO 模块。在这种情况下,运行

$ ./scripts/config_2fxo2fxs stamp

现在,您已准备好启动 Asterisk。使用 Telnet 打开到 Blackfin STAMP 的控制台

$ /var/tmp/asterisk -vc

当 Asterisk 启动时,会闪烁大量文本,但最终,您应该看到 Asterisk CLI 提示符

Asterisk Event Logger restarted
Asterisk Ready.
*CLI>

将普通模拟电话插入其中一个 FXS 端口(FXS 端口将具有绿色 LED)。拿起电话,您将听到拨号音。尝试拨打 2000,您应该听到“恭喜,您已...”欢迎消息。然后,您可以尝试拨打一些演示选项并在分机之间进行一些呼叫。

每次关闭电源或重置 STAMP 卡时,都需要执行上述步骤。对于常规使用,PBX 可以从 SD 卡启动 Asterisk;但是,在实验时,从主机 PC 下载通常更方便。

Expect 和嵌入式系统

Expect 是 Tcl 的扩展,可让您自动化控制台会话。我发现它对于自动化嵌入式系统工作中的常用步骤非常有价值。

嵌入式系统开发存在一些令人恼火的问题

  1. 在常规桌面系统上,您编译代码,然后在同一台机器上运行它。对于嵌入式系统,您在主机 PC 上编译它,然后下载到主机系统——例如,使用 FTP 或 TFTP。这个额外的步骤变得繁琐,并且可能导致愚蠢的错误,例如忘记下载最新版本。

  2. 许多嵌入式开发工作涉及设备驱动程序工作,这可能意味着频繁崩溃。在开发阶段,嵌入式系统通常使用基于 RAM 的文件系统,因此系统崩溃或重置意味着您丢失所有内容,并且必须重新下载所有软件和配置文件。

Expect 让您可以自动化所有这些。例如,以下是一些 Expect 代码,用于通过 FTP 将文件传输到目标系统

#!/usr/local/bin/expect -f

set tarball [lindex $argv 0]
set target  [lindex $argv 1]

send "ftp $target\r"
expect "): "
send "root\r"
expect "Password:"
send "uClinux\r"
expect "ftp> "
send "cd /var/tmp\r"
expect "ftp> "
send "put $tarball\r"
expect "ftp> "
send "quit\r"

编写它就像看起来一样容易。只需几分钟,您就可以自动化常用任务。要运行脚本,只需键入

$ ./download tarball.tar.gz target

其中 target 是目标系统的主机名。

您甚至可以使用它为您设置配置文件(Asterisk 有数百万个)

spawn telnet $target
send "cd /var/tmp/ipkg/asterisk\r"
expect "> "
send "cp -a etc/* /etc\r"
expect "> "
send "exit\r"

此示例在目标上启动 Telnet 会话,并将一堆文件复制到 /etc。

Expect 可以为您节省大量嵌入式系统工作时间,从而缩小嵌入式开发与常规桌面开发之间的距离。

Asterisk 的配置文件与 x86 Asterisk 的配置文件相同。一些有用的文件是

  • /etc/zaptel.conf:Zaptel 驱动程序配置

  • /etc/asterisk/zapata.conf:更多 Zaptel 配置。

  • /etc/asterisk/extensions.conf:设置 PBX 的拨号计划。

  • /etc/asterisk/sip.conf:SIP 电话配置。

可以在 Blackfin 上使用 vi 编辑这些文件,但请记住,当板断电或重置时,任何配置都将丢失。永久更改可以存储在 SD 卡上。

进一步的工作

因此,您已经掌握了构建自己的嵌入式 Asterisk PBX 的基本步骤。包含子板和模块的套件可从作者处获得。我们正在进行进一步的开发——例如,专门为电话工作设计的定制 Blackfin 硬件和其他线路接口卡,例如 BRI-ISDN。这是一个令人兴奋的项目,具有开放硬件开发的新颖特性。

资源

自由电话项目:www.rowetel.com/ucasterisk/index.html

Blackfin uClinux 网站:blackfin.uclinux.org

构建嵌入式 Asterisk PBX,第 1 部分:www.rowetel.com/blog/?p=15

构建嵌入式 Asterisk PBX,第 2 部分:www.rowetel.com/blog/?p=16

优化 Blackfin 代码:www.rowetel.com/blog/?p=5

gEDA 开源 EDA 工具:www.geda.seul.org

David Rowe 在基于 DSP 的电话和卫星通信硬件/软件开发方面拥有 20 年的经验。David 拥有广泛的技能组合,包括软件、硬件和项目管理,以及 DSP 理论博士学位。他曾在卫星通信行业担任高管职位 (www.dspace.com.au),并建立并成功退出了一家小型企业 (www.voicetronix.com)。但是,他认为自己更擅长调试机器而不是人,因此他目前选择全职破解电话硬件和软件。

加载 Disqus 评论