mirror of
https://codeberg.org/postscriptum/gemlog.git
synced 2026-02-18 22:12:40 +00:00
237 lines
No EOL
13 KiB
Text
237 lines
No EOL
13 KiB
Text
# Спроба портування 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 (дякую усім, хто долучився) |