Adaptations/PinePhone64

=Hardware Support=

Full information of hardware spec Here

PostMarket OS hardware information PostMarketOS Wiki

WiFi
The WiFi driver isn't available in the Linux kernel yet. However, we can compile it as an out-of-tree driver for now. See kernel building for more instruction

Bluetooth
The production version of the PineTab and PinePhone are both using the Realtek 8723CS WiFi/BT module. BT is natively supported after adding the necessary firmware from https://github.com/anarsoul/rtl8723bt-firmware/tree/master/rtl_bt Download all the  files and copy them to the   directory in the rootFS.

Setup
1. Make sure that the  plugin is enabled in the   of.

2. Remove the  file under.

3. Restart systemctl restart ofono

4. Install ofono-tests zypper in ofono-tests

5. Check if the QMI modem is properly detected: /usr/lib/ofono/test/list-modems

6. Unlock you SIM card (if needed): /usr/lib/ofono/test/enter-pin /quectelqmi_0 pin 

The EC25 Quectel modem is now ready :) Thanks to SuperPrower for the hard work!

Sending SMS
/usr/lib/ofono/test/send-sms   

To skip the delivery report, use  as argument.

Cameras
Thanks to: https://wiki.postmarketos.org/wiki/Pine_Don't_be_evil_devkit_(pine-dontbeevil)#Cameras Only the back camera is supported by the mainline kernel. To use it, you need to configure it first:

media-ctl --set-v4l2 '"ov5640 2-003c":0[fmt:UYVY8_2X8/1280x7200]' -d /dev/media1

Afterwards, you can take a picture with:

ffmpeg -s 1280x720 -f video4linux2 -i /dev/video1 -vframes 1 selfie.jpg

-  is the controller interface of the back camera

-  is the back camera stream interface

If that works, you can try  to make the camera available for system wide usage:]

gst-launch-1.0 v4l2src device=/dev/video1 num-buffers=1 ! 'video/x-raw,format=UYVY,width=1280,height=720' ! jpegenc ! filesink location=selfie.jpg cp selfie.jpg /home/nemo/Pictures

This command generates a  file and by copying it to   you can view it with the Gallery app.

Audio
1. Unmute the  channel using. Use  to unmute.

2. Same for  and increase the volume to 100 (default is 0).

2. Copy the default PulseAudio config: cp /etc/pulse/default.pa /etc/pulse/arm_native_config.pa

3. Enable ALSA modules in the new config: load-module module-alsa-sink load-module module-alsa-source device=hw:1,0 They are commented out by default.

4. Configure PulseAudio by changing  to   in.

5. Restart PulseAudio or reboot.

6. Go to the Settings app and test the sound output by playing a ringtone under Sounds and Feedback.

Video
WIP GStreamer support. Doesn't start the sink properly yet.

Pine devices should support hardware video codecs using https://github.com/bootlin/libva-v4l2-request

Install gstreamer1.0-vaapi. libva and libva-v4l2-request from the hwcommon repository

Pipeline to try to play an MPEG-2 video, which is most mature codec in v4l2-request so far:

GST_DEBUG=4 gst-launch-1.0 filesrc location=~/lion-sample.mov ! qtdemux ! h264parse ! vaapidecodebin ! vaapisink

You need to export some env variables:

LIBVA_V4L2_REQUEST_VIDEO_PATH=/dev/videoX LIBVA_DRIVER_NAME=v4l2_request GST_VAAPI_ALL_DRIVERS=1

then remove .cache/gstreamer1.0/.cache/gstreamer-1.0/registry.armv7l.bin

run gst-inspect-1.0 vaapi to see the detected elements.

PineTab
In pinetab we have jack to uart port cable. For enable UART console move selector nearby sd-card slot away from sd-card slot.

Testing the vibrator motor
You need to have the  enabled in your kernel config for this!

Vibrator motor is on pin. You can calculate the PIN number for PD2 as followed (more information):

echo "98" > /sys/class/gpio/export # Make pin available echo "out" > /sys/class/gpio/gpio98/direction # Set as output echo "1" > /sys/class/gpio/gpio98/value # On echo "1" > /sys/class/gpio/gpio98/value # Off echo "98" > /sys/class/gpio/unexport # When you're done

Notification LED
export COLOR=red # or green, blue is broken due to a hardware fault # Activate LED echo 1 > /sys/class/leds/$COLOR/brightness # Deactivate LED echo 0 > /sys/class/leds/$COLOR/brightness

The LED can be controlled in Mer by MCE. You need the  for this.

In the latest kernel, the control paths of the LED aren't the default ones that the MCE is expecting. This requires a config file to enable MCE to control the LED on the PinePhone devphone:

[LEDConfigHybris] # Choose Vanilla backend BackEnd=vanilla # Configure base directories for red/green/blue channels RedDirectory=/sys/class/leds/pinephone:red:user GreenDirectory=/sys/class/leds/pinephone:green:user BlueDirectory=/sys/class/leds/pinephone:blue:user

This config file must be saved in the following file:

=Installation=

Prepare SD card
Use GParted or any other tool to create the following  partitions:


 * 1) boot: Holds the mainline kernel Image and Device Tree files
 * 2) data: Holds the Sailfish OS rootFS

GParted will ask you to leave the first MB free of the SD card when creating the first partition, this is correct. This 1 MB will be used to store the U-boot boot loader.

Note: Make sure you have a  partition table! If not, the U-boot flashing will make partition table unusable (in case of GPT for example)!

U-Boot
We will now build the mainline U-boot boot loader from Git.

Clone ARM Trusted Firmware (master branch)
git clone https://github.com/ARM-software/arm-trusted-firmware.git

Build the BL31.bin
Follow the instructions here: https://github.com/u-boot/u-boot/blob/master/board/sunxi/README.sunxi64

Quick start: export CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 make PLAT=sun50i_a64 DEBUG=1 bl31 export BL31=/path/to/bl31.bin # Probably: ~/arm-trusted-firmware/build/sun50i_a64/debug/bl31.bin

Clone U-boot (master branch):
You can find the U-boot mirror repository on Github:

git clone https://github.com/u-boot/u-boot.git

Compile U-boot
You have to cross compile U-boot with the  arch:

export CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 make clean ARCH=arm64 make sopine_baseboard_defconfig # U-boot upstream, use pinephone_defconfig when using pine64-org's U-boot with enhanced PinePhone support ARCH=arm64 make

The  is the same for the Don't Be Evil devkit.

Burn U-boot to your SD card
Copy the compiled U-boot bootloader to the first sector on your SD card:

sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=8k seek=1

Manually loading the kernel
Serial TTY Baudrate over UART = 115200 for screen, example: You have to start screen first, before turning on the devkit.

Interrupt the U-boot autoboot process when you see a message in the U-boot prompt. We need to access the U-boot prompt to load the Kernel image and boot it manually!

Set bootargs:

setenv bootargs root=/dev/mmcblk0p2 rootwait panic=10

Kernel Image loading and Device Tree files:

ext4load mmc 0:1 ${kernel_addr_r} /Image ext4load mmc 0:1 ${fdt_addr_r} /sun50i-a64-pinephone.dtb

Boot the kernel:

booti ${kernel_addr_r} - ${fdt_addr_r}

Automatic boot
Create a  file for the PinePhone:

echo Setting bootargs setenv bootargs console=tty0 console=ttyS0,115200 root=/dev/mmcblk0p2 no_console_suspend rootwait quiet earlycon=uart,mmio32,0x01c28000 panic=10 consoleblank=0 loglevel=0 printenv echo Loading DTB load mmc 0:1 ${fdt_addr_r} /sun50i-a64-pinephone.dtb echo Loading kernel Image load mmc 0:1 ${kernel_addr_r} /Image echo Booting kernel NOW booti ${kernel_addr_r} - ${fdt_addr_r}

Create a  file for the PineTab:

echo Setting bootargs setenv bootargs console=tty0 console=ttyS0,115200 root=/dev/mmcblk0p2 no_console_suspend rootwait quiet earlycon=uart,mmio32,0x01c28000 panic=10 consoleblank=0 loglevel=0 printenv echo Loading DTB load mmc 0:1 ${fdt_addr_r} /sun50i-a64-pinetab.dtb echo Loading kernel Image load mmc 0:1 ${kernel_addr_r} /Image echo Booting kernel NOW booti ${kernel_addr_r} - ${fdt_addr_r}

Mount your  partition and run the following command: sudo mkimage -C none -A arm -T script -d /mnt/boot.cmd /mnt/boot.scr

This will translate the  file into a U-boot script.

If you don't have the  command available, you can install it from the   package.

Kernel
The PinePhone runs a mainline kernel, device tree modifications are done by all the PinePhone OS developers on Gitlab (https://gitlab.com/pine64-org/linux).

Clone the kernel
git clone https://gitlab.com/pine64-org/linux cd linux git checkout pine64-kernel

Configure the kernel

 * 1) Copy our kernel config: https://gitlab.com/pinephone-sailfish-os/linux-kernel/raw/master/pinephone-config
 * 2) Enter the   project:
 * 3) Copy the config file to   in the main directory

Enable WiFi out-of-tree driver
Add the driver to the kernel: cd drivers/staging git clone https://github.com/Icenowy/rtl8723cs.git

Configure the kernel build system now:


 * 1) Add this line to  :
 * 2) Add this line to  :
 * 3) Enable the driver in the kernel config:

See: https://gitlab.com/postmarketOS/pmaports/blob/master/main/linux-postmarketos-allwinner/rtl8723cs.patch

Build the kernel
We cross compile the kernel for ARM64. The  variable can be used to add a version to the build.

Cross compile the kernel: export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- export LOCALVERSION=-nemo make clean make defconfig KBUILD_DEFCONFIG=config-sailfishos-allwinner.aarch64 make -j4 Image modules dtbs

Install the kernel modules in a different path: make modules_install INSTALL_MOD_PATH=../linux_modules/

Install kernel
Copy the following things:

For pinethone  and   to the root of the   partition.
 * 1) Image from   to the root of the   partition.
 * 2) Device tree files

For pinetab  and   to the root of the   partition.
 * 1) Modules from   to   on the   partition.

Nemo Mobile
Nemo Mobile have same MW with SFOS but use gcc8 have aarch64 support and use newset version of packages.

git of device config: https://github.com/neochapay/nemo-device-dont_be_evil

For build last release of nemo use this ks file https://gist.github.com/neochapay/8d40f9ee1e5fd621e0053aa126d39e81

Github & OBS project
- https://github.com/sailfish-on-dontbeevil

- https://build.merproject.org/project/show/nemo:devel:hw:pine:dontbeevil

Flash rootFS
You can download the latest rootFS from the Gitlab SailfishOS Porters CI: https://gitlab.com/sailfishos-porters-ci/dont_be_evil-ci (see the artifacts of the latest CI job).

This  archive should be burned to the   partition of the SD card. It's important to burn it as the root user (not with sudo) to preserve extended attributes and ACLs:

sudo su bsdtar -xpf .tar.bz2 -C 

Device repos
To boot Lipstick, you need to add the device specific repos to the devkit. All the following commands are executed in a shell on the devkit.

Make sure you configure the ethernet interface first before you continue! You need to have access to the WWW to fetch the necessary repository data and packages.

Install zypper manually: curl -o augeas-lib.rpm http://repo.merproject.org/obs/mer:/core/latest_armv7hl/armv7hl/augeas-libs-1.6.0+git1-1.10.6.armv7hl.rpm curl -o zypper.rpm http://repo.merproject.org/obs/mer:/core/latest_armv7hl/armv7hl/zypper-1.14.6+git3-1.24.5.armv7hl.rpm rpm -Uvh *rpm

Use  to add the repo ssu ar common http://repo.merproject.org/obs/nemo:/devel:/hw:/common/sailfish_latest_armv7hl/ ssu ar dontbeevil http://repo.merproject.org/obs/home:/piggz:/dontbeevil/sailfishos_3.0.3.9_latest_armv7hl/ ssu ar jolla https://releases.jolla.com/releases/3.0.3.9/jolla/armv7hl/

Refresh the repo: zypper refresh

Install the device packages: zypper install dontbeevil:qt5-qtcore dontbeevil:qt5-qttest dontbeevil:lipstick-qt5 zypper install droid-config-dontbeevil # Select 1 for vendor change zypper install droid-config-dontbeevil-sailfish zypper install qt5-plugin-platform-eglfs # EGLFS LIMA plugin zypper install qt5-plugin-generic-evdev # evdev input plugins

Other useful packages zypper install mce-tools #useful for mcetool (mcetool -U activates the screen)

Unknown password
The Sailfish OS rootFS sets a random password when booting for the first time. You can only log in through the  debug interface. Since the  interface still requires manually setup, you can't access.

To circumvent this issue, you can login through the UART TTY interface. However you don't know the password of the  nor   users! To disable the  and   passwords, we can modify the   file:

sudo chmod +w /etc/shadow sudo vim /etc/shadow # Remove any characters where  is written: user1::16092:0:99999:7:::. sudo chmod -w /etc/shadow

By removing the hashed password, we can login with the user without entering a password. You can set a new password afterwards by running as a logged in user:

passwd

Init eth0
Enabling the  interface has to be done manually for now:

ifconfig eth0  route add default gw  echo "nameserver " > /etc/resolv.conf

Test your configuration with :

ping jolla.com

Lipstick crashing
Install Lipstick from the  repository:

zypper install dontbeevil:lipstick-qt5

As from 3.1.0.12, this fix is obsolete.

No setup wizard
Make sure the configuration package is installed:

zypper install droid-config-dontbeevil-sailfish

Missing regulatory.db for RT8723BS WiFi/BT module
git clone git://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git cd wireless-regdb cp regulatory* /lib/firmware