Jump to content

Nokia N900 (nokia-n900): Difference between revisions

From postmarketOS Wiki
Sicelo (talk | contribs)
mNo edit summary
Mykhal (talk | contribs)
Keyboard layout: mention ptes layout
 
(46 intermediate revisions by 8 users not shown)
Line 7: Line 7:
| releaseyear = 2009
| releaseyear = 2009
| category = community
| category = community
| originalsoftware = Maemo 5 (Fremantle) on Linux 2.6.28
| originalsoftware = Maemo
| originalversion = 5 (Fremantle) (Linux 2.6.28)
| pmoskernel = Mainline Linux
| pmoskernel = Mainline Linux
| chipset = TI OMAP 3430
| chipset = TI OMAP 3430
Line 16: Line 17:
| memory = 256 MB
| memory = 256 MB
| architecture = armv7
| architecture = armv7
| type = handset
| type = Slide-Out Keyboard Handset
| whet_dhry = 58.4
| whet_dhry = 58.4
| status_usbnet = Y
| status_usbnet = Y
Line 31: Line 32:
| status_bluetooth = N
| status_bluetooth = N
| status_camera = P
| status_camera = P
| status_gps = P
| status_gps = Y
| status_mobiledata = Y
| status_mobiledata = Y
| status_emmc = Y
| status_sms = Y
| status_sms = Y
| status_calls = P
| status_calls = P
Line 38: Line 40:
| status_keyboard = Y
| status_keyboard = Y
| status_irtx = Y
| status_irtx = Y
| status_sdcard = Y
| status_haptics = Y
| status_proximity = Y
| status_proximity = Y
| status_light = Y
| status_light = Y
Line 78: Line 82:
The GPU is a PowerVR SGX530 which does not have FOSS drivers, so 3D acceleration does not work with the mainline kernel. However, the blobs, patched mesa, and patched wlroots that permit it to work on mainline with postmarketOS are maintained in the [https://gitlab.com/pvrports pvrports project]. It packages the work of the [https://github.com/openpvrsgx-devgroup/linux_openpvrsgx linux openpvrsgx dev group] , which maintains a "near-mainline" kernel fork with the required kernel driver.  
The GPU is a PowerVR SGX530 which does not have FOSS drivers, so 3D acceleration does not work with the mainline kernel. However, the blobs, patched mesa, and patched wlroots that permit it to work on mainline with postmarketOS are maintained in the [https://gitlab.com/pvrports pvrports project]. It packages the work of the [https://github.com/openpvrsgx-devgroup/linux_openpvrsgx linux openpvrsgx dev group] , which maintains a "near-mainline" kernel fork with the required kernel driver.  


Voice calls work, but need https://gitlab.com/libcmtspeechdata/libcmtspeechdata to route the speech data. Due to very tight timings involved in the associated protocol, the audio is very low quality unless additional processing is performed (Nokia had closed-source Pulseaudio modules for this).
Voice calls work, but need https://gitlab.com/libcmtspeechdata/libcmtspeechdata to route the speech data. Integrating this in pmOS is WIP.


There's bluetooth support at bluetooth-next, but that works on N950, not on N900. [https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git/commit/?id=7bb318680e868cd049922f6761170b42ff89687d Bluetooth] . The driver compiles fine and loads firmware correctly, then times out on the bluetooth 'read_BD_ADDR' HCI command.
There's bluetooth support at bluetooth-next, but that works on N950, not on N900. [https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git/commit/?id=7bb318680e868cd049922f6761170b42ff89687d Bluetooth] . The driver compiles fine and loads firmware correctly, then times out on the bluetooth 'read_BD_ADDR' HCI command.
The FM receiver, located inside the bluetooth chip, is enabled by a magic bluetooth packet, so it requires a working bluetooth stack to be available. Otherwise it is a regular i2c device and has simple routing to the codec. Its driver needed some work in the kernel and was eventually dropped. It should not be too difficult to get it working once chip is enabled.


OTG might work since the kernel has support. However, like [[Wileyfox_Swift_(wileyfox-crackling)]], there is a hardware limitation that prevents the N900 from automatically detecting that there's a connected device, and also detecting the USB version/speed it supports. With some work, it most likely should work with manual activation
OTG might work since the kernel has support. However, like [[Wileyfox_Swift_(wileyfox-crackling)]], there is a hardware limitation that prevents the N900 from automatically detecting that there's a connected device, and also detecting the USB version/speed it supports. With some work, it most likely should work with manual activation


== Installation ==
== Installation ==
=== Flash postmarketOS to SD card ===
=== Boot from the SD card ===
Follow the instructions on the [[installation]] page for installing postmarketOS to the SD card. Running from internal storage is not supported and probably has no real benefit since it is quite slow.
 
If your phone does not jump from Nokia logo to U-Boot prompt when powered on and booted with the keyboard slider open, you'll need to install U-Boot by Pali, see [[#Boot from the SD card]].
 
The first boot takes longer, as the root partition gets resized to fit the whole SD card. There is a lot of kernel output during boot, just wait patiently until i3wm shows up. Read [[#i3wm]] for the N900 specific keybindings, most importantly <code>Shift + Space</code>, then <code>t</code> to open a terminal. You can use <code>nmtui</code> to connect to a Wi-Fi network (<code>nmcli</code> can be used also: https://wiki.postmarketos.org/wiki/WiFi#Using_NetworkManager).


=== Boot from the SD card ===
# Follow the instructions on the [[installation]] page for installing postmarketOS to the SD card. Running from internal storage is not recommended and probably has no real benefit since it is quite slow.
# [http://maemo.org/downloads/product/Maemo5/u-boot-flasher/ Install u-boot from pali] on the n900 in Maemo. If this does not work in Hildon Application Manager, you may run <code>sudo apt-get install u-boot-flasher</code> in maemo terminal (see {{issue|16|wiki}} and {{issue|1371|pmbootstrap}}).  See Additional Info below for instructions on configuring pmos to boot by default.
# If you do not already have u-boot installed, boot Maemo Fremantle (the stock OS) and [http://maemo.org/downloads/product/Maemo5/u-boot-flasher/ install u-boot from pali]. If this does not work from Hildon Application Manager, you may run <code>sudo apt-get install u-boot-flasher</code> in maemo terminal (see {{issue|16|wiki}} and {{issue|1371|pmbootstrap}}).  See Additional Info below for instructions on configuring pmos to boot by default.
# Place the sdcard into the n900 and boot it with the keyboard slide open
# Place the sdcard into the n900 and boot it with the keyboard slide open
# Choose the u-boot shell
# Choose the u-boot shell
Line 128: Line 129:


=== Wifi ===
=== Wifi ===
The <code>device-nokia-n900-nonfree-firmware</code> package is required to provide the wl1251 firmware necessary for initializing the wifi device. ([https://github.com/postmarketOS/pmbootstrap/pull/1414 #1414])
You can use NetworkManager's console UI to connect to your network. Please note that <code>nmtui</code> does not work properly when started from <code>tmux</code>.
You get asked during <code>pmbootstrap init</code> if you would like to install that proprietary firmware package.
 
Now you can use NetworkManager's console UI to connect to your network. Please note that <code>nmtui</code> does not work properly when started from <code>tmux</code>.


<syntaxhighlight lang="shell-session">
<syntaxhighlight lang="shell-session">
Line 138: Line 136:


==== With iwd ====
==== With iwd ====
From the 5.15.13 kernel package onwards, you are also able to use <code>iwd</code> to manage wireless, if you so prefer.
From the 5.15.13 kernel package onward, you are also able to use <code>iwd</code> to manage wireless, if you so prefer.
 
==== With ConnMan ====
If connman is already used for [[#GPRS|GPRS]] per instructions below, don't forget to unblacklist <tt>wlan</tt> in <code>/etc/connman/main.conf</code>.
<syntaxhighlight lang="text">
$ connmanctl
connmanctl> scan wifi
Scan completed for wifi
connmanctl> services
    mywifi  wifi_001fdfcafe01_6d7977696669_managed_psk
connmanctl> agent on
Agent registered
connmanctl> connect wifi_001fdfcafe01_6d7977696669_managed_psk
Agent RequestInput wifi_001fdfcafe01_6d7977696669_managed_psk
  Passphrase = [ Type=psk, Requirement=mandatory ]
Passphrase? Mysupersecurewifipassword123
Connected wifi_001fdfcafe01_6d7977696669_managed_psk
connmanctl> services
*AO mywifi  wifi_001fdfcafe01_6d7977696669_managed_psk
</syntaxhighlight>


==== Power saving / ping times ====
==== Power saving / ping times ====
Line 164: Line 143:


<syntaxhighlight lang="shell-session">
<syntaxhighlight lang="shell-session">
$ sudo su -
$ sudo apk add iw
# apk add iw
$ sudo iw dev wlan0 set power_save off
# iw dev wlan0 set power_save off
# exit
</syntaxhighlight>
</syntaxhighlight>
=== Sound ===
Modules need not to be compiled, sound support is built into kernel. Install alsa-utils.
<pre>
aplay /usr/share/sounds/alsa/Front_Left.wav
</pre>
NikkSaan provided an advanced audio configuration in [https://github.com/postmarketOS/pmbootstrap/pull/702#issuecomment-380999740 #702 (comment)].


=== Keyboard Backlight ===
=== Keyboard Backlight ===
Line 198: Line 166:
[[File:N900 keymap it.jpg|800px|thumb|left|it/rx51_it]]
[[File:N900 keymap it.jpg|800px|thumb|left|it/rx51_it]]
</div>
</div>
and es/rx51_es and pt/rx51_pt (same for Spanish a Portugese)


==== Console ====
==== Console ====
Line 203: Line 172:
:'''NOTE:''' during installation pmbootstrap will typically ask you for the desired keymap. The following is only for experimentation: normally all should just work fine after setting up the SD card from pmbootstrap. The following section may be dated and pmbootstrap has already done the job for you.
:'''NOTE:''' during installation pmbootstrap will typically ask you for the desired keymap. The following is only for experimentation: normally all should just work fine after setting up the SD card from pmbootstrap. The following section may be dated and pmbootstrap has already done the job for you.


To obtain your desired language keymap file for the RX-51, [https://gitlab.com/postmarketOS/pmaports/-/blob/master/device/community/device-nokia-n900/keymaps/rx51_us.map such as this one]:
To obtain your desired language keymap file for the RX-51, [https://gitlab.postmarketos.org/postmarketOS/pmaports/-/blob/master/device/community/device-nokia-n900/keymaps/rx51_us.map such as this one]:


* On the N900, install <code>kbd-bkeymaps</code>, either by using <code>pmbootstrap install --add kbd-bkeymaps</code> on the host system or by running <code>apk add kbd-bkeymaps</code> on the device itself.
* On the N900, install <code>kbd-bkeymaps</code>, either by using <code>pmbootstrap install --add kbd-bkeymaps</code> on the host system or by running <code>apk add kbd-bkeymaps</code> on the device itself.
Line 209: Line 178:
* The keymap must be in binary format, bmap. This can be accomplished using the <code>loadkeys</code> tool:
* The keymap must be in binary format, bmap. This can be accomplished using the <code>loadkeys</code> tool:


<source lang="shell-session">$ apk add kbd kbd-bkeymaps
<syntaxhighlight lang="shell-session">
$ apk add kbd kbd-bkeymaps
$ loadkeys -b rx51_us.map > rx51_us.bmap
$ loadkeys -b rx51_us.map > rx51_us.bmap
$ gzip rx51_us.bmap</source>
$ gzip rx51_us.bmap
</syntaxhighlight>


* Compress it and copy it to <code>/usr/share/bkeymaps/us/</code> on the N900.
* Compress it and copy it to <code>/usr/share/bkeymaps/us/</code> on the N900.
Line 225: Line 196:
In X11 you can use <code>setxkbmap</code> to configure the desired layout.
In X11 you can use <code>setxkbmap</code> to configure the desired layout.


Right now it's configured to use the <code>nokiarx51/us</code> layout by default (see [https://github.com/postmarketOS/pmbootstrap/blob/a7afd519eff34237dfe2766634ac6b2c5076e9f5/aports/device/device-nokia-n900/keymaps/40-xkb.conf 40-xkb.conf]) then the pmbootstrap script will patch this file to set the <code>Option "XkbLayout"</code> to <code>"nn"</code> where "nn" is your country code.
Right now it's configured to use the <code>nokiarx51/us</code> layout by default (see [https://gitlab.postmarketos.org/postmarketOS/pmbootstrap/-/blob/a7afd519eff34237dfe2766634ac6b2c5076e9f5/aports/device/device-nokia-n900/keymaps/40-xkb.conf 40-xkb.conf]) then the pmbootstrap script will patch this file to set the <code>Option "XkbLayout"</code> to <code>"nn"</code> where "nn" is your country code.


{{note| Info: Tab is ctrl+i}}
{{note| Info: Tab is ctrl+i}}
Line 264: Line 235:


==== i3wm ====
==== i3wm ====
'''[[I3wm]] is the recommended UI.''' It is lightweight and fast, and we have a custom N900 configuration that optimizes for its keyboard ([https://www.reddit.com/r/unixporn/comments/7wt8ig/i3gaps_n900_restored_to_glory/ photos]). The most important keybindings are described below, for details see [https://gitlab.com/postmarketOS/pmaports/-/blob/master/device/community/device-nokia-n900/i3wm/i3wm.conf i3wm.conf]. This file gets installed to <code>~/.config/i3/config</code> and of course you can customize it. If you have good additions, please make a merge request so everybody benefits from an improved default config.
'''[[I3wm]] is the recommended UI.''' It is lightweight and fast, and we have a custom N900 configuration that optimizes for its keyboard ([https://www.reddit.com/r/unixporn/comments/7wt8ig/i3gaps_n900_restored_to_glory/ photos]). The most important keybindings are described below, for details see [https://gitlab.postmarketos.org/postmarketOS/pmaports/-/blob/master/device/community/device-nokia-n900/i3wm/i3wm.conf i3wm.conf]. This file gets installed to <code>~/.config/i3/config</code> and of course you can customize it. If you have good additions, please make a merge request so everybody benefits from an improved default config.


===== default mode =====
===== default mode =====
Line 279: Line 250:
* a/s/d/f/g: switch to workspace 1/2/3/4/5
* a/s/d/f/g: switch to workspace 1/2/3/4/5
* q: go back to "command mode"
* q: go back to "command mode"
===== Other =====
====== Display brightness ======
With the current configuration, you can adjust the display brightness using the volume keys while holding the Shift key


==== Xfce4 ====
==== Xfce4 ====
[[Xfce4]] also works very well on the N900
[[Xfce4]] also works very well on the N900
==== Sxmo (dwm or sway) ====
[[Sxmo]] also supports the Nokia N900, and also includes a fully-featured deviceprofile. However, note that sxmo has very high CPU usage on the N900, evidently due to the daemons that keep the environment working. It is recommended to disable as many of its daemons as possible, e.g. conky.


==== Others ====
==== Others ====
There are also Mate, etc.
There are also Mate, etc.
==== Misc: Power button ====
If you want to make use of the power button, bind <code>XF86PowerOff</code> to this script:
<syntaxhighlight lang="sh">
FILE=~/.screenoff
if [ -f $FILE ]; then
    xinput set-prop 8 "Device Enabled" 1
    xinput set-prop 6 "Device Enabled" 1
    xinput set-prop 9 "Device Enabled" 1
    xset dpms force on
    rm ~/.screenoff
else
    xinput set-prop 8 "Device Enabled" 0
    xinput set-prop 6 "Device Enabled" 0
    xinput set-prop 9 "Device Enabled" 0
    xset dpms force off
    touch ~/.screenoff
fi
</syntaxhighlight>
{{note|You cannot use this to turn the screen back on if i3lock or similar is running, as they would grab the keys}}


==== Misc: Middle click and right click ====
==== Misc: Middle click and right click ====
Line 353: Line 311:
[http://www.ti.com/lit/ds/symlink/bq24150.pdf Datasheet for the bq24150 charging chip]
[http://www.ti.com/lit/ds/symlink/bq24150.pdf Datasheet for the bq24150 charging chip]


==== Capacity Reporting ====
==== Battery Capacity Reporting ====


The current battery capacity can be found under <code>/sys/class/power_supply/bq27200-0/capacity</code>, and is represented as a percentage. For example, a value of <code>11</code> equates to <code>11%</code>. To calibrate the battery and get a more accurate capacity report:
To calibrate the battery and get a more accurate capacity report:


# Charge it up '''fully''', using a wall power adapter.
# Charge it up '''fully''', using a wall power adapter.
# Unplug the device, then allow the battery to run all the way down. This may take quite a while to happen (&gt;24hrs, but can be made shorter by running a CPU intensive workload). Do not let it charge at all during this time. This means you may not use USB for example, as this automatically causes the device to start charging, albeit slowly.
# Unplug the device, then allow the battery to run all the way down. This may take quite a while to happen (&gt;24hrs, but can be made shorter by running a CPU intensive workload). Do not let it charge at all during this time. This means you may not use USB for example, as this automatically causes the device to start charging, albeit slowly.
# When the voltage reaches 3248mV, the battery charge gauge chip will be calibrated. You may charge it up again to use the device. Note it may require a number of learning cycles to more accurately learn the battery capacity
# When the voltage reaches 3248mV (the EDV1 threshold burned into the fuel gauge's EEPROM), the battery charge gauge chip will be calibrated. You may charge it up again to use the device. Note it may require a number of learning cycles to more accurately learn the battery capacity.
 
Unfortunately, it is not possible to calibrate an N900 that has a non-functional USB port (which is rather common). In this case, all battery utilities will permanently report a 0% capacity. The battery status will still be monitored by the kernel/udev, and when it gets low, the system will automatically be shutdown gracefully.


[http://www.ti.com/lit/ds/symlink/bq27200.pdf Datasheet for the bq27200 charge gauge chip]
[http://www.ti.com/lit/ds/symlink/bq27200.pdf Datasheet for the bq27200 charge gauge chip]
==== Battery Protection ====
Currently, when battery gets below suitable operating voltage, the device dies. This is bad for the battery and the file system. [https://gist.github.com/NikkSaan/800c17d87dddfaa9edf5274130717d73 Here] is a script that monitors the battery, and powers the device off before the battery reaches critical state. For suggested usage, read the program's comments.


==== Temperature ====
==== Temperature ====
Line 378: Line 335:
==== Setting the hardware clock ====
==== 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:
If your hardware clock doesn't have the time set you can set it with:


<source lang="shell-session">
<syntaxhighlight lang="shell-session">
$ date -s "2017-08-14 16:34:50"
$ date -s "2017-08-14 16:34:50"


# Write the current system time to the hardware clock
# Write the current system time to the hardware clock
$ hwclock -w</source>
$ hwclock -w
</syntaxhighlight>


==== Setting the hardware alarm clock ====
==== Setting the hardware alarm clock ====
Line 391: Line 349:


Control trough <code>rtcwake</code> [https://linux.die.net/man/8/rtcwake (Manual Page)].
Control trough <code>rtcwake</code> [https://linux.die.net/man/8/rtcwake (Manual Page)].
<source lang="shell-session">
<syntaxhighlight lang="shell-session">
# Suspends the device to memory for 10 seconds
# Suspends the device to memory for 10 seconds
rtcwake --verbose --seconds 10 --mode mem
rtcwake --verbose --seconds 10 --mode mem
Line 398: Line 356:
rtcwake --verbose --time_t $TIME --mode no
rtcwake --verbose --time_t $TIME --mode no
/sbin/poweroff
/sbin/poweroff
</source>
</syntaxhighlight>


Manual control from sysfs:
Manual control from sysfs:
<source lang="shell-session">
<syntaxhighlight lang="shell-session">
# To set the wakealarm directly, set $TIME to number of seconds since epoch (1970-01-01). Then poweroff or suspend:
# To set the wakealarm directly, set $TIME to number of seconds since epoch (1970-01-01). Then poweroff or suspend:
echo $TIME > /sys/class/rtc/rtc0/wakealarm
echo $TIME > /sys/class/rtc/rtc0/wakealarm
Line 407: Line 365:
# To set new wakealarm time, first reset time to 0!
# To set new wakealarm time, first reset time to 0!
echo 0 > /sys/class/rtc/rtc0/wakealarm
echo 0 > /sys/class/rtc/rtc0/wakealarm
</source>
</syntaxhighlight>


{{note| When setting number of seconds since epoch, make sure you account for your timezone and see how your realtime clock keeps the time (utc or local)!}}
{{note| When setting number of seconds since epoch, make sure you account for your timezone and see how your realtime clock keeps the time (utc or local)!}}
Line 413: Line 371:
=== SMS ===
=== SMS ===


You can use ofono test scripts
You can use [[Modem#oFono|ofono]] test scripts


<code>sudo apk add ofono-scripts; cd /usr/lib/ofono/test</code>
<code>sudo apk add ofono-scripts; cd /usr/lib/ofono/test</code>
Line 419: Line 377:
Here's an example using the test scripts to enable the modem and send an SMS:
Here's an example using the test scripts to enable the modem and send an SMS:
<pre>
<pre>
# ./enable-modem
$ ./enable-modem
# ./online-modem
$ ./online-modem
# ./send-sms 5033784582 "I like pizza." 0
$ ./receive-sms  
</pre>
</pre>


Line 442: Line 400:
=== GPRS ===
=== GPRS ===


GPRS can be managed by [https://pkgs.alpinelinux.org/package/edge/testing/armhf/connman connman]. Either install connman using <code>apk</code> or add it when installing pmOS by passing <code>--add connman</code> to <code>pmbootstrap</code>.
GPRS can be managed by NetworkManager.
 
{{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 <code>/etc/connman/main.conf</code> '''BEFORE''' starting connman, else it will take over all network connection handling and disconnect you if you are connected over SSH:
 
{{hc|/etc/connman/main.conf|<nowiki>
NetworkInterfaceBlacklist = usb,wlan
</nowiki>}}
 
Configure connman to start at boot:


<code>$ sudo rc-update add connman</code>
{{note|Once you perform the following steps, the GPRS connection will be established by NetworkManager automatically on every boot.}}


Stop ofono in order to set APN:
Stop ofono in order to set APN:
Line 482: Line 430:
<pre>
<pre>
$ sudo rc-service ofono start
$ sudo rc-service ofono start
$ sudo connmanctl enable cellular
$ sudo rc-service networkmanager stop
$ sudo rc-service networkmanager start
</pre>
</pre>


In some cases, it seems necessary to run a scan before the necessary service will show in connman, even though the scan is 'unsupported':
<pre>
<pre>
$ sudo connmanctl scan cellular                                                               
Error /net/connman/technology/cellular: Not supported                                   
$ sudo connmanctl services
cellular_340369959729712_context1
</pre>
Connect to the cellular service:
<pre>                               
$ sudo connmanctl connect cellular_340369959729712_context1                                   
Connected cellular_340369959729712_context1
$ ip addr show gprs0
$ ip addr show gprs0
10: gprs0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UNKNOWN qlen 10
10: gprs0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UNKNOWN qlen 10
Line 507: Line 444:
=== GPS ===
=== 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.
Install the package <code>gps-nokia-n900</code>, then run as follows:


<pre>
<pre>
mkdir /my
sudo GPS_PTY_LINK=/tmp/n900-gps gps-nokia-n900 -d
cd /my
git clone https://gitlab.com/tui/tui.git
</pre>
</pre>


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.
The NMEA stream will be available at <code>/tmp/n900-gps</code>.


<pre>
{{note| The modem must be Powered on in order to get data from the GPS chip. While it is not absolutely required for the modem to be set Online, it is recommended to do so}}
apk add gcc vala musl-dev make linux-headers gpsd
cd /my/tui/ofone
make gps2
./gps2
</pre>
 
gps2 reportedly can talk to gpsd. Needs further investigation.


=== FM Transmitter ===
=== FM Transmitter ===
Line 530: Line 458:
The N900 contains an Si4713 FM transmitter, it's controlled by video4linux. To start transmitting:
The N900 contains an Si4713 FM transmitter, it's controlled by video4linux. To start transmitting:


<source lang="shell-session">
<syntaxhighlight lang="shell-session">
$ v4l2-ctl -d /dev/radio0 --set-ctrl=mute=0 --set-freq=95.21
$ v4l2-ctl -d /dev/radio0 --set-ctrl=mute=0 --set-freq=95.21
Now there should be silence on 95.21Mhz instead of noise when tuning in with a radio
Now there should be silence on 95.21Mhz instead of noise when tuning in with a radio
$ aplay -vv some-very-good-music.wav
$ aplay -vv some-very-good-music.wav
</source>
</syntaxhighlight>


=== Torch ===
=== Torch ===
Line 543: Line 471:
However, '''BE WARNED:''' setting wrong values via i2c runs the risk of over-driving the LEDs and causing permanent hardware damage.
However, '''BE WARNED:''' setting wrong values via i2c runs the risk of over-driving the LEDs and causing permanent hardware damage.


<source lang="shell-session">
<syntaxhighlight lang="shell-session">
Install the prerequisites
Install the prerequisites
$ sudo apk add i2c-tools
$ sudo apk add i2c-tools
Line 566: Line 494:
$ echo 0 | sudo tee /sys/class/gpio/gpio88/value
$ echo 0 | sudo tee /sys/class/gpio/gpio88/value
$ echo 88 | sudo tee /sys/class/gpio/unexport
$ echo 88 | sudo tee /sys/class/gpio/unexport
</source>
</syntaxhighlight>


== Resources ==
== Resources ==
* {{Device package|nokia-n900|community}}
* {{Device package|nokia-n900|community}}
* {{Kernel package|nokia-n900|community}}
* {{Kernel package|postmarketos-omap|community}}
* [https://kernel.org Kernel source]
* [https://kernel.org Kernel source]
* [https://web.archive.org/web/20131117073524/http://skeiron.org/tablets-dev/nokia_N900/ Images and Flashers for Maemo]
* [https://web.archive.org/web/20131117073524/http://skeiron.org/tablets-dev/nokia_N900/ Images and Flashers for Maemo]

Latest revision as of 10:32, 24 March 2025

Nokia N900
Nokia N900 running cmus
Nokia N900 running cmus
Manufacturer Nokia
Name N900
Codename nokia-n900
Released 2009
Type slide-out keyboard handset
Hardware
Chipset TI OMAP 3430
CPU 1x 600 MHz Cortex-A8
GPU PowerVR SGX530
Display 800x480 TFT resistive
Storage 32 GB
Memory 256 MB
Architecture armv7
Software
Original software Maemo
Original version 5 (Fremantle) (Linux 2.6.28)
postmarketOS
Category community
Pre-built images yes
postmarketOS kernel Mainline Linux
Unixbench Whet/Dhry score 58.4
Features
Flashing
Broken
USB Networking
Works
Internal storage
Works
SD card
Works
Battery
Works
Screen
Works
Touchscreen
Works
Keyboard
Works
Multimedia
3D Acceleration
Broken
Audio
Works
Camera
Partial
Camera Flash
No data
IR TX
Works
Connectivity
WiFi
Works
Bluetooth
Broken
GPS
Works
Modem
Calls
Partial
SMS
Works
Mobile data
Works
Miscellaneous
FDE
Works
HDMI/DP
No data
Sensors
Accelerometer
Works
Ambient Light
Works
Proximity
Works
Hall Effect
No data
Haptics
Works
Barometer
No data
U-Boot
Primary Bootloader
No data
Secondary Bootloader
Works
Mainline
Works
Internal Storage
Works
SD card
Works
USB Peripheral
Works
Display
Works
Keyboard
Works
Buttons
Works
Running i3wm
Splash screen

Contributors

Users owning this device


Additional info

Cameras are supported in the kernel, but have very complex media pipelines. Megapixels has preliminary support for at least the rear/main camera.

The GPU is a PowerVR SGX530 which does not have FOSS drivers, so 3D acceleration does not work with the mainline kernel. However, the blobs, patched mesa, and patched wlroots that permit it to work on mainline with postmarketOS are maintained in the pvrports project. It packages the work of the linux openpvrsgx dev group , which maintains a "near-mainline" kernel fork with the required kernel driver.

Voice calls work, but need https://gitlab.com/libcmtspeechdata/libcmtspeechdata to route the speech data. Integrating this in pmOS is WIP.

There's bluetooth support at bluetooth-next, but that works on N950, not on N900. Bluetooth . The driver compiles fine and loads firmware correctly, then times out on the bluetooth 'read_BD_ADDR' HCI command.

The FM receiver, located inside the bluetooth chip, is enabled by a magic bluetooth packet, so it requires a working bluetooth stack to be available. Otherwise it is a regular i2c device and has simple routing to the codec. Its driver needed some work in the kernel and was eventually dropped. It should not be too difficult to get it working once chip is enabled.

OTG might work since the kernel has support. However, like Wileyfox_Swift_(wileyfox-crackling), there is a hardware limitation that prevents the N900 from automatically detecting that there's a connected device, and also detecting the USB version/speed it supports. With some work, it most likely should work with manual activation

Installation

Boot from the SD card

  1. Follow the instructions on the installation page for installing postmarketOS to the SD card. Running from internal storage is not recommended and probably has no real benefit since it is quite slow.
  2. If you do not already have u-boot installed, boot Maemo Fremantle (the stock OS) and install u-boot from pali. If this does not work from Hildon Application Manager, you may run sudo apt-get install u-boot-flasher in maemo terminal (see wiki#16 and pmbootstrap#1371). See Additional Info below for instructions on configuring pmos to boot by default.
  3. Place the sdcard into the n900 and boot it with the keyboard slide open
  4. Choose the u-boot shell
  5. enter run sdboot into the shell

Configuring U-boot (optional)

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 as 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.

Features

Wifi

You can use NetworkManager's console UI to connect to your network. Please note that nmtui does not work properly when started from tmux.

$ nmtui

With iwd

From the 5.15.13 kernel package onward, you are also able to use iwd to manage wireless, if you so prefer.

Power saving / ping times

It should be possible to disable power saving for better ping times, see maemo-leste#172.

$ sudo apk add iw
$ sudo iw dev wlan0 set power_save off

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

Keyboard layout

The keyboard layout is asked during pmbootstrap init after you select the nokia-n900 device.

Available keymaps:

us/rx51_us
ch/rx51_ch
se/rx51_se and fi/rx51_fi (same for Swedish and Finnish).
it/rx51_it

and es/rx51_es and pt/rx51_pt (same for Spanish a Portugese)

Console

NOTE: during installation pmbootstrap will typically ask you for the desired keymap. The following is only for experimentation: normally all should just work fine after setting up the SD card from pmbootstrap. The following section may be dated and pmbootstrap has already done the job for you.

To obtain your desired language keymap file for the RX-51, such as this one:

  • On the N900, install kbd-bkeymaps, either by using pmbootstrap install --add kbd-bkeymaps on the host system or by running apk add kbd-bkeymaps 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.

(TODO: Need to pull 'official' vconsole keymaps from Maemo5 if they exist..)

X11

NOTE: during installation pmbootstrap will typically ask you for the desired X11 xkb keymap. The following is only for experimentation: normally all should just work fine after setting up the SD card from pmbootstrap. The following section may be dated and pmbootstrap has already done the job for you.

In X11 you can use setxkbmap to configure the desired layout.

Right now it's configured to use the nokiarx51/us layout by default (see 40-xkb.conf) then the pmbootstrap script will patch this file to set the Option "XkbLayout" to "nn" where "nn" is your country code.

Note Info: Tab is ctrl+i

Console switching

You can use the blue arrow key in combination with the Volume Up/Down to switch to a different virtual terminal.

If you installed postmarketOS with a UI, you first have to enable again the other VT by editing the /etc/inittab file and uncomment the following lines:

...
# Set up a couple of getty's
tty1::respawn:/sbin/getty 38400 tty1
tty2::respawn:/sbin/getty 38400 tty2
tty3::respawn:/sbin/getty 38400 tty3
tty4::respawn:/sbin/getty 38400 tty4
tty5::respawn:/sbin/getty 38400 tty5
tty6::respawn:/sbin/getty 38400 tty6
...

Display

With DRM enabled (pmbootstrap!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

To adjust brightness:

# # Replace $VAL with a value from 0 to 255:
# echo $VAL > /sys/class/backlight/acx565akm/brightness

GUI

i3wm

I3wm is the recommended UI. It is lightweight and fast, and we have a custom N900 configuration that optimizes for its keyboard (photos). The most important keybindings are described below, for details see i3wm.conf. This file gets installed to ~/.config/i3/config and of course you can customize it. If you have good additions, please make a merge request so everybody benefits from an improved default config.

default mode
  • shift + space: switch to "command mode"
command mode
  • t: open terminal
  • k: kill current program
  • w: workspace mode
  • r: restart i3wm (use after modifying the config)
  • q: go back to "default mode"
workspace mode
  • a/s/d/f/g: switch to workspace 1/2/3/4/5
  • q: go back to "command mode"
Other
Display brightness

With the current configuration, you can adjust the display brightness using the volume keys while holding the Shift key

Xfce4

Xfce4 also works very well on the N900

Sxmo (dwm or sway)

Sxmo also supports the Nokia N900, and also includes a fully-featured deviceprofile. However, note that sxmo has very high CPU usage on the N900, evidently due to the daemons that keep the environment working. It is recommended to disable as many of its daemons as possible, e.g. conky.

Others

There are also Mate, etc.

Misc: Middle click and right click

Obviously, you can't middle click with a touchscreen, but this can be annoying when it's one of the few ways to paste in the terminal. This script simulates a middle click:

xdotool mousedown --clearmodifiers 2
xdotool mouseup 2
xdotool keyup alt
xdotool keyup ctrl
xdotool keyup shift

For simulating right click button you can use this command:

xdotool click 3

You can bind it to any key you wish. XF86WebCam is a good choice since it's fairly easy to reach and isn't used for anything.

Battery

Charging

Battery charging is fully supported by the kernel and does not need any special configuration.

Normally, the N900 will auto-detect the connected charger type, and pull an appropriate current from it. However, in the event that this does not work, you can adjust it manually as follows:

~$ echo 'host' | sudo tee /sys/class/power_supply/bq24150a-0/mode         # sets current limit to 500mA
~$ echo 'dedicated' | sudo tee /sys/class/power_supply/bq24150a-0/mode    # sets current limit to 1800mA

You can also directly set the current limit by writing one of:

 100
 500
 800
1800

to /sys/class/power_supply/bq24150a-0/current_limit. Any other value written will be rounded to the next higher number from this list.

Be sure that the charger/port can supply the amount of current safely

Hint: To disable the LED charging indication, do:

echo 0 > /sys/class/power_supply/bq24150a-0/stat_pin_enable.

Datasheet for the bq24150 charging chip

Battery Capacity Reporting

To calibrate the battery and get a more accurate capacity report:

  1. Charge it up fully, using a wall power adapter.
  2. Unplug the device, then allow the battery to run all the way down. This may take quite a while to happen (>24hrs, but can be made shorter by running a CPU intensive workload). Do not let it charge at all during this time. This means you may not use USB for example, as this automatically causes the device to start charging, albeit slowly.
  3. When the voltage reaches 3248mV (the EDV1 threshold burned into the fuel gauge's EEPROM), the battery charge gauge chip will be calibrated. You may charge it up again to use the device. Note it may require a number of learning cycles to more accurately learn the battery capacity.

Unfortunately, it is not possible to calibrate an N900 that has a non-functional USB port (which is rather common). In this case, all battery utilities will permanently report a 0% capacity. The battery status will still be monitored by the kernel/udev, and when it gets low, the system will automatically be shutdown gracefully.

Datasheet for the bq27200 charge gauge chip

Temperature

There's battery temperature sensor.

$ cat /sys/devices/platform/68000000.ocp/48072000.i2c/i2c-2/2-0055/power_supply/bq27200-0/temp ; \
  cat /sys/devices/virtual/thermal/thermal_zone0/temp
324
32400

Clock

Setting the hardware clock

If your hardware clock doesn't have the time set you can set it with:

$ date -s "2017-08-14 16:34:50"

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

Setting the hardware alarm clock

Realtime clock at /dev/rtc0 is on the twl4030 (PMU), and allows setting an alarm to wake the device from sleep, poweroff states.

Control trough rtcwake (Manual Page).

# Suspends the device to memory for 10 seconds
rtcwake --verbose --seconds 10 --mode mem

# Power off the device and power it on after $TIME, where $TIME is the number of seconds since epoch (1970-01-01)
rtcwake --verbose --time_t $TIME --mode no
/sbin/poweroff

Manual control from sysfs:

# To set the wakealarm directly, set $TIME to number of seconds since epoch (1970-01-01). Then poweroff or suspend:
echo $TIME > /sys/class/rtc/rtc0/wakealarm
 	
# To set new wakealarm time, first reset time to 0!
echo 0 > /sys/class/rtc/rtc0/wakealarm
Note When setting number of seconds since epoch, make sure you account for your timezone and see how your realtime clock keeps the time (utc or local)!

SMS

You can use ofono test scripts

sudo apk add ofono-scripts; cd /usr/lib/ofono/test

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

$ ./enable-modem
$ ./online-modem
$ ./receive-sms 

USB Gadget

Mass Storage

The Mass Storage class exposes a block device as a flash drive on your host machine.

For example, to use the "MyDocs" partition as Mass Storage Device, make sure you unmount the partition first (if mounted), then execute:

echo /dev/mmcblk1p1 > /sys/devices/platform/68000000.ocp/480ab000.usb_otg_hs/musb-hdrc.0.auto/gadget/lun0/file

If you only need read permissions on the partition, you can set the read-only flag before exporting it:

echo 1 > /sys/devices/platform/68000000.ocp/480ab000.usb_otg_hs/musb-hdrc.0.auto/gadget/lun0/ro

GPRS

GPRS can be managed by NetworkManager.

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

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 rc-service networkmanager stop
$ sudo rc-service networkmanager start
$ 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

Install the package gps-nokia-n900, then run as follows:

sudo GPS_PTY_LINK=/tmp/n900-gps gps-nokia-n900 -d

The NMEA stream will be available at /tmp/n900-gps.

Note The modem must be Powered on in order to get data from the GPS chip. While it is not absolutely required for the modem to be set Online, it is recommended to do so

FM Transmitter

The N900 contains an Si4713 FM transmitter, it's controlled by video4linux. To start transmitting:

$ v4l2-ctl -d /dev/radio0 --set-ctrl=mute=0 --set-freq=95.21
Now there should be silence on 95.21Mhz instead of noise when tuning in with a radio
$ aplay -vv some-very-good-music.wav

Torch

The device has an ADP1653 flash controller, mainly for use with the camera. It drives two white power LEDs connected in series, and has an additional red indicator led (referred to as a privacy indicator). The ADP1653 has a driver in mainline kernel, and it probes fine. However, some DTS changes are needed to make it work, since the driver requires it to be tied to a camera.

In the meantime, the LEDs can be used as a torch manually using i2cset. However, BE WARNED: setting wrong values via i2c runs the risk of over-driving the LEDs and causing permanent hardware damage.

Install the prerequisites
$ sudo apk add i2c-tools

Unload the driver in case it is already loaded. We will use i2c manually
$ sudo modprobe -r adp1653

Enable the chip
$ echo 88 | sudo tee /sys/class/gpio/export
$ echo "out" | sudo tee /sys/class/gpio/gpio88/direction
$ echo 1 | sudo tee /sys/class/gpio/gpio88/value

Turn the torch on, using the lowest torch current - DO NOT use other values here or you risk burning the LED
Values between 1 and 7 enable the red privacy/recording led, with different intensity
0x8 is the lowest torch intensity, and we do not recommend going above it
$ sudo i2cset -y 2 0x30 0x0 0x8

Turn the torch off
$ sudo i2cset -y 2 0x30 0x0 0x0

Disable the chip
$ echo 0 | sudo tee /sys/class/gpio/gpio88/value
$ echo 88 | sudo tee /sys/class/gpio/unexport

Resources

Helpful Links for Porting