PineNote Development

From PINE64
Revision as of 18:55, 12 January 2023 by Fxc (talk | contribs) (outsourced content)
Jump to navigation Jump to search

This article seeks to provide general development information for the PineNote. If you are new and down to try a new installation process, the easiest way to get linux is likely to install Debian -- NOTE THAT THIS INSTALLATION PROCESS IS VERY NEW. While many people have been using the kernel that will be installed safely at this point, the instructions for installing Debian via rootfs are very new. Take backups!

The more stable recommended approach is described below:

Start with Dorian's guide which will guide you through getting Arch installed. For instructions on building the latest kernel, see PineNote Development/Building Kernel. For helpful configurations, see PineNote Development/Apps. For ways to pitch in, see PineNote Development/TODOs. To boot Linux by default instead of Android, see PineNote Development/Booting Linux. Here is a video of a user running Manjaro and some apps on their PineNote on 9/10/2022.

Overview

Kernel modules / mainlining status

WORK IN PROGRESS !

The following table aims to provide a list of kernel modules required for running the PineNote. It also aims at listing repositories of work in progress. While some overlap with the Quartz64 module list (Quartz64_Development#Upstreaming_Status) is expected, only modules relevant to the PineNote hardware should be listed here.

Function Status Component Notes
Suspend mode driver tbd rockchip-sip
Touchscreen Linux Mainline cyttsp5 As of 6.2-rc1[1]
Digitizer Linux Mainline i2c_hid_of
Pen BLE Buttons tbd ws8100-pen
EBC Display controller tbd rockchip_ebc
EBC PMic tbd tps65185
LED backlight driver Linux Mainline lm3630a
Accelerometer Linux Mainline st-accel-i2c (silan,sc7a20) As of 5.18-rc1[2]
Rastergraphics unit RGA2e tbd rga (v4l2 mem2mem driver)
Mali GPU Linux Mainline Upstream Mesa panfrost As of 5.18 [3] this got added to the .dtsi file, but it's status is disabled.

I haven't seen the gpu node getting enabled in the .dts for PineNote (yet)?

Wifi/BT Linux Mainline brcmfmac

Development work

  • tps65185: driver developed here: [4], small tweaks to resume behaviour added on top here: [5]
  • RGA: WIP patches for activation on the Pinenote/dithering/Y4-conversion can be found here: [6]. Note that the rga2e in the rk3566 only works for RAM <= 4 G!). Simple demo program found here: [7]
  • The rockchip-sip driver required for suspend/resume is currently only hacked-in [8]

More Information

High-level developer new to embedded linux?

Here are some resources I have found helpful in learning to develop on embedded linux devices:

Notes Written by Some Developers

Alternative to patching of mesa

Mesa needs to be patched to add the driver entry point. The alternative to this, is the renaming of the ebc driver to an existing mesa driver entry point. A good existing name can be "repaper". To change the driver name, edit in the kernel tree the following files:
- replace "rockchip-ebc" with "repaper" in the two places in the file: drivers/gpu/drm/rockchip/rockchip_ebc.c
- preventive, replace "repaper" with "repaper-disabled" in the two places in the file: drivers/gpu/drm/tiny/repaper.c

Building the most recent kernel

See here.

Video of Factory Android OS

PineNote Developer Edition w/Tech Demo Android OS (Video Only)

Informal walkthrough of the factory Android installation on the PineNote Developer Edition, recorded by a community member (Apr 2022). This is useful to look back at the original OS after erasing it from your device, or to get some additional detail before your device arrives.

The video also includes a chapter at the end showing how to enable Android Debug Bridge (`adb`) over USB. Once enabled, keep the device powered and connect a USB cable directly to the PineNote (i.e. no UART breakout) to a computer running `adb`.

Emulator for Developing/Testing Pinenote Apps

https://github.com/michaelshiel/picom-epaper

Mainline development

Status

Some work happening here: https://gitlab.com/calebccff/linux, the idea is to import the parts of the eink/ebc drivers which are open source and use the downstream u-boot framebuffer driver as a reference to create a basic framebuffer driver.

Currently mainline struggles to boot due to weird issues while probing fixed regulators (?). It also fails to detect eMMC.

Further work is being done here: https://github.com/smaeul/linux/commits/rk356x-ebc-dev. This has a complete device tree, with working eMMC. Pen input also works out of the box. Wi-Fi and BT work with firmware copied from the factory Android image.

How to boot mainline

UART is currently REQUIRED for this to work! We depend on u-boot falling back to console. Once we have a prebuilt u-boot which will use extlinux by default, UART won't be needed anymore.

You can compile a u-boot that uses extlinux by default by following the instructions here.

Getting to a U-Boot prompt

You can get to a U-Boot prompt by:

  1. Holding Ctrl-C while the display panel initializes.
  2. Wiping the "boot" partition.

Using sysboot

extlinux.conf should have the following contents:

timeout 10
default MAINLINE
menu title boot prev kernel

label MAINLINE
  kernel /vmlinuz
  fdt /rk3566-pinenote.dtb
  initrd /initramfs
  append earlycon console=tty0 console=ttyS2,1500000n8 fw_devlink=off PMOS_NO_OUTPUT_REDIRECT

At the u-boot console, run the following command to boot your mainline kernel:

sysboot ${devtype} ${devnum}:9 any ${scriptaddr} extlinux.conf

Booting with individual commands

Booting with individual commands can be useful when you need to temporarily add some kernel command line arguments. Use these or similar commands at the U-Boot shell:

load mmc 0:b ${kernel_addr_r} boot/Image
load mmc 0:b ${fdt_addr_r} boot/rk3566-pinenote.dtb
setenv bootargs ignore_loglevel root=/dev/mmcblk0p11 rootwait init=/bin/bash
booti ${kernel_addr_r} - ${fdt_addr_r}

Configuration

Firmware for WiFi & Bluetooth and Waveform data

Using Maximilian's Debian image

If the Android partition (super) and waveform partition (waveform) is left intact the image extracts the WiFi, BT driver and waveform from the partitions on first run.

For instance if you repartitions the userdata partition and installs the image there.

Getting it from the Android install manually

Copy WiFi/BT firmware from Android:

mkdir -p /cache/lib/firmware/brcm
cp /vendor/etc/firmware/fw_bcm43455c0_ag_cy.bin /cache/lib/firmware/brcm/brcmfmac43455-sdio.bin
cp /vendor/etc/firmware/nvram_ap6255_cy.txt /cache/lib/firmware/brcm/brcmfmac43455-sdio.txt
cp /cache/lib/firmware/BCM4345C0.hcd /cache/lib/firmware/brcm/BCM4345C0.hcd

Copy waveform partition (via previously dumped file):

adb root
adb push waveform.img /cache/lib/firmware/waveform.bin

Or via dd within Linux:

dd if=/dev/mmcblk0p3 of=/lib/firmware/waveform.bin bs=1k count=2048

Getting the Wifi and Bluetooth driver blobs from "other" sources

WiFi

The WiFi firmware .bin blob can be obtained by installing the Debian package firmware-brcm80211 (in the non-free section)

The WiFi brcmfmac43455-sdio.txt file can according to Eugen be sourced from https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/brcm/brcmfmac43455-sdio.AW-CM256SM.txt needs a renaming when copying it to /lib/firmware/brcm/brcmfmac43455-sdio.txt)

The content of the upstream .txt is different than the Android configuration, but is supposed to work.

As you don't have WiFi yet you need to get the firmware-brcm80211*.deb and brcmfmac43455-sdio.txt file on the PineNote by other means, for instance using an USB stick

Bluetooth

Once you have WiFi working you can get BCM4345C0.hcd by installing the bluez-firmware

 sudo apt install bluez-firmware


Configuring the E-ink refresh mode

https://github.com/m-weigand/mw_pinenote_misc/tree/main/rockchip_ebc/patches contains information on how/where to write in /sys to alter the refresh mode

https://github.com/m-weigand/mw_pinenote_misc/tree/main/gnome_extension contains the gnome extension used in Maximilian image


Touchscreen and Pen In X.org

By default the pen config is flipped 180° (which makes it unusable) and the touchscreen doesn't work. Placing the following config in /etc/X11/xorg.conf.d/50-touchscreen.conf will fix both problems:

Section "InputClass"
    Identifier "evdev touchscreen"
    MatchProduct "tt21000"
    MatchIsTouchscreen "on"
    Driver        "evdev"
EndSection
Section "InputClass"
    Identifier    "RotateTouch"
    MatchProduct    "w9013"
    Option    "TransformationMatrix" "-1 0 1 0 -1 1 0 0 1"
EndSection