Free Telephony Project
Open Telephony Hardware

Introduction

Package based Build system for Blackfin Asterisk. Key differences compared to buildroot based systems like Astfin and uCasterisk:

  1. End users do not need to compile any software, they just install them on a running Blackfin system, for example:

    root:~> ipkg install asterisk

    will grab the latest Asterisk package from a web site and install it on a Blackfin based hardware platform. Use is not limited to Asterisk, it could be used to manage any Blackfin software, including the kernel. The use of ipkg is very common on the OpenWRT project, and similar package based systems are common on x86 Linux, e.g. apt-get, debs, rpms.

    Note that software is installed at run time rather than build time. Packages (via ipkg) are used to install applications like Asterisk, rather than placing everything in a uImage. The target hardware is initially booted with a basic kernel and root file system, then packages are installed as required. We assume availability of persistent (non ram) based file system like yaffs or jffs2.

    The goal is to make installing software on the Blackfin much easier for end-users, more like an x86 experience.

  2. Compared to buildroot systems BAPS has a flat directory structure to ease development (less wear on your tab key). It is designed to allow modular compilation of packages, e.g. you can compile a single application without building the entire uImage. Faster and less output to wade through. Makefiles (e.g. asterisk.mk) and source (e.g. asterisk-1.4.4) are within one directory level of each other for easy navigation of the source tree. There is less chance of breaking the build system due to decoupling of modules (kernel, root fs, are separate from Asterisk).

Packages

In addition to an IP04/IP08 uImage (kernel plus basic root filesystem) there is a growing list of packages:

Name Description
asterisk Asterisk is a complete PBX in software. It provides all of the features you would expect from a PBX and more. Asterisk does voice over IP in three protocols, and can interoperate with almost all standards-based telephone equipment using relatively inexpensive hardware.
asterisk-gui Asterisk Now GUI.
asterisk-spandsp Asterisk is a complete PBX in software. It provides all of the features you would expect from a PBX and more. Asterisk does voice over IP in three protocols, and can interoperate with almost all standards-based telephone equipment using relatively inexpensive hardware.
atftp tftp (trivial file transfer protocol) server
busybox Additional busybox utilities not included in the default uImage. Lets you to install extra utilities without reflashing.
cron CRON is a small version of the cron daemon..
dropbear Dropbear, a smallish SSH 2 server and client URL:=http://matt.ucc.asn.au/dropbear/dropbear.html
ee easyeditor ee, a smallish editor
freepbx FreePBX is a standardized implementation of Asterisk and is based around a web-based configuration interface and other tools.
gettext This is the GNU gettext package. It is interesting for authors or maintainers of other packages or programs which they want to see internationalized. As one step the handling of messages in different languages should be implemented. For this task GNU gettext provides the needed tools and library functions.
hello A trivial demo program to show how easy baps is to use.
leds Control SD and SYS LEDS from /proc on IP04
libcurl Curl is a command line tool for transferring files with URL syntax, supporting FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and LDAP. Curl supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos,HTTP form based upload, proxies, cookies, user+password authentication, file transfer resume, http proxy tunneling and a busload of other useful tricks.
libtiff Tiff image file format library
libxml A library for manipulating XML and HTML resources.
lighttpd Light web server with PHP support.
login The default telnet in the BAPS uImage does not request a username/password. This package adds the login utility which forces telnet to prompt for a username/password.
munin Munin node and plugins for remote data logging from Blackfin systems. Monitor a network of IP04s and graph the results with a small amount of configuration. Easy to set up and customise.
nano basic text editor
native-sounds Asterisk prompts in native mulaw format.
network-static Static (non-dhcp) network config scripts.
ntp NTP is a protocol designed to synchronize the clocks of computers over a network. only ntpd is packaged in for now.
oslec Open Source Line Echo Canceller, a high quality free echo canceller for Asterisk.
pagecache Reduces the amount of memory available for file buffering freeing this memory for system use.
perl A perl package without operating-specific functions such as readdir.
php PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML.
procps procps is the package that has a bunch of small useful utilities that give information about processes using the /proc filesystem. The package includes the programs ps, top, vmstat, w, kill, free, slabtop, and skill.
rsync fast remote file copy program
spandsp Telephony Algorithms and Digital Signal Processing Routines
sqlite3 SQLite is a small C library that implements a self-contained, embeddable, zero-configuration SQL database engine.
ssmtp SSMTP is a small version of the sendmail..
tcpdump TCPDUMP is a common computer network debugging tool to capture TCP/IP packets
vim Vim is an almost compatible version of the UNIX editor Vi
voiptel-gui-pre VoIPtel GUI, pre-release version. An upgraded and debugged version of the AsteriskNow GUI for Blackfin Asterisk.
wispcar Controls Wifi Station Power Controller And Reporter hardware which provide voltage and current monitoring, watchdog and sleep timer functions.
zaptel-spi Telephony hardware drivers for IP04 SPI-over-SPI hardware version (Rowetel IP04).
zaptel-sport Telephony hardware drivers for IP04 SPI-over-SPORT1 version (later Atcom IP04s, IP08s).

Getting Started

The installation of the BAPs uImage is still a little complex (apologies). It requires working with u-boot using the RS232 console interface. For more information on this process please see the IP04 Wiki or please post to the Blackfin Asterisk forum.

However once the uImage is install life gets much easier!

This process will erase your IP04 root file system so please backup anything you really need (like your asterisk conf files).

1/ Get the baseline BAPs uImage (contains kernel and basic root file system) and place it on your tftp server:

http://www.rowetel.com/ucasterisk/downloads/uImage_r2.ip08
Note Despite it's name, uImage_r2.ip08 works fine on both the IP04 and IP08.

2/ Connect a RS232 cable to your IP04 (via the daughter board) and stop the boot process at the u-boot prompt.

Now we are going to write the new uImage to flash. your:mac:address can be found using print at the u-boot prompt.

Caution Do not cut/paste the steps below into your serial terminal program, as they often cannot respond fast enough and lose characters. Type each line carefully by hand.

Install the new uImage into NAND flash using u-boot:

ip04>set autostart
ip04>set serverip your.tftp.server
ip04>tftp 0x1000000 uImage_r2.ip08
ip04>nand erase clean
ip04>nand erase
ip04>nand write 0x1000000 0x0 0x300000
ip04>set bootargs ethaddr=your:mac:address root=/dev/mtdblock0 rw
ip04>save
ip04>bootm 0x1000000
(uClinux will boot.......)
Tip If Linux doesn't boot or you experience other problems reboot into uboot, type "print", and carefully check bootargs

3/ Now we have uClinux running, but using a ram-based ext2 file system (mtdblock0) for root. So we need to copy /root into the yaffs file system:

On the IP04:

root:~> copy_rootfs.sh
root:~> reboot

4/ Now set up u-boot to mount root from yaffs (some of these env variables may be set already, use print to check):

ip04>set autostart yes
ip04>set bootargs ethaddr=your:mac:address root=/dev/mtdblock2 rw
ip04>set nandboot 'nboot 0x2000000 0x0'
ip04>set bootcmd run nandboot
ip04>save
ip04>reset

5/ Boot IP04 to a uClinux root prompt. Use mount to check that root is mounted on mtdblock2 (yaffs file system).

Now we can install some packages using ipkg:

$root:~> ipkg update
$root:~> ipkg install zaptel-spi asterisk native-sounds
$root:~> reboot

Documentation

After installation many packages include documentation in the /usr/doc directory of the IP04. These are small files designed to capture Blackfin or IP04 specific information, for example simple tests and notes on differences from other versions of the same package. The documentation files can also be browsed from BAPS SVN.

HOWTO - Developer

1/ svn co http://svn.astfin.org/software/baps/trunk baps

2/ You need this toolchain:

[baps]$ wget http://blackfin.uclinux.org/gf/download/frsrelease/ \
        348/3347/blackfin-toolchain-07r1.1-3.i386.tar.gz
[baps]$ tar xzf blackfin-toolchain-07r1.1-3.i386.tar.gz

If you untar the toolchain in baps directory then it will be included in your path automatically. If you untar it somewhere else make sure the bin directories in this toolchain are in your path.

3/ Make a BAPS uImage that supports ipkg. This also configures uClinux-dist to support compiling of other packages. You need to make uClinux before making any other packages.

[baps]$ make -f uClinux.mk uClinux
[baps]$ cp uClinux-dist/images/uImage /tftpboot/uImage

You can then try booting from your uImage via tftp, in u-boot:

ip04>set autostart
ip04>set bootargs ethaddr=your:mac:address root=/dev/mtdblock0 rw
ip04>save
ip04>tftp 0x1000000 uImage
ip04>bootm

Or you can flash the uImage as described in the Getting Started section above.

4/ Check out ipkg.conf:

root:~> cat /etc/ipkg.conf
src snapshots http://rowetel.com/ucasterisk/ipkg
dest root /

Try installing a simple ipkgs:

root:~> ipkg update
root:~> ipkg list
root:~> ipkg install hello
root:~> hello

5/ BAPS uses init.d type start up scripts, for example:

root:~> ls /etc/init.d
root:~> /etc/init.d/hello
root:~> /etc/init.d/hello enable
root:~> ls -l /etc/rc.d/

HOWTO - IPKG

To build the ipkg:

[baps]$ make -f hello.mk hello
[baps]$ make -f hello.mk hello-package
[baps]$ ls ipkg

To create an index file:

[baps]$ cd ipkg
[baps]$ ../scripts/ipkg-make-index.sh . > Packages
[baps]$ scp Packages /your/web/server

Then change the first line in /etc/ipkg.conf on your IP04:

src snapshots http://you.web.server

And try:

root:~> ipkg update
root:~> ipkg list

NOTES:

1/ If you change the post or pre inst scripts, it is a good idea to rm the existing $(TARGET_DIR) (see Makefile for your package), as the package make scripts don't seem to recognise when post/pre scripts have been changed.

2/ To debug post/pre inst scripts #!/bin/sh -x is your friend!

3/ To test ipkgs you can rcp down to the target:

[host]$ rcp ipkg/asterisk_1.4.4-1_bfin.ipk root@ip04:/root
[ip04]$ ipkg install asterisk_1.4.4-1_bfin.ipk

If you get complaints about MD5 mismatch, then:

[ip04]$ rm /usr/lib/ipkg/lists/snapshots

HOWTO - uClinux Changes

Say you have changed a busybox option, or modified some files in uClinux-dist. To capture the changes to patches in SVN:

[baps]$ make -f uClinux.mk uClinux-ip04-make-patch
[baps]$ svn status

Tips:

To change linux kernel options:

[baps]$ cd uClinux-dist
[uClinux-dist]$ make linux_menuconfig (kernel changes)

To change user application and library settings:

[baps]$ cd uClinux-dist
[uClinux-dist]$ make config_menuconfig

To modify the IP04 rc, motd etc:

[baps]$ cd uClinux-dist/vendors/Rowetel/IP04
(mess with files)

Then capture changes as above with:

[baps]$ make -f uClinux.mk uClinux-ip04-make-patch

Notes

1/ Patch files are compatible with Astfin, so hopefully it's possible to move patches back and forth between BAPS and Astfin.

2/ See TODO.txt

3/ To debug init shell scripts, e.g. files/hello.init, add a -x to the first line if the script using vi on the IP04:

#!/bin/sh -x

4/ When writing init scripts your will find the busybox msh shell has some quirks, here is a link that explains them (all one line):

http://dslinux.org/cgi-bin/moin.cgi/DSLinuxMshScriptingGuide?
action=show&redirect=DSLinux+msh+scripting+guide

5/ For more information on the IPKG format:

http://handhelds.org/moin/moin.cgi/Ipkg

6/ On the target, the ipkg data is stored in /usr/lib/ipkg/info/

Directories

ipkg - completed packages are placed here

include - from OpenWRT kamikaze, contains useful stuff for building packages.

scripts - Useful scripts from OpenWRT kamikaze

patch - patches for all packages

files - start up scripts for packages, get copied to /etc/init.d on target

G729 Codec Installation

Analog Devices has developed an optimised g729 library for the Blackfin that can run on the IP04. Note that you require a license from Sipro to run this g729 codec legally.

Here are the instructions for building and installing the g729 codec. Familiarity with compiling Blackfin code for the IP04 is assumed.

1/ Make sure the 2007 toolchain is installed as per the Developer How To above. You path should include these directories:

/path/to/baps/opt/uClinux/bfin-linux-uclibc/bin
/path/to/baps/opt/uClinux/bfin-uclinux/bin

2/ Change the processor type in uClinux-dist/linux-2.6.x/.config to BF533:

# CONFIG_BF532 is not set
CONFIG_BF533=y

Rebuild the uImage. You can test it by booting the uImage from ram:

ip04>tftp 0x1000000 uImage;bootm

Check that it boots as a BF533.

Now flash this new uImage. It is possible to install this new kernel without erasing your root file system if you just erase the first 0x300000 of flash.

ip04>set autostart
ip04>set serverip your.tftp.server
ip04>tftp 0x1000000 uImage_bf533
ip04>nand erase clean 0x0 0x300000
ip04>nand erase 0x0 0x300000
ip04>nand write 0x1000000 0x0 0x300000

3/ Check out and build libbfgdots:

$ svn co svn://sources.blackfin.uclinux.org/uclinux-dist/trunk/lib/libbfgdots libbfgdots
$ cd libbfgdots; make

Now rcp libg729.so from libbfgdots to /lib on your IP04. When Asterisk boots it should load the g729 codec. Check the codec is installed with show translate at the Asterisk CLI.

Credits

Thanks to: Jeff Knighton, Alex Tao, Ming C (Vincent) Li, Mike Taht, Keith Huang, Mark Hindess, Nick Basil and Michael O'Conner for contributing. Thanks Bruce and Jan at Voiptel for the great work on the GUI.

VoipTel GUI Installation

Bruce and Jan at Voiptel have done some great work on upgrading and debugging the AsteriskNow GUI for the IP04. To install the GUI:

Note Installing the Voiptel GUI will move all of your existing asterisk conf files to /etc/asterisk.backup. In general it is not possible to mix manual and GUI-edited configuration files, as the GUI requires a special configuration file format.
  1. Edit /etc/ipkg.conf to include the voiptel.no ipkg repository:

    root:/etc> cat ipkg.conf
    src snapshots http://rowetel.com/ucasterisk/ipkg
    src voiptel http://update.voiptel.no
    dest root /
  2. Assuming you have an IP04 with asterisk installed and running:

    root:~> ipkg update
    root:~> ipkg install voiptel-gui
    root:~> reboot

Thats it!

The GUI source code is available from here.

VoipTel GUI User Guide

Well, not really a user guide! Just some basic notes to get started:

  • Point your web browser at your IP04 and login with admin/mysecret

  • I also start up an Asterisk CLI session so I can see what the GUI is up to.

  • The first step is to create a default Dialplan - without this none of the extensions can call each other. Go to Calling Rules and click here to create Dialplan1. Click Activate Changes. That's it for this menu.

  • Now lets set up a couple of FXS analog extensions. Go to Users and change the 6004 - David extension to your name. From the Dial Plan box select DialPlan1. Uncheck the SIP and IAX check-boxes. Click Save then Activate Changes.

  • Now create a new analog extension. Click New then fill in some details like Extension and Name. Select Analog Phone to match a free FXS port (say Analog Port #3). Uncheck the SIP and IAX check-boxes. From the Dial Plan box select DialPlan1. Click Save then Activate Changes.

  • Now you should be able to dial one extension from another.

  • To add a SIP phone create a new extension (say 6015). In the password field enter the SIP password (e.g. lets also make this 6015). Check the SIP check-box. Click Save then Activate Changes.

  • Configure your SIP phone (e.g. via it's web interface) to be username/password 6015/6015 and the SIP server to be your IP04. Now try dialling the SIP phone from one of the analog phones.

  • Check out the CLI to see what the GUI is up to. This is what I found after setting up two analog (6004 and 6016), and one SIP (6015) extensions:

    ip04*CLI> show dialplan default
    
    [ Context 'default' created by 'pbx_config' ]
      '.' =>            1. Goto(${EXTEN})                             [pbx_config]
      '6004' =>         hint: Zap/4                                   [pbx_config]
                        1. Macro(stdexten|6004|${HINT})               [pbx_config]
      '6015' =>         hint: SIP/6015                                [pbx_config]
                        1. Macro(stdexten|6015|${HINT})               [pbx_config]
      '6016' =>         hint: Zap/3                                   [pbx_config]
                        1. Macro(stdexten|6016|${HINT})               [pbx_config]
    
    ip04*CLI> sip show peers
    
    Name/username              Host            Dyn Nat ACL Port     Status
    6015/6015                  192.168.1.23     D          5060     Unmonitored
    
    ip04*CLI> zap show channels
    
       Chan Extension  Context         Language   MOH Interpret
     pseudo                                       default
          1            default                    default
          2            default                    default
          3            numberplan-cust            default
          4            numberplan-cust            default

GUI Gotchas

I was caught by these:

  • On my web browser (Firefox on an Ubuntu laptop) I sometimes can't see buttons like New and Save on the bottom of the Users Page. To see them I decreased my font size using Ctrl—.

  • If you get a busy tone when you try to dial make sure you have selected a Dialplan (e.g. Dialplan1 above) for that phone.

BAPS TODO

Some tasks that need doing….:

  1. Work out a way to install uImage.ip08 without u-boot, i.e. from a uClinux root prompt. This will take much of the pain away, kernels can then be treated like packages.

  2. Can we install kernels (uImage) using a package and no u-boot/RS232?

  3. Should we separate kernel from baseline root file system install?

  4. BAPS uImages for BF537 and BF533

  5. A way to build all packages needed for development, like ip08.mk, or maybe set up dependencies in existing Makefile, e.g. so that libssl.mk is called when making asterisk. Not sure about the best way to go here - the idea behind BAPs is to modularise compilation so I am sensitive to having many dependencies and all the extra output that would generate on the command line.

  6. Fix the Maintainer Field in packages (e.g. specific entries for each package).