Как пропатчить планшет под OpenSuSE

в 7:42, , рубрики: windows

Всем привет, меня зовут Иван. Хочу поделиться опытом, который может пригодиться тем, кто захочет сделать такую же странную вещь, как и я, — установить OpenSuse на планшет с Windows.

Наступила осень, на улице холодно и мокро, велосипед поставлен на зимовку. Хочется сидеть на диване и серфить в Интернете под расслабляющую музыку. А где проблема? А она в том, что планшет был пожертвован детям, а жена свой не даст. Значит, пришло время прикупить новый.

Как пропатчить планшет под OpenSuSE - 1

Муки выбора и «хитрый» план

Решение принято, но что брать? Наступает тот самый момент, когда гик должен выбрать новый девайс. Скажу честно: продукцией Apple не интересуюсь и даже не рассматривал в качестве варианта. Казалось бы, можно взять Android и радоваться, но не тут-то было. Хочется чего-то… 

И тут в выдаче всплывает недорогой Irbis TW104 с Windows. Хм, да он еще и на Intel Atom. Получается это мини-ноутбук в формфакторе планшета. Беру! Поставлю на него свой любимый OpenSuSE, буду на диванчике в родном окружении чилить. 

Итого: процессор Intel Atom x5-Z8350 (4 ядра), 1.44 ГГц, 4 Гбайта ОЗУ, разъем под microSD (смогу оставить Windows и сделать dual boot), встроенная в чехол клавиатура с мышью и вроде бы разъем USB, но, похоже, через кабель OTG. Докидываю в корзину OTG-кабель и какую-то microSD на 128 Гбайт из тех, что пошустрее. 

Анбоксинг и первый запуск 

Сутки мучительного ожидания позади — и вот новая игрушка у меня в руках. Первые впечатления: увесист, пухловат (современные Android‑планшеты, конечно, тоньше и легче), но на ощупь приятен, а с прицепленной клавиатурой превращается в ноутбучек. Мне нравится, желания вернуть не возникло.

Включаю, появляется логотип фирмы‑производителя, затем Windows радостно приветствует меня и не менее радостно предлагает разрешить передавать всякое в Microsoft. Дохожу до создания учетной записи, и тут он требует почту, чтобы сделать учетную запись Microsoft. Гуглю: надо было пропустить подключение к Wi‑Fi, тогда Windows дает завести локальную учетную запись.

Зажимаю кнопку питания, перезапускаю устройство, и, о чудо, — девайс предлагает завести локальную учетную запись. Вроде все работает, нести устройство в гарантию не надо, попробуем поставить Linux.

Попытка установки 1: неудача

Итак, приступаю к установке. Первым делом качаю OpenSuSE 15.5 Leap. Как оказалось, зря, дальше расскажу почему. Если захотите повторить мой путь, качайте сразу Offline Image.

Небольшое пояснение, у OpenSuSE есть два типа дистрибутивов:

  • Leap — версия OpenSuSE из пакетов SUSE Linux Enterprise, стабильный дистрибутив;

  • Tumbleweed — версия из пакетов, собранных на основе последних наработок сообщества, так называемый rolling release.

Я, естественно, выбираю тот, что постабильней.

Заливаю с Unetbootin дистрибутив на флешку. Собираю конструкцию из нее и OTG‑кабеля, захожу в UEFI, чтобы поменять порядок загрузки, и сталкиваюсь с первым приколом — экран повернут набок. Немного поразмышляв о сооружении системы зеркал, чтобы «выпрямить» картинку, решаю, что пока потерплю.

Как пропатчить планшет под OpenSuSE - 2

В меню загрузки менять ничего не пришлось: USB-устройства и так идут первыми. Запускаю инсталлятор, снова получаю повернутый экран и еще одну проблему: сетевых устройств не найдено, и по сети систему не поставить. Деваться некуда, качаю офлайн-инсталлер. 

Как пропатчить планшет под OpenSuSE - 3

Попытка 2: опять мимо

Имидж скачан и залит на флешку, запускаю установку — и снова получаю повернутую картинку, а еще инвертированную мышь и неработающий тачпад.

Как пропатчить планшет под OpenSuSE - 4

Перемещаться по кнопкам можно с помощью Tab, выбирать кнопки и поля ввода — пробелом.  Для подтверждения выбора — Enter.  

Инсталлятор предлагает удалить раздел Windows и поставить систему на него, такой вариант не подходит. Отказываюсь от предложения системы и создаю разметку с / на microSD. После перезагрузки во время установки снова грузится Windows. В UEFI загрузчик OpenSuSE виден, но при попытке оверрайда запуска из UEFI все равно грузится Windows.

Может, из-за Secure Boot? Отключаю (кстати, тут мне повезло: отключенный Secure Boot, возможно, сэкономил мне кучу времени позже), но все равно грузится не то. Пробую рассуждать логически: вероятно, все дело в том, что у меня /boot на microSD, и надо попробовать перенести этот раздел «внутрь».

Попытка 3: удача (но с оговорками) 

Заново запускаю инсталлятор, дохожу до раздела с разметкой и понимаю, почему инсталлятор предлагал удалить раздел с Windows полностью — раздел зашифрован Bitlocker, так просто ресайз ему не сделать. Ctrl-Alt-Del. 

Загрузка в Windows, лезу в раздел «Настройки», нахожу там  в подразделе «Обновление и безопасность» пункт Bitlocker и жму «Расшифровать». Полчаса на чаек и посмотреть в окно в ожидании. После расшифровки — снова загрузка инсталлятора OpenSuSE, разметка /boot-раздел на встроенной Flash, и / на microSD. 

В целом догадка оказалась верной. После установки встречает повернутый набок GRUB.

Как пропатчить планшет под OpenSuSE - 5

Победа? Нет. Не монтируется /. Меня встречает печальная консоль Single User. Так, если инсталлятор видел microSD, а установленная система — нет, проблема понятна: ядро Linux при запуске монтирует специальный CPIO-архив c маленьким RAM-диском, в котором лежат драйвера устройств. Тот самый initrd. В этот маленький архив складывают специфичные драйвера SCSI- и RAID-контроллеров, чтобы была возможность разместить корневой раздел на RAID-массиве или SCSI-диске.

Как пропатчить планшет под OpenSuSE - 6

Похоже, набор модулей, подгружаемый инсталлятором, несколько побольше и включает модули, которые позволяют видеть microSD. Снова загружаю инсталлятор, перебирая комбинациями клавиш (Ctrl-Alt-F1, Ctrl-Alt-F2) терминалы, и нахожу тот, в котором можно понабирать команды. 

Командой lsblk узнаю, что microSD определилась как mmcblk2. Дальше командой lsmod | grep mmc ищу модули, которые отвечают за mmc. 

Дополнительно просто копаюсь в списке модулей и выбираю те, которые мне понравились (по ощущениям, их тоже нужно подгрузить, ну так, на всякий случай, чтобы второй раз не вставать), потом выверю список. Честно. :)

В итоге получается так:

sdhci 
sdhci-acpi
mmc_core
mmc_block
dw_dmac_core 
dw_dmac
i2c_designware_platform 
i2c_designware_core

Теперь надо добавить эти модули в Init RAM Disk. В дистрибутивах RPM Based сейчас чаще всего используется утилитка dracut, в дистрибутивах на Debian, кажется, mkinitramfs. 

Создаю в /mnt директорию sd:

mkdir /mnt/sd

Дальше монтирую в эту директорию / c sd-карточки: 

mount /dev/mmcblk2p1 /mnt/sd

А потом монтирую /boot, который ранее разместил на встроенном flash:

mount /dev/mmcblk0p6 /mnt/sd/boot

Ну, и меняю корень на /mnt/sd:

chroot /mnt/sd

Теперь можно и dracut запустить, чтобы собрать Init RAM Disk с нужными модулями: 

dracut -f --force-drivers "sdhci sdhci-acpi mmc_core mmc_block dw_dmac_core dw_dmac i2c_designware_platform i2c_designware_core"

Перезапускаю систему через Ctrl-Alt-Del. Победа! Система загружается. Теперь надо добавить на постоянку в конфигурацию dracut, чтобы после обновления ядра не отвалился снова корневой раздел. 

Создаю файл /etc/dracut.conf.d/11-mmc.conf,

в него вписываю драйвера:

add_drivers+="sdhci sdhci-acpi mmc_core mmc_block dw_dmac_core dw_dmac i2c_designware_platform i2c_designware_core"

Готово.

Настройка оборудования: экран

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

Как пропатчить планшет под OpenSuSE - 7

Начну с простого: надо повернуть экран в графическом режиме. Кнопкой Win открываю меню запуска программ, затем консоль. Командой xrandr ищу, куда подключен экран — DSI-1.

Открываю файл /etc/X11/xorg.conf.d/50-monitor.conf.

Раскомментирую секцию настроек монитора и подставляю идентификатор монитора DSI-1. Ну, и добавляю настройку ротации экрана вправо. 

Section "Monitor"
  Identifier "DSI-1"
  Option "Rotate" "right"
EndSection

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

Открываю /etc/default/grub и в переменную GRUB_CMDLINE_LINUX добавляю fbcon=rotate:1

Дальше командой grub2-mkconfig -o /boot/grub2/grub.cfg пересобираю конфигурацию GRUB. Все, теперь шея не будет болеть и при работе в текстовой консоли. 

Настройка оборудования: сеть

Теперь одна из главных задач — поднять сеть. Чтобы не возиться с поиском драйвера по айдишникам оборудования, загружаюсь в Windows и выясняю, что сетевой адаптер — это rtl8723ds. Драйвер, слава Интернету, есть. Сделан энтузиастами и его можно собрать из исходников: https://github.com/lwfinger/rtl8723ds.git

Копирую исходники на флешку и переношу на планшет. Дальше вроде бы все просто:

make
make install

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

uname -a
sudo zypper info kernel-default-devel

Решение: подключаю телефон как USB-модем и скачиваю все нужные пакеты. Драйвер собрался, сеть заработала.

Помните, я выше писал, что с отключением Secure Boot мне повезло? Вот почему: после одной из перезагрузок я решил вернуть Secure Boot, но после его включения перестала работать сеть. Покурив форумы, нашел ветку с точно такой же проблемой работы драйвера в сочетании с Secure Boot. И решения пока не найдено.

Настройка оборудования: тачскрин

Теперь пришло время запустить тачскрин. Какой тачскрин установлен, можно тоже подсмотреть в Windows. Благо, энтузиасты и здесь не остались в стороне. Клонирую репозиторий: https://github.com/onitake/gslx680-acpi.git

make
make install

Перезагрузка, не работает. В dmesg — ошибка подгрузки firmware. Дело в том, что контроллер тачскрина универсальный, а в прошивке указываются параметры конкретного экрана и модели. Сами прошивки и утилиты по работе с ними есть в репозитории: https://github.com/onitake/gsl‑firmware.git

При попытке подсунуть firmware от другой модели тачскрин заработал, только координаты были сбиты напрочь. Придется делать свою прошивку. Монтирую раздел c Windows и в драйверах в директории windows ищу файл SileadTouch.sys. Дальше скармливаю файл драйвера утилите scanwindrv из репозитория gsl-firmware. 

gsl-firmware/tools/scanwindrv ./SileadTouch.sys

На выходе получается файл firmware_00.fw из драйвера Windows. После чего другой утилитой gsl-firmware/tools/fwtool генерирую firmware для драйвера на Linux. Набор параметров экрана пришлось подыскивать методом тыка. Я делал это так: нажимал на экран в левом нижнем углу и в режиме выделения тянул рамку в правый верхний угол. Если рамка отставала от пальца, то корректировал размер в плюс, если обгоняла — в минус. 

Как пропатчить планшет под OpenSuSE - 8
Как пропатчить планшет под OpenSuSE - 9

Копирую firmware:

cp silead_ts.fw /lib/firmware/
cp silead_ts.fw /lib/firmware/silead/silead_ts.fw
cp silead_ts.fw /lib/firmware/silead/mssl1680.fw

Тачксрин работает, можно уже установить виртуальную клавиатуру и посидеть в ютубчике? Не получится: звука нет, Bluetooth не работает. 

Настройка оборудования: звук и Bluetooth

На самом деле запустить встроенный звук было проще всего. Ровно одна команда:

zypper install sof-firmware

Судя по описанию чипа сетевой карты, Bluetooth в нее встроен. Драйвер уже установлен, значит, надо копать, почему Bluetooth не запускается.

Команда dmesg | egrep "(Blue|blue|rtl)", чтобы посмотреть все ошибки, связанные с Bluetooth: снова не хватает Firmware, благо, на этот счет уже побеспокоились ребята из комьюнити дистрибутива Armbian.

Клонирую репозиторий https://github.com/armbian/firmware.git, копирую файлы: 

cp firmware/rtl_bt/rtl8723_ds* /lib/firmware/rtl_bt/

При загрузке драйвер пытается подгрузить конфиг из файла rtl8723ds_config-OBDA8723.bin,  делаю символьную ссылку.

ln -s rtl8723ds_config.bin rtl8723ds_config-OBDA8723.bin 

Тут обратите внимание, что O в имени файла rtl8723ds_config-OBDA8723.bin — буква, а не ноль. Пока не понял, проковырялся где-то час, матерясь и не понимая, почему не подтягивается конфигурация. Перезагружаюсь, Bluetooth работает. Почти победа, только инверсированная мышь раздражает. 

Настройка оборудования: мышь (не побеждено)

Пришло время разобраться с инвертированной мышью. Первым делом, по заветам Интернета, пробую решить проблему через настройку InputClass в X. Безрезультатно. Никакие Option "InvX " "true " и Option "InversionX" "true " не срабатывают. Промучавшись несколько часов, перехожу в итоге к гайдам с методами, выглядящими как-то «костыльно».  

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

И вроде даже получилось заставить курсор двигаться правильно такой вот командой:

xinput set-prop 13 --type=float "Coordinate Transformation Matrix" -1 0 1 0 -1 1 0 0 1

Только, к сожалению, клики мыши остались инвертированными. 

Попробую копать в сторону xinput. Оказывается, в X можно теперь создать несколько курсоров и «цеплять» их к разным устройствам. Это ли не мечта детства — погонять с товарищем в «Героев», да так, чтобы не передавать друг другу мышку и не ругаться о том, у кого ладони потные.

Пробую. Ничего себе — работает. На экране теперь два курсора, один стоит на месте, другой двигается в нужном направлении. Еще немного подкостылю, с помощью xdotool буду сдвигать курсор за пределы экрана.

Получается вот такой костыльный скриптик:

#!/bin/bash
xdotool mousemove 1000000 100000
xinput create-master mymouse
xinput reattach "SIGMACHIP USB Keyboard Mouse" "mymouse pointer" 
xinput reattach "Silead GSLx680 Touchscreen" "mymouse pointer"

Добавляю этот скриптик в автозагрузку KDE. Вроде работает, но «такое»: в некоторых приложениях новый курсор ведет себя странно, а иногда старый внезапно выскакивает из зоны невидимости. В общем, костыль получился совсем кривой. Но исследовательский запал исчерпан, хочется уже полежать с планшетом на диване, а допилить все немного позже. Надеюсь, что-то из этой статьи будет кому-нибудь полезно. 

Автор: Иван Кушневский

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js