Adaptation/Nook Color

= Barnes and Noble Nook Color hardware adaptation =

This page is intended to help track the task required and the progress of creating a hardware adaptation for Mer on the Barnes and Noble Nook Color.

Hardware components

 * OMAP3621 armv7 CPU (camera support is disabled via fuses, otherwise identical to OMAP3630)
 * PowerVR SGX 530 (OpenGL ES 2.0)
 * MAX17042 Advanced Stand-Alone Fuel Gauge IC
 * MAXIM 8903 Charger IC (capable of 2A draw from proprietary B&N Nook Charger + Cable)
 * TWL4030 Power Module
 * WL1271 Wifi/Bluetooth module (bluetooth is not fully wired out)
 * 7" LG 1024x600 IPS panel with capacitive touch
 * SanDisk 8GB eMMC
 * MicroSDHC card slot
 * Texas Instruments (TPS65921B) "Integrated Power Management IC with 3 DC/DC's, 4 LDO's, USB HS Transceiver
 * TI DAC3100 Audio controller
 * 512MB Hynix SDRAM
 * Cypress TrueTouch (cyttsp) capacitive input panel

All support for this hardware is, thus far, locked to the 2.6.32 kernels that Barnes and Noble has released for it. Attempts have been made to upstream the necessary drivers and thus far Oleg Drokin (verygreen @ xda-devs) has managed to get the base board support file upstream.

The sound driver, if a compatible one isn't already upstream, needs to be completely rewritten due to the large changes in the sound subsystem with 2.6.37.

Otherwise, many other hardware bits and pieces are shared with the N900/N9/N950 and Beagleboard.

Adaptation Progress
Thus far (as of January 6, 2012) we have a kernel and filesystem that will boot the Nook Color up to qml-viewer, which is an excellent start after far too long.

Nothing can be remotely described as clean or fully functional, but it is possible to use usbnet to access an SSH shell on the device and work with it remotely.

Adaptation TODO
Lots, to say the very least.


 * Figure out how to get all of this mess up on COBS, and have it to a complete build.
 * Xorg is registering the accelerometer as an input device, thus doing weird things.
 * Xorg is -not- registering the touch panel.
 * No PowerVR drivers in current builds.

Adaptation Notes
The Nook Color can be triggered to boot from the SD card slot by holding the + volume key while the unit either reboots or is powered on from the off state. It will then load the x-loader on the SD card, then u-boot, then the kernel.

Sources and support files

 * Kernel: https://github.com/dalingrin/nook_kernel
 * This kernel is a modified variant of the stock kernel from Barnes and Noble. Noisy build and some hacks for things like Bluetooth and USB Host support.
 * Kernel Patches and configs: https://gitorious.org/mer-nook-compat/mer-nook-kernel (apply against the above kernel)
 * Patches based on several N9/N950 kernel patches to extend support for Mer back to 2.6.32
 * Attempting to consolidate files on gitorious if at all possible
 * Kickstart files: https://gitorious.org/mer-nook-compat/mer-nook-kickstart
 * Various and sundry kickstart files.
 * U-Boot sources: https://github.com/verygreen/u-boot-encore
 * x-loader

Before attempting a build, please check out ALL of the above repositories.

For building in the platform SDK ensure you have the Mer-SB2-armv7l pattern installed and a suitable minimal mer armv7l target.

Note that the nook-x-loader source assumes that there is a u-boot/ dir at a peer level: ln -s u-boot-encore u-boot

Creating a bootable image
Build x-loader
 * cd nook-x-loader
 * make omap3621_evt1a_config
 * make (-jN)

In the platform SDK: CROSS_COMPILE="sb2 -t mer_armv7l_min " make

The x-loader is effectively unchanged.

Build u-boot
 * cd u-boot-encore
 * make omap3621_evt1a_config
 * make (-jN)

In the platform SDK: CROSS_COMPILE="sb2 -t mer_armv7l_min " make

This version of u-boot is the same as the one found when booting CyanogenMod 7. Holding the N button at boot with it installed will display a menu with the ability to choose the boot target. As a result, neither x-loader nor u-boot need to be present in the boot partition if CM7 is installed, but u-boot still needs to be built for the tools needed to prepare the uImage.

Ensure the tools are in the path:
 * export PATH=$PATH: /u-boot-encore/tools/

Apply all patches in mer-nook-kernel

Build the kernel
 * cd nook_kernel
 * copy ../mer-nook-kerne/configs/usb_ethernet.config .config
 * make oldconfig
 * make (-jN) uImage

For a uRamdisk, use the one found here: http://side-7.us/files/mer/uRamdisk

This uRamdisk consists of a disabled init and not much more. Open question: is this even necessary? How does one build a proper uRamdisk?

Finally, generate a raw image. This assumes you already have mic installed:

sudo mic create raw mer-nook-kickstart/mer_sgx.ks --arch=armv7l -o tmp/

This will produce an image that can be dd'd to a 4GB SD card. Next, we must copy the previous build objects into the boot partition. First, mount the boot partition:

mount -o loop,offset=512

Then, copy the files.


 * cp ../x-loader/MLO
 * cp ../u-boot-encore/u-boot.bin
 * cp ../nook_kernel/arch/arm/boot/uImage
 * cp ../uRamdisk

Now unmount the file. This image is now fully bootable on the Nook Color. Eventually all of this will be integrated into COBS.

Accessing the Nook
Until I get something in the image that will display the IP address, the best means I've found so far has been to do an nmap scan on the usb ethernet adaptor on your Linux host:


 * nmap -sP 169.254.*.*

A few minutes later it'll pop up with the IP.

Additionally, there is a UART available via the USB port that requires some hacks to make work, which I have not. Additionally, there are 4 test points inside the Nook Color that are exposed through the metal shielding under the back that supply access to a 1.8v UART, which I have not attempted to access. These can readily provide you with access to x-loader and u-boot at power on time.