Introduction
Package based Build system for Blackfin Asterisk. Key differences
compared to buildroot based systems like Astfin and uCasterisk:
-
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.
-
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
|
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.
|
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.......)
|
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:
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:
|
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. |
-
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 /
-
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….:
-
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.
-
Can we install kernels (uImage) using a package and no u-boot/RS232?
-
Should we separate kernel from baseline root file system install?
-
BAPS uImages for BF537 and BF533
-
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.
-
Fix the Maintainer Field in packages (e.g. specific entries for each
package).