Jump to content

Nokia N900 (nokia-n900)

From postmarketOS Wiki
Revision as of 22:36, 30 September 2017 by Craftyguy (talk | contribs) (GPRS)


Nokia N900
Nokia N900 running cmus
Nokia N900 running cmus
Manufacturer Nokia
Name N900
Codename rx51
Released 2009
Hardware
CPU TI OMAP 3430
GPU PowerVR SGX530
Display 800x480 IPS
Storage 32GB
Memory 256MB
Software
Original software Maemo on Linux 2.6
postmarketOS
Category testing
Pre-built images no
Mainline no
Features
Flashing
No data
USB Networking
No data
Internal storage
No data
SD card
No data
Battery
No data
Screen
No data
Touchscreen
No data
Multimedia
3D Acceleration
No data
Audio
No data
Camera
No data
Camera Flash
No data
Connectivity
WiFi
No data
Bluetooth
No data
GPS
No data
NFC
No data
Modem
Calls
No data
SMS
No data
Mobile data
No data
Miscellaneous
FDE
No data
USB OTG
No data
HDMI/DP
No data
Sensors
Accelerometer
No data
Magnetometer
No data
Ambient Light
No data
Proximity
No data
Hall Effect
No data
Haptics
No data
Barometer
No data

Contributors

What works

  • Framebuffer & DRM graphics
  • GPRS / SMS (see section below)
  • Unlocking the root partition using the physical keyboard
  • Display Backlight control
  • Wayland on framebuffer
  • Wifi (see Additional Info below)
  • Notification led
  • Audio playback (ALSA)
  • Keyboard backlight (see Additional Info below)
  • Battery capacity reporting (see Additional Info below)
  • Keyboard in virtual terminal

What does not work

  • Front cameras
  • Back camera is close to supported in 4.14-rc1.
  • Voice calls (needs https://gitlab.com/libcmtspeechdata/libcmtspeechdata )
  • 3D Acceleration (requires binary blob)
  • There's bluetooth support at bluetooth-next, but that works on N950, not on N900. Bluetooth . There was driver in staging some time ago, that one should work.

Installation

We currently only support installing and running pmos from the microsd card on the n900.
Getting it to work with emmc and 0xffff is harder to implement and has no real benefit since
the built in emmc is quite slow and fragile.

  1. Init pmbootstrap
$ ./pmbootstrap.py init
  1. Start the build process and install the completed image to a sdcard
# Replace /dev/sdX with the device for your sdcard
$ ./pmbootstrap.py install --sdcard /dev/sdX
  1. Install u-boot from pali on the n900 if you haven't installed it already. See Additional Info below for instructions on configuring pmos to boot by default.
  2. Place the sdcard into the n900 and boot it with the keyboard slide open
  3. Choose the u-boot shell
  4. enter run sdboot into the shell

Links

Additional info

  • Martijn's N900 has uboot installed a long time ago, I'm using sdcard boot from the bootmenu shell using run sdboot
  • The Neo900 (still in development) will upgrade the hardware inside of the N900, and has some nice features such as hardware sandboxing the modem.

Wifi

The linux-firmware package is required to provide the wl1251 firmware necessary for initializing the wifi device. (#158)

Once the device has been successfully initialized, enable it:

$ sudo ip link set wlan0 up
$ sudo iw wlan0 set type managed

Configure wpa_supplicant (only necessary on encrypted networks):

$ sudo su -
# wpa_passphrase $YOUR_SSID > /etc/wpa_supplicant/wlan0.conf
<enter passphrase here and press Enter>
# exit

Connect to network using wpa_supplicant:

$ sudo wpa_supplicant -Dwext -i wlan0 -c /etc/wpa_supplicant/wlan0.conf 

If your network uses DHCP, start the DHCP client:

$ sudo udhcpc -i wlan0

Keyboard Backlight

There are 6 keyboard backlight LEDs that can be adjusted, they are found under /sys/class/leds/lp5523:kb{1-6}. To adjust brightness, write a value, $VAL between 0 and 255, to the brightness parameter as the root user:

for i in $(seq 1 6);
    do echo $VAL > /sys/class/leds/lp5523\:kb$i/brightness
done

Display

With DRM enabled (#197), the display can be managed at this location: /sys/devices/platform/omapdrm.0/graphics/fb0/

For example, the display can be turned off by:

# echo 1 > /sys/devices/platform/omapdrm.0/graphics/fb0/blank

Keyboard layout in console

In order to set the keyboard layout for the virtual console (e.g. to take advantage of number keys on the N900 keyboard), obtain your desired language keymap file for the RX-51, such as this one.. (TODO: Need to pull 'official' vconsole keymaps from Maemo5 if they exist..).

On the N900, install kbd-bkeymaps, either by using pmbootstrap install --add kbd-bkeysmaps on the host system or by running apk add kbd-bkeysmaps on the device itself.

The keymap must be in binary format, bmap. This can be accomplished using the loadkeys tool:

$ apk add kbd kbd-bkeymaps
$ loadkeys -b rx51_us.map > rx51_us.bmap
$ gzip rx51_us.bmap

Compress it and copy it to /usr/share/bkeymaps/us/ on the N900.

Log into the N900, and run sudo setup-keymap, then select us and finally rx51_us.

Battery Capacity Reporting

The current battery capacity can be found under /sys/class/power_supply/bq27200-0/capacity, and is represented as a percentage. For example, a value of 11 equates to 11%. If capacity does not exist or contains erroneous information, then your battery needs to be calibrated first. To calibrate the battery:

1) Charge it up fully, using a wall power adapter.

2) Once it is charged up, power on the device

3) Unplug the device and allow the battery to run all the way down until it powers off. This may take quite a while to happen (>24hrs, but can be made shorter by running a CPU intensive workload)

4) When device powers off, plug it back into wall adapter and allow to charge up fully again. The battery and charging chip should now be calibrated.

Datasheet for the bq27200 charging chip

Setting the hardware clock

Since 49fd9e0e4efcf030ca47344858bdc74370a78603 the hardware clock works. If your hardware clock doesn't have the time set you can set it with:

# Get the system date in the right ballpark so ntpd works
$ date -s "2017-08-14 16:34:50"

# Write the current system time to the hardware clock
$ hwclock -w

Configuring U-boot

In order to configure pmos to boot by default on the N900, using U-boot, you will need to boot into Maemo and create a /etc/bootmenu.d/10-pmos.item file as the root user with these contents:

/etc/bootmenu.d/10-pmos.item
ITEM_NAME="postmarketOS"
ITEM_SCRIPT="boot.scr"
ITEM_DEVICE="${EXT_CARD}p1"
ITEM_FSTYPE="ext2"

It can be set to the default boot option by creating a symlink:

root@Nokia-N900:~# ln -s /etc/bootmenu.d/10-pmos.item /etc/default/bootmenu.item

Finally, run u-boot-update-bootmenu:

root@Nokia-N900:~# u-boot-update-bootmenu 
Default bootmenu entry is '/etc/bootmenu.d/10-pmos.item'
Adding bootmenu entry for: 'Maemo 5 with attached kernel (Internal Nand)'

Configuration file: /etc/bootmenu.d/10-pmos.item
Adding bootmenu entry for: 'postmarketOS'
Configuring this bootmenu entry as default

Generating u-boot bootmenu script...

Note: This will set pmos as the default boot option. Maemo will still be accessible when booting the N900 with the keyboard slide out and selecting the relevant boot option in the u-boot boot menu.

SMS

In order to use the ofono test scripts, you must install py-dbus, that is currently available only for python2.

Note The N900 needs internet access to perform these steps. See the section above on setting up Wifi.
Note Your date/time need to be correct in order for HTTPS to work. You can use ntpd to do this.
# apk add git py-dbus
# git clone --depth 1 https://git.kernel.org/pub/scm/network/ofono/ofono.git

Here's an example using the test scripts to enable the modem and send a SMS:

# cd ofono/test
# python2 enable-modem
# python2 online-modem
# python2 send-sms 5033784582 "I like pizza." 0 


GPRS

GPRS can be managed by connman. Either install connman using apk or add it when installing pmOS by passing --add connman to pmbootstrap.

Note Once you perform the following steps, the GPRS connection will be established by connman automatically on every boot.

It's VERY important that you add the following to /etc/connman/main.conf BEFORE starting connman, else it will take over all network connection handling and disconnect you if you are connected over SSH:

/etc/connman/main.conf
NetworkInterfaceBlacklist = usb,wlan

Configure connman to start at boot:

$ sudo rc-update add connman

Stop ofono in order to set APN:

$ sudo rc-service ofono stop

Edit APN, where <IMSI> should be replaced in the following commands with the IMSI from your SIM card. Replace <APN> with the relevant APN for your cellular carrier (e.g. fast.t-mobile.com). This file should be created when ofono starts, so you should only need to add the APN.

/var/lib/ofono/<IMSI>/gprs
[Settings]                                                                                                                                                                                                                                                                                                                                                              
Powered=true                                                                                                                                                                                                                                                                                                                                                            
RoamingAllowed=false                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                                        
[context1]                                                                                                                                                                                                                                                                                                                                                              
Name=Internet                                                                                                                                                                                                                                                                                                                                                           
AccessPointName=<APN>                                                                                                                                                                                                                                                                                                                                      
Username=                                                                                                                                                                                                                                                                                                                                                               
Password=                                                                                                                                                                                                                                                                                                                                                               
AuthenticationMethod=chap                                                                                                                                                                                                                                                                                                                                               
Type=internet                                                                                                                                                                                                                                                                                                                                                           
Protocol=ip  

Start ofono and power on modem.

$ sudo rc-service ofono start
$ sudo connmanctl enable cellular

In some cases, it seems necessary to run a scan before the necessary service will show in connman, even though the scan is 'unsupported':

$ sudo connmanctl scan cellular                                                                 
Error /net/connman/technology/cellular: Not supported                                     
$ sudo connmanctl services
cellular_340369959729712_context1

Connect to the cellular service:

                                
$ sudo connmanctl connect cellular_340369959729712_context1                                     
Connected cellular_340369959729712_context1
$ ip addr show gprs0
10: gprs0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UNKNOWN qlen 10
    link/[821] 
    inet 33.238.141.172/32 brd 33.238.141.172 scope global gprs0
       valid_lft forever preferred_lft forever

GPS

First, get network and date to work. Next, clone tui repository. it contains includes many goodies, including script for hardware testing, gps support, and graphical ofono control software.

mkdir /my
cd /my
git clone https://gitlab.com/tui/tui.git

Next, install packages necessary for compiling software and prepare gps2. enable-modem, online-modem and you should be able to run gps2. AGPS is not available, so expect long startup.

apk add gcc vala musl-dev make linux-headers gpsd
cd /my/tui/ofone
make gps2
./gps2

gps2 will not talk to gpsd, so it is only useful to verify that hardware is working.

GUI

XFCE4 should work well.

Helpful Links for Porting