Showing posts with label Debian. Show all posts
Showing posts with label Debian. Show all posts

Wednesday, February 28, 2018

Howto: Bluetooth GN/NAP on Beaglebone

This is an old article that I never published, but I'm making it available now, "as-is". Some of the instructions may be outdated, but I hope you find it helpful.

Recently I had the need to create a more secure wireless network connection. Bluetooth NAP came up as a viable solution, for a number of reasons:

  • Short Range
  • Fewer Sniffing/Hacking/War-driving tools
  • Mobile device support (Android/IOS)
I'll detail some of the configuration challenges and pairing procedures to get it up and running.

Prerequisites

  • Linux beaglebone 3.8.13-bone50 #1 SMP Tue May 13 13:24:52 UTC 2014 armv7l GNU/Linux
  • Bluetooth USB Dongle: GBU521 (http://www.iogear.com/product/GBU521/)
  • Powered USB Hub (IO Gear Bluetooth adapter will not work when directly plugged into Beaglebone)

Get Bluetooth up and running

Update servers/folders/file names:
sudo apt-get update

Bring installed packages up-to-date:
sudo apt-get upgrade

Install necessary packages:
sudo apt-get install bluez bluez-tools bridge-utils

Ensure Bluetooth is up and running by listing loaded Kernel modules:
debian@beaglebone:~$ lsmod
Module                  Size  Used by
rfcomm                 26769  10
bnep                    8909  2
g_multi                50407  2
libcomposite           15028  1 g_multi
btusb                  10339  0
bluetooth             159258  24 bnep,btusb,rfcomm
rfkill                 16672  2 bluetooth
mt7601Usta            641118  0

Verify Bluetooth Stack

See if device is up via bluez:
debian@beaglebone:~$ hciconfig -a
hci0:   Type: BR/EDR  Bus: USB
        BD Address: 00:02:72:CC:B8:47  ACL MTU: 1021:8  SCO MTU: 64:1
        UP RUNNING PSCAN
        RX bytes:1351 acl:0 sco:0 events:60 errors:0
        TX bytes:1333 acl:0 sco:0 commands:60 errors:0
        Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
        Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
        Link policy: RSWITCH SNIFF
        Link mode: SLAVE ACCEPT
        Name: 'beaglebone-0'
        Class: 0x420100
        Service Classes: Networking, Telephony
        Device Class: Computer, Uncategorized
        HCI Version: 4.0 (0x6)  Revision: 0x1000
        LMP Version: 4.0 (0x6)  Subversion: 0x220e
        Manufacturer: Broadcom Corporation (15)


Pair Beaglebone and Device

NOTE: Make sure you have a discoverable Bluetooth device turned on now... 

Test scanning:
debian@beaglebone:~$ hcitool scan
Scanning ...
        60:A4:4C:00:00:00       CGM Nexus 7

Configure local Bluetooth settings:
debian@beaglebone:~$ bluez-test-adapter name honeypot
debian@beaglebone:~$ bluez-test-adapter pairable on
debian@beaglebone:~$ bluez-test-adapter discoverable on
debian@beaglebone:~$ bluez-test-adapter discoverabletimeout 30

NOTE: After setting discoverable to on, you must scan for the beaglebone before the timeout. If you took too long, simple set discoverable to on again.

Pair the beaglebone to the other device
debian@beaglebone:~$ bluez-simple-agent
Agent registered
RequestConfirmation (/org/bluez/15561/hci0/dev_60_A4_4C_B7_C0_A2, 945453)
Confirm passkey (yes/no): yes

Press CTRL-C to quit simple agent....

Add the other device to the trusted list
debian@beaglebone:~$ bluez-test-device trusted 60:A4:4C:B7:C0:A2 yes

At this point the devices are paired, but no services are running on the Beaglebone.

Configure Services

Add NAP service to Beaglebone by editing bluez-nap-server:
debian@beaglebone:~$ sudo nano /usr/local/bin/bluez-nap-server

#!/usr/bin/python

import sys
import time
import dbus
from optparse import OptionParser, make_option

bus = dbus.SystemBus()

manager = dbus.Interface(bus.get_object("org.bluez", "/"), "org.bluez.Manager")

option_list = [
      make_option("-i", "--device", action="store", type="string", dest="dev_id"),
      ]
parser = OptionParser(option_list=option_list)

(options, args) = parser.parse_args()

if options.dev_id:
        adapter_path = manager.FindAdapter(options.dev_id)
else:
        adapter_path = manager.DefaultAdapter()

server = dbus.Interface(bus.get_object("org.bluez", adapter_path), "org.bluez.NetworkServer")

service = "nap"

if (len(args) < 1):
        bridge = "tether"
else:
        bridge = args[0]

server.Register(service, bridge)

print "Server for %s registered for %s" % (service, bridge)

while True:
        time.sleep(1000)

Make it an executable file:
debian@beaglebone:~$ sudo chmod a+x /usr/local/bin/bluez-nap-server

Start it at boot by creating/editing a service file:
debian@beaglebone:~$ sudo nano /etc/systemd/system/bluez-nap.service

[Unit]
Description=Bluetooth NAP Server
After=syslog.target

[Service]
Type=simple
ExecStart=/usr/local/bin/bluez-nap-server br0
WorkingDirectory=/home/debian

[Install]
WantedBy=multi-user.target


Enable the service:
debian@beaglebone:~$ sudo systemctl enable bluez-nap.service

Enable DHCP by modifying udhcpd config file:
debian@beaglebone:~$ sudo nano /etc/udhcpd.conf
start      169.254.7.2
end        169.254.7.2
interface  br0
max_leases 1
option subnet 255.255.255.252

Create Bluetooth Bridge interface (add to end of interface file, after usb0 definition):
debian@beaglebone:~$ sudo nano /etc/network/interfaces
# Bluetooth NAP interface
auto br0
iface br0 inet static
address 169.254.7.1
netmask 255.255.255.0
bridge_ports none
bridge_fd 5
bridge_stp no

Reset and restart services
debian@beaglebone:~$ sudo systemctl restart networking.service
debian@beaglebone:~$ sudo systemctl restart udhcpd.service
debian@beaglebone:~$ sudo systemctl restart bluez-nap.service

References

  • http://notes.pitfall.org/ip-over-bluetooth-to-a-raspberry-pi.html
  • http://www.hkepc.com/forum/viewthread.php?tid=1710030
  • http://forum.doozan.com/read.php?2,2698
  • https://viaforensics.com/articles-presentations/bluetooth-packet-capture-android.html
  • https://bbs.archlinux.org/viewtopic.php?pid=1129449
  • http://www.linux.com/learn/tutorials/346552-personal-area-networking-with-bluetooth
  • https://github.com/Douglas6/pinaple
  • http://www.raspberrypi.org/forums/viewtopic.php?t=36889&p=479992h

Tuesday, November 11, 2014

Beaglebone Debian Read Only Filesystem

Overview

To save the eMMC and to allow for faster bootup/shutdowns, I wanted to mount the root partition as read-only. I spent many days researching and trying to find out what areas of the filesystem needed to have write permissions. It seemed like I was going in circles. Unionfs, aufs, mount -bind, overlayfs, tmpfs.....so many options and so many modules that didn't exist in the default BBB Debian kernel. I finally got so fed up that I decided to just start hacking away at the fstab.

Details

It turns out that the basic read-only filesystem is fairly easy to create, as everything that needs to be configured is contained in /etc/fstab. We need to change the root mount to read-only and add a couple of temporary file systems to handle logs and such. Let's start with an ordinary fstab created by the eMMC flasher script:
# /etc/fstab: static file system information.
#
# Auto generated by: beaglebone-black-eMMC-flasher.sh
#
UUID=716e1ca7-bc61-4958-8c0d-665e48102cfd / ext4 ro,noatime,errors=remount-ro 0 1
UUID=0DFE-E81B /boot/uboot auto defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0

We could then use the following sed command to add the "ro" tag to the root mount line and save it to a temporary fstab file:
> sudo sed s:ext4\ \ noatime:ext4\ \ ro,noatime: /etc/fstab_ro

Next we need to append some tmpfs declarations to our temporary fstab file:
> sudo nano /etc/fstab_ro

and put the following lines at the end:
tmpfs /tmp tmpfs nodev,nosuid,size=32M 0 0
tmpfs /srv tmpfs nodev,size=512K 0 0
tmpfs /var/log tmpfs defaults,noatime,size=1M 0 0
tmpfs /var/tmp tmpfs defaults,noatime,size=512K 0 0
tmpfs /var/run tmpfs defaults,noatime,size=512K 0 0

Replace the real /etc/fstab with your temporary file:
> sudo cp /etc/fstab /etc/fstab.orig
> sudo mv /etc/fstab_ro /etc/fstab

Reboot and you're done!

You may have to experiment with different size limits, depending on your logging needs, but the sizes above should get you started.

Alternate Method

Systemd does the actually mounting, by parsing the fstab. The order in which the mounts are created is not guaranteed. If you need to create mounts in a particular order you need to create a systemd .mount unit for each mount:
> sudo nano /etc/systemd/system/my.mount


with content similar to the following:
[Unit]
Description=Runtime Directory
Before=local-fs.target

[Mount]
What=/mine
Where=/tmp/myfs
Type=bind
Options=bind

Remount RW

If you need to modify the filesystem, you can remount it rw, for a while, with the following command:
> sudo mount -o remount,rw /

To return to read-only mode, either reboot or run this command:
> sudo mount -o remount,ro /

References

https://groups.google.com/forum/#!topic/beagleboard/9J2r8xn3-Os
http://adis.ca/tag/beaglebone/
http://unix.stackexchange.com/questions/27449/mount-a-filesystem-read-only-and-redirect-writes-to-ram
https://help.ubuntu.com/community/aufsRootFileSystemOnUsbFlash
http://unix.stackexchange.com/questions/81959/how-to-mount-aufs-file-system-on-boot-in-archlinux
http://www.thegeekstuff.com/2013/05/linux-aufs/
https://wiki.debian.org/ReadonlyRoot
https://code.google.com/p/rootaufs/wiki/HowToUse

Monday, March 10, 2014

Qt 5.2.1 Beaglebone Binaries

Overview

So, how did I create these binaries....well I thought it would be fun to see how long it would take the Beaglebone to compile Qt. Here is a brief description of my setup.

I powered the Beaglebone with a 5v power supply and booted a Debian rootfs using TFTP and NFS (a future post will explain how to configure this) so I could utilize the large HD of my Linux host. After compiling and installing Qt, the total root filesystem usage is around 3 Gb. The actual compile took about 21 hours, which includes compiling all examples and plugins.

Configuration

I created a simple shell script to modify the Qt source, with the Beaglebone configuration, and run the Qt configuration script:
#!/bin/sh
# Create beaglebone hard float configuration file
cd qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/devices/
cp -r linux-beagleboard-g++ linux-beaglebone-g++
sed 's/softfp/hard/' <linux-beagleboard-g++/qmake.conf >linux-beaglebone-g++/qmake.conf
# Run configuration
cd ../../../
./configure -v -opensource -confirm-license -prefix /usr/local/qt-5.2 -no-largefile -no-accessibility -qt-zlib -no-gif -qt-libpng -qt-libjpeg -no-nis -no-cups -device linux-beaglebone-g++


This produced the following summary:
   Configure summary
Build type:    linux-g++ (arm, CPU features:)
Platform notes:
            - Also available for Linux: linux-kcc linux-icc linux-cxx
        
qmake vars .......... styles += mac fusion windows DEFINES += QT_NO_MTDEV QT_CFLAGS_DBUS = -I/usr/include/dbus-1.0 -I/usr/lib/arm-linux-gnueabihf/dbus-1.0/include   QT_LIBS_DBUS = -ldbus-1   QT_CFLAGS_GLIB = -pthread -I/usr/include/glib-2.0 -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include   QT_LIBS_GLIB = -pthread -lgthread-2.0 -lrt -lglib-2.0   QT_CFLAGS_PULSEAUDIO = -D_REENTRANT -I/usr/include/glib-2.0 -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include   QT_LIBS_PULSEAUDIO = -lpulse-mainloop-glib -lpulse -lglib-2.0   DEFINES += QT_NO_LIBUDEV QMAKE_CFLAGS_XCB =   QMAKE_LIBS_XCB = -lxcb   QMAKE_CFLAGS_DIRECTFB = -D_REENTRANT -I/usr/include/directfb   QMAKE_LIBS_DIRECTFB = -ldirectfb -lfusion -ldirect -lpthread   sql-drivers =  sql-plugins =  sqlite qmake switches ......... 
Build options:
  Configuration .......... alsa audio-backend c++11 clock-gettime clock-monotonic compile_examples concurrent dbus directfb evdev eventfd full-config getaddrinfo getifaddrs glib iconv inotify ipv6ifname large-config linuxfb medium-config minimal-config mremap neon no-gif no-harfbuzz opengl openssl pcre png posix_fallocate precompile_header pulseaudio qpa qpa reduce_exports reduce_relocations release rpath shared small-config system-freetype xcb xcb-qt xkbcommon-qt xlib zlib 
  Build parts ............ libs tools examples
  Mode ................... release
  Using C++11 ............ yes
  Using PCH .............. yes
  Target compiler supports:
    iWMMXt/Neon .......... no/yes
Qt modules and options:
  Qt D-Bus ............... yes (loading dbus-1 at runtime)
  Qt Concurrent .......... yes
  Qt GUI ................. yes
  Qt Widgets ............. yes
  JavaScriptCore JIT ..... yes (To be decided by JavaScriptCore)
  QML debugging .......... yes
  Use system proxies ..... no
Support enabled for:
  Accessibility .......... no
  ALSA ................... yes
  CUPS ................... no
  FontConfig ............. no
  FreeType ............... system
  Iconv .................. yes
  ICU .................... no
  Image formats: 
    GIF .................. no
    JPEG ................. yes (plugin, using bundled copy)
    PNG .................. yes (in QtGui, using bundled copy)
  Glib ................... yes
  GTK theme .............. no
  Large File ............. no
  mtdev .................. no
  Networking: 
    getaddrinfo .......... yes
    getifaddrs ........... yes
    IPv6 ifname .......... yes
    OpenSSL .............. yes (loading libraries at run-time)
  NIS .................... no
  OpenGL ................. desktop
  OpenVG ................. no
  PCRE ................... yes (bundled copy)
  pkg-config ............. yes 
  PulseAudio ............. yes
  QPA backends: 
    DirectFB ............. yes
    EGLFS ................ no
    KMS .................. no
    LinuxFB .............. yes
    XCB .................. yes (bundled copy)
      MIT-SHM ............ yes
      Xcb-Xlib ........... no
      Xcursor ............ yes (loaded at runtime)
      Xfixes ............. yes (loaded at runtime)
      Xi ................. yes (loaded at runtime)
      Xi2 ................ no
      Xinerama ........... yes (loaded at runtime)
      Xrandr ............. yes (loaded at runtime)
      Xrender ............ no
      XKB ................ yes
      XShape ............. yes
      XSync .............. yes
      XVideo ............. yes
  Session management ..... yes
  SQL drivers: 
    DB2 .................. no
    InterBase ............ no
    MySQL ................ no
    OCI .................. no
    ODBC ................. no
    PostgreSQL ........... no
    SQLite 2 ............. no
    SQLite ............... yes (plugin, using bundled copy)
    TDS .................. no
  udev ................... no
  xkbcommon .............. yes (bundled copy)
  zlib ................... yes (bundled copy)
NOTE: libxkbcommon 0.2.0 (or higher) not found on the system, will use 
the bundled version from 3rd party directory.
NOTE: Qt is using double for qreal on this system. This is binary incompatible against Qt 5.1.
Configure with '-qreal float' to create a build that is binary compatible with 5.1.

If you've tried cross compiling Qt, from my other posts, you will notice a lot more modules are enabled in this build.

I've tested a few examples and they all work, but I have not tested everything (haven't been able to test touch screen stuff yet). The examples default to using X11, if you want to use the linuxfb, add '-platform linuxfb' to the command line options. For example:
> analogclock -platform linuxfb

Here are two versions of binaries, one that includes examples (78 Mb) and one that does not (36 Mb).

MD5SUM:
9395fc70f576e58b68df7d732a002abb  qt-5.2-no-examples.tgz
f698f038166c4b2f65cec40056e23db2  qt-5.2.tgz

Extract to /usr/local, as the tarball contains the qt-5.2 folder in it.

If you want to try your hand at compiling applications on the Beaglebone, these packages have a native qmake included. Don't forget to add /usr/local/qt-5.2/bin to your path.

Have fun!

Sunday, January 26, 2014

element14 BB-View and the Debian Beta

This is a post I made at the element14 Community pages:

I thought some other might like to know how to get the BB-View working under the latest Debian beta images.

Unfortunately, you are going to have to recompile the Kernel. The video works fine without a recompile (the red/blue swap is easy to fix), but the touchscreen control connections are not the same as the standard TI 4-wire interface. I tried to patch the ti_am335x_tsc.c file, so the changes would be limited to a dts recompile, but I haven't been able to get that working yet (I'm pretty sure it is a state machine / bit assignment issue). But anyway, here are the steps that you need to perform.....

Overview

1) Download the necessary files
     a) Robert Nelson's handy tools for compiling the Beaglebone kernel
     b) BB-View source for Angstrom
2) Build the default kernel
3) Patch the Kernel and perform a fast recompile
4) Copy the new kernel to the Beaglebone
5) Edit the xorg.conf file to correct the Red/Blue color swap
6) Revel in the 4 days you just saved 

Let's Get Started

I am using Ubuntu 12.04 LTS 64 bit running in a VirtualBox VM to compile the kernel:
Make a new folder called bb-view, this is where our build will happen.
> mkdir bb-view
> cd bb-view

Install git, if you haven't already:
> apt-get install git

Clone Robert Nelson's linux-dev project locally. Be prepared for a large download (~100 Mb for the cross-compiler and ~700 Mb for the kernel source).
> git clone https://github.com/RobertCNelson/linux-dev.git

Change into the new linux-dev folder and select branch/tag that matches the Debian version.
> cd linux-dev
> git checkout 3.8.13-bone37 -b tmp

Now we need to build the base image, so our cape drivers folder gets populated. The script will tell you if you need to do or install anything else. 
> ./build_kernel.sh

Come back in an hour or so.....(You might want to download the Angstrom source from element14 now)

Patching the Kernel

Extract two files from the Angstrom source:
> unzip angstrom-source.zip
> tar -zxf bb-black-kernel-3.8.13-bb-view.tar.bz2
> cp ./kernel/kernel/drivers/input/touchscreen/ti_am335x_tsc.c  ~/bb-view/linux-dev/KERNEL/drivers/input/touchscreen/
> cp ./kernel/kernel/firmware/capes/BB-VIEW-LCD7-01-00A0.dts  ~/bb-view/linux-dev/KERNEL/firmware/capes/

Now we need to let the compiler know that we want to add the firmware to the build:
> nano   ~/bb-view/linux-dev/KERNEL/firmware/Makefile

Add the following line somewhere near line 192 (CTRL-C will display current cursor position):
BB-VIEW-LCD7-01-00A0.dtbo \

Don't forget the trailing backslash....it is important. Now save and exit by doing CTRL-O, Enter, CTRL-X.
Change back to the linux-dev root folder:
> cd   ~/bb-view/linux-dev

Now issue the kernel rebuild command, this won't take very long at all:
> ./tools/rebuild.sh


Copy Kernel to BBB

The following instructions assume that you already have the Debian beta installed and booted up on the BBB.
The easiest way is to copy the files over the network, via the 'scp' command:
> scp   ~/bb-view/linux-dev/deploy/3.8.13-bone37.zImage   debian@192.168.7.2:/home/debian
Replace debian (both instances) with the username you are running on the BBB and 192.168.7.2 with the IP address of the BBB.

Now log into the BBB and copy the kernel image to the boot partition:
> ssh debian@192.168.7.2
bbb>  sudo cp 3.8.13-bone37.zImage   /boot/uboot/zImage

We need to do one more thing before the LCD will work. Since the cape doesn't have an EEPROM, we need to black-list the HDMI drivers and force-load the BB-VIEW drivers in the boot command file:
bbb>  sudo  nano  /boot/uboot/uEnv.txt

Find the "optargs" line and edit it to be:
optargs=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN  capemgr.enable_partno=BB-VIEW-LCD7-01
Notice that the preceding "#" has been removed. You don't want to disable BB-BONE-EMMC-2G, or you won't be able to boot from eMMC.
Now save and exit by doing CTRL-O, Enter, CTRL-X.

Reboot the BBB and the LCD should now work....except the blue and red are reversed.

Fixing Red/Blue Color Swap

This is due to errata in the TI AM335x processor when switching between 16 and 24 bit video modes. To fix this, we must first find the name of our screen:
> ssh debian@192.168.7.2
bbb> cat  /var/log/Xorg.0.log  |  grep  screen
Mine was "Builtin Default fbdev Screen 0"

Now we edit our X configuration file:
bbb> sudo nano  /usr/share/X11/xorg.conf.d/10-evdev.conf

and add a "Screen" section at the end of the file:
Section "Screen"
        Identifier "Builtin Default fbdev Screen 0"
        Monitor "Configured Monitor"
        Device "Configured Video Device"
        DefaultDepth 24
EndSection
Save and exit by doing CTRL-O, Enter, CTRL-X.
Reboot and enjoy!