📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

1,186行目: 1,186行目:
</center>
</center>
<br><br>
<br><br>
== PinePhone ==
==== 概要 ====
Allwinner A64 SoC(sun50iw1)は、Cortex-A53 ARM CPU(クアッドコア)とARM社のMali400 MP2 GPUを搭載している。<br>
<br>
A64は、基本的にAllwinner H3のCortex-A7コアをCortex-A53コアに置き換えたものである。<br>
メモリマップ、クロック、割り込みのほとんどを共有しており、IPブロックも同じものを使用している。<br>
<br>
H3とA64の違いは以下の通りである。<br>
<br>
H3は、USBホストコントローラを3つ搭載しているのに対して、A64は1つしか搭載していない。<br>
どちらのSoCもUSB-OTGコントローラを追加しているが、これは通常のホストコントローラとしても使用することを想定している。<br>
<br>
H3のDRAMコントローラは最大2[GB]のRAMをサポートしており、A64は最大3[GB]をサポートしている。<br>
64bitチップでありながら、物理的には完全に3bitのSoCとなっている。<br>
<br>
H3は5個のUARTをサポートしており、A64は6個のUARTをサポートしている。<br>
MMCコントローラーが更新され、より高速な転送モードをサポートしている。<br>
MMCのクロックは途中で変更され、現在はMMCコントローラ自身が出力とサンプルフェーズをサポートしている。<br>
<br>
H3はSRAM A1がアドレス0にマッピングされており、BROMは0xffff0000にある。<br>
A64はBROMがアドレス0にマッピングされており、SRAM A1はそのすぐ後ろの0x10000(64KB)にマッピングされている。<br>
<br>
pinmuxの構成はまだ多少似ているが、互換性のない程度に異なる。<br>
顕著な例は(デバッグ用の)UART0で、H3ではPortAにあるが、A64ではPortBにある。<br>
H3にはPortBが無い。<br>
<br>
==== Qtのソースコードのダウンロード ====
* Qt Everywhere (こちらを推奨する)<br>
*: <code>wget https://download.qt.io/official_releases/qt/x.x/x.x.x/single/qt-everywhere-src-6.x.x.tar.xz</code>
*: <code>tar xf qt-everywhere-opensource-src-6.x.x.tar.gz</code>
*: <br>
* Githubの使用
*: GithubからQtのソースコードを個別にダウンロードする。<br>
*: <code>git clone https://github.com/qt/qt6.git</code>
*: <br>
*: ダウンロードしたスーパーリポジトリに移動する。<br>
*: <code>cd qt6</code>
*: <code>git checkout <Qtのバージョン></code>
*: または
*: <code>git checkout <Qtのショートバージョン></code>
*: <br>
*: <code>init-repository</code>コマンドは、Qtが提供する指定したモジュールのソースコードを取得するためのツールである。<br>
*: スーパーリポジトリは小さく、全てのモジュール(ライブラリ)はgit submodulesとして保持されている。<br>
*: <br>
*: 利用可能な全てのモジュールについては[https://doc.qt.io/qt-6/qtmodules.html こちらのWebサイト]、ツールについては<code>init-repository --help</code>コマンドまたは[https://github.com/qt/qt6/blob/dev/init-repository こちらのWebサイト]を参照すること。<br>
*: <code>./init-repository --module-subset=essential,qtsvg,qtvirtualkeyboard,qtquickcontrols</code>
*: <code>./init-repository -f --module-subset=qtquick3d,qtquicktimeline,qtwayland</code>  # 必要な場合は個別に追加ダウンロードする
<br>
==== Linux PCの設定 ====
Linux PCにおいて、以下の依存関係のライブラリをインストールする。<br>
(Texinfoは、GNU公式Webサイトにアクセスして、ソースコードからインストールすることを推奨する)<br>
sudo zypper install autoconf automake cmake unzip tar git wget pkg-config gperf gcc gcc-c++ \
                    gawk bison openssl flex figlet pigz ncurses-devel ncurses5-devel texinfo
<br>
Linero社が提供しているGCC ARMツールチェーンをダウンロードする。<br>
https://releases.linaro.org/components/toolchain/binaries/<br>
<br>
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
<br>
または、[[インストール - GCC#クロスコンパイラ向けGCCツールチェーンのインストール]]のページを参照して、AArch64向けのGCCツールチェーンを作成する。<br>
<br>
<u>Qt 6では、Qt 5とは異なり、ホスト向けのQtライブラリもビルドしてインストールする必要がある。</u><br>
まず、ホスト向けQt 6ライブラリのビルドディレクトリを作成する。<br>
mkdir build && cd build
<br>
次に、ホスト向けQt 6ライブラリをビルドおよびインストールする。<br>
cmake -GNinja ../qt-everywhere-src-6.x.x/qtbase \
-DCMAKE_BUILD_TYPE=Release                      \
-DCMAKE_C_COMPILER=<GCC 8以降のGCCのパス>        \
-DCMAKE_CXX_COMPILER=<GCC 8以降のG++のパス>      \
-DQT_BUILD_EXAMPLES=OFF                        \
-DQT_BUILD_TESTS=OFF                            \
-DBUILD_qtdoc=OFF                              \
-DBUILD_qtwebengine=OFF                        \
-DBUILD_qtwebview=OFF                          \
-DCMAKE_INSTALL_PREFIX=<ホスト向けQt 6ライブラリのインストールディレクトリ>
<br>
==== PinePhoneの設定 ====
Qtのクロスコンパイルの手順において、SSH接続ができることが必須のため、SSH Serverをインストールおよび設定する。<br>
# Mobian
sudo apt-get install openssh-server
# Manjaro
sudo pacman -S openssh
<br>
必要に応じて、公開鍵認証を行う場合は、[[設定 - SSHの公開鍵認証|設定 - SSHの公開鍵認証]]を参照すること。<br>
<br>
SSH Serverの自動起動設定および開始する。<br>
sudo systemctl enable ssh
sudo systemctl restart ssh
<br>
MobianまたはManjaroをアップデートする。<br>
# Mobian
sudo apt-get update
sudo apt-get dist-upgrade
sudo systemctl reboot
# Manajro
sudo pacman -Syyu
sudo systemctl reboot
<br>
Qtライブラリをクロスコンパイルするために必要なライブラリをインストールする。<br>
Qtライブラリのビルド設定によっては、不要なパッケージも含まれている。<br>
# Mobian
sudo apt-get install build-essential cmake unzip pkg-config gdbserver python python3 gfortran \
                      ccache libicu-dev icu-devtools libhd-dev libsctp1 libsctp-dev libatspi2.0-0 libatspi2.0-dev libzstd1 libzstd-dev \
                      libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                      libblkid-dev libffi-dev libglib2.0-dev libglib2.0-dev-bin libmount-dev \
                      libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libselinux1-dev libsepol1-dev libwacom-dev libassimp-dev libassimp5 \
                      libfontconfig1-dev libdbus-1-dev libnss3-dev libxkbcommon-dev libjpeg-dev libasound2-dev libudev-dev libxcb-xinerama0 libxcb-xinerama0-dev libpugixml1v5 \
                      libsqlite3-dev libxslt1-dev libssl-dev \
                      libwayland-bin libwayland-dev libwayland-egl++0 libwayland-egl-backend-dev libwayland-client++0 libwayland-client-extra++0 libwayland-cursor++0 wayland-scanner++ \
                      waylandpp-dev libweston-9-dev libgles2-mesa-dev libegl-dev libgegl-dev libegl1-mesa-dev libgles-dev libwayland-egl1-mesa
# Manjaro
sudo pacman -S --needed base-devel util-linux-libs glib2 cmake unzip pkg-config gdb gdb-common gdbm gcc gcc-libs gcc-fortran python2 python3 \
                        gmp libmpc mpfr libisl ccache icu lksctp-tools python-atspi zstd libinput libtsm mtdev libevdev libffi pcre pcre2 \
                        libwacom assimp fontconfig dbus dbus-c++ nss libxkbcommon alsa-lib libxinerama pugixml sqlite libxslt openssl \
                        wayland wayland-utils wayland-protocols egl-wayland waylandpp waylandpp wrapland wlc wayfire glew-wayland glfw-wayland libva1 \
                        mesa mesa-utils glu libglvnd libb2 lttng-ust libproxy qt6-resource-git
<br>
Manjaroにおいて、マルチメディア関連やBluetooth等を使用する場合、下表に示す任意のパッケージをインストールする。<br>
Mobianの場合、[[インストール - Qt6#Raspberry Piの設定|上記のセクションにあるRaspberry Piの表]]を参照すること。<br>
<center>
{| class="wikitable" | style="background-color:#fefefe;"
|+ Manjaro向け その他のライブラリ(オプション)
|-
! style="background-color:#66CCFF;" | 機能
! style="background-color:#66CCFF;" | インストールするライブラリ
! style="background-color:#66CCFF;" | configureスクリプトのオプション
|-
| Bluetooth || bluez bluez-tools bluez-libs bluez-utils ||
|-
| 画像 || openjpeg2 libjpeg-turbo libpng libtiff libmng ||
|-
| マルチメディア || gstreamer gstreamermm gst-plugins-base gst-plugins-base-libs gst-plugins-good<br>gst-plugins-bad gst-plugins-bad-libs<br>gst-plugins-ugly gst-libav gst-plugin-wpe gst-plugin-pipewire gst-plugin-gtk<br>qt-gstreamer gst-plugin-qmlgl gst-plugin-opencv ||
|-
| ALSAオーディオ || alsa-lib ||
|-
| Pulseオーディオ || pulseaudio-alsa ||
|-
| OpenAL || openal ||
|-
| Text to Speech || flite ||
|-
| シリアルポート || libserialport ||
|-
| センサ || sensorfw ||
|-
| データベース || postgresql-libs libpqxx (PostgreSQL)<br>mariadb-clients mariadb-libs (MariaDB)
unixodbc (ODBC)<br>sqlite (SQLite)
|
|-
| プリンタ || libcups ||
|-
| Wayland (X11) || xorg-xwayland ||
|-
| X11 ||  ||
|-
| WebEngine || 必須 :<br>flex bison gperf readline nss libdrm<br><br>オプション1 :<br>libxml2 libxml++ libxslt minizip jsoncpp lcms2 libevent protobuf protobuf-c<br><br>オプション2(不安定なため注意すること) :<br>opus libvpx ||
|-
| アクセシビリティ || at-spi2-core at-spi2-atk ||
|-
| SCTP || lksctp-tools || -sctp
|}
</center>
<br>
* 上表のライブラリを全てインストールする場合
*: <code>sudo pacman -S --needed bluez bluez-libs openjpeg2 libjpeg-turbo libpng libtiff libmng gstreamer gstreamermm gst-plugins-base gst-plugins-base-libs gst-plugins-good \</code>
*: <code>gst-plugins-bad gst-plugins-bad-libs gst-plugins-ugly gst-libav gst-plugin-wpe gst-plugin-pipewire gst-plugin-gtk qt-gstreamer gst-plugin-qmlgl gst-plugin-opencv alsa-lib \</code>
*: <code>pulseaudio-alsa openal flite libserialport sensorfw unixodbc sqlite libcups xorg-xwayland flex bison gperf readline nss libdrm libxml2 libxml++ libxslt minizip jsoncpp \</code>
*: <code>lcms2 libevent protobuf protobuf-c opus libvpx at-spi2-core at-spi2-atk lksctp-tools</code>
<br>
次のセクションにおいて、rsyncコマンドを使用してLinux PCとPinePhoneのファイルを同期する。<br>
しかし、同期するファイルには、スーパユーザ権限が必要なものがある。<br>
<br>
そのため、一般ユーザでも全てのファイルを同期できるように、/etc/sudoersファイルに以下の設定を追記する。<br>
以下の設定により、rsyncコマンドは、必要に応じてスーパユーザ権限で実行される。<br>
echo "$USER ALL=NOPASSWD:$(which rsync)" | sudo tee --append /etc/sudoers
<br>
==== システムルートディレクトリの設定 ====
Linux PCで、PinePhone向けのQtソフトウェアをクロスコンパイルできるように開発環境を設定する。<br>
PinePhone上でネイティブにコンパイルすることもできるが、Linux PCの方がスループットが良い。<br>
<br>
Linux PC上に開発用ディレクトリを作成する。<br>
また、PinePhoneのいくつかのルートディレクトリと同期する必要があるため、システムルートディレクトリも作成する。<br>
mkdir -p ~/Program/Qt_Embedded/sysroot \
          ~/Program/Qt_Embedded/sysroot/usr \
          ~/Program/Qt_Embedded/sysroot/usr/share
<br>
<code>rsync</code>コマンドを使用して、Raspberry Piに存在するいくつかのディレクトリから、ファイルをダウンロードする。<br>
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/lib ~/Program/Qt_Embedded/sysroot
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/usr/include ~/Program/Qt_Embedded/sysroot/usr
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/usr/lib ~/Program/Qt_Embedded/sysroot/usr
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/usr/share/pkgconfig ~/Program/Qt_Embedded/sysroot/usr/share
<br>
==== Qtの設定 ====
Qtのソースコードがあるディレクトリにおいて、qtbase/mkspecs/devices/linux-pinephone-g++ディレクトリを作成する。<br>
mkdir <Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++
<br>
次に、<Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qplatformdefs.hファイルを以下の内容で作成する。<br>
vi <Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qplatformdefs.h
<br>
<syntaxhighlight lang="c++">
// qplatformdefs.hファイル
#include "../../linux-g++/qplatformdefs.h"
</syntaxhighlight>
<br>
さらに、<Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qmake.confファイルを以下の内容で作成する。<br>
vi <Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qmake.conf
<br>
# qmake.confファイル
# qmake configuration for the PinePhone(Based A20_OlinuxinO boards)
include(../common/linux_device_pre.conf)
#QT_QPA_DEFAULT_PLATFORM = eglfs    # 不要の可能性があるため要調査
QT_QPA_DEFAULT_PLATFORM = wayland  # 不要の可能性があるため要調査
SYSROOT_INC = $$[QT_SYSROOT]/usr/include
SYSROOT_LIB = $$[QT_SYSROOT]/usr/lib
# Extra stuff (OpenGL, DirectFB, ...)
QMAKE_INCDIR_EGL        = $$[SYSROOT_INC] \
                          $$[SYSROOT_INC]/aarch64-linux-gnu \
                          $$[SYSROOT_INC]/GL \
                          $$[SYSROOT_INC]/EGL \
                          $$[SYSROOT_INC]/GLES \
                          $$[SYSROOT_INC]/GLES2 \
                          $$[SYSROOT_INC]/GLES3 \
                          $$[SYSROOT_INC]/GLFW
QMAKE_LIBDIR_EGL        = $$[SYSROOT_LIB] \
                          $$[SYSROOT_LIB]/aarch64-linux-gnu
QMAKE_INCDIR_OPENGL_ES2 = $$[QMAKE_INCDIR_EGL]
QMAKE_LIBDIR_OPENGL_ES2 = $${QMAKE_LIBDIR_EGL}
QMAKE_INCDIR_OPENVG    = $${QMAKE_INCDIR_EGL}          # 不要の可能性があるため要調査
QMAKE_LIBDIR_OPENVG    = $${QMAKE_LIBDIR_EGL}          # 不要の可能性があるため要調査
QMAKE_LIBS_EGL          = -lEGL
QMAKE_LIBS_OPENGL_ES2  = -lGLESv2 $${QMAKE_LIBS_EGL}
QMAKE_LIBS_OPENVG      = -lOpenVG $${QMAKE_LIBS_EGL}  # 不要の可能性があるため要調査
# modifications to gcc-base.conf
QMAKE_CFLAGS            = -march=armv8-a -mtune=cortex-a53      # PinePhoneの場合
#QMAKE_CFLAGS            = -march=armv8-a -mtune=cortex-a72 -lts  # PinePhone Proの場合
QMAKE_CFLAGS_RELEASE  += -O3
QMAKE_CXXFLAGS          = $$QMAKE_CFLAGS
QMAKE_CXXFLAGS_RELEASE += -O3
QMAKE_LIBS              += -lrt -lpthread -ldl -lz      # Linaro GCC ARM 7.5 ツールチェーンを使用する場合
#QMAKE_LIBS              += -lrt -lpthread -ldl          # GCC ARM 8.3 以降のツールチェーンを使用する場合
DISTRO_OPTS += aarch64
DISTRO_OPTS += deb-multi-arch  # Mobian OSを使用する場合は指定する
                                # 他のOSを使用する場合は、削除またはコメントアウトする
# Preferred eglfs backend
EGLFS_DEVICE_INTEGRATION = eglfs_mali
include(../common/linux_arm_device_post.conf)
load(qt_config)
<br>
==== Qtのビルド ====
===== Qt Baseのビルド =====
Qtをビルドするため、ビルド用のディレクトリを作成する。<br>
mkdir /<Qtのソースコードがあるディレクトリ>/../build && cd /<Qtのソースコードがあるディレクトリ>/../build
<br>
Configureスクリプトを実行する。<br>
export PATH="/<Wayland Scannerのインストールディレクトリ>/bin:$PATH"
export LD_LIBRARY_PATH="/<Wayland Scannerのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"
export PKG_CONFIG_PATH="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/aarch64-linux-gnu/pkgconfig"
export PKG_CONFIG_LIBDIR="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/aarch64-linux-gnu/pkgconfig:/<SysRootがあるディレクトリ>/usr/share/pkgconfig"
# コンパイラの設定
export COMPILER="/<GCC ARMツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-"
# または
# export COMPILER="/<GCC ARMツールチェーンのインストールディレクトリ>/bin/aarch64-unknown-linux-gnu-"
../<Qtのソースコードがあるディレクトリ>/configure -v
-release \
-opensource \
-confirm-license \
-opengl es2 \
-qpa wayland \
-device linux-pinephone-g++ \
-device-option CROSS_COMPILE=$COMPILER \
-nomake examples -no-compile-examples -nomake tests -make libs -no-use-gold-linker -recheck-all \
-skip qtscript -skip qtwebengine -skip qtandroidextras -skip qtmacextras -skip qtwinextras \
-skip qtgamepad -skip qtpurchasing -skip qtcharts -skip qtsensors \  (不要な場合)
-skip qtlocation -skip qtspeech -skip qtlottie \                      (不要な場合)
-skip qtdoc \
-sysroot /<SysRootが存在するディレクトリ>/sysroot \
-prefix /<Qtソフトウェアを配置するディレクトリ>/QtSoftware \
-extprefix /<PinePhoneにインストールするQtライブラリを配置するディレクトリ>/Target \
-hostprefix /<Linux PCで使用するQtツールを配置するディレクトリ>/Host
<br>
Qtをビルドおよびインストールする。<br>
gmake -j $(nproc)
gmake install
<br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Qt]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]]
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Qt]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]]