
По рунету гуляет windows-кухня для прошивок rk2818. Факт сам по себе замечательный, но на Linux мы по умолчанию получаем комфортную работу с cramfs-образами, символическими ссылками и правами доступа.
1. Подготовка инструментария и распаковка update.img
Понадобятся утилиты rkunpack, rkafpack и rkcrc из набора rkutils.Стягиваем архив, распаковываем и компилируем:
gcc rkunpack.c -o rkunpackДля простоты я указываю относительные пути. Предполагается, что каталог rk2818 содержит скомпилированные утилиты и файл с модифицируемой прошивкой.
gcc rkafpack.c -o rkafpack
gcc rkcrc.c -o rkcrc
Распаковываем update.img
./rkunpack update.img

Из первых двух строчек следует, что мы потрошим кастом от BQ Voltaire.
Вообще большинство параметров можно почерпнуть в каталоге с распакованной прошивкой, но лучше сохранить вывод rkunpack в отдельном файле:
./rkunpack update.img > hwdef.txt

Из всего этого великолепия сейчас понадобятся только два файла:
/Image/boot.img - образ рамдиска
/Image/system.img - образ с андроидом

2. Распаковка cramfs-образов boot.img и system.img
Создадим необходимые для работы каталоги:mkdir -p ./edit-system ./edit-boot ./mnt-tmpmnt-tmp будет точкой монтирования образов
edit-system и edit-boot я использую для редактирования
Монтируем system.img в mnt-tmp:
sudo mount -t cramfs -o loop ./Image/system.img ./mnt-tmpИз-за особенностей файловой системы cramfs мы не можем вносить изменения напрямую, поэтому копируем содержимое в рабочий каталог:
sudo cp -r ./mnt-tmp/* ./edit-systemИ отмонтируем образ:
sudo umount ./mnt-tmpС boot.img работаем по аналогии:
sudo mount -t cramfs -o loop ./Image/boot.img ./mnt-tmp
sudo cp -r ./mnt-tmp/* ./edit-boot
sudo umount ./mnt-tmp
rmdir ./mnt-tmp

3. Кастомизация прошивки
Часть необязательная и условная
Итак, сейчас к доступной пользователю памяти мы обращаемся следующим образом:
/flash - внутренняя память устройства
/flash/sdcard - съёмная sd-карта
/sdcard - символическая ссылка на /flash/sdcard
Хочется избежать монтирования в каталог встроенной памяти и получить такую структуру:
/flash - внутренняя память
/sdcard - съёмная карта памяти
В android менеджер томов конфигурируется через vold.fstab, однако в старых версиях мы должны отредактировать vold.conf:
sudo nano ./edit-system/etc/vold.conf

Вносим необходимые изменения, удаляем симлинк и создаём нормальный каталог:
rm ./edit-boot/sdcard
sudo mkdir ./edit-boot/sdcard

Остаётся поправить пути в скрипте инициализации:
sudo nano ./edit-boot/init.rk28board.rcПридётся изменить три-четыре строки, а может и всего одну - здесь всё зависит от прошивки.
4. Сборка boot.img и system.img
Воспользуемся утилитой mkcramfs (Make a CramFs) для создания сжатого образа из содержимого директории:mkcramfs ./edit-boot boot-nocrc.img

Подписываем образ контрольной суммой для нашей платформы:
./rkcrc boot-nocrc.img ./Image/boot.img

С system.img процедура аналогичная:
mkcramfs ./edit-system system-nocrc.img
./rkcrc system-nocrc.img ./Image/system.img

5. Сборка прошивки в update.img
AFPTool - простой инструмент с тривиальными параметрами:wine AFPTool.exe -pack ./ update-new.img

А вот rkafpack позволяет вносить коррективы:
./rkafpack [parameter:value] name:file[@offset]Здесь нам и пригодится созданный при распаковке файл hwdef.txt
./rkafpack
FIRMWARE_VER:X.X.X
MACHINE_MODEL:XXXXXX
MANUFACTURER:rock-chips
HWDEF:HWDEF
package-file:package-file
'bootloader:RK28xxLoader(L).bin'
parameter:parameter:0x0@0x0
misc:Image/misc.img:0x0@0x2000
kernel:Image/kernel.img:0x0@0x4000
boot:Image/boot.img:0x0@0x8000
recovery:Image/recovery.img:0x0@0xa000
system:Image/system.img:0x0@0xe000
backup:SELF:0x0@0x56000
update-script:update-script
recover-script:recover-script
> update-new.img

Выглядит пугающе, но в итоге все процедуры сборки/разборки отдаются скриптам.
Заливаем прошивку на устройство и переименовываем в update.img:
