2016-10-17

Сборка Qualcomm модема из исходников (msm8626)

Пару недель назад анонимус поделился со мною полными исходниками Qualcomm для SoC msm8626, которые доступны производителям смартфонов. Причём данные исходники предназначены для сборки Android прошивок версии 5.1 (сами исходники датируются апрелем 2015 года).
Сразу после скачивания архива с этими исходниками у меня возникла мысль о сборке модема для моего телефона Highscreen Boost 2 SE из данных исходников.

До сего момента я уже пробовал собирать из исходников 2013 года модем для SoC msm8974 (тоже пренадлежит к Badger семейству), но я бросил это дело сразу, как только столкнулся с очень значительной проблемой. А всё потому, что у меня нет ни одного телефона с чипом msm8974. Теперь же у меня оказались в руках исходники модема для моего телефона и значит теперь со сборкой допустимо промучиться значительно дольшее время. Но всё оказалось значительно проще, т.к. со сборкой мне помог товарищ, который сумел довольно быстро найти хитрое решение проблемы, с которой я столкнулся ещё при попытках сборки модема для msm8974.

Ну да ладно. Хватит уже лирики, приступим к сборочному процессу. Но перед дальнейшем чтением всё же советую ознакомиться с моей предыдущей статьёй «Сборка Qualcomm модема из исходников (msm8916)» , которая посвящена аналогичной тематике.


Если собираете модем впервые, то следует установить некоторые зависимости:
sudo apt-get install p7zip-full
sudo apt-get install lib32z1 lib32ncurses5
sudo apt-get install scons
sudo apt-get install libxml-parser-perl

Скачиваем все исходники модема для msm8x26:
ROOTDIR=$HOME/dev/qcom/msm8626
mkdir -p $ROOTDIR
cd $ROOTDIR
git clone --branch "master" --progress -v "https://v2.pikacode.com/jsr-d10/qcom_msm8626_modem_proc.git" modem_proc
git clone --branch "master" --progress -v "https://v2.pikacode.com/jsr-d10/qcom_msm8626_adsp_proc.git"  adsp_proc
git clone --branch "master" --progress -v "https://v2.pikacode.com/jsr-d10/qcom_msm8626_wcnss_proc.git" wcnss_proc
Примечание: На текущий момент времени репозиторий "qcom_msm8626_modem_proc" был заблокирован (у QCOM длинные руки). Используйте зеркало: https://drop.me/B439WM
Для сборки нам понадобится специальная версия HEXAGON Tools, которую можно использовать для сборки модемов для чипов Badger семейства: HEXAGON Tools 6.4.06.a (170 MB).

После скачивания HEXAGON Tools их следует установить (устанавливаем из директории ~/Downloads):
HEXAGON_ROOT=$HOME/Qualcomm/HEXAGON_Tools
7za x -y -o$HEXAGON_ROOT $HOME/Downloads/hexagon_tools_6.4.06.a.7z

После того как все исходники и утилиты скачались можно приступить непосредственно к сборке.
Запускаем сборку модема:
ROOTDIR=$HOME/dev/qcom/msm8626
cd $ROOTDIR/modem_proc/build/ms/
./build.sh 8626.gen.prod BUILD_ID=AAAAANAZ -k

Через некоторое время процесс сборки должен завершиться и при успехе вы в консоли должны увидить следующие строки:
scons: done building targets.

==============================================================================
   SCons build summary
==============================================================================
** Build time...
 Build start  : Fri Oct 14 09:50:27 2016
 Build end    : Fri Oct 14 10:00:56 2016
 Elapsed time : 0:10:30
#-------------------------------------------------------------------------------
# BUILD END: AAAAANAZ
#-------------------------------------------------------------------------------

Хочу сразу отметить, что если вам понадобиться начать сборку с самого начала, то перед этим нужно выполнить "clean". Для этого нужно в консоли выполнить следующее:
ROOTDIR=$HOME/dev/qcom/msm8626
cd $ROOTDIR/modem_proc/build/ms/
./build.sh 8626.gen.prod BUILD_ID=AAAAANAZ --clean

Если сборка завершилась успешно, то результаты следует искать в директории "~/dev/qcom/msm8626/modem_proc/build/ms/":
./build.log
./bin/AAAAANAZ/mba.mbn
./bin/AAAAANAZ/qdsp6sw.mbn

Оба файла mba.mbn и qdsp6sw.mbn не имеют цифровой подписи. Поэтому их можно использовать только в тех случаях, когда в стоковом образе NON-HLOS.bin модуль модема так же не имеет цифровой подписи. В моём телефоне как раз таки все MBN образы не имеют цифровой подписи.

После удачной сборки основного модуля модема можно приступить к сборке ADSP модуля:
ROOTDIR=$HOME/dev/qcom/msm8626
cd $ROOTDIR/adsp_proc/build/ms/
./build.sh msm8x26 msm8x26_MPD BUILD_VER=1234 -k

Модуль WCNSS собрать из исходников не получиться, т.к. данный модуль поставляется уже в собранном виде. Поэтому можно сразу приступить к внедрению полученных образов в образ NON-HLOS.bin (его следует взять из стоковой прошивки).

Для начала скачаем специальный Python скрипт, служащий для разбивки MBN-образов на отдельные кодосекции:
ROOTDIR=$HOME/dev/qcom/msm8626
cd $ROOTDIR
wget http://github.com/remittor/qcom-mbn-tools/raw/master/pil-splitter.py

После этого скопируйте в директорию ROOTDIR образ модема NON-HLOS.bin (возьмите его из стоковой прошивки) и переименуйте этот файл в NON-HLOS-BASE.bin.
Создайте в директории ROOTDIR файл makeimg.sh со следующим содержимым:
cd `dirname $0`
ROOTDIR=$(pwd)

TMPDIR=mbn_images
rm -rf $ROOTDIR/$TMPDIR
mkdir -p $ROOTDIR/$TMPDIR
cd $ROOTDIR/$TMPDIR

MODEM_STK=$ROOTDIR/NON-HLOS-BASE.bin
MODEM_NEW=$ROOTDIR/NON-HLOS.bin

BUILD_ID=AAAAANAZ
IMAGE_DIR=$ROOTDIR/modem_proc/build/ms/bin/$BUILD_ID
python $ROOTDIR/pil-splitter.py $IMAGE_DIR/qdsp6sw.mbn modem
python $ROOTDIR/pil-splitter.py $IMAGE_DIR/mba.mbn mba

BUILD_ID=AAAAAAAA
IMAGE_DIR=$ROOTDIR/adsp_proc/build/ms/bin/$BUILD_ID
python $ROOTDIR/pil-splitter.py $IMAGE_DIR/dsp2.mbn adsp

BUILD_ID=8x26
IMAGE_DIR=$ROOTDIR/wcnss_proc/build/ms/bin/$BUILD_ID
python $ROOTDIR/pil-splitter.py $IMAGE_DIR/wcnss.mbn wcnss

MODEMVERSTR=`grep -aohPz "QC_IMAGE_VERSION_STRING=.*" ./modem.*`
MODEMVER=`echo $MODEMVERSTR | cut -d "=" -f 2`
echo $MODEMVER > $ROOTDIR/ver_info.txt

MODEM_VDISK=/media/vdisk
cp -f $MODEM_STK $MODEM_NEW
sudo mkdir -p $MODEM_VDISK
sudo mount -t vfat $MODEM_NEW -o rw,umask=0000,shortname=lower $MODEM_VDISK
rm -f $MODEM_VDISK/image/modem.*
rm -f $MODEM_VDISK/image/mba.*
rm -f $MODEM_VDISK/image/adsp.*
rm -f $MODEM_VDISK/image/wcnss.*
cp -f ./* $MODEM_VDISK/image/
rm -f $MODEM_VDISK/verinfo/ver_info.txt
mkdir -p $MODEM_VDISK/verinfo
cp -f $ROOTDIR/ver_info.txt $MODEM_VDISK/verinfo/
sudo umount $MODEM_NEW

cd $ROOTDIR
Теперь, запустив на выполнение скрипт makeimg.sh , вы получите на выходе новый файл NON-HLOS.bin , содержащий все ранее собранные MBN-файлы (точнее их кодосекции).

Полученный образ NON-HLOS.bin следует залить в eMMC в соответствующий раздел.

Результаты тестирования полученного модема в программе ookla SpeedTest:


4 комментария:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. Спасибо за интересные статьи. Информации по сборке радиомодулей для Qualcomm в интернете действительно мало, в свое время мне удалось найти только один китайский блог (здесь и здесь) в котором рассматривались эти вопросы.

    p.s. Кстати, а вы случайно не богаты Hexagon Tools 5.0.08? Интересует именно эта версия, т.к. 6.4.06 не собирает мой modem для 9x25 чипа. Если в двух словах, то ковырялся с ним около недели, удалось победить все ошибки, но на этапе линковки получаю что-то вроде:

    In function `tplt_task':
    tplt_cntrl.c:(.text.tplt_task+0xc4): relocation truncated to fit: R_HEX_GPREL16_2 against symbol `dog_plt_rpt_time' defined in .rodata.dog_plt_rpt_time section in __local.dir/dog.o

    в нескольких местах. И как это победить я пока не придумал. Штатно, исходники предназначены для сборки с помощью Hexagon Tools 5.0.08, которая, к сожалению, у меня отсутствует.

    ОтветитьУдалить
  3. Здравствуйте, сам я в программировании не разбираюсь, но имею такую проблему:есть телефон Samsung Note 4 Sprint(n910p) на квалкоме, он не поддерживает Российские band сетей 4G. Есть подозрения, что это дело можно исправить поковырявшись в модеме. Это можно как то проверить? Спасибо

    ОтветитьУдалить
  4. Это больше похоже на OEM пакет. Там куча бинарных библиотек используется. Вот если бы реальные сырцы нарыть.

    ОтветитьУдалить