PINE64 PinePhone (pine64-pinephone): Difference between revisions
add: changing the RAM clock frequency |
sxmo is no longer edge only |
||
Line 73: | Line 73: | ||
** Phosh: Purism's GTK based phone interface (This is what we shipped with the postmarketOS community edition.) ([[Phosh|more]]) | ** Phosh: Purism's GTK based phone interface (This is what we shipped with the postmarketOS community edition.) ([[Phosh|more]]) | ||
** Plasma Mobile (edge only): KDE's Plasma based phone interface ([https://www.plasma-mobile.org/ more]) | ** Plasma Mobile (edge only): KDE's Plasma based phone interface ([https://www.plasma-mobile.org/ more]) | ||
** Sxmo | ** Sxmo: Simple X Mobile interface, a tiling WM based interface ([https://sr.ht/~mil/Sxmo/ more]) | ||
** (Note that [[User-Interfaces|more interfaces]] are available, build your own image with pmbootstrap if interested) | ** (Note that [[User-Interfaces|more interfaces]] are available, build your own image with pmbootstrap if interested) | ||
* Pick the latest image by its date | * Pick the latest image by its date |
Revision as of 22:02, 2 May 2021
Find and report PinePhone related issues here. Keep in mind that postmarketOS currently is in beta. Join the chat if you have questions.
![]() A PinePhone with a case | |
Manufacturer | PINE64 |
---|---|
Name | PinePhone |
Codename | pine64-pinephone |
Released | 2019 |
Hardware | |
Chipset | Allwinner A64 |
CPU | 4x 1152 MHz Cortex-A53 |
GPU | Mali-400 MP2 |
Display | 720x1440 IPS |
Storage | 16 GB / 32 GB |
Memory | 2 GB / 3 GB |
Architecture | aarch64 |
Software | |
Original software | postmarketOS |
postmarketOS | |
Category | main |
Pre-built images | yes |
Unixbench Whet/Dhry score | 1314.3 |
USB Networking |
Works |
---|---|
Internal storage |
No data |
SD card |
No data |
Battery |
Works |
Screen |
Works |
Touchscreen |
Works |
Multimedia | |
3D Acceleration |
Works |
Audio |
Works |
Camera |
Partial |
Camera Flash |
No data |
Connectivity | |
WiFi |
Works |
Bluetooth |
Works |
GPS |
Works |
NFC |
No data |
Modem | |
Calls |
Works |
SMS |
Works |
Mobile data |
Works |
Miscellaneous | |
FDE |
Works |
USB OTG |
Broken |
HDMI/DP |
No data |
Sensors | |
Accelerometer |
Works |
Magnetometer |
No data |
Ambient Light |
No data |
Proximity |
No data |
Hall Effect |
No data |
Haptics |
No data |
Barometer |
No data |

The PinePhone is a smartphone by PINE64. The postmarketOS vendor and device names are "pine64" and "pinephone" respectively. The back panel can be lifted off by pulling at the notch on the bottom-right corner of the phone. This exposes the battery, microSD and SIM slots, and dipswitches. It comes with a 3000mAh battery and uses the same form-factor as the Samsung Galaxy J7 (2015) for replacement.
Contributors
- MartijnBraam
- z3ntu
- bshah
- ollieparanoid
- (and many more!)
Installation
The PinePhone will boot from a bootable microSD card if it is plugged, and fall back to booting from internal eMMC. You can install postmarketOS on either of them (or even on both).
From pre-built image (easy method)
Official images of postmarketOS for the PinePhone are built at least every week. There are quite a few images to choose from, so read the following to help you navigate through the downloads page. (Weekly images are brand new, it's planned to make the download pages more self-explaining: build.postmarketos.org#78).
Download the right image
- Branch (more):
- User interface
- Phosh: Purism's GTK based phone interface (This is what we shipped with the postmarketOS community edition.) (more)
- Plasma Mobile (edge only): KDE's Plasma based phone interface (more)
- Sxmo: Simple X Mobile interface, a tiling WM based interface (more)
- (Note that more interfaces are available, build your own image with pmbootstrap if interested)
- Pick the latest image by its date
- Choose the regular image, or the installer image
- Graphical Installer:
- Ends in
-installer.img.xz
- Recommended for a proper installation.
- Allows to install postmarketOS to the microSD card or to internal memory (eMMC)
- Encrypting your installation is possible
- Passwords for user and SSH are set during installation (and SSH can be disabled)
- Default username is
user
(this is mostly relevant to Sxmo as the "installer program was created with phosh and plasma mobile in mind and those [installers] allow only for 1 user") - On a similar note, the password for Sxmo is the pin that you set up during the installer
- Ends in
- Regular image:
- Ends in
.img.xz
- Like a live CD, flash it to your microSD card to try postmarketOS out.
- The login is
user
with password147147
- sshd is currently enabled by default! (build.postmarketos.org#85)
- Ends in
- Graphical Installer:
Flash to microSD card
After downloading the image, figure out the name of the microSD card. Run lsblk
once, then insert the microSD card and run lsblk
again. The microSD card is the newly appeared device, and you can take a look at the reported size to be extra sure. You should really double check that you pick the right device, otherwise you can overwrite the wrong disk by accident. Flash the image as shown below, replace /dev/mmcblk...
with the device name of your microSD card.
$ cd ~/Downloads
$ xzcat 20210127-2313-postmarketOS-edge-phosh-6-pine64-pinephone-installer.img.xz | sudo dd of=/dev/mmcblk... status=progress
When you are done, insert the microSD into your PinePhone and boot it up. Note that the microSD fits in the SIM slot, but that does of course not work.
With pmbootstrap (advanced)
Use pmbootstrap to build a customized image. Consult the installation guide for details.
$ pmbootstrap init # vendor: pine64, device: pinephone
$ pmbootstrap install --sdcard=/dev/mmcblk... # add --fde for full disk encryption
After that, unplug the microSD card from your PC, put it in your PinePhone and postmarketOS should boot up.
Flash to eMMC (advanced)
The easiest way of flashing to the eMMC is using a pre-built image with the installer, as it will simply ask during the installation if you want to install to eMMC. However, if you want to flash a custom image to eMMC, follow these steps.
Download Jumpdrive and put it on a microSD.
$ wget https://github.com/dreemurrs-embedded/Jumpdrive/releases/download/0.7/pine64-pinephone.img.xz
$ sha512sum pine64-pinephone.img.xz
79019771a7ade68a6e97e030e835b6357a3f71bae7cb3297e8772f8e069bd26033809f43ead7a0dfdf82d0ea537a7e3530c6d8935a9af040c6da211dc2ebdbb3 pine64-pinephone.img.xz
$ xzcat pine64-pinephone.img.xz | sudo dd of=/dev/mmcblk... status=progress
Insert the microSD into your pinephone and connect it via USB to your PC. Boot it up. Check in lsblk
for new storage devices, the eMMC and microSD storage devices of the pinephone should appear. Triple-check that you found the right device, and now you can flash to it as if it was a SD card attached to your PC.
As of writing, Jumpdrive doesn't have a shutdown procedure (#2). Maybe leave it on for a few more minutes after the dd
command is done to make sure that the data isn't still in some cache, but really written to the eMMC (the author had data corruption once, which might be related to turning it off too quickly after flashing). Then press the power button for five seconds to power it off. Remove the microSD card, turn it on again. The PinePhone should boot into postmarketOS.
Serial console
The PinePhone has a serial port in the headphone connector, it's activated by the 6th contact on the dipswitch. If the switch is on then the headphone connector is in audio mode, if it's off then it's in UART mode.
The uart is 115200n8
The pinout for the serial connector on the headphone jack is:
- Tip: RX
- Ring: TX
- Sleeve: GND
The serial connection is 3.3V
You can also buy the debug cable from PINE64 Store. The store cable uses a 4 ring plug, as seen in the PDF, but a 3 ring plug works just as well.
Hardware switches
There's a 6 contact dipswitch on the back of the phone underneath the back cover. The 6 switches are for enabling/disabling hardware components. The switch has tiny numbers 1-6 beneath the contacts, moving the contact up sets that contact on.
# | Off | On |
---|---|---|
1 | Modem disabled | Modem enabled |
2 | Wifi/BT disabled | Wifi/BT enabled |
3 | Microphone disabled | Microphone enabled |
4 | Rear camera disabled | Rear camera enabled |
5 | Front camera disabled | Front camera enabled |
6 | Headphone UART mode | Headphone audio mode |
Expansion port
There is a 2x3 grid of pogo pins on the back of the PinePhone for connecting a back cover with extra hardware like an extended battery case or a keyboard case. The pinout for this connector:
Interrupt | SDA | SCL |
5V / VBUS | VBAT | GND |
The VBUS pin is powered by USB and is 5V. The second power pin is VBAT, which connects to the battery voltage. The I2C and interrupt lines have pull-ups on the phone side. The I2C lines are pulled up to 3V3 by the phone.
Components
Component | Model | Driver |
---|---|---|
Touchscreen | Goodix GT917S | TOUCHSCREEN_GOODIX |
Rear camera | OmniVision OV5640 | VIDEO_OV5640 |
Camera flash | SGMICRO SGM3140 | LEDS_SGM3140 |
Front camera | GalaxyCore GC2145 | Nope |
LCD | Xingbangda XBD599 | CONFIG_DRM_PANEL_XINGBANGDA_XBD599 |
WiFi | Realtek RTL8723CS | RTL8723CS |
Bluetooth | Realtek RTL8723CS | BT_HCIUART_RTL |
Modem | Quectel EC25-G | USB_NET_QMI_WWAN |
GNSS/GPS | Quectel EC25-G | CONFIG_USB_SERIAL_OPTION |
Magnetometer | ST LIS3MDL | IIO_ST_MAGN_3AXIS |
Ambient light / Proximity | SensorTek STK3335 | STK3310 |
Sixaxis | InvenSense MPU-6050 | INV_MPU6050_I2C |
Vibration motor | Unknown model | INPUT_GPIO_VIBRA |
Notification LED | LED0603RGB | LEDS_GPIO |
Volume buttons | Buttons connected to the KEYADC | KEYBOARD_SUN4I_LRADC |
Power button | X-Powers AXP803 | INPUT_AXP20X_PEK |
Battery fuel gauge | X-Powers AXP803 | BATTERY_AXP20X |
Cameras
The cameras both share the csi-0 bus. Currently only the rear camera (OV5640) has mainline linux support, a driver for the front camera (GC2145) is being developed in the kernel fork for the phone development.
Both camera's share the same bus for the video stream, due to this it's impossible to use both cameras at the same time, but you can switch between the cameras by keeping one of them in reset and then restarting the whole pipeline.
Switching to the rear camera
$ sudo media-ctl -d /dev/media1 --links "gc2145 3-003c":0->"sun6i-csi":0[0]
$ sudo media-ctl -d /dev/media1 --links "ov5640 3-004c":0->"sun6i-csi":0[1]
Switching to the front camera
$ sudo media-ctl -d /dev/media1 --links "ov5640 3-004c":0->"sun6i-csi":0[0]
$ sudo media-ctl -d /dev/media1 --links "gc2145 3-003c":0->"sun6i-csi":0[1]
The camera hardware pipeline is controlled with /dev/media1
and media-ctl
, the result is on /dev/video1
pinephone:~# media-ctl -d /dev/media1 --set-v4l2 '"ov5640 3-004c":0[fmt:UYVY8_2X8/1280x720]'
pinephone:~# ffmpeg -s 1280x720 -f video4linux2 -i /dev/video1 -vframes 1 selfie.jpg

Camera Flash
Please note, that the driver for the sgm3140 is not yet included in the main kernel source and as such is not available for use yet without compiling the module yourself.
The camera flash consist out of a SG Micro SGM3140 "500mA Buck/Boost Charge Pump LED Driver" and a EHP-C04 LED. It supports Flash and Torch mode, the first being brighter but only for 200-300ms, when it switches to Torch mode automatically. Torch mode is lower brightness but can be turned on continuously.
Controlling the flash from user space is possible via sysfs and via v4l2:
# Torch on
$ echo 1 > /sys/class/leds/white\:flash/brightness
# Torch off
$ echo 0 > /sys/class/leds/white\:flash/brightness
# Activate flash
$ echo 1 > /sys/class/leds/white\:flash/flash_strobe
# Torch on
$ v4l2-ctl -d /dev/video1 -c led_mode=2
# Torch off
$ v4l2-ctl -d /dev/video1 -c led_mode=0
# Activate flash
$ v4l2-ctl -d /dev/video1 -c led_mode=1
$ v4l2-ctl -d /dev/video1 -c strobe=1
WiFi
The wifi uses the rtl8723cs driver and is functional. There is still an issue with the driver not reloading correctly when the SoC is put into suspend mode, this can be worked around by reloading the kernel module:
pinephone:~# sudo rmmod 8723cs
pinephone:~# sudo modprobe 8723cs
Bluetooth
Main article: Bluetooth.
The bluetooth connection is handled by the wifi chipset. It is functional but there is no integration in Plasma Mobile yet. To pair a bluetooth device start the bluetooth service and use bluetoothctl to connect.
pinephone:~# sudo service bluetooth start
pinephone:~# bluetoothctl
# scan on
[NEW] 00:11:22:33:44:55
# pair 00:11:22:33:44:55
To use bluetooth headphones with pulseaudio, the package pulseaudio-bluez
is required.
Modem
Receiving and sending text messages works, The calls work but there are some issues left with the audio routing. Mobile data is functional. For information on audio routing and setting up the modem in phosh, see the specific article.
To bring up mobile data run the following commands (for plasma mobile):
pinephone:~# sudo apk add ofonoctl
pinephone:~# ofonoctl wan --connect --append-dns
Or use only modemmanager which integrates better with phosh.
pinephone:~# sudo mmcli -m 0 --create-bearer='apn=APN.NAME,user=USERNAME,password=PASSWORD,allowed-auth=chap,allow-roaming=no'
pinephone:~# sudo nmcli c add type gsm ifname cdc-wdm0 con-name OPERATOR-NAME apn APN.NAME user USERNAME password PASSWORD
# Check your connection
pinephone:~# nmcli c # check status of the connection named OPERATOR-NAME as above
pinephone:~# nmcli d # check status of cdc-wdm0
In order to connect to the serial console of the modem, you need a terminal application. One option is to use minicom
.
# apk add minicom
Connect to the console by issuing:
# minicom -D /dev/ttyUSB2
The command AT
returns OK:
AT
OK
The command ATI
returns some version information from the modem:
ATI
Quectel
EG25
Revision: EG25GGBR07A07M2G
OK
The command AT+QDAI
(Digital Audio Interface Configure) is used to configure the digital audio interface. AT+QDAI?
returns the current configuration:
AT+QDAI?
+QDAI: 3,0,0,4,0,0,1,1
OK
Some more details on how to configure the modem is available here. The reference for the available commands is the EC25 & EC21 AT Commands Manual.
VoLTE
The EG25 modem in the PinePhone comes preloaded with VoLTE profiles for a few providers. The modem can handle VoLTE fully internally so nothing complicated is required on the postmarketOS side. PostmarketOS tries to set the VoLTE profile automatically. If that fails it can also be set manually:
# List of embedded VoLTE profiles
$ echo 'AT+QMBNCFG="list"' | atinout - /dev/EG25.AT -
+QMBNCFG: "List",0,1,1,"ROW_Generic_3GPP",0x0501081F,201901141
+QMBNCFG: "List",1,0,0,"VoLTE-ATT",0x0501033C,201909271
+QMBNCFG: "List",2,0,0,"hVoLTE-Verizon",0x05010141,201911251
+QMBNCFG: "List",3,0,0,"Sprint-VoLTE",0x05010205,201908141
+QMBNCFG: "List",4,0,0,"Commercial-TMO_VoLTE",0x05010505,201811231
+QMBNCFG: "List",5,0,0,"Telus-Commercial_VoLTE",0x05800C43,201912031
+QMBNCFG: "List",6,0,0,"Commercial-SBM",0x05011C18,201904021
+QMBNCFG: "List",7,0,0,"Commercial-DT",0x05011F1C,201905311
+QMBNCFG: "List",8,0,0,"Reliance_OpnMkt",0x05011B38,201910161
+QMBNCFG: "List",9,0,0,"TF_Germany_VoLTE",0x05010C1B,201909201
+QMBNCFG: "List",10,0,0,"TF_Spain_VoLTE",0x05010CFA,201909261
+QMBNCFG: "List",11,0,0,"Volte_OpenMkt-Commercial-CMCC",0x05012071,201904281
+QMBNCFG: "List",12,0,0,"OpenMkt-Commercial-CT",0x05011322,201911081
+QMBNCFG: "List",13,0,0,"OpenMkt-Commercial-CU",0x05011505,201807052
OK
# Select the profile most applicable to your provider, or use the Generic one if nothing matches
$ echo 'AT+QMBNCFG="select","ROW_Generic_3GPP"' | atinout - /dev/EG25.AT -
OK
# Enable calling over ip (VoLTE)
$ echo 'AT+QCFG="ims",1' | atinout - /dev/EG25.AT -
OK
# Reboot the modem to apply the settings
$ echo 'AT+CFUN=1,1' | atinout - /dev/EG25.AT -
After this process VoLTE should be used when available. To check the status while in a call you can run the CLCC command:
$ echo 'AT+CLCC' | atinout - /dev/EG25.AT -
+CLCC: 1,1,0,1,0,"",128
+CLCC: 2,1,0,1,0,"",128
OK
The "1" in the 4th column on the second CLCC row means it's currently calling with VoLTE, when it's "0" it's calling over the legacy phone network.
Sensors
All sensors work and are accessible as Industrial I/O (iio) devices in Linux. To query the data you can cat the files in `/sys/bus/iio/` to make the kernel module query the sensors
pinephone:~# cat /sys/bus/iio/devices/iio\:device0/name
mpu6050
pinephone:~# cat /sys/bus/iio/devices/iio\:device0/in_accel_z_raw
-17594
pinephone:~# echo "Verified gravity still exists"
RGB Led
# Activate LED
echo 1 > /sys/class/leds/$COLOR/brightness
# Deactivate LED
echo 0 > /sys/class/leds/$COLOR/brightness
You may turn on and off the blue led by issuing:
# echo 1 > /sys/devices/platform/leds/leds/pinephone\:blue\:user/brightness
# echo 0 > /sys/devices/platform/leds/leds/pinephone\:blue\:user/brightness
Make sure you run these commands as root (sudo -i
), sudo echo 1 > /sys/devices/platform/leds/leds/pinephone\:blue\:user/brightness
, won't work.
Audio
Speakers
Sound output should work after unmuting AIF1 Slot 0 digital
Start by making sure alsa-utils are installed:
$ sudo apk add alsa-utils
You may use amixer, or alsamixer to unmute the required channels, and to control the volume:
Amixer:
$ amixer scontents
$ amixer sset Master unmute
Alsamixer (use terminal keyboard input to use up/down/left/right keys, to set volume and select devices):
$ alsamixer -V all
Test the sound output by issuing:
$ speaker-test -c3
USB Host (OTG)
USB-OTG is broken on hardware level and require soldering skills.
RAM
Changing the Clock Frequency
Only change the RAM clock frequency if you know what you are doing. Otherwise you will probably break your installation and need to reinstall postmarketOS! |
postmarketOS runs with a RAM clock of 528 MHz to be most compatible with all PinePhones. Some PinePhones support higher RAM clock frequencies, and if you know what you are doing you can change it by replacing 528 with 552 and even 624.
# update-u-boot -r 528
Find the frequency your PinePhone is currently running at in /proc/device-tree/memory/ram_freq
.
Details in pmaports!1998. Author of the patches BobbyTheBuilder also made a side-by-side video.
Troubleshooting
Modem's SMS cache is full and cannot receive SMS
ModemManager may not process all SMS, which can lead to the SMS cache getting full and not receiving future SMS. See pmaports#731 for instructions to clear the cache, and for details on how this is getting fixed.
Failed to create boot/xxx: No space left on device
A bug has been observed where too many initramfs's are created. To fix, run the following commands to delete and regenerate all initramfs's
postmarketos:~# sudo rm /boot/initramfs*
postmarketos:~# sudo apk fix linux-postmarketos-allwinner
Qt Based Browsers Not Loading Web Pages
Webkit sandbox is broken in the current build. In order to be able to use Qt based browsers it is necessary to create the file "/etc/profile.d/sandboxhack.sh" with the following contents:
#!/bin/sh
export QTWEBENGINE_DISABLE_SANDBOX=1
This sets an environment variable that kills the webkit sandbox because that's broken in the current build. This should be fixed already for the chromium musl build but not yet for all qtwebkit based browsers. This is being worked on here and here.
Fix broken boot partition
If postmarketOS gets stuck early in the booting process, it might fail to load the kernel / initramfs / initramfs-extra. The exact cause can be determined over serial (remember to toggle the headphone killswitch for that), if initramfs-extra is corrupt, it will look like this for example:
Extract /boot/initramfs-postmarketos-allwinner-extra gzip: unexpected end of file cpio: short read /init: line 233: parted: not found
The solution is to replace the contents of your boot partition with a known good one. You don't need a serial cable for that, the serial cable is only needed to figure out the exact cause.
Boot partition on eMMC
- Download the latest image from the same channel you are running (edge, v21.03, ...) (see above)
- Put it on your SD card
- Login via serial or SSH (user / 147147)
- Replace contents of your boot partition:
$ sudo mount /dev/mmcblk2p1 /mnt
$ cd /boot
$ sudo cp -v -r * /mnt
'allwinner' -> '/mnt/allwinner'
'boot.scr' -> '/mnt/boot.scr'
'initramfs-postmarketos-allwinner' -> '/mnt/initramfs-postmarketos-allwinner'
'initramfs-postmarketos-allwinner-extra' -> '/mnt/initramfs-postmarketos-allwinner-extra'
'lost+found' -> '/mnt/lost+found'
'sun50i-a64-pinephone-1.1.dtb' -> '/mnt/sun50i-a64-pinephone-1.1.dtb'
'sun50i-a64-pinephone-1.2.dtb' -> '/mnt/sun50i-a64-pinephone-1.2.dtb'
'uImage-postmarketos-allwinner' -> '/mnt/uImage-postmarketos-allwinner'
'uInitrd-postmarketos-allwinner' -> '/mnt/uInitrd-postmarketos-allwinner'
'vmlinuz-postmarketos-allwinner' -> '/mnt/vmlinuz-postmarketos-allwinner'
$ sudo umount /mnt
$ sudo poweroff
Wait until it is powered off. Then remove the SD card and start your phone, your boot partition should be working again. Remember to switch the killswitch again if you want to use your audio jack for audio.
Boot partition on SD card
- Download the latest image from the same channel you are running (edge, v21.03, ...) (see above)
- Plug the SD card into your computer
$ unxz 20210317-0042-postmarketOS-edge-phosh-6-pine64-pinephone.img.xz
$ sudo modprobe loop
$ sudo losetup -f --show -P 20210317-0042-postmarketOS-edge-phosh-6-pine64-pinephone.img
/dev/loop0
$ sudo dd if=/dev/loop0p1 of=/dev/mmcblkNp1
$ sudo losetup -d /dev/loop0
Replace /dev/mmcblkNp1
with the first partition of your SD card (see lsblk
).
See also
- pmaports!308 Initial merge request (Don't be evil devkit)
- pmaports!583 Initial merge request (PinePhone)
- PinePhone v1.1 - Braveheart - schematics, changes and known issues on the PINE64 wiki