понедельник, 30 сентября 2013 г.

RK3066 TV box. Работы продолжаются.

С утра сделал boot-анимацию (как это делается описано во многих источниках, поэтому не стану распространяться), пересобрал system.img, потом всю прошивку. Залил полученное в коробочку и получил неприятность - коробка загрузилась, показала анимацию и так на ней и застряла. Пришлось изучать вопрос - каким образом её перешить. Замечу, что коробка без USB-OTG, т.е. к компьютеру её не подключить. Кнопок на ней тоже нет. Разобрал, рассмотрел. Нашел отверстия для запайки кнопочки "RES". Поскольку при замыкании оных перезагрузки не произошло, предположил, что это у нас "Restore". Отключил питание, замкнул контакты, включил питание, подождал секунд пять - разомкнул контакты. Счастье есть - попал в restore mode. Там среди прочего есть "erase/wipe" и "rkflash ...". Еще раз всё перепроверил, подправил boot-анимацию (частоту кадров в первом случае поставил низковатую), собрал новый образ, залил на SD-карточку, прошил - коробка ожила. По некоторым непроверенным данным коробка могла "ожить" уже после "erase/wipe".
Где-то недавно видел сентенцию - "опыт - это то, что получаешь, когда не получаешь то, что хочешь". Склонен согласиться. Могу добавить только, что после получения опыта сильно возрастает вероятность получить то, что хочешь. Теперь можно не особо опасаясь пробовать кастомайзить ядро и сам android.
Ну и немного о том, как работать с system.img. Как я говорил в прошлом посте, system.img - в данном случае - это файл, содержащий в себе файловую систему ext3. Сначала монтируем систему и вытаскиваем из нее содержимое:

mkdir system
sudo mount -o loop system.img system
mkdir -p out/system
cp -R --preserve=all system/* out/system/
sudo umount system
mv system.img system-orig.img
Далее производим нужные пассы, после чего запаковываем out/system. Скриптик запаковки выдрал из тулзов сборки ядра для rk30xx:
#!/bin/bash

SYS=$1
OUT="system.img"

if [ -d "$SYS" ]
then
        # Main calculation
        delta=5120
        num_blocks=`du -sk $SYS | tail -n1 | awk '{print $1;}'`
        num_blocks=$(($num_blocks + $delta))
        num_inodes=`find $SYS | wc -l`
        num_inodes=$(($num_inodes + 500))
        ok=0

        echo "Blocks=$num_blocks, inodes=$num_inodes"
        while [ "$ok" = "0" ]
        do
                genext2fs -a -d $SYS -b $num_blocks \
                        -N $num_inodes -m 0 $OUT \
                        2>&1 >/dev/null \
                && \
                tune2fs -j -L system -c -1 -i 0 \
                        $OUT 2>&1>/dev/null \
                && \
                        ok=1 || num_blocks=$(($num_blocks + $delta))
        done
        echo "Recalculate blocks=$num_blocks"
        e2fsck -fy $OUT 2>&1>/dev/null || true

        delta=1024
        num_blocks=`resize2fs -P $OUT 2>&1 \
                | tail -n1 | awk '{print $7;}'`
        rm -f $OUT
        echo "Dirty run end, now building image..."
        ok=0
        while [ "$ok" = "0" ]
        do
                genext2fs -a -d $SYS -b $num_blocks \
                        -N $num_inodes -m 0 \
                        $OUT 2>&1>/dev/null \
                && \
                tune2fs -j -L system -c -1 -i 0 \
                        -O "dir_index,filetype,sparse_super" \
                        $OUT 2>&1>/dev/null \
                && \
                        ok=1 || num_blocks=$(($num_blocks + $delta))
        done
        e2fsck -fyD $OUT 2>&1>/dev/null || true
        echo "Done."

else
        echo "System directory $SYS not found"
        exit 0
fi

Выпольнять скрипт надо из под sudo. Результатом будет новый файл system.img, который надо поместить в Images, для последующей сборки прошивки.

воскресенье, 29 сентября 2013 г.

RK3066 TV Box update.img: Туда и обратно.

Разбираюсь с прошивками TV-Box на базе RockChip RK3066. Так, чисто для себя...
Итак. Распаковать имадж:

$ img_unpack update.img update-unpacked
rom version: 4.1.1
build time: 2013-08-20 14:15:41
chip: 60
checking md5sum....OK
 
Полученный образок распаковывается с помощью afptool:
 
$ afptool -unpack update-unpacked root
Check file...OK
------- UNPACK -------
package-file    0x00000800      0x00000238
RK30xxLoader(L)_V1.22.bin       0x00001000      0x0002EC7A
parameter       0x00030000      0x00000267
Image/misc.img  0x00030800      0x0000C000
Image/kernel.img        0x0003C800      0x00711030
Image/boot.img  0x0074E000      0x00A50000
Image/recovery.img      0x0119E000      0x00A9C000
Image/system.img        0x01C3A000      0x15D60800
parameter       0x1799A800      0x0000025B
SELF    0x00000000      0x1799C004
Skip SELF file.
update-script   0x1799B000      0x000003A5
recover-script  0x1799B800      0x0000010A
UnPack OK!
$
Забегая вперед скажу, что сразу же проверил обратную процедуру - упаковку с полученного дерева. Файлы в результате идентичные, об этом сказал ls -l и md5sum.
Упаковка до *.img делается с помощью img_maker, md5-суммы сходиться не будут, т.к. внутрь файла .img запихивается время, когда он был произведен. Проверил тем, что опять распаковал и проверил md5-сумму. Все точно.
Итак, после распаковки apftool получаем каталог root, в котором лежит структура прошивки андроида. В каталог Image легли образы всех кусков прошивки - boot, kernel, misc, recovery, system. В моем случае system.img - это готовая к работе ext3:
 
$ file Image/system.img
Image/system.img: Linux rev 1.0 ext3 filesystem data...

Соответственно, ее можно просто замонтировать по соседству:
$ mkdir system
$ sudo mount -o loop Image/system.img system 
О пассах с system.img - как нибудь позже.

Файл Image/boot.img содержит в себе и ядро и ramdisk

$ boot_info Image/boot.img
Page size: 16384 (0x00004000)
Kernel size: 7409700 (0x00711024)
Ramdisk size: 3374548 (0x00337dd4)
Second size: 0 (0x00000000)
Board name:
Command line: ''
Base address: 1611169536 (0x60087f00)

Распаковывается это дело с помощью скрипта split_boot:

$ split_boot Image/boot.img
Page size: 16384 (0x00004000)
Kernel size: 7409700 (0x00711024)
Ramdisk size: 3374548 (0x00337dd4)
Second size: 0 (0x00000000)
Board name:
Command line: ''
Base address: (0x60087f00)
 
в результате в текущем каталоге появляется каталог boot, который содержит boot.img-kernel, boot.img-ramdisk.cpio.gz и распакованный в соответствующий каталог ramdisk.Файлы Image/kernel.img - это упакованное ядро, а boot/boot.img-kernel - распакованное. репаковку можно делать с помощью mkkrnlimg. С ключиком -a - в img, с ключиком -r - распаковать. Опять же проверено по md5sum. Собрать boot.img назад можно с помощью mkbootimg, указав программе файлы с незапакованным ядром и рамдиском:

$ mkbootimg --kernel boot/boot.img-kernel \
     --ramdisk boot/boot.img-ramdisk.cpio.gz \
     -o Image/boot-1.img

опять же, boot.img & boot-1.img показывают одинаковые md5-суммы.

Пока я не смог понять, какой формат у файла boot/boot.img-kernel - я полагал, что это загзипленное ядро, но file говорит, что не понял, что это за формат.

Тулзы взяты из rk-tools, mkbootimg из rk30sdk.

MiniDLNA patch

Давеча подпатчил MiniDLNA сервер: поменял старого пингвина на нового, со значком DLNA на брюхе, а так же добавил раздаваемые расширения для аудиофайлов .dts & .mka. Тут вот. Патчить надо версию, которая раздается с сорсфоржа - там демон зовется minidlnad в отличии от версии в git'е.