BeagleBoard/James

= Introduction =

James (acronym for Just A Miniature Entertainment System) is an application providing a home entertainment solution. It is also called James as it aims to be a global "butler" application providing various services. What functionality is actually offered by James also depends on the actual hardware present in the system.

Rationale for calling it Miniature, is because the system will be small in physical size (but not in functionality). Aim is also to reuse as much open source software as possible.

And actually entertainment system is a little bit of a misnomer. James will provide all kind of home services, so it could also e.g. provide NAS functionality or even a web server.

= Latest News =

A very nice person borrowed me a board! I don't know if you want to have your name exposed, but thank you very much; you know who you are :-)

With this board I already managed to bring up several packages (and updated these to the latest version). The original plan was to build my own PVR (like I did with NSLU2); but the current plan is to investigate first if I can use mythTV. For wiimote support libwiimote and CWiid have been ported. Unfortunately the wintv prv usb2 drivers seem to have some issues with usb on angstrom. No idea yet what is wrong there.

ALso a lot of effort was spent on getting Coherence up and running. Coherence is a UPnP server that supports several backends which can e.g. serve FlickR content over UPnP.

Furthermore an attempt was made to connect the webcam. Technically it works, but apparenty there are some USB related issues. The cam works fine under a regular linux system but on the Beagle over the OTG port apparently data is corrupted. I get a picture but with some colored striping in it. The same behaviour has also been reported by others, but a report from someone who has a revC board with working EHCI said that there webcams were functioning properly.

Stay tuned for progress reports.

= James Hardware =

Core of the James development will be a BeagleBoard, although the code should be platform independent. BeagleBoard was chosen because it is very small (although functionality wise it can be big).

Additional hardware used during the development and for prototyping
 * Philips PCVC680K webcam
 * Toshiba MK4007GAL 1.8" hard disk with USB enclosure.
 * Sitecom IT-001 USB phone
 * Pertelian X2040 Character based LCD display (4 lines, 20 columns)
 * Perhaps touch screen/pixel based display
 * GATEWAY OVU400002/00 Infrared receiver
 * bluetooth dongle (I use a very small one, but most bluetooth dongels will work)
 * Support for WII-mote (requires bluetooth)
 * WiFi. I have successfully used a 3com 3crusb10075 USB dongle (zd1211 based), a Linksys WUSB54G and a Philips CPWUA054/00 USB dongle (both Prism54 based)
 * Hauppauge WinTV PVR2 USB analog TV receiver.
 * A DVB-T receiver. (or maybe a DVB-S receiver) (to be obtained)
 * PHILIPS SPD3400CC USB CD/DVD drive.
 * various USB hubs
 * USB hard disk (Toshiba 40GB, 1.8")

Ideally of course would be to have an expansion board with features like Bbluetooth, WiFi, IR, USB hub), but as such a board does not exist yet initially the system will use standard USB components (although may be with the cover removed and mounted together). Aim is to select small components. As I am not a skilled hardware developer, creating an expansion board is outside my capabilities.

= James Software =

As written above James will be open source and will use open source as much as possible. Actually the programming effort will be mainly porting open source applications (with the associated debugging and problem fixing) and writing the UI software. For UI the idea is to use something web based. That would allow controlling the device locally, but also remote.

Software functionality on James is the following:
 * Personal Video Recorder (PVR): see http://www.dse.nl/~meulenbr/pvr/pvr.html for some documentation and access to a prototype running on ARM
 * Security functionality (motion pacakge)
 * Photo retrieval from digital camera (both mass storage and ptp; mtp ?)
 * Audio grabbing from CD
 * writing of CD/DVD (e.g. cdrecord)
 * File server/NAS (samba/swat)
 * uPnP server
 * PBX functionality (asterisk)
 * Media rendering (mplayer?), also from USB/CD/DVD if present (NSLU2 prototype only has mp3 playback as there is no video out.
 * Bluetooth headphone (bluez a2dp profile)
 * Internet telephony preferably with camera support (SIP based; probably EKIGA
 * Maybe: uPnP playback
 * Maybe: interface with GSM phone (e.g. using the gsm as a remote control using bluetooth)

Supporting software:
 * For wii-mote (CWiid (includes libwiimote)) Already demonstrated on eeePC under debian by me. See this page on wiki.eeeusoer.com on what I did there.
 * Lirc (for remote control) (did that already on NSLU2)
 * Web server for serving the UI (The current demo uses out-of-the-box apache2 with php)
 * Web browser for displaying the UI locally (not on NSLU2 as it has no display).

UI of the NLSU2 implementaion was done with html, javascript, css stylesheets, php and some self-written cgi scripts. It might be that for the next version I'll move to flash. I am planning to make a small prototype, but due to other things I did not get to this yet.

= James Filesystem =

James has no specific requirements on the filesystem. For development and testing I used a standard generated Angstrom image (see next section) with a 1GB ext3 filesystem.

James deals with multimedia content. Of course on a 1GB partition you cannot store that much multimedia data. Therefore I use a directory /media/content in this description to refer to the location of the multimedia content. By doing so you can easily mount another partition or e.g. an external USB hard disk or flash disk on this directory. But of course if you want to you can also keep /media on your SD card. And of course it is also possible to use a different directory to store the multimedia content as you see fit. Just use the directory where you stored the data instead of /media/content.

= How to install =

As James is still in the process of being developed, there is no automated install or precooked image or something like that. Meanwhile as a starter I have listed all steps I had to undertake with my hardware. If you are following the steps below and find things that are unclear or work out different for you (e.g because you have different hardware, please update these instructions.

Generally there is no strict need to execute all steps in the order I gave. Most of the things are pretty independent of each other. I just listed the steps in the order I executed them. If there are dependencies that I am aware of, I tried to list them.

Required Hardware
In order to get started you at least need the following hardware: also use a wireless adapter. Setting up a wireless dongle is outside the scope of this document. The USB network interface is connected to the hub
 * beagle board. rev B is assumed, with a 5V power brick
 * empty SD card, 1GB or larger
 * serial connection to your beagle
 * USB OTG cable
 * A USB hub. The beagle is not powerful enough to power most USB devices.
 * USB network interface to your beagle (wired is recommended, but if you know what you are doing you can
 * a working internet connection.

Getting Started
Start off by generating an image using Koen's image builder at http://amethyst.openembedded.net/~koen/narcissus/. In the machine section select beagleboard. From the options select: Base system: extended, X11 window managers: Enlightenment. Development packages: Busybox replacements, Additional packages: All kernel modules, alsa utils, apache2, ntpdate. If you want more packages to be installed you can select those too. (e.g. if you have a WiFi dongle you might want to select wireleess-tools). mplayer might also be handy but can always be installed later on through the command opkg install mplayer Give the image a name (let's take James in this example, but you must pick your own name, choose whatever you want or whatever is generated for you). hit "build me" and wait (could be a few minutes) for the image to be generated. If you miss a package that is also not that dramatic, as it is always possible to install things later on.

When the image build is completed, perform the following steps: /dev/sdf, but it will probably be different for you. Use the name from dmesg |tail and NOT /dev/sdf when entering the commands. again takes some time. Only difference is that at least this time you'll see progress. When done continue with: writing and perhaps wait one more minute. If booting the image fails often the case is that not all data is present on the SD card quite some time. Especially the loading of the kernel modules takes lots of time.You can follow the progress on your serial port. Note that this only occurs one (on first use). Later boots will be at normal speed (less than a minute).
 * download the james image for beagleboard (this will give you a file James-image-beagleboard.tar.bz2)
 * downlaod the raw SD card image.(this will give you a file James-image-beagleboard-sd.img.gz).
 * insert an empty SD card (at least 1GB) into a card reader in your linux desktop system
 * do a dmesg | tail to find out the name of the device. In the subsequent lines I will assume it is
 * gunzip James-image-beagleboard-sd.img.gz
 * sudo dd if=James-image-beagleboard-sd.img of=/dev/sdf bs=1M
 * grab a coffee as the command above will take some time. How much depends on the speed of your card. For
 * me it took 3 minutes.
 * sudo mount /dev/sdf2 /mnt
 * cd /mnt
 * sudo tar xvfj .../James-image-beagleboard.tar.bz2
 * here ... is the path to your James-image-beagleboard.tar.bz2 file. Grab a second cup of coffee as this
 * cd /
 * sudo umount /dev/sdf2 (this again takes some time)
 * sync (just to be safe)
 * and to be safer: verify that the ligth of your SD card writer is not indicating any more that it is
 * insert the card in your beagle and power the beagle
 * have you had enough coffee? if not, grab another cup. All kind of things will be installed. This takes

BTW: when booting error messages like "uncorrectable error : <3>end_request: I/O error, dev mtdblock0, sector 0" can be ignored.

Configuring the image
I have a pegasus based USB to ethernet dongle. In the kernel the driver for a pegasus dongle is a module. And for some reason the dongle does not get an IP address while booting. Unplugging and replugging the dongle works, but is not very convenient. If you also have a pegasus based USB to ethernet dongle you can avoid this by issueing the following commands on a console on your beagle:


 * echo pegasus >/etc/modutils/pegasus
 * /usr/sbin/update-modules

After that the module will be loaded before the IP addresses are assigned and the dongle will get an IP address during bootup.

Next you want to create a /media directory and optionally populate it with some multimedia content. Creating the directory is dony by:
 * mkdir /media/content

And update your package list by issueing the command:
 * opkg update

Optionally: give your Beagleboard a fixed IP address
For James the beagle will also act as a server. For that it is very convenient if the beagle has a fixed address (or you have to use something like dyndns or configure a DHCP reservation in your router).

In order to give the Beagle a fixed IP address you should edit the file /etc/network/interfaces and replace the line: iface eth0 inet dhcp with something like: iface eth0 inet static address 192.168.1.230 netmask 255.255.255.0 network 192.168.1.0 gateway 192.168.1.1 Also in order to have DNS working create/edit the file /etc/resolv.conf. You should add lines like: nameserver 192.168.1.1 You can have several lines specifying name servers in the file. Of course you should use the addresses of whatever DNS server your use.

Optionally: install Synergy
If you are like me and do not want to clutter your desk with multiple keyboards it is a good idea to install Synergy. Synergy is a software application that can be used to share the keyboard and mouse between multiple computers.

Let us assume that your keyboard is connected to your linux system and that you want to use that keyboard also with your beagle. The linux system then acts as the server system, and the beagle system is the client system. Both systems require that X11 is running and must be connected to the ethernet. Let us assume that both systems have their own display and that the linux display is at the left side and the beagle display is located to the right.

In order to share the keyboard you need to install synergy on both systems. For beagle synergy is in the feeds and can be installed with 'opkg install synergy'. For your unix system your milage may vary. It may be that your distribution supports synergy. If not you need to download it from http://synergy2.sourceforge.net/ and install it yourself. There is one potential caveat. Synergy does not out of the box compile with gcc 4.3. If your system has gcc 4.3 you can patch the synergy sources with [[Media:Synergy-1.3.1-gcc-4.3.patch| this patch]].

To get things running you need to create a file synergy.conf. Assuming the host names of your systems are linux and beagle, the file looks like: section: screens linux: beagle: end section: links linux: right = beagle beagle: left = linux end Of course if the names of your systems are different or if the location of your monitors is different, you need to change the file.

Store this file under the name 'synergy.conf' on the server system. Then on the server system run: synergys -f --config synergy.conf and on the client system run: synergyc -f server-host-name If the server host name is not available you can also use the server IP address. If on the beagle you get an error that it cannot open the display try as command: DISPLAY=:0.0 synergyc -f server-host-name

After doing so, if you move the cursor to the right of the linux screen it will automagically appear at the left side of your beagle screen, and of course if you them move to the left again your cursor will go to the linux screen. Keys will also be redirected to the screen in which the cursor is.

(for the technically interested: what happens is that the server detects that the mouse is on the edge of the screen and if that happens it will pass the mouse events and key presses to the client at that side over TCP/IP).

If you want to autostart xynergyc when starting your system you can create a file /etc/X11/Xinit.d/99Synergy with contents: /usr/bin/synergyc server-hostname After that do a 'chmod 755/etc/X11/Xinit.d/99Synergy' to make the file executable.
 * 1) !/bin/sh

Sharing your data: NFS
Of course it is nice to access the multimedia content of your beagle on another PC. There are two ways to do so. The first one is through NFS and is handled in this section. The second one is through Samba (SMB) and is covered in the next section.

install nfs-server; tell client side to be written

Sharing your data: Samba
install samba, swat; tell client side to be written

Adding WiFi support
The modules for the WiFi dongles that are supported by Linux are already present in the system. However, most likely the firwmware is still missing. This firmware need to be placed in /lib/firmware before you can use your WiFi dongle.

For ZD1211 based dongles the firmware can be found at http://sourceforge.net/project/showfiles.php?group_id=129083 This firmware supports the following wifi dongles: http://www.linuxwireless.org/en/users/Drivers/zd1211rw/devices.

For prism54 based dongles the firmware can be found at http://wireless.kernel.org/en/users/Drivers/p54#firmware. This firmware supports the following devices: http://wireless.kernel.org/en/users/Devices/USB

Configuring your wifi is outside the scope of this document.

Adding WiiMote support
Using a WiiMote as a mouse replacement is easy. You need a bluetooth dongle, a wiimote and a sensor bar (you can use the one from your wii, but I just used a noname wireless sensor bar bought on Ebay. (Actually such a sensor bar is nothing more than a piece of plastic with a few IR leds, a switch, a battery compartment and maybe a few resistors.)

Just perform the following actions: now follow the instructions to connect your wiimote to the dongle and use your wiimote as a mouse pointer. (do not forget to point in the direction of the sensor bar).
 * opkg install cwiid
 * insert the bluetooth dongle
 * hciconfig hci0 up
 * wminput -c ir_ptr

For more information on how to configure wminput see http://abstrakraft.org/cwiid/wiki/wminput

(btw: wminput assumes that the uinput driver is loaded, but if you use the standard kernel this is the case. If uinput is not there you need to load it using insmod uinput (probably after building it)).

Adding support for a remote control
To be updated
 * opkg install lirc

Using a webcam
I have connected a Philips PCVC680K (Vesta Pro) USB webcam to my beagle. If the module pwc is present it will be loaded when you plug in the cam. The moudule will be there if you have chosen "all kernel modules" in the image builder. If not you can still get it by issueing the command 'opkg install kernel-module-pwc'

After doing so I was able to play the video on a monitor connected to the beagle by issuing the command DISPLAY=0:0 mplayer -tv width=320:height=240:driver=v4l2 -fps 15 tv:// on the serial console (if you are running from a terminal you can omit the DISPLAY=0:0 part. Note that I connected the webcam on the OTG port. This resulted in a picture with some colored striping. Apparently some data gets corrupted somewhere. As the same setup works flawless on various systems (x68, nslu2) with a regular usb host interface, I guess there is a bug in the OTG driver or a glitch in the hardware.

Other webcams can be used in a similar fashion, but you probably need to adjust the width, height and fps commands for mplayer.

vidcat
It is also possible to capture individual pictures from your webcam. You can use the program vidcat to do so. This program is part of the package w3cam and can be installed with 'opkg install w3cam'.

vidcat is a little bit picky on its arguments. For my PCVC680K the command 'vidcat -p y -s 640x480 > test.jpg' did the job for me. If you get a message like: VIDIOCMCAPTURE: Invalid argument args: width=320 height=240 palette=4 Error: Can't get image your parameters are probably incorrect. Btw you can use vidcat --help to get a list of possible options to vidcat.

motion
Another application that is proven to work is motion (install with 'opkg install motion'. This does support motion detection by taking a picture at regular intervals and comparing that picture with the previous one. If the differences between the pictures exceed a user-defined treshold the pictures are stored. That way the cam can be used to detect intruders. Unfortunately due to the random color stripes, this is not useful yet on Beagle revB hardware. More information on motion and how to configure it can be found at: http://www.lavrsen.dk/twiki/bin/view/Motion/WebHome

Audio playback: mpd
Mpd is a daemon process that can play audio. It is a daemon only and it can be controlled remotely by a mpd client (e.g. gmpc). This client can run locally on the beagle but also remotely on another system. Actually you can even set things up in such a way that your audio player can be controlled over the internet.

Installation of mpd can be done with: Installation of the gmpc client can be done with
 * opkg install mpd
 * opkg install gmpc

Before starting the client be sure to review and edit the file /etc/mpd.conf Especially you want to modify the line starting with music_directory as this points to the location where your audio files are. Also if your beagle has a public IP address you might want to restrict access by modifying the bind_to_address line, which specifies what systems have access and/or install a password.

More info on mpd can be found at: http://mpd.wikia.com/wiki/Music_Player_Daemon_Wiki

Grabbing photos from a PTP enabled camera
If you have a PTP enabled digital photocamera, it is possible to automate the extraction of photos from that camera. In order to do so perform the following steps: Create a script photoripper. My script looks like: test "x$ACTION" != "xadd" && exit 0 test "x$SUBSYSTEM" != "xusb_device" && exit 0 if test -e "$DEVNAME" then # SUBSYSTEM == "usb_device" implies that DEVNAME == "/dev/bus/usb/123/456" # Determine device ID and bus ID. dev="$(basename "$DEVNAME")" bus="$(basename "$(dirname "$DEVNAME")")" cd /home/root # change this line if you want to download to a different directory. /usr/bin/gphoto2 --port usb:${bus},${dev} --get-all-files else echo "photoripper: Given device named $DEVNAME not found." >>/tmp/photoripper.log exit 1 fi Place this script in a directory of your choice. I've used /usr/local/bin (which need to be created first), but you can put it in another location. Just adapt the path in the next two commands. This will start the photoripper script whenever you connect the camera to your system.
 * opkg install gphoto2
 * 1) !/bin/sh
 * chmod 755 /usr/local/bin/photoripper
 * /usr/lib/libgphoto2/print-camera-list udev-rules version 0.98 script /usr/local/bin/photoripper > /etc/udev/rules.d/90-libgphoto2.rules

Of course the script above is just my version. If desired you can use other gphoto2 options. E.g. you can add the option --new to the gphoto2 command so only new files are downloaded. And if you are brave you can even automatically remove the pictures from your camera after downloading them by adding a gphoto2 command with the option --delete-all-files. Note that you do this completely at your own responsibility. Don't blame me if for wahtever reason you loose pictures!

Ripping an audio CD
If you have an USB CD or DVD drive you can use it to rip audio CD's. James does that by using cdstatus. Advantage of cdstatus is that it can interface with CDDB.

You can install cdstatus through:
 * opkg install cdstatus

Ripping a CD can be done through the command: Note that this command rips to wav files. cdstatus has some more options (e.g. specifying the destination directory). Issue 'cdstatus --help' to learn about them.
 * cdstatus --cddb --drive /dev/sr0 --rip

The speed to rip a CD depends mostly on the audio extraction speed of your drive.

Transcoding a wav file to mp3
Cdstatus gives wav files but probably you want mp3 files. This is easily being done by lame.

You can install lampe through:
 * opkg install lame

Then you can encode a file using the command:
 * lame -h input.wav output.mp3

Handy trick: if you want to convert all files in a directory you can simply issue the command: And if you want to remove the wav file after that you can say:
 * for i in *.wav;do lame -h $i `basename $i .wav`.mp3; done
 * for i in *.wav;do lame -h $i `basename $i .wav`.mp3 && rm $i; done

Lame has options to control the bitrate, set mp3 tags etc. Use to get an extensive list.
 * lame --longhelp

Lame does not retrieve mp3 tags or so from CDDB Speed of lame is about twice the time of the track when ripping with -h and 128 kbit/s on an otherwise unused Beagle, so it would be nice to be able to use the DSP to transcode wav files.

UPnP server: mediatomb
If you have a UPnP client device like a TV with an embedded UPnP client, or a Digital Media Adapter or a UPnP audio client, or a phone with UPnP client functionality build in you are probably interested in having a UPnP server on your Beagle. As UPnP server James supports mediatomb. This is a server with a web based UI.

Installation of mediatomb is done in the usual way: After that you can run mediatomb on your beagle. You might want to check out the options of mediatomb (use mediatomb --help). E.g. you might want to fix the port that mediatomb uses. The default port is the first port after 49151 so most often 49152. Configuration settings can also be specified in ~/.mediatomb/config.xml See http://mediatomb.cc/ for information on the syntax of config.xml and on general usage information.
 * opkg install mediatomb

After mediatomb is running you can configure what contents is shared through the web interface. Just use a web browser and browse to the IP address:port number of your beagle (e.g. 192.168.0.10:49152 if 192.168.0.10 is the address of your beagle).

Note: I have never tried the transcoding features of mediatomb.

Another UPnP server: Coherence
When selecting a UPnP server there is another interesting candidate: Coherence. It does not have a fancy UI yet,but it has a very nice feature: it supports a variety of backends which make external (web) content available through UPnP. E.g. there is a backend to serve internet radio (iRadio). Yet another backend will serve FLickR pictures, while yet another one serves Youtube. And if you are a cat lover you definitely want to check out Lolcats!

Installation is done through: Beware: this will drag in a lot of other packages.
 * opkg install python-coherence

Coherence configuration is stored in ~/.coherence. Info on Coherence and its configuration can be found at http://coherence.beebits.net/

= Packages that are present but still need some work =


 * asterisk (IP pbx): still need to look at how to integrate/use it
 * ekiga (SIP client): requires testing
 * LCD4Linux: works as expected, but it is not used yet to display James info.
 * rtorrent: works, needs to be more automated to download torrents
 * cups: haven't played with it yet
 * gpsd and gps-utils: these are a little bit off-topic, but I would love to use the beagle with my bluetooth gps, need to peek into this.

= Things to do =

In no particular order:
 * More automated/user friendly install script
 * newsreader/leechere (probably nzb based)
 * better UI
 * ampache?
 * pvr (mythtv?)
 * xmltv ?
 * upnp client (gstreamer?
 * automatic import from mass storage
 * fle manager ? (phpexplorer?)
 * photo slideshow application
 * cd recording; I've made a package for cdrkit, but that has some issues and I have not had the time to find out what it is

= Infrequently Asked Questions =

Where are the frequently asked questions
LOL, there are no frequently asked questions. This is so new that any question is infrequently asked (or not at all). This section is here to give answers to some of the things that might pop up while reading this.

Great! Where can I download this? When is this available?
This is work in progress. For now you can reproduce things using the steps outlined above. An installer or recipe will be made in the next few weeks.

Is this feasible? It looks very ambitious
It is definitely ambitious. Then again a bit of ambition does not hurt. And feasible: I think it is, but only time will tell. A lot of the software is available in the open source domain. I have quite some experience porting software, and a lot of things I did before on NSLU2 where I am eFfeM

But... in the end only time will tell!

Cool, but it would be cooler if you add function XXX
Could be. Feel free to bring XXX to my attention. If there is open source software to support this function, please mention it. Depending on the amount of effort needed and the potential benefit for others, I might pick it up earlier or later.

Can you support hardware device YYY
Depends. I try to make use of existing software as much as possible and try to be device independent, so it might be supported already (perhaps with a little effort). Then again this also depends on what kind of hardware it is. If it is something nice I'd want myself, I might buy it. If not I might still support it if someone borrows or donates me a piece of hardware to allow testing, if I consider it to be of general use. Then again if your problem is very specific you are probably on your own (although of course I am willing to give some advice).

This project sounds good! Can I help?
Depends on your skills, competences and time. If you have hardware skills you could probably come up with a prototype for an expansion board, instead of the hodge-podge of USB devices that I am undoubtedly going to make. If you have mechanical skills you could come up with a casing proposal (otherwise it'll probably be a shoe box project). If you are graphically skilled you could help defining the UI (I am graphically challenged :-) ). And if you are a programmer you could port and test some of the packages mentioned above.

Unanswered questions, suggestions, remarks etc
If you have other questions, suggestions, remarks etc. feel free to add them below. I'll try to come up with answers.