Спроба портування KoReader на PocketBook 602

На момент допису, через допотопність девайсу PocketBook 602, офіційної підтримки його в KoReader немає, тому я вирішив на скору для себе з цим розібратись.

Сам додаток KoReader мені потрібен виключно через наявність в ньому плагіна для читання ресурсів Gemini / Gemtext:

Нижче описаний персональний досвід, щоб нічого не забути, бо портування не є завершеним!

Особливості встановлення

Встановлюючи 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

Але у такому разі, додаток не запускатиметься, при чому 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

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

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

Building
Building targets
Porting

Варіант компіляції KoReader на базі архітектури Kindle

Цей метод мені порадили тут:

Як виявилося згодом, бінарна збірка 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:

Розпаковуємо його в потрібну теку або створюємо туди симлінки та оголошуємо шлях:

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:

Щоб застосувати оновлену гілку, не чекаючи мержу, оновлюємо джерела секції "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 (дякую усім, хто долучився)