gemlog/public/uk/porting-koreader-on-pocketbook-602.gmi
2025-11-13 19:28:41 +02:00

217 lines
No EOL
11 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
ARMv6-compatible processor rev 6 (v6l)
```
Я спочатку подумав, що самий хитрий і вирішив просто підмінити бінарники з іншого релізу:
=> 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
### crosstool-ng
Це залежність koxtoolchain, даний розділ можна пропустити якщо не плануєте збирати koxtoolchain з сорсу.
Згадую про crosstool-ng, бо на системах (зокрема Fedora 43) з останніми версіями wget є баг:
=> https://github.com/NiLuJe/crosstool-ng/issues/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"
```
### Збірка 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
Цей метод мені порадили тут:
=> https://github.com/koreader/koreader/issues/14600#issuecomment-3523865864
Завантажуємо бінарний реліз 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
І власне збираємо віртуальне середовище:
=> 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
```
Після чого компілюємо pocketbook вже засобами хосту arm-kindle-linux-gnueabi:
``` bash
./kodev release pocketbook
```
## Посилання
=> https://github.com/koreader/koreader/issues/14600 Тема №14600 на GitHub (дякую усім, хто долучився)