====== 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