Первый открытый GSM-телефон
Приветствую всех!
Последние годы довольно часто обсуждаются проекты open-source телефонов. В основном это всякие смартфоны на Linux, иногда припоминают и всякую экзотику типа OpenMoko. Но есть одна проблема — baseband, процессор модема, который непосредственно отвечает за всё его взаимодействие с сетями. Эти чипы исполняют проприетарный код, исходники которого распространяются под строгими NDA и недоступны практически никому.
Как насчёт того, чтобы создать открытый GSM-телефон? Именно об этом мы сегодня и поговорим, а заодно и попробуем запустить такой экземпляр.
Итак, в сегодняшней статье поговорим о том, насколько реально простому пользователю получить GSM-телефон, прошивка модема в котором работает без блобов. Попутно выясним, как это сделать и что из этого получится. Традиционно будет много интересного.
❯ Суть такова
У всех на слуху такие девайсы как PinePhone или Fairphone. Это довольно интересные устройства, но сегодня речь пойдёт не о них. Если у упомянутых телефонов основной упор сделан на операционную систему, ремонтопригодность и тому подобные параметры, то проект, который мы рассмотрим сейчас, касается радиочастотной части: модема, DSP и взаимодействия с сотовой сетью на низком уровне. Во всех ранее представленных экземплярах используется уже готовый модуль модема, тогда как тут всё практически полностью открыто, а прошивка собирается из исходников и лишена блобов.
Сразу предупреждаю: то, что есть сейчас — всего лишь концепт, до полноценного использования девайса как телефона ещё далеко. Тем не менее, это хороший пример того, как при помощи доступного даже простому школьнику железа получить открытый (ну почти) GSM-телефон.
❯ TI Calypso
Давным-давно, где-то в самом начале двухтысячных, в Texas Instruments придумали чипсет Calypso.
Он предназначался для построения на нём бюджетных кнопочных телефонов и использовался целым рядом компаний, в частности, Motorola, Sony Ericsson и Siemens.
На самом деле практически никто не занимался разработкой и производством телефонов, все эти задачи были отданы на откуп тайваньской Compal, у которой просто закупали огромными партиями дешёвые ODM-трубки. Таких телефонов, использующих данный чипсет, по факту было ещё больше, чем может показаться. И, казалось бы, девайсы не были примечательны что для пользователей, что для энтузиастов, если бы не один примечательный факт. В 2008 году на сайте cryptome.org была выложена слитая документация на данный чипсет. Это вызвало поистине небывалый интерес в узких кругах, позже с использованием этих наработок было создано немало интересных проектов, в том числе во всех смыслах легендарный OsmocomBB. Но сегодня речь пойдёт не о нём, а о прямо противоположном устройстве. Раз есть базовая станция с открытым ПО, то почему бы и не быть такому телефону? Именно о нём мы сейчас и поговорим.
❯ FreeCalypso
Именно благодаря упомянутой утечке был создан проект FreeCalypso — открытая альтернативная прошивка для телефонов на таком чипсете. Для её использования понадобится только телефон из числа совместимых (их мы затронем чуть позже) и шнурок для подключения подопытного к компьютеру.
Несмотря на то, что прошивка цифрового сигнального процессора (он же DSP) так и остаётся «чёрным ящиком», можно с уверенностью сказать, что FreeCalypso наиболее близок к идее открытого GSM-телефона. На момент написания статьи ближе находятся только решения с использованием SDR, но простым пользователям они практически недоступны ввиду крайне высокой цены таких приборов, тогда как старый телефон на опыты может себе позволить практически каждый.
❯ Обзор оборудования
Итак, для того, чтобы повторить у себя этот проект, понадобится всего-ничего: совместимый телефон, кабель для прошивки и компьютер с Linux.
А вот и подопытный телефон. Это Motorola C139. Подойдут также C113, C115, C118, C155, но лично я с ними не пробовал. Под другие телефоны альтернативной прошивки нет.
Как и в C118, тут тоже есть сервисное меню, код для его входа такой же: **16379#. Тут можно включить трассировку, которую он будет отправлять в последовательный порт.
Интерфейс также очень похож на другие телефоны Motorola на чипсете TI Calypso. Ну, а если достать C118, сомнения о том, что это телефоны из одной линейки, пропадают сразу же.
Для прошивки понадобится некий «T191 unlock cable», служащий для связи телефона с компьютером.
На практике его можно заменить переходником на базе CP2102 (или любым другим, у которого есть поддержка уровней 3,3 В. Не используйте переходники с пятивольтовыми уровнями. Спалите телефон). Как его спаять, я уже описывал тут. Подключать его надо к ПК с Linux, виртуалка не подойдёт. Возможно, у вас дела будут обстоять иначе, но на практике я столкнулся с тем, что при подключении такой штуки к ВМ начинается периодический пропуск байтов.
❯ Чуть-чуть об устройстве GSM-телефона
Немного затронем то, из чего вообще состоят обычные телефоны.
Сейчас нас интересуют именно кнопочные экземпляры, причём именно «традиционные», без какой-то пользовательской ОС и прочих наворотов. В отличие от смартфонов и коммуникаторов, где основной процессор общается с внешним модемом, здесь что пользовательские функции, что взаимодействие с сетью выполняются одним и тем же процессором, в нашем случае это тот самый TI Calypso.
Вот структурная схема телефона на таком чипсете. TI Calypso имеет в своём составе тот самый необходимый для работы сети DSP, процессорное ядро (ARM7TDMI) и аппаратные контроллеры интерфейса. К нему подключается радиочастотная часть: чип трансивера, высокостабильный генератор (тот самый, погрешности которого нам тогда не хватало, чтобы поднять свою БС без приёма синхросигнала от другой), антенна, фильтр, смеситель и антенный переключатель. Последний позволяет использовать одну антенну для приёма и передачи. Поскольку в GSM используется временное разделение, между кадрами на приём и передачу есть определённая задержка (равная длительности трёх кадров), так что этот чип представляет собой не частотно-разделительный фильтр, как в аналоговых телефонах (AMPS, TACS, NMT), а просто коммутатор, подключающий антенну то к приёмнику, то к передатчику.
Эти аналоговые сигналы обрабатывает DSP, прошивка и описание которого не разглашается даже производителям телефонов (тем же компаниям, которые и продают трубки, либо тем, кто выпускает ODM-телефоны, закупаемые предыдущими брендами).
Другими компонентами baseband являются аппаратный шифратор (реализующий те самые алгоритмы A5/1 и A5/2), ПЗУ с прошивкой DSP, аудиокодек, а также различные контроллеры — UART, дисплея, клавиатуры, ISO7816 (для чтения SIM-карты) и прочей периферии.
Что же до телефонов с двумя симками, то тут есть два варианта. Первый ныне практически полностью ушёл в историю — там используется один модем, а симки подключаются к нему через обычный мультиплексор. Таким образом, единовременно может быть доступна в сети только одна карта. Такая схема использовалась в первых таких телефонах (обычно это были дешёвые китайские трубки). Второй вариант сложнее — по сути это два полноценных модема, размещённых в одном корпусе. Так устроены ну практически все современные телефоны, начиная от стареньких Samsung Duos и заканчивая нынешними смартфонами.
❯ Ставим софт
Переходим к опытам. Для загрузки альтернативной прошивки нужна сама прошивка под нужный нам телефон, а также софт для этого. Всё это можно скачать тут. Нас интересуют архивы c1xx-fcmag-latest.tar.bz2 и fc-host-tools-latest.tar.bz2. Первый содержит прошивку и сопутствующие файлы, второй — утилиты для её загрузки.
Если прошивка поставляется собранной вместе с исходниками, то софт необходимо компилировать самому. Для этого распаковываем архив в папку, заходим в неё и традиционным для линукса образом собираем софт:
make
sudo make install
После непродолжительной сборки (я пробовал на Linux Mint и на Lubuntu, проблем не возникло) всё нужное ПО будет готово.
❯ Сливаем прошивку
Перед началом прошивки необходимо сделать резервную копию Flash. Она нужна на случай, если придётся вернуться к изначальной прошивке или если в процессе загрузки новой что-то пойдёт не так.
Итак, заходим в папку loadtools и запускаем софт:
sudo ./fc-loadtool -h compal -c 1003 /dev/ttyUSB0
Само собой, порт нужно заменить на тот, который соответствует вашему переходнику. Если у вас не C139, то команду следует выполнить со следующими параметрами:
C11x/12x: fc-loadtool -h compal /dev/ttyXXX
C139/140: fc-loadtool -h compal -c 1004 /dev/ttyXXX
C155/156: fc-loadtool -h c155 /dev/ttyXXX
Если всё сделано верно, в консоли появится примерно следующее:
Коротко жмякаем кнопку питания. Удерживать её не надо, это приведёт к обычной загрузке, что нам пока что не требуется. Также не стоит пытаться делать это с подключенным зарядником — в это время загрузчик не работает.
Если подключение успешно, отобразится консоль loadtool. Вводим следующую команду:
flash dump2bin backup.bin
Начнётся копирование прошивки с телефона на ПК. Процесс этот ничуть не быстрый и занимает примерно десять минут.
По окончании в папке с программой будет создан файл с штатной прошивкой телефона.
❯ Калибровка
Компоненты, использованные в радиочастотной части телефона, неидеальны, а ручная подгонка их номиналов привела бы к непомерному удорожанию телефона. Поэтому поступают проще: собранный телефон подключается к тестовому стенду, после чего полученные поправки и коэффициенты записываются на Flash.
Многие из вас наверняка видели этот маленький высокочастотный разъём на телефоне, а кто-то ошибочно полагал, что нужен он для подключения внешней антенны.
На старых телефонах всё было именно так. Вот, например, такое подключение на Motorola M3688. На новых же трубках этот разъём служит исключительно для тестирования на заводе или в сервисе, никакие пользовательские аксессуары в него не втыкаются.
Более того, кустарные попытки что-то туда воткнуть, скорее всего, приведут к тому, что не самый распространённый в других областях разъём сломается и телефон перестанет ловить сеть.
Тестирование обычно происходит при помощи специальных (ориентированных именно на мобильные сети) анализаторов стоимостью как квартира в центре столицы нашей страны.
Так вот. После того, как нужные настройки радиочастотной части получены, их загружают в память телефона, где они лежат в одном из скрытых каталогов файловой системы. Если просто установить свою прошивку (а FreeCalypso затирает всю Flash), то эти данные будут утеряны и телефон превратится в электронный органайзер. Поэтому их надо оттуда извлечь. Для этого предназначена специальная утилита c1xx-calextr, лежащая в папке ./ffstools/caltools.
Выполняем следующую команду:
./c1xx-calextr -b rfbin backup.bin 0x3FC000
Здесь backup.bin — файл дампа Flash, 0×3FC000 — смещение. Оно определяется следующим образом. Если размер Flash равен двум МБ, то смещение равно 0×1FC000, если четырём, то 0×3FC000. Размер этот очень легко определить по самому файлу дампа — 2097152 байт для маленькой версии и 4194304 байт для большой. После выполнения команды создастся папка rfbin, содержащая в себе все необходимые файлы с параметрами.
❯ Аккумулятор
Теперь очередь контроллера питания. Для него тоже есть свои параметры, если их не задать, то телефон не будет заряжаться. В инструкциях FreeCalypso упоминается вот эта ссылка, но она нерабочая. В реальности нужные нам файлы лежат тут. Нам понадобится standard следующего содержания:
# This is the "standard" charging config for Mot C1xx phones running
# FreeCalypso fw. The key points are:
#
# 1) The battery is charged to the full 4.2 V, not a lower voltage,
# for traditional mobile phone usage patterns in which the user charges
# the battery fully before going out.
#
# 2) The start threshold is set fairly high on the reasoning that if
# the user connects the charging power source (which is not USB and thus
# not required for computer connection), it means that she actually intends
# to charge the battery, but it is set to 4100 mV instead of "always"
# so that if the battery is really full, an explicit AT@CHG=1 command
# or a future UI equivalent will be needed to force a charging start.
#
# 3) The restart threshold is a reasonable setting so if the phone is left
# plugged into the charger for a long time, the user won't be surprised
# with a battery that has run down significantly after the completion
# of the initial charging cycle.
start-threshold 4100 # mV
restart-threshold 3900 # mV
# Constant Voltage charging parameters mostly copied from Pirelli
ci2cv-threshold 4245 # mV, lowered from Pirelli's 4250
cv-initial-setpoint 4220 # mV
cv-ctrl-loop-high 4236 # mV
cv-ctrl-loop-low 4170 # mV, bumped up from Pirelli's 4160
cv-dac-max-incr 8 # DAC units
cv-dac-max-decr 50 # DAC units
cv-ctrl-loop-sample-count 6 # our logic is simpler than Pirelli's
overvoltage 4280 # mV, bumped up from Pirelli's 4270
# For the current settings, keep in mind that C1xx phones use a current
# measurement resistor of 0.15R instead of TI's "canonical" value of 0.20R,
# hence the conversion factor between mA and ADC/DAC numbers changes
# accordingly. The CI current setting is based on what Motorola's fw
# has been observed to set, but the end current setting is our own,
# chosen empirically.
ci-current 280 # DAC units, about 320 mA
end-current 60 # ADC units, about 68 mA
ichg-max-spike 26 # ADC units, about 30 mA
ichg-low-samples-needed 30 # sample count
# The apppropriate charging time limit and restart delay have yet to be
# determined; for now we give it a super-generous 6 h charging time limit
# and 2 h restart delay.
charging-time-limit 21600
restart-delay 7200
# Motorola's fw does not seem to use the I2V offset mechanism,
# but we use the same setting as Pirelli.
i2v-offset 0x18 # register setting
# This is the "standard" charging config for Mot C1xx phones running
# FreeCalypso fw. The start threshold is set to "always" on the reasoning
# that if the user connects the charging power source (which is not USB
# and thus not required for computer connection), it means that she
# actually intends to charge the battery, the charge-to voltage is the
# full charge (charge the battery fully before going out), and the
# restart threshold is a reasonable setting so if the phone is left
# plugged into the charger for a long time, the user won't be surprised
# with a battery that has run down significantly after the completion
# of the initial charging cycle.
start-threshold always
restart-threshold 3900 # mV
charge-to-voltage 4200 # mV
overvoltage 4280 # mV
# For the current settings, keep in mind that C1xx phones use a current
# measurement resistor of 0.15R instead of TI's "canonical" value of 0.20R,
# hence the conversion factor between mA and ADC/DAC numbers changes
# accordingly. The CI current setting is based on what Motorola's fw
# has been observed to set, but the end current setting is our own.
ci-current 280 # DAC units, about 320 mA
end-current 88 # ADC units, about 100 mA
# Motorola's fw does not seem to use the I2V offset mechanism,
# but we use the same setting as Pirelli.
i2v-offset 0x18 # register setting
Ну что же, можно перейти к самому важному этапу.
❯ Загрузчик
Теперь самый ответственный момент — перезапись загрузчика Motorola на тот, который будет запускать софт FreeCalypso.
Внимание! Неправильная перепрошивка загрузчика или нештатная ситуация в её процессе ведёт к окирпичиванию телефона. Если вы запорете эту область памяти, вернуть трубу к жизни сможет только программатор!
В случае использования C155 перепрошивать загрузчик не надо, описанные в этом разделе действия окирпичат телефон.
Перед началом данного предприятия заряжаем телефон «под завязку», затем подключаем его к компьютеру. Если аккумулятор дохлый, то запускаем от ЛБП, для верности. Симку, если она была вставлена, необходимо вытащить. Из архива с прошивкой извлекаем compal-flash-boot-for-fc.bin. После этого запускаем софт для прошивки, ранее описанным образом запускаем на телефоне загрузчик и выполняем следующую команду:
flash erase-program-boot compal-flash-boot-for-fc.bin
Если всё было сделано правильно, загрузчик будет успешно записан.
❯ Освобождение «Калипсо»
Теперь, если загрузчик записан, можно приступать к самой прошивке. В архиве нас интересует папка build-c139-hybrid-ui-vo. В ней и находится интересующая нас прошивка. И тут есть один нюанс: в качестве «полноценного» телефона подойдёт только Motorola C139. Под другие телефоны прошивки тоже имеются, но они реазизуют функционал голосового модема, а не полностью самостоятельного телефона. Это тоже необходимо учесть, если вы хотите использовать иной телефон.
Итак, идём в эту папку и закидываем содержимое туда, где у нас лежит софт для загрузки. Далее вводим команду:
exec flash-script
Прошивка начинается со стирания памяти.
Далее произойдёт загрузка самой прошивки.
И, после нескольких минут томительного ожидания, программа выдаст нечто вроде этого.
Затираем участок Flash, выделенный под системные файлы, для чего вводим команду:
flash erase 0x3C0000 0x30000
Первое число — смещение. Оно также отличается в зависимости от объёма памяти: 0×1C0000 для 2 МБ, 0×3C0000 для 4 МБ, 0×700000 для 8 МБ. Второе число — количество байт: 0×30000 для 2 и 4 МБ, 0xD0000 для 8 МБ.
С fc-loadtool по сути всё. Выходим, набрав exit.
❯ IMEI
Поскольку Flash была затёрта, необходимо восстановить IMEI. Не будем заморачиваться с тем, какой взять, а просто вернём обратно тот, какой был изначально. В память телефона записывается не IMEI, а IMEISV, содержащий в себе также версию прошивки, поэтому это число придётся несколько модифицировать.
Получить его довольно просто. Берём IMEI, указанный под крышкой телефона, отбрасываем последнюю цифру (контрольное значение, рассчитанное по коду Луна), после чего прибавляем любые две цифры, какие хочется. То, что получилось, где-нибудь записываем, оно нам пригодится чуть позже.
❯ Файловая система
Сразу после загрузки прошивки телефон не готов к работе. Необходимо инициализировать ФС и залить ранее упомянутые параметры.
Для этого идём в папку rvinterf/lowlevel, где выполняем команду:
sudo ./rvinterf /dev/ttyUSB0
После её выполнения ничего произойти не должно.
Коротко жмякаем красную трубочку на телефоне. После этого телефон крякнет, а в окне быстро посыпятся логи.
При этом на дисплее отобразится «Insert SIM».
Далее идём в rvinterf/etmsync, где выполняем:
sudo ./fc-fsio
Это и есть та самая утилита для работы с файловой системой.
После этого помещаем в папку файл конфигурации зарядки аккумулятора standard и папку rfbin. После этого вводим следующие команды:
format /
mk-std-dirs
set-imeisv fc XXXXXXXX-YYYYYY-SV
set-rfcap dual-eu
upload-subtree rfbin /gsm/rf
write-charging-config standard
В ходе их выполнения происходит восстановление структуры каталогов, а также восстанавливается ранее затёртый IMEI. Само собой, нужно подставить те значения, которые мы тогда получили.
Теперь точно всё. Можно выходить.
❯ Что же получилось?
Включаем телефон.
Нас встречает вот такая заставка с логотипом TI.
Если в телефоне есть симка, то он напишет «No Network», а затем начнёт пытаться искать сеть.
Откроем меню.
Поддерживается даже SIM Toolkit.
А вот телефонную книгу в русской кодировке он прочитать не смог.
Само собой, куча настроек отведена для сотовых сетей.
Приложения дадут постоять в сторонке любому нынешнему мобильнику с претензией на минимализм — тут только калькулятор и диктофон. Последний умеет записывать только непрерывное «Кхрррр» на максимальной громкости, с чем это связано, мне неведомо. Никаких игр тоже не предусмотрено.
Ну, а для тех, кто не любит звонить или для тех, кто хочет отдельный телефон для авторизаций, есть возможность отправлять и принимать SMS.
Предусмотрена куча мелодий звонка, но, равно как и в пиратских восьмибитных картриджах »9999 в одном», какая бы ни была выбрана, звучать всё равно будет одна и та же.
❯ Можно ли по нему звонить?
Перейдём к тестированию самой главной его функции.
Чтобы выяснить это, берём рабочую симку и вставляем её в телефон. После запуска трубка нашла сеть, а на экране появился «замочек» активного шифрования.
Набираем номер, и телефон начинает звонить.
Звонит, однако!
И можно принять вызов и попробовать поговорить. Само собой, качество связи ничем от обычного мобильника не отличается.
❯ Что же ещё?
Одной лишь прошивкой FreeCalypso не ограничилась. И у них даже есть несколько аппаратных продуктов.
Самый главный — FCDEV3B, по сути отладочная плата на таком чипсете. Что характерно, во FreeCalypso говорят, что она не предназначена для запуска на ней софта Osmocom и будет лишена гарантии, если будет замечено, что на ней проводилось именно это (например, если с её помощью поднимали БС, для чего перепаивали фильтры).
FreeCalypso Tango, некий GSM-модем, но с их открытой прошивкой.
Community SIM, программируемая симка, ориентированная специально на работу в сетях 2G.
❯ Вот как-то так
Для чего же всё это надо? Разумеется, большинству из нас будет куда проще просто пойти и купить какой-то кнопочный телефон, не заморачиваясь с поиском и прошивкой Motorola C139. И для большинства таких пользователей он будет успешно справляться со всеми необходимыми задачами (если, конечно, сам не окажется с подвохом).
Сама по себе прошивка далека от идеала, но отлично показывает, что открытая реализация сотового телефона вполне возможна, причём без существенных затрат.
Такие дела.
❯ Ссылки
Возможно, захочется почитать и это:
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩