Microsoft Surface 2 вышел в 2013 году: Windows RT, NVIDIA Tegra 4, 2 ГБ памяти, экран 1920×1080. Сегодня это красивый и почти бесполезный планшет: Windows RT давно не поддерживается, магазин приложений мёртв, а браузер не открывает половину интернета. Мы решили проверить, можно ли превратить его в нормальный компьютер на Linux.
Когда мы начали, запускалось ядро, рабочий стол и часть устройств. Не работали Bluetooth и обе камеры, память бегала на половине скорости, частота процессора не менялась, а графика большинства программ считалась на процессоре. Этот текст о том, как это чинилось, что получилось и что так и не поддалось.
Коротко о результате
| Что | Было | Стало |
|---|---|---|
| Bluetooth | Не работает | Работает через BlueZ |
| Wi-Fi и Bluetooth вместе | Невозможно | Работают одновременно, 65–117 Мбит/с |
| Задняя камера | Нет драйвера | 1280×720 при 30 fps, до 2560×1920 |
| Фронтальная камера | Нет драйвера | 1152×648 при 30 fps, до 2304×1536 |
| Память | 408 МГц | 792 МГц, копирование быстрее на 42 % |
| Процессор | Фиксированная частота | 204–1320 МГц с управлением напряжением |
| Перетаскивание окна | 38–51 fps | 59 fps |
Мы искали в открытых источниках сообщения о работе камер на Surface 2 и об одновременной работе Wi-Fi и Bluetooth в Linux и не нашли ни одного. Документация сообщества Open Surface RT описывает железо этого планшета, но не эти результаты. Если вы знаете о более ранних работах, напишите нам, и мы добавим ссылку.
С чего мы начинали
Загрузку Linux на этих планшетах открыло сообщество Open Surface RT. За основу взято их ядро 5.17-next с драйвером Grate. Всё дальнейшее мы строили на нём, а базовая система — Raspbian 12 с GNOME 50.
Главный источник знаний о железе оказался неожиданным: сам планшет. В таблицах ACPI описана вся разводка: какие GPIO за что отвечают, какой камере какая шина положена и даже тайминги памяти. Это превратило большую часть работы из гаданий в чтение документации, которую Microsoft случайно оставила внутри устройства.
Правило работы мы приняли сразу: любая рискованная проба делается через одноразовую загрузку с автоматическим откатом. Планшет много раз зависал, но ни разу не превратился в кирпич.
Wi-Fi и Bluetooth: одна прошивка на два радио
Это самая интересная часть. В планшете стоит комбо-чип Marvell 88W8797, и прошивка одна на оба радио. Ловушка выглядела так:
- Прошивка из
linux-firmwareотдаёт Bluetooth через SDIO, а на этой плате он разведён на UART. - Родная прошивка Surface 2 работает с UART, но её часть Wi-Fi говорит на другом протоколе, который
mwifiexне понимает.
Каждая известная прошивка давала только одно радио. Мы перебрали всю историю linux-firmware, ChromiumOS, сборки Steam Link и TI: версии с UART для 8797 там нет.
Решение нашлось в старшем брате. У первого Surface RT тот же чип, а его прошивка FP62_WIN7 14.62.17.p215 собрана под классический протокол Marvell и при этом с Bluetooth через UART. После небольшого патча драйвера заработали оба радио. Отдельным сюрпризом оказалось, почему Bluetooth молчал раньше: планшет просто не поднимал линию RTS.
Подробный разбор с кодом: Wi-Fi и Bluetooth одновременно.
Камеры: драйвер, которого не существовало
В Linux не было драйвера видеовхода для Tegra 114, поэтому мы написали его на основе T20/T30 и исходников NVIDIA. Задняя камера заработала быстрее, а фронтальная упорно не присылала ни одного пакета. Причина оказалась красивой: на T114 порт CSI-B берёт линии не из блока CIL-B, как на предыдущих чипах, а из нового блока CIL-C, и UEFI оставляет его выключенным.
Разбор с регистрами: камеры на Tegra 114.
Производительность: 8 мс на копию одной текстуры
Больше всего нас удивила скорость интерфейса. Окно таскалось с рывками, и 80–87 % времени главного потока GNOME Shell уходило на memcpy. Драйвер выделял текстуры с шагом строки 32 байта, а аппаратному сэмплеру нужно 64, поэтому каждая текстура заново копировалась на каждую отрисовку.
Рядом нашлись и другие подарки. Память работала на половине паспортной частоты, а настоящие таблицы таймингов лежали в ACPI. UEFI на части загрузок оставлял процессор на 3/4 частоты, и система этого не замечала: она показывала 1320 МГц при реальных 990.
Разбор: GPU, память и частоты.
Что так и не заработало
- USB 3.0, HDMI и режим сна.
- Аппаратное кодирование видео. Прошивка энкодера запускается, но отклоняет каждый кадр с ошибкой
e2640010. На это ушло больше всего времени, и причина пока не найдена. - Браузеры работают, но не плавно. У GPU только GLES2, а современный Chromium ждёт GLES3.
- Wi-Fi на 5 ГГц не проверялся, а энергосбережение Wi-Fi пришлось выключить: с ним прошивка иногда зависает.
Как повторить
Весь код, патчи и инструменты собраны в один архив на этой странице. Порядок такой:
Это работа для опытных пользователей: изменение загрузки может сделать планшет незагружаемым, и вы действуете на свой риск. Полная последовательность пока не проверялась на втором, чистом устройстве, поэтому будьте готовы что-то адаптировать.
В архиве нет файлов Microsoft, Marvell и NVIDIA. Проект не связан с этими компаниями и не одобрен ими.
Спасибо сообществу Open Surface RT, проекту grate-driver и разработчикам Linux, Mesa и libcamera, без которых этой работы бы не было.