This is an account of installing Debian wheezy armhf on a Nokia N900. Notes are abridged assuming that you've read MaemoAndSqueeze already.

I still haven't got the special keys ( like "-"!) on the keyboard working in the console yet, so this install revolves around getting SSH working first.

Prepare the root file system

EDITOR=vim # ..or your favourite
sudo debootstrap --arch=armhf --variant=minbase --include=$PACKAGES --foreign  wheezy  /tmp/wheezy-armhf/  http://mirror:9999/debian
# Copy these files to the SD card

# Need these scripts because don't have "-" on the keyboard ( amongst other things)
cat <<'.' > bin/fn
debootstrap/debootstrap --second-stage
cat <<'.' > bin/rb
mount -o remount,ro /
reboot -f
chmod +x  bin/fn  bin/rb
cat <<'.' > etc/fstab  # so that "mount -o remount,ro" prior to reboot works if you need it
# /etc/fstab: static file system information.
# pass: 0: do not check, 1: before mounting root, 2: after mounting root
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#                                                               pass,
# ,file system    ,mount point  ,type  ,options               dump, |
# |               |             |      |                          | |
  /dev/mmcblk1p4  /             ext4   errors=remount-ro,noatime  0 0
  proc            /proc         proc   nodev,noexec,nosuid        0 0
  none            /tmp          tmpfs  noatime                    0 0
echo N900 > etc/hostname
$EDITOR etc/shadow # and set root's password to something
cat <<'.' >> etc/modules
cat <<'.' > etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)

# loopback
auto lo
iface lo inet loopback

# usb
auto usb0
iface usb0 inet static
echo nameserver > etc/resolv.conf

Building the kernel

# Needs at least 2.3G of disc space
git clone git://
git checkout v3.8-rc3-n900
ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make rx51_defconfig
# Change the configuration to include ext2 and the TWL4030 watchdog:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make xconfig
# Comment out line 1040 of arch/arm/mach-omap2/board-rx51-peripherals.c
ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- nice -19 make -j 5 
INSTALL_MOD_PATH=/tmp ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make modules_install
sudo rsync --archive /tmp/lib/
sudo flasher-3.5 -l -k arch/arm/boot/zImage -b"vram=12M console=tty0 rootdelay=1 rootwait root=/dev/mmcblk0p4 init=/bin/bash"

Once at the bash prompt, run fn to finish the debootstrap process then rb to reboot and use the same command line but without an explicit init= parameter to boot normal init.

Routing via workstation

# Configure usb0 with, then:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s -o wlan0 -j MASQUERADE


Use version 2013.04-1 of u-boot-flasher in Maemo because earlier versions boot some kernels but reset the CPU instead of booting others.


Video driver

Both xserver-xorg-video-omap3 and xserver-xorg-video-omapfb segfaulted for me. xserver-xorg-video-fbdev works though.


To get support for the special characters printed on the keys, edit /etc/default/keyboard:


To add other characters, edit /usr/share/X11/xkb/symbols/nokia_vndr/rx-51:

    key <UP>   { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Up, Page_Up ] };
    key <LEFT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Left, Home ] };
    key <DOWN> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Down, Page_Down ] };
    key <RGHT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Right, End ] };

..then to reload the keymap:

setxkbmap us

Some useful keys not available by default: Escape Tab Page_Up Page_Down Home End Insert Delete less greater bracketleft bracketright braceleft braceright grave percent asciicircum asciitilde bar F2


The Y axis of the touchscreen was inverted. xinput --list shows a line like:

TSC2005 touchscreen                       id=6

xinput --list-props 6 shows:

Evdev Axis Inversion (239)

..and then xinput --set-prop --type=int 6 239 0 1 flipped the axis for me. It also needed some calibration:

xinput --set-prop --type=float 6 113  1.10 0.00 -0.05  0.00 1.18 -0.10  0.00 0.00 1.00