Меню
Исследование

Linux на Microsoft Surface 2

Как мы заставили работать на планшете 2013 года Wi-Fi и Bluetooth одновременно, обе камеры, GPU и аппаратное видео.

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 fps59 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 пришлось выключить: с ним прошивка иногда зависает.

Как повторить

Весь код, патчи и инструменты собраны в один архив на этой странице. Порядок такой:

  1. Что нужно и откуда взять прошивки
  2. Инструкция по установке

Это работа для опытных пользователей: изменение загрузки может сделать планшет незагружаемым, и вы действуете на свой риск. Полная последовательность пока не проверялась на втором, чистом устройстве, поэтому будьте готовы что-то адаптировать.

В архиве нет файлов Microsoft, Marvell и NVIDIA. Проект не связан с этими компаниями и не одобрен ими.

Спасибо сообществу Open Surface RT, проекту grate-driver и разработчикам Linux, Mesa и libcamera, без которых этой работы бы не было.

Подробные материалы