====== PinePhone ======
===== UB Ports Build process =====
for UB Ports, the build system is taken from [[https://gitlab.com/ubports/core/rootfs-builder-debos/-/blob/master/pinephone.yaml|pinephone.yaml]], This calls up [[https://gitlab.com/ubports/core/rootfs-builder-debos/-/blob/master/pine64-common.yaml|pine64-common.yaml]].
The pine64-common.yaml then calls up [[https://gitlab.com/pine64-org/linux/-/jobs/artifacts/pine64-kernel-ubports/download?job=build|the kernel]] built from the special [[https://gitlab.com/pine64-org/linux/-/tree/pine64-kernel-ubports|pine64-kernel-ubports]] branch.
The [[https://gitlab.com/ubports/core/rootfs-builder-debos/-/blob/master/pine64-common.yaml|pine64-common.yaml]] then also includes [[https://gitlab.com/ubports/core/rootfs-builder-debos/-/blob/master/mainline-rootfs-core.yaml|mainline-rootfs-core.yaml]]. This then fetches the latest build from:
xenial-mainline-edge-pine-rootfs-arm64
https://ci.ubports.com/job/xenial-mainline-edge-pine-rootfs-arm64/lastSuccessfulBuild/artifact/out/ubuntu-touch-xenial-edge-pine-arm64-rootfs.tar.gz
The page for this is found:
https://ci.ubports.com/job/xenial-mainline-edge-pine-rootfs-arm64/
This is how you build the final image. To build the actual image (https://ci.ubports.com/job/xenial-mainline-edge-pine-rootfs-arm64/lastSuccessfulBuild/artifact/out/ubuntu-touch-xenial-edge-pine-arm64-rootfs.tar.gz)
This comes from xenial_-_edge_-_pine
https://github.com/ubports/rootstock-ng/tree/xenial_-_edge_-_pine
The build of the FS is performed by:
https://github.com/ubports/rootstock-ng/blob/xenial_-_edge_-_pine/rootstock-touch
The pinephone specific stuff is pulled from:
http://repo.ubports.com/dists/xenial_-_edge_-_pine/main/binary-arm64/Packages
==== UB ports update servers ====
The settings for update servers etc.. is stored:
/etc/system-image/config.d/01_channel.ini
This points to the update server.
system-image.ubports.com
This uses the following file to define the update channels:
http://system-image.ubports.com/channels.json
so for pinephone:
http://system-image.ubports.com/16.04/arm64/mainline/stable/pinephone/index.json
There are 3 channels for Pine phone: rc, stable and devel
===== Changelog =====
There is no official changelog,
https://www.retallack.org.uk/pinephonechangelog.html
===== Kernel =====
The kernel currently used is:
https://gitlab.com/pine64-org/linux/-/tree/pine64-kernel-ubports
To compile:
NOTE: this assumes OpenSuse with addition of cross-aarch64-gcc7
Also note: set CONFIG_LOCALVERSION_AUTO to "n"
# Configure
make ARCH=arm64 CROSS_COMPILE=aarch64-suse-linux- pine64_defconfig
# Clean
make ARCH=arm64 CROSS_COMPILE=aarch64-suse-linux- LOCALVERSION="-pine64" clean
# Compile image
make ARCH=arm64 CROSS_COMPILE=aarch64-suse-linux- -j4 LOCALVERSION="-pine64" Image
# Compile modules
make ARCH=arm64 CROSS_COMPILE=aarch64-suse-linux- -j4 LOCALVERSION="-pine64" modules
===== Crust =====
The Pinephone uses CRUST to do the power management.
https://github.com/crust-firmware/crust
===== Current State =====
The following is not working:
* Camera
* Phone (no signal)
* Vibration motor
Some interesting info here: https://xnux.eu/devices/pine64-pinephone.html
==== Vibration motor ====
From https://xnux.eu/devices/feature/vibrator.html#toc-example-program-to-control-the-vibration-motor there is a test app (assuming its using the force feedback input).
Initial run return:
ERROR: Can't open vibrator event device: No such file or directory
Adding additional debug:
name: axp20x-pek
name: Goodix Capacitive TouchScreen
name: gpio-keys
name: 1c21800.lradc
ERROR: Can't open vibrator event device: No such file or directory
So, there is no vibrator driver :( this is hopefully because the kernel has not been configured to do this yet.
On the https://megous.com/git/linux/tree/arch/arm64/configs/pinephone_defconfig?h=orange-pi-5.7 kernel (not sure if this is a PinePhone kernel) sets CONFIG_INPUT_GPIO_VIBRA, However https://gitlab.com/pine64-org/linux/-/blob/pine64-kernel-ubports/arch/arm64/configs/pine64_defconfig also sets this :(
However there is also:
CONFIG_INPUT_GPIO_VIBRA=y
CONFIG_INPUT_PWM_VIBRA=m
However the pwm_vibra module does not help.
==== Camera =====
The camera is a OV6540 and is connected via the sun6i csi interface. This is how to enable it
So First we need to enable a number of modules in the kernel tree
CONFIG_V4L2_FLASH_LED_CLASS=m
CONFIG_LEDS_CLASS_FLASH=m
CONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y
CONFIG_LEDS_SGM3140=m
Then compile up the kernel modules, this generates three new modules led-class-flash.ko, v4l2-flash-led-class.ko, leds-sgm3140.ko.
Copy these over the PinePhone and install them into the running kernel:
sudo insmod led-class-flash.ko
sudo insmod v4l2-flash-led-class.ko
sudo insmod leds-sgm3140.ko
You should now have the /dev/media1 device.
Next, UT does not have media-ctl, we could use the apt version, however that one is too old. Instead I used: https://archlinuxarm.org/packages/aarch64/v4l-utils
Download this package and copy just the media-ctl over to the PinePhone. Then setup the media device:
sudo ./media-ctl -d /dev/media1 --set-v4l2 '"ov5640 3-004c":0[fmt:UYVY8_2X8/1280x720]'
Now we need to check that it all works
Ok, by using fswebcam, we can install this from apt (Note this may be unsafe and could brick the PinePhone......)
sudo mount /dev/loop0 / -o remount,rw
sudo apt-get install fswebcam
sudo mount /dev/loop0 / -o remount,ro
And now we are ready to capture:
fswebcam --device /dev/video1 --resolution 1280x720 -p UYVY --verbose --save bob.jpeg
Using gstreamer, the orientation is wrong.
V4l2Src should implement GstVideoOrientation see https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good/html/gst-plugins-good-plugins-v4l2src.html
GstVideoOrientation
See
https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/blob/230cf41cc966d7b3ebea248b82e1e3a60ac58d63/sys/v4l2/gstv4l2src.c#L110
this is implemented in
https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/blob/1.10.4/sys/v4l2/gstv4l2vidorient.c
For gst-droid (used on android), https://github.com/sailfishos/gst-droid/blob/e755c8521b3ff0a622fba4c85e57ff41015c7793/gst/droidcamsrc/gstdroidcamsrc.c#L271
For droidcamsrc:
https://github.com/sailfishos/gst-droidcamsrc
So does not look like v4l handles angle
==== PinePhone Camera ====
I have created a special version of the Camera app for the Pinephone, this is not the correct solution to the problem, but works for now.
The following script also needs to be run once to setup the media control and video input. It assumes the the non-standard version of media-ctl is available along with the kernel modules (see above).
#!/bin/bash
sudo insmod led-class-flash.ko
sudo insmod v4l2-flash-led-class.ko
sudo insmod leds-sgm3140.ko
sudo ./media-ctl -d /dev/media1 --set-v4l2 '"ov5640 3-004c":0[fmt:UYVY8_2X8/1920x1080@1/20]'
sudo v4l2-ctl --set-ctrl horizontal_flip=1 --device=/dev/video1
sudo v4l2-ctl --set-ctrl vertical_flip=1 --device=/dev/video1
The Custom version of the camera can be found here: {{ ::uk.co.retallack.camera-3.1.5.arm64.zip |}}
And the src is: https://gitlab.com/Retallack/camera-app
===== Cross Compile =====
https://blog.marcg.pizza/marcg/pinephone-arm-build-environment-setup