gemlog/public/uk/porting-koreader-on-pocketbook-602.gmi
2025-11-14 10:11:23 +02:00

237 lines
No EOL
13 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Спроба портування KoReader на PocketBook 602
На момент допису, через допотопність девайсу PocketBook 602, офіційної підтримки його в KoReader немає, тому я вирішив на скору для себе з цим розібратись.
Сам додаток KoReader мені потрібен виключно через наявність в ньому плагіна для читання ресурсів Gemini / Gemtext:
=> gemini://gemini.thegonz.net/gemini.koplugin/
Нижче описаний персональний досвід, щоб нічого не забути, бо портування не є завершеним!
## Особливості встановлення
Встановлюючи KoReader, я спочатку скопіював його на зовнішню картку USB, як це описано в інструкції:
> You need to obtain a recent PocketBook package from the releases page. Then unzip the archive on your computer. There will be two directories in the unzipped directory, namely applications and system.
>
> Copy and merge both the applications and system directories into your PocketBook's USB root directory
=> https://github.com/koreader/koreader/wiki/Installation-on-PocketBook-devices#installation
Але у такому разі, додаток не запускатиметься, при чому crash.log не створюватиметься. Після аналізу вихідних файлів, знайшов "мовчазного винуватця" в рядку:
``` /applications/koreader.app
# we're always starting from our working directory
cd ${KOREADER_DIR} || exit
```
Тобто шлях був не коректним, і додаток вилітав ще до ініціації самого crash.log нижче по коду. Виявивши причину, я додав у цей же файл рандомні шляхи, отримані з ШІ, один з яких (ext2) спрацював. Після ініціалізації crash.log я таки вирішив перевірити як влаштована файлова система на цьому девайсі, додавши після рядків ініціації crash.log команду:
``` bash
df -h "$@" >> crash.log 2>&1
```
Запустивши додаток і перепідключившись через шнурок, вивід crash.log був наступним:
``` crash.log
Filesystem Size Used Available Use% Mounted on
/dev/root 26.5M 17.5M 7.6M 70% /
none 128.0M 168.0K 127.8M 0% /var
tmpfs 124.4M 0 124.4M 0% /var/dev/shm
/dev/mmcblk0p3 117.2M 97.6M 19.7M 83% /ebrmain
/dev/mmcblk0p2 602.3M 409.4M 192.9M 68% /mnt/secure
/dev/loop0 117.5M 117.5M 0 100% /ebrmain/cramfs
/dev/mmcblk0p1 1019.0M 338.4M 680.7M 33% /mnt/ext1
/dev/mmcblk1 1.9G 81.3M 1.8G 4% /mnt/ext2
```
Як бачимо, девайс ext1 - це саме внутрішня пам'ять, якщо поритись в сорсах, то фігурує саме цей шлях. Але якщо поставити KoReader на ext1, то його просто не буде видно в меню додатків. Згодом, щоб не патчити все на світі у сорсах KoReader, я скористався таким лайф-хаком:
* ставимо (через шнурок) на ext1 згідно інструкції
* копіюємо /mnt/ext1/system/bin/koreader.app до /mnt/ext2/system/bin/koreader.app
Таким чином, все буде розпізнаватись, додаток буде стартувати, але все-одно вилітатиме по причинам нижче (хоча вже писатиме подробиці в crash.log)
## Біндінг PocketBook 602
На момент допису, підтримки цього девайсу в офіціному наборі немає. Біндінг потрібен для опису специфіки конкретного пристрою для роботи програми, це свого роду такий собі високорівневий "драйвер", без якого KoReader просто не запуститься з помилкою в crash.log накшталт "девайс не підтримується".
Все це є в документації, але підсумовуючи створив:
=> https://github.com/oooo-ps/koreader/tree/pocketbook-602 окрему гілку
=> https://github.com/oooo-ps/koreader/commit/083d71a6065b209cf1f39229ed2c792fa2fedba0 патч
=> https://github.com/koreader/koreader/pull/14611 PR#14611
Щоб не ходити на GitHub, інструкція для PocketBook 602 виглядає наступним чином:
``` frontend/device/pocketbook/device.lua
# рядок ~472
-- PocketBook Pro (602)
local PocketBook602 = PocketBook:extend{
model = "PB602",
display_dpi = 167,
isTouchDevice = no,
hasFrontlight = no,
hasDPad = yes,
hasFewKeys = yes,
}
# рядок ~869
elseif codename == "602" then
return PocketBook602
```
* тут я ще трохи сумніваюся стосовно display_dpi (можливо має бути 166)
## Крос-компіляція PocketBook / ARMv6 на Linux / amd64
Запустити готові бінарники (application/koreader) для PocketBook з асету відповідних релізів на GitHub не вийде, бо вони зкомпільовані для сучасних ARM і при такій спробі, в crash.log буде помилка:
``` crash.log
Illegal instruction
```
PocketBook має відносно стару архітектуру процесора ARMv6:
``` crash.log
# cat /proc/cpuinfo >> crash.log
ARMv6-compatible processor rev 6 (v6l)
# uname -a >> crash.log
Linux pocketbook 2.6.29.6 #1 PREEMPT Fri Dec 9 16:04:47 EET 2011 armv6l GNU/Linux
```
Я спочатку подумав, що самий хитрий і вирішив просто підмінити бінарники з іншого релізу:
=> https://github.com/koreader/koreader/releases/download/v2025.10/koreader-linux-armv7l-v2025.10.tar.xz
Але не все так склалося як гадалося: у цьому наборі зовсім інша структура та набори файлів. Отже довелось таки розгортати середовище для крос-компіляції. Минаючи довгу передісторію, потрібно виконати кроки в розділах нижче, попередньо ознайомившись з актуальною документацією:
=> https://github.com/koreader/koreader/blob/master/doc/Building.md Building
=> https://github.com/koreader/koreader/blob/master/doc/Building_targets.md Building targets
=> https://github.com/koreader/koreader/blob/master/doc/Porting.md Porting
### Варіант компіляції KoReader на базі архітектури Kindle
Цей метод мені порадили тут:
=> https://github.com/koreader/koreader/issues/14600#issuecomment-3523865864
Як виявилося згодом, бінарна збірка Kindle (Legacy) виявилась не сумісною з типом процесора armv6l/EABI4:
``` bash
busybox: ELF 32-bit LSB executable, ARM, EABI4 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, stripped
```
=> https://github.com/koreader/koreader/issues/14600#issuecomment-3530172054 Аналіз /bin/busybox
Нижче все-ж лишаю інструкцію такого варіанту збірки (на прикладі платформи Kindle) на випадок, якщо опція EABI4 з'явиться в релізах. В інших випадках - гортайте до розділу "Варіант компіляції KoReader на базі патчу koxtoolchain".
Завантажуємо бінарний реліз Kindle:
=> https://github.com/koreader/koxtoolchain/releases/download/2025.05/kindle.tar.gz
Розпаковуємо його в потрібну теку або створюємо туди симлінки та оголошуємо шлях:
``` bash
export PATH="$PATH:$HOME/x-tools/arm-kindle-linux-gnueabi/bin:$PATH"
```
Додатково ставимо залежності для вашої операційної системи:
=> https://github.com/koreader/koreader/blob/master/doc/Building.md#prerequisites Prerequisites
* не знаю, чи там вказано, але собі для уникнення помилки ще поставив:
``` bash
sudo dnf install 7zip
```
І власне збираємо віртуальне середовище:
=> https://github.com/koreader/koreader/blob/master/doc/Building.md#building-and-running-the-emulator Building and running the emulator
``` bash
git clone https://github.com/koreader/koreader.git
cd koreader && ./kodev fetch-thirdparty
```
Так як у цьому випадку використовуюється підміна платформи бінарниками ARM Kindle, замінюємо:
``` base/Makefile.defs
CHOST?=arm-pocketbook-linux-gnueabi
POCKETBOOK=1
HAS_POCKETBOOK_TC:=$(shell command -v arm-pocketbook-linux-gnueabi-gcc 2> /dev/null)
ifdef HAS_POCKETBOOK_TC
CHOST?=arm-pocketbook-linux-gnueabi
else
CHOST?=arm-linux-gnueabi
endif
```
на
``` base/Makefile.defs
CHOST?=arm-kindle-linux-gnueabi
LEGACY=1
```
* для запобігання подальшої помилки компіляції, можна додати `KINDLE=1` щоб підтягнулись динамічні заголовки для Kindle (не рекомендовано) або закоментувати generateFakeEvent до його реалізації для PB
Після чого компілюємо збірку pocketbook (засобами хосту arm-kindle-linux-gnueabi)
``` bash
./kodev release pocketbook
```
Архіви мають згенеруватись в корінь поточного проєкту, в мене вони без версії:
* koreader-pocketbook-.targz
* koreader-pocketbook-.zip
### Варіант компіляції KoReader на базі патчу koxtoolchain
``` bash
git clone https://github.com/koreader/koxtoolchain.git
cd koxtoolchain
```
Для секції PocketBook, я оновив рядок ARCH_FLAGS:
``` refs/x-compile.sh
PB )
# NOTE: The TC itself is built in ARM mode, otherwise glibc 2.9 doesn't build (fails with a "r15 not allowed here" assembler error on csu/libc-start.o during the early multilib start-files step).
# AFAICT, the official SDK doesn't make a specific choice on that front (i.e., it passes neither -marm not -mthumb. That usually means ARM)...
# NOTE: This is probably related to our choice of -mcpu target, as the kindle TC builds just fine on the same glibc version... for armv6j ;).
# ARCH_FLAGS="-march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -mthumb"
ARCH_FLAGS="-march=armv6j -mtune=arm1136jf-s -mfpu=vfp -mfloat-abi=softfp -mthumb"
```
Компілюємо:
``` bash
./gen-tc.sh pocketbook
```
* можливо, доведеться довстановити:
``` bash
sudo dnf install texinfo help2man
```
Збираємо KoReader аналогічно до способу з Kindle, але використовуємо локальний $PATH.
### crosstool-ng
Це алежність до koxtoolchain. Згадую про crosstool-ng окремо, бо на системах (зокрема Fedora 43) з останніми версіями wget є баг:
=> https://github.com/NiLuJe/crosstool-ng/issues/9 Unknown option 'passive-ftp' #9
і готове рішення:
=> https://github.com/crosstool-ng/crosstool-ng/pull/2439 Remove --passive-ftp from wget usage #2439
Для PocketBook в koxtoolchain використовується стара хеш-залежність, яку я локально замінив на свою гілку зі ще одним, додатковим випилом --passive-ftp:
=> https://github.com/NiLuJe/crosstool-ng/pull/10
Щоб застосувати оновлену гілку, не чекаючи мержу, оновлюємо джерела секції "pocketbook":
``` scripts/scripts.mk
# змінюємо рядки ~196-197
pocketbook)
# NOTE: Prevent libstdc++ from pulling in utimensat@GLIBC_2.6
export glibcxx_cv_utimensat=no
Build_CT-NG \
https://github.com/oooo-ps/crosstool-ng.git \
remove--passive-ftp \
"arm-${1}-linux-gnueabi"
```
Перезбираємо koxtoolchain. Цей тріп я до кінця поки не довів, буде оновлюватись.
## Посилання
=> https://github.com/koreader/koreader/issues/14600 Тема №14600 на GitHub (дякую усім, хто долучився)