A Mutable Log

Install AOSP build to PandaBoard

This post continues the post on building AOSP for PandaBoard. Read that post, if you haven’t already. This post covers installing the AOSP images to PandaBoard. It is much more adventuresome that I initially imagined it would be. The procedure described here, with some variations, is based on instructions in the device/ti/panda/README file.


PandaBoard’s usbboot boot loader runs when no SD card is provided. In this mode, the board can receive the next stage boot loader over the USB bus, using the usbboot utility located under device/ti/panda. Unfortunately, VirtualBox Ubuntu VM is able to use the PandaBoard only after Windows host has loaded a valid driver for it. I modified Google’s USB driver to work with PandaBoard’s usbboot mode.

I am using Windows 8 as the host OS. It will not install unsigned drivers by default. I test signed the driver using Windows Driver Kit. Once the driver is installed, you’ll need to stop the VM, and edit its settings to use device “PandaBoard UsbBoot Interface”. You’ll know VirtualBox is using the USB device when lsusb lists it, and it does not appear in Windows Device Manager on the host. The same driver also works with Android’s fastboot mode. Here’s what lsusb -v dumps when PandaBoard is in usbboot mode.

Bus 001 Device 012: ID 0451:d00f Texas Instruments, Inc.
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.10
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass       255 Vendor Specific Subclass
  bDeviceProtocol       255 Vendor Specific Protocol
  bMaxPacketSize0        64
  idVendor           0x0451 Texas Instruments, Inc.
  idProduct          0xd00f
  bcdDevice            0.00
  iManufacturer          33
  iProduct               37
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          1
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol    255 Vendor Specific Protocol
      iInterface              2
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0

Finally, here’s the command you need to run so that usbboot puts PandaBoard in fastboot mode.

sudo ./device/ti/panda/usbboot device/ti/panda/bootloader.bin


Android’s fastboot command line utility can flash Android to a device when it is in fastboot mode. Build of fastboot from source under out/host/linux-x86/bin didn’t work, until I installed the Oracle VM VirtualBox Extension Pack and enabled USB 2.0 support. If you want to avoid installing that extension pack, Android SDK for Windows installs fastboot in the platform-tools folder. You can use that instead of using the one built from source.

You’ll need to copy all image files built by make under out/target/product/panda to the Windows host and run the following commands from the command prompt. Change ANDROID_SDK_PATH appropriately.

set ANDROID_SDK_PATH=C:\Users\user\AppData\Local\Android\android-sdk
%ANDROID_SDK_PATH%\platform-tools\fastboot.exe oem format
%ANDROID_SDK_PATH%\platform-tools\fastboot.exe flash xloader xloader.bin
%ANDROID_SDK_PATH%\platform-tools\fastboot.exe flash bootloader bootloader.bin
%ANDROID_SDK_PATH%\platform-tools\fastboot.exe erase cache
%ANDROID_SDK_PATH%\platform-tools\fastboot.exe -p panda flash userdata userdata.img
%ANDROID_SDK_PATH%\platform-tools\fastboot.exe -p panda flash boot boot.img
%ANDROID_SDK_PATH%\platform-tools\fastboot.exe -p panda flash system system.img
%ANDROID_SDK_PATH%\platform-tools\fastboot.exe -p panda flash recovery recovery.img
%ANDROID_SDK_PATH%\platform-tools\fastboot.exe -p panda flash cache cache.img

The more convenient flashall option of fastboot fails as follows

%ANDROID_SDK_PATH%\platform-tools\fastboot.exe -p panda flashall
error: could not load android-info.txt: No error

Hence, the need to flash image files individually.

At this point, you can reset the PandaBoard so that it loads Android!

To boot into fastboot mode ever again, hold the GPIO_121 button (furthest button from SD card) and press and release the PWRON_RESET button. Release the GPIO_121 button after a while.

Proprietary binaries for PowerVR

Android failed to load on PandaBoard after my first build. The serial port console printed the following message.

[  297.078613] PVR_K:(Error): BridgedDispatchKM: Driver initialisation not completed yet. [4836, drivers/gpu/pvr/bridged_pvr_bridge.c]

I discovered the version of the PowerVR binary required by my Android branch is as follows.

shell@android:/ $ cat /proc/pvr/version
Version CustomerGoogle_Android_ogles1_ogles2_GPL sgxddk 18 1.8@785978 (release) omap4430_android
System Version String: None

shell@android:/ $ ls -l system/vendor/lib/egl
-rw-r--r-- root     root         4812 2013-05-24 17:25 libEGL_POWERVR_SGX540_120.so
-rw-r--r-- root     root       445892 2013-05-24 17:25 libGLESv1_CM_POWERVR_SGX540_120.so
-rw-r--r-- root     root       371532 2013-05-24 17:25 libGLESv2_POWERVR_SGX540_120.so

The binary I had provided pre build was a different version.

$ strings vendor/imgtec/panda/proprietary/libGLESv2_POWERVR_SGX540_120.so | grep build
OpenGL ES 2.0 build 1.8@905891
OpenGL ES GLSL ES 1.00 build 1.8@905891

The solution was to clobber and build again with the correct version of the proprietary driver.

Does it work?

This Android build is painfully slow. adb shell dmesg shows repeating omapfb message below.

%ANDROID_SDK_PATH%\platform-tools\adb.exe shell dmesg
[   10.060485] omapfb omapfb: Unknown ioctl 0x40044f40

The CPU itself is relatively idle as reported by monitor and shown in the figure below. Changing display size using adb am display-size or display density using adb am display-density, has no noticeable impact.


logcat shows the following messages repeating very often.

01-02 15:22:48.375: I/PowerManagerService(346): Going to sleep due to screen timeout...
01-02 15:22:48.382: E/SurfaceFlinger(99): eventControl(0, 1) failed Invalid argument
01-02 15:22:49.390: W/SurfaceFlinger(99): Timed out waiting for hw vsync; faking it
01-02 15:22:53.375: I/PowerManagerService(346): Waking up from sleep...

All that leads me to believe graphics are hardware accelerated but buggy. If and when I figure this out I’ll post an update.

Here’s the Android screen captured using monitor on Windows

Android 4.2.2