Спроба портування 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 не створюватиметься. Після аналізу вихідних файлів, знайшов "мовчазного винуватця" в рядку:
# we're always starting from our working directory
cd ${KOREADER_DIR} || exit
Тобто шлях був не коректним, і додаток вилітав ще до ініціації самого crash.log нижче по коду. Виявивши причину, я додав у цей же файл рандомні шляхи, отримані з ШІ, один з яких (ext2) спрацював. Після ініціалізації crash.log я таки вирішив перевірити як влаштована файлова система на цьому девайсі, додавши після рядків ініціації crash.log команду:
df -h "$@" >> crash.log 2>&1
Запустивши додаток і перепідключившись через шнурок, вивід 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 накшталт "девайс не підтримується".
Все це є в документації, але підсумовуючи створив:
Щоб не ходити на GitHub, інструкція для PocketBook 602 виглядає наступним чином:
# рядок ~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 буде помилка:
Illegal instruction
PocketBook має відносно стару архітектуру процесора ARMv6:
# 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
Я спочатку подумав, що самий хитрий і вирішив просто підмінити бінарники з іншого релізу:
Але не все так склалося як гадалося: у цьому наборі зовсім інша структура та набори файлів. Отже довелось таки розгортати середовище для крос-компіляції. Минаючи довгу передісторію, потрібно виконати кроки в розділах нижче, попередньо ознайомившись з актуальною документацією:
Варіант компіляції KoReader на базі архітектури Kindle
Цей метод мені порадили тут:
https://github.com/koreader/koreader/issues/14600#issuecomment-3523865864
Як виявилося згодом, бінарна збірка Kindle (Legacy) виявилась не сумісною з типом процесора armv6l/EABI4:
busybox: ELF 32-bit LSB executable, ARM, EABI4 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, stripped
Нижче все-ж лишаю інструкцію такого варіанту збірки (на прикладі платформи Kindle) на випадок, якщо опція EABI4 з'явиться в релізах. В інших випадках - гортайте до розділу "Варіант компіляції KoReader на базі патчу koxtoolchain".
Завантажуємо бінарний реліз Kindle:
https://github.com/koreader/koxtoolchain/releases/download/2025.05/kindle.tar.gz
Розпаковуємо його в потрібну теку або створюємо туди симлінки та оголошуємо шлях:
export PATH="$PATH:$HOME/x-tools/arm-kindle-linux-gnueabi/bin:$PATH"
Додатково ставимо залежності для вашої операційної системи:
- не знаю, чи там вказано, але собі для уникнення помилки ще поставив:
sudo dnf install 7zip
І власне збираємо віртуальне середовище:
Building and running the emulator
git clone https://github.com/koreader/koreader.git cd koreader && ./kodev fetch-thirdparty
Так як у цьому випадку використовуюється підміна платформи бінарниками ARM Kindle, замінюємо:
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
на
CHOST?=arm-kindle-linux-gnueabi LEGACY=1
- для запобігання подальшої помилки компіляції, можна додати `KINDLE=1` щоб підтягнулись динамічні заголовки для Kindle (не рекомендовано) або закоментувати generateFakeEvent до його реалізації для PB
Після чого компілюємо збірку pocketbook (засобами хосту arm-kindle-linux-gnueabi)
./kodev release pocketbook
Архіви мають згенеруватись в корінь поточного проєкту, в мене вони без версії:
- koreader-pocketbook-.targz
- koreader-pocketbook-.zip
Варіант компіляції KoReader на базі патчу koxtoolchain
git clone https://github.com/koreader/koxtoolchain.git cd koxtoolchain
Для секції PocketBook, я оновив рядок ARCH_FLAGS:
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"
Компілюємо:
./gen-tc.sh pocketbook
- можливо, доведеться довстановити:
sudo dnf install texinfo help2man
Збираємо KoReader аналогічно до способу з Kindle, але використовуємо локальний $PATH.
crosstool-ng
Це залежність до koxtoolchain. Згадую про crosstool-ng окремо, бо на системах (зокрема Fedora 43) з останніми версіями wget є баг:
Unknown option 'passive-ftp' (#9)
і готове рішення:
Remove --passive-ftp from wget usage (#2439)
Для PocketBook в koxtoolchain використовується стара хеш-залежність, яку я локально замінив на свою гілку зі ще одним, додатковим випилом --passive-ftp:
https://github.com/NiLuJe/crosstool-ng/pull/10
Щоб застосувати оновлену гілку, не чекаючи мержу, оновлюємо джерела секції "pocketbook":
# змінюємо рядки ~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. Цей тріп я до кінця поки не довів, буде оновлюватись.
Посилання
Тема #14600 на GitHub (дякую усім, хто долучився)
/uk/