Первый открытый GSM-телефон

Приветствую всех!

Последние годы довольно часто обсуждаются проекты open-source телефонов. В основном это всякие смартфоны на Linux, иногда припоминают и всякую экзотику типа OpenMoko. Но есть одна проблема — baseband, процессор модема, который непосредственно отвечает за всё его взаимодействие с сетями. Эти чипы исполняют проприетарный код, исходники которого распространяются под строгими NDA и недоступны практически никому.

Как насчёт того, чтобы создать открытый GSM-телефон? Именно об этом мы сегодня и поговорим, а заодно и попробуем запустить такой экземпляр.

v7nopmbno9uphmf0-tbt0gcmw8u.jpeg

Итак, в сегодняшней статье поговорим о том, насколько реально простому пользователю получить GSM-телефон, прошивка модема в котором работает без блобов. Попутно выясним, как это сделать и что из этого получится. Традиционно будет много интересного.

Суть такова


У всех на слуху такие девайсы как PinePhone или Fairphone. Это довольно интересные устройства, но сегодня речь пойдёт не о них. Если у упомянутых телефонов основной упор сделан на операционную систему, ремонтопригодность и тому подобные параметры, то проект, который мы рассмотрим сейчас, касается радиочастотной части: модема, DSP и взаимодействия с сотовой сетью на низком уровне. Во всех ранее представленных экземплярах используется уже готовый модуль модема, тогда как тут всё практически полностью открыто, а прошивка собирается из исходников и лишена блобов.

Сразу предупреждаю: то, что есть сейчас — всего лишь концепт, до полноценного использования девайса как телефона ещё далеко. Тем не менее, это хороший пример того, как при помощи доступного даже простому школьнику железа получить открытый (ну почти) GSM-телефон.

TI Calypso


Давным-давно, где-то в самом начале двухтысячных, в Texas Instruments придумали чипсет Calypso.

9gipet3hrolfjqg-dv-dt7cgkyk.jpeg

Он предназначался для построения на нём бюджетных кнопочных телефонов и использовался целым рядом компаний, в частности, Motorola, Sony Ericsson и Siemens.

9tyhdqn6eotly9vuyfxhnn6d3e8.jpeg

На самом деле практически никто не занимался разработкой и производством телефонов, все эти задачи были отданы на откуп тайваньской Compal, у которой просто закупали огромными партиями дешёвые ODM-трубки. Таких телефонов, использующих данный чипсет, по факту было ещё больше, чем может показаться. И, казалось бы, девайсы не были примечательны что для пользователей, что для энтузиастов, если бы не один примечательный факт. В 2008 году на сайте cryptome.org была выложена слитая документация на данный чипсет. Это вызвало поистине небывалый интерес в узких кругах, позже с использованием этих наработок было создано немало интересных проектов, в том числе во всех смыслах легендарный OsmocomBB. Но сегодня речь пойдёт не о нём, а о прямо противоположном устройстве. Раз есть базовая станция с открытым ПО, то почему бы и не быть такому телефону? Именно о нём мы сейчас и поговорим.

FreeCalypso


Именно благодаря упомянутой утечке был создан проект FreeCalypso — открытая альтернативная прошивка для телефонов на таком чипсете. Для её использования понадобится только телефон из числа совместимых (их мы затронем чуть позже) и шнурок для подключения подопытного к компьютеру.

Несмотря на то, что прошивка цифрового сигнального процессора (он же DSP) так и остаётся «чёрным ящиком», можно с уверенностью сказать, что FreeCalypso наиболее близок к идее открытого GSM-телефона. На момент написания статьи ближе находятся только решения с использованием SDR, но простым пользователям они практически недоступны ввиду крайне высокой цены таких приборов, тогда как старый телефон на опыты может себе позволить практически каждый.

Обзор оборудования


Итак, для того, чтобы повторить у себя этот проект, понадобится всего-ничего: совместимый телефон, кабель для прошивки и компьютер с Linux.

w2nzvskfvjiwppda7agxfmkmblw.jpeg

А вот и подопытный телефон. Это Motorola C139. Подойдут также C113, C115, C118, C155, но лично я с ними не пробовал. Под другие телефоны альтернативной прошивки нет.

8iszzgxyxru72buqvc1alm3viek.jpeg

Как и в C118, тут тоже есть сервисное меню, код для его входа такой же: **16379#. Тут можно включить трассировку, которую он будет отправлять в последовательный порт.

elr6jjmrlnxwdvyjwuebnfvd6ku.jpeg

Интерфейс также очень похож на другие телефоны Motorola на чипсете TI Calypso. Ну, а если достать C118, сомнения о том, что это телефоны из одной линейки, пропадают сразу же.

_pt9xjbbbgdmc0kignwctzuhgcc.jpeg

Для прошивки понадобится некий «T191 unlock cable», служащий для связи телефона с компьютером.

image

На практике его можно заменить переходником на базе CP2102 (или любым другим, у которого есть поддержка уровней 3,3 В. Не используйте переходники с пятивольтовыми уровнями. Спалите телефон). Как его спаять, я уже описывал тут. Подключать его надо к ПК с Linux, виртуалка не подойдёт. Возможно, у вас дела будут обстоять иначе, но на практике я столкнулся с тем, что при подключении такой штуки к ВМ начинается периодический пропуск байтов.

Чуть-чуть об устройстве GSM-телефона


Немного затронем то, из чего вообще состоят обычные телефоны.
Сейчас нас интересуют именно кнопочные экземпляры, причём именно «традиционные», без какой-то пользовательской ОС и прочих наворотов. В отличие от смартфонов и коммуникаторов, где основной процессор общается с внешним модемом, здесь что пользовательские функции, что взаимодействие с сетью выполняются одним и тем же процессором, в нашем случае это тот самый TI Calypso.

tktjjkb5gwffamnzjmrubwcw2yw.png

Вот структурная схема телефона на таком чипсете. 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

Если всё сделано верно, в консоли появится примерно следующее:

iemqidshfdubqoryyy-4or_85ka.jpeg

Коротко жмякаем кнопку питания. Удерживать её не надо, это приведёт к обычной загрузке, что нам пока что не требуется. Также не стоит пытаться делать это с подключенным зарядником — в это время загрузчик не работает.

7ku1fttrdzwkd62uuwruf5-vy7s.jpeg

Если подключение успешно, отобразится консоль loadtool. Вводим следующую команду:

flash dump2bin backup.bin


uunexsejl96616pvpmdlb7c_evk.jpeg

Начнётся копирование прошивки с телефона на ПК. Процесс этот ничуть не быстрый и занимает примерно десять минут.

zioynhtxc1oekw3oblninaa9l-s.jpeg

По окончании в папке с программой будет создан файл с штатной прошивкой телефона.

Калибровка


Компоненты, использованные в радиочастотной части телефона, неидеальны, а ручная подгонка их номиналов привела бы к непомерному удорожанию телефона. Поэтому поступают проще: собранный телефон подключается к тестовому стенду, после чего полученные поправки и коэффициенты записываются на Flash.

nr71avwnsklz81kbcaofz3bzj9s.jpeg

Многие из вас наверняка видели этот маленький высокочастотный разъём на телефоне, а кто-то ошибочно полагал, что нужен он для подключения внешней антенны.

y6udugdmeajviwkx1mxgdd8nvxs.jpeg

На старых телефонах всё было именно так. Вот, например, такое подключение на Motorola M3688. На новых же трубках этот разъём служит исключительно для тестирования на заводе или в сервисе, никакие пользовательские аксессуары в него не втыкаются.

yczvp6ojj9eqh8hdhsltozwjvsw.png

Более того, кустарные попытки что-то туда воткнуть, скорее всего, приведут к тому, что не самый распространённый в других областях разъём сломается и телефон перестанет ловить сеть.

5tntv3unglk7p-386tu84miefke.png

Тестирование обычно происходит при помощи специальных (ориентированных именно на мобильные сети) анализаторов стоимостью как квартира в центре столицы нашей страны.

Так вот. После того, как нужные настройки радиочастотной части получены, их загружают в память телефона, где они лежат в одном из скрытых каталогов файловой системы. Если просто установить свою прошивку (а FreeCalypso затирает всю Flash), то эти данные будут утеряны и телефон превратится в электронный органайзер. Поэтому их надо оттуда извлечь. Для этого предназначена специальная утилита c1xx-calextr, лежащая в папке ./ffstools/caltools.

wix69jroru2faa6-ej_ljpg_ob4.jpeg

Выполняем следующую команду:

./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


lxqnnegequg4e22_karh7ile54e.jpeg

Если всё было сделано правильно, загрузчик будет успешно записан.

Освобождение «Калипсо»


Теперь, если загрузчик записан, можно приступать к самой прошивке. В архиве нас интересует папка build-c139-hybrid-ui-vo. В ней и находится интересующая нас прошивка. И тут есть один нюанс: в качестве «полноценного» телефона подойдёт только Motorola C139. Под другие телефоны прошивки тоже имеются, но они реазизуют функционал голосового модема, а не полностью самостоятельного телефона. Это тоже необходимо учесть, если вы хотите использовать иной телефон.

Итак, идём в эту папку и закидываем содержимое туда, где у нас лежит софт для загрузки. Далее вводим команду:

exec flash-script


mcfuwjoosh5akpezm5aiqkvv8bk.jpeg

Прошивка начинается со стирания памяти.

v-wsgoq6wm2h89vk25zqauke068.jpeg

Далее произойдёт загрузка самой прошивки.

o_yfw0hhrrb-iudmcnrtanoruds.jpeg

И, после нескольких минут томительного ожидания, программа выдаст нечто вроде этого.

j3c1z0b4ew3lmllcyad44nimgs8.jpeg

Затираем участок 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, содержащий в себе также версию прошивки, поэтому это число придётся несколько модифицировать.

kdlcrqgzwnedbw1wy8d4svuil50.jpeg

Получить его довольно просто. Берём IMEI, указанный под крышкой телефона, отбрасываем последнюю цифру (контрольное значение, рассчитанное по коду Луна), после чего прибавляем любые две цифры, какие хочется. То, что получилось, где-нибудь записываем, оно нам пригодится чуть позже.

Файловая система


Сразу после загрузки прошивки телефон не готов к работе. Необходимо инициализировать ФС и залить ранее упомянутые параметры.

Для этого идём в папку rvinterf/lowlevel, где выполняем команду:

sudo ./rvinterf /dev/ttyUSB0


После её выполнения ничего произойти не должно.

2s2a0qsxj_stk0d80wj-_gckmqw.jpeg

Коротко жмякаем красную трубочку на телефоне. После этого телефон крякнет, а в окне быстро посыпятся логи.

azuf3fw2yzdnplbzimb5nn5zi84.jpeg

При этом на дисплее отобразится «Insert SIM».

i8-7a7rzpbpd5tszfstzfr3lx1q.jpeg

Далее идём в 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. Само собой, нужно подставить те значения, которые мы тогда получили.
Теперь точно всё. Можно выходить.

Что же получилось?


Включаем телефон.

qqizycgwvralhi50g2eib301lsa.jpeg

Нас встречает вот такая заставка с логотипом TI.

k2qaji_mikgnfiouxb4qhztbhe8.jpeg

Если в телефоне есть симка, то он напишет «No Network», а затем начнёт пытаться искать сеть.

gdix3mnd-v01cw7pknggktk_y18.jpeg

eijtwpeibm-xtbepbpnnw5uq-2w.jpeg

Откроем меню.

k8juqc2gggplkrz2kh7phz1giig.jpeg

Поддерживается даже SIM Toolkit.

mhq_iav-4xxdutj0h1y4nhzbxck.jpeg

А вот телефонную книгу в русской кодировке он прочитать не смог.

sab6zmew1sssixqr7ax8z8oxyzi.jpeg

Само собой, куча настроек отведена для сотовых сетей.

sdsg6q6w6v9uyaflkcsr0uzjlgm.jpeg

Приложения дадут постоять в сторонке любому нынешнему мобильнику с претензией на минимализм — тут только калькулятор и диктофон. Последний умеет записывать только непрерывное «Кхрррр» на максимальной громкости, с чем это связано, мне неведомо. Никаких игр тоже не предусмотрено.

dza8cxo5f9q1ldvg07r32xyz64c.jpeg

Ну, а для тех, кто не любит звонить или для тех, кто хочет отдельный телефон для авторизаций, есть возможность отправлять и принимать SMS.

wqyk4sw9j68ffeqxxlekl3uv8im.jpeg

Предусмотрена куча мелодий звонка, но, равно как и в пиратских восьмибитных картриджах »9999 в одном», какая бы ни была выбрана, звучать всё равно будет одна и та же.

Можно ли по нему звонить?


Перейдём к тестированию самой главной его функции.

ymua9nzveyew4uqkxqcqbzbksc4.jpeg

Чтобы выяснить это, берём рабочую симку и вставляем её в телефон. После запуска трубка нашла сеть, а на экране появился «замочек» активного шифрования.

wiunv7muzvruuny5wnqshwdh8ac.jpeg

Набираем номер, и телефон начинает звонить.

fyhjtpnxercc6zjkyss8bvecu9o.jpeg

Звонит, однако!

shhkxn0qbrx3phrkahxng3ideku.jpeg

И можно принять вызов и попробовать поговорить. Само собой, качество связи ничем от обычного мобильника не отличается.

Что же ещё?


Одной лишь прошивкой FreeCalypso не ограничилась. И у них даже есть несколько аппаратных продуктов.

m660g5g-tnnpzmyo10gqbprdgt4.jpeg

Самый главный — FCDEV3B, по сути отладочная плата на таком чипсете. Что характерно, во FreeCalypso говорят, что она не предназначена для запуска на ней софта Osmocom и будет лишена гарантии, если будет замечено, что на ней проводилось именно это (например, если с её помощью поднимали БС, для чего перепаивали фильтры).

csk-nqjxlsmsq8sjdymxr_g87so.jpeg

FreeCalypso Tango, некий GSM-модем, но с их открытой прошивкой.

wsoq8yxc7keokoix_eai_mekg-q.jpeg

Community SIM, программируемая симка, ориентированная специально на работу в сетях 2G.

Вот как-то так


Для чего же всё это надо? Разумеется, большинству из нас будет куда проще просто пойти и купить какой-то кнопочный телефон, не заморачиваясь с поиском и прошивкой Motorola C139. И для большинства таких пользователей он будет успешно справляться со всеми необходимыми задачами (если, конечно, сам не окажется с подвохом).

Сама по себе прошивка далека от идеала, но отлично показывает, что открытая реализация сотового телефона вполне возможна, причём без существенных затрат.
Такие дела.

Ссылки



Возможно, захочется почитать и это:

Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале


r8msjcfet9mgza3ybpor_sdgrt0.jpeg

© Habrahabr.ru