Спроба портування 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, я скористався таким лайф-хаком:



Таким чином, все буде розпізнаватись, додаток буде стартувати, але все-одно вилітатиме по причинам нижче (хоча вже писатиме подробиці в crash.log)


Біндінг PocketBook 602


На момент допису, підтримки цього девайсу в офіціному наборі немає. Біндінг потрібен для опису специфіки конкретного пристрою для роботи програми, це свого роду такий собі високорівневий "драйвер", без якого KoReader просто не запуститься з помилкою в crash.log накшталт "девайс не підтримується".


Все це є в документації, але підсумовуючи створив:


окрему гілку

патч

PR#14611


Щоб не ходити на 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

Крос-компіляція 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

Я спочатку подумав, що самий хитрий і вирішив просто підмінити бінарники з іншого релізу:

https://github.com/koreader/koreader/releases/download/v2025.10/koreader-linux-armv7l-v2025.10.tar.xz


Але не все так склалося як гадалося: у цьому наборі зовсім інша структура та набори файлів. Отже довелось таки розгортати середовище для крос-компіляції. Минаючи довгу передісторію, потрібно виконати кроки в розділах нижче, попередньо ознайомившись з актуальною документацією:


Building

Building targets

Porting


Варіант компіляції 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

file /bin/busybox


Нижче все-ж лишаю інструкцію такого варіанту збірки (на прикладі платформи 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"

Додатково ставимо залежності для вашої операційної системи:

Prerequisites

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

Після чого компілюємо збірку pocketbook (засобами хосту arm-kindle-linux-gnueabi)


./kodev release pocketbook

Архіви мають згенеруватись в корінь поточного проєкту, в мене вони без версії:



Варіант компіляції 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/