Beagle bone notes
Notes on porting the HAH for the beagle bone. These notes really aren't for consumption by anybody but me as reminders for things I did whilst playing around on the Beagle Bone.
The Angstrom distribution was just too warty for my liking and I moved everything to UBUNTU which also allows the Raspberry PI and other embedded boards to also join the fun.
Validating the cross compiler works
Mounting NFS to get back to the BB development x86 box where the cross compiling happens.
busybox mount -t nfs -o nolock,soft,timeo=5,retry=5 bb-dev:/home/brett /home/brett
Setting up /usr/local where the xAP distribution is compiled and setup pointing to our NFS development box.
ln -s /home/brett/svn/trunk/targets/bb.src /usr/local root@beaglebone:/usr# ls -l /usr total 116 drwxr-xr-x 3 root root 4096 Sep 11 2012 arm-angstrom-linux-gnueabi drwxr-xr-x 8 root root 32768 Jan 11 2000 bin drwxr-xr-x 3 root root 4096 Sep 11 2012 etc drwxr-xr-x 2 root root 4096 Aug 26 2012 games drwxr-xr-x 96 root root 12288 Sep 11 2012 include drwxr-xr-x 66 root root 40960 Jan 11 2000 lib drwxr-xr-x 11 root root 4096 Jan 11 2000 libexec lrwxrwxrwx 1 root root 36 Jan 23 09:40 local -> /home/brett/svn/trunk/targets/bb.src drwxr-xr-x 2 root root 4096 Jan 11 2000 sbin drwxr-xr-x 99 root root 4096 Apr 19 2012 share drwxr-xr-x 3 root root 4096 Sep 11 2012 src
Append/Create a library search path, and rebuild the link cache.
echo "/usr/local/lib" >>/etc/ld.so.conf ldconfig
Fire something up to test this is working.
root@beaglebone:/usr/local/usr/bin# ./xap-hub --help xAP HUB Copyright (C) DBzoo, 2008-2010 ./xap-hub: [options] -i, --interface IF Default eth0 -d, --debug 0-7 -h, --help
COOL - now we can build/run/debug on x86 and have everything available on the BB.
Lets check out LUA.
root@beaglebone:/usr/local/usr/bin# ./lua Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio "TERMCAP", line 20, col 1, terminal 'SC': Missing separator > require "pl" stdin:1: module 'pl' not found: no field package.preload['pl'] no file './pl.lua' no file '/usr/share/lua/5.1/pl.lua' no file '/usr/share/lua/5.1/pl/init.lua' no file '/usr/lib/lua/5.1/pl.lua' no file '/usr/lib/lua/5.1/pl/init.lua' no file './pl.so' no file '/usr/lib/lua/5.1/pl.so' no file '/usr/lib/lua/5.1/loadall.so' stack traceback: [C]: in function 'require' stdin:1: in main chunk [C]: ?
Its going to look in these paths by default and not/usr/local/usr/share/…
We can workaround that with a small shell script wrapper
# Use for local running # Once on the HAH the paths will all be fine. LOCAL=/usr/local/usr export LUA_CPATH="$LOCAL/lib/lua/5.1/?.so;$LOCAL/lib/lua/5.1/?/core.so" export LUA_PATH="?.lua;luaxap/?.lua;$LOCAL/share/lua/5.1/?.lua;$LOCAL/share/lua/5.1/?/init.lua;$LOCAL/share/lua/5.1/?/?.lua" export LD_LIBRARY_PATH=$LOCAL/lib:/usr/local/lib export _PROMPT2="2>" $LOCAL/bin/lua $*
Launching with our wrapper.
root@beaglebone:/usr/local# ~/lua.sh Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio "TERMCAP", line 20, col 1, terminal 'SC': Missing separator > require "socket" > require "pl" >
How do we use oPkg
Why is it hard to find any good information on the web about this?
Reverse engineering an ipkg
First get an ipkg to play with.
wget http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/base/busybox_1.19.4-r6_armv7a.ipk
What does the file magic say about it.
[brett@bb-dev ~]$ file busybox_1.19.4-r6_armv7a.ipk busybox_1.19.4-r6_armv7a.ipk: Debian binary package (format 2.0)
That means its just an 'ar' file format file.
[brett@bb-dev ~]$ ar tv busybox_1.19.4-r6_armv7a.ipk rw-r--r-- 0/0 4 Apr 28 06:02 2012 debian-binary rw-r--r-- 0/0 287119 Apr 28 06:02 2012 data.tar.gz rw-r--r-- 0/0 1602 Apr 28 06:02 2012 control.tar.gz
Note the USER and GROUP are both set to 0 (root/root)
Using the opkg-utils we can unpack this file. I suspect doing this as a non-root user is going to munge permissions.
[brett@bb-dev ~]$ ./opkg-utils/opkg-unbuild busybox_1.19.4-r6_armv7a.ipk
This will create
[brett@bb-dev ~]$ tree -A busybox_1.19.4-r6_armv7a busybox_1.19.4-r6_armv7a ├── bin │ ├── busybox │ └── sh -> busybox ├── CONTROL │ ├── control │ ├── postinst │ └── prerm └── etc ├── busybox.links ├── default │ └── busybox-syslog └── init.d └── hwclock.sh 5 directories, 8 files
And forward engineering to turn this directory structure back into an .ipk
[brett@bb-dev ~]$ ./opkg-utils/opkg-build busybox_1.19.4-r6_armv7a /tmp *** Warning: The following files have a UID greater than 99. You probably want to chown these to a system user: drwxr-xr-x. 5 brett brett 4096 Jan 23 21:35 . drwxr-xr-x. 2 brett brett 4096 Apr 28 2012 ./bin -rwxr-xr-x. 1 brett brett 519160 Apr 28 2012 ./bin/busybox lrwxrwxrwx. 1 brett brett 7 Jan 23 21:35 ./bin/sh -> busybox drwxr-xr-x. 2 brett brett 4096 Apr 28 2012 ./CONTROL -rw-r--r--. 1 brett brett 1649 Apr 28 2012 ./CONTROL/control -rwxr-xr-x. 1 brett brett 834 Apr 28 2012 ./CONTROL/postinst -rwxr-xr-x. 1 brett brett 1001 Apr 28 2012 ./CONTROL/prerm drwxr-xr-x. 4 brett brett 4096 Apr 28 2012 ./etc -rw-r--r--. 1 brett brett 2113 Apr 28 2012 ./etc/busybox.links drwxr-xr-x. 2 brett brett 4096 Apr 28 2012 ./etc/default -rw-r--r--. 1 brett brett 15 Apr 28 2012 ./etc/default/busybox-syslog drwxr-xr-x. 2 brett brett 4096 Apr 28 2012 ./etc/init.d -rwxr-xr-x. 1 brett brett 2445 Apr 28 2012 ./etc/init.d/hwclock.sh Packaged contents of busybox_1.19.4-r6_armv7a into /tmp/busybox_1.19.4-r6_armv7a.ipk
There is going to be a requirement here that the packages are built as root or at least their permissions and ownerships are setup by root prior to building.
Building your own package feed
Setting up a development package feed
root@beaglebone:/etc/opkg# cat hah.conf src/gz hah http://bb-dev.local/feeds/eglibc/ipkg/armv7a/hah
Setup feed location on bb-dev
# mkdir -p /var/www/html/feeds/eglibc/ipkg/armv7a/hah
Place the HAH package in the directory and build the Package files.
[root@bb-dev hah]# pwd /var/www/html/feeds/eglibc/ipkg/armv7a/hah [root@bb-dev hah]# /home/brett/opkg-utils/opkg-make-index -p Packages -m . /home/brett/opkg-utils/opkg.py:39: DeprecationWarning: the md5 module is deprecated; use hashlib instead import md5 Lost field license, GPLv2+ [root@bb-dev hah]# ls -l total 1328 -rw-r--r--. 1 root root 1334146 Jan 24 19:59 hah_0.1_armv7a.ipk -rw-r--r--. 1 root root 447 Jan 24 20:02 Packages -rw-r--r--. 1 root root 8233 Jan 24 20:02 Packages.filelist -rw-r--r--. 1 root root 332 Jan 24 20:02 Packages.gz -rw-r--r--. 1 root root 30 Jan 24 20:02 Packages.stamps [root@bb-dev hah]#
Update the package caches on the BB - yes mine is in there now (look hard).
root@beaglebone:/etc/opkg# opkg update Downloading http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/base/Packages.gz. Inflating http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/base/Packages.gz. Updated list of available packages in /var/lib/opkg/lists/base. Downloading http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/machine/beaglebone/Packages.gz. Inflating http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/machine/beaglebone/Packages.gz. Updated list of available packages in /var/lib/opkg/lists/beaglebone. Downloading http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/debug/Packages.gz. Inflating http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/debug/Packages.gz. Updated list of available packages in /var/lib/opkg/lists/debug. Downloading http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/gstreamer/Packages.gz. Inflating http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/gstreamer/Packages.gz. Updated list of available packages in /var/lib/opkg/lists/gstreamer. Downloading http://bb-dev.local/feeds/eglibc/ipkg/armv7a/hah/Packages.gz. Inflating http://bb-dev.local/feeds/eglibc/ipkg/armv7a/hah/Packages.gz. Updated list of available packages in /var/lib/opkg/lists/hah. Downloading http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/all/Packages.gz. Inflating http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/all/Packages.gz. Updated list of available packages in /var/lib/opkg/lists/no-arch. Downloading http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/perl/Packages.gz. Inflating http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/perl/Packages.gz. Updated list of available packages in /var/lib/opkg/lists/perl. Downloading http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/python/Packages.gz. Inflating http://feeds.angstrom-distribution.org/feeds/v2012.05/ipk/eglibc/armv7a/python/Packages.gz. Updated list of available packages in /var/lib/opkg/lists/python. root@beaglebone:/etc/opkg#
Installing the HAH package
root@beaglebone:/etc/opkg# opkg install hah Installing hah (0.1) to root... Downloading http://bb-dev.local/feeds/eglibc/ipkg/armv7a/hah/hah_0.1_armv7a.ipk. Configuring hah. Adding system startup for /etc/init.d/xap. root@beaglebone:/etc/opkg#
connman is shit
Connman has no right to be used on MY embedded hardware, yeah yeah I know all the argument about fall back and what if the network isn't etc etc… But really I don't give a shit, if the network is not up we are hosed.
I don't want connman anywhere near my beaglebone.
I want this → http://www.unix.com/man-page/Linux/5/interfaces/
How to remove connman and revert to traditional network interface start up.
systemctl disable connman.service for i in pre-up up post-up pre-down down post-down; do mkdir -p /etc/network/if-${i}.d done cat > /etc/network/interfaces <<EOF auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 EOF cat >/etc/resolv.conf <<EOF search local nameserver 192.168.1.20 EOF cat > /lib/systemd/system/network.service <<EOF [Unit] Description=Network interfaces After=remount-rootfs.service [Service] RemainAfterExit=yes ExecStart=/sbin/ifup -a ExecStop=/sbin/ifdown -a [Install] WantedBy=basic.target EOF systemctl enable network.service
dmesg log filled with hdmi messages?
After running the Beaglebone for a while you may notice messages like this
[drm:output_poll_execute], [CONNECTOR:5:HDMI-A-1] status updated from 2 to 2
in the log called with dmesg. It's not really a problem unless you are trying to debug but still annoying.
To stop these edit the uEnv.txt file on the FAT partition (not uEnv.txt in /boot)
Mount the partition
mount /dev/mmcblk0p1 /mnt/card
edit the uEnv.txt file to remove the drm_debug part
nano /mnt/card/uEnv.txt
and remove drm.debug=7
Save the file:
Ctrl-X, Y
Unmount the partition:
umount /mnt/card
Reboot the board:
shutdown -r now
backing up the BeagleBone Black eMMC
After you have got the BBB up and running how you like it, backing up is always a good idea.
You can of course back up the ini settings, plugboard scripts etc using the web GUI but I like to keep a backup of the entire eMMC.
There are a few methods to be found on the 'net that require the use of a script on a microSD card. This is ideally the best way but requires stopping the BBB (and if SWMBO is expecting things to happen, that's never good)
So here is an option to use dd over ssh to backup to another PC (in my case a mac)
on the BBB
sudo dd if=/dev/mmcblk0 bs=1M | ssh themac@192.168.0.X "dd of=/Users/themac/Desktop/BBB_Backup_date.img bs=1m"
n.b. the block size is set on the BBB using bs=1M but on the mac HAS to be bs=1m (lowercase) (I'm not sure if this is the case :) on a pc)
To restore. This needs to be done after booting from an SD card to free up the eMMC The eMMC is then mmcblk1 not mmcblk0
ssh themac@192.168.0.X "dd of=/Users/themac/Desktop/BBB_Backup_date.img bs=1m” | sudo dd of=/dev/mmcblk1 bs=1M
Then power down, remove the SD card and reboot.