Про код ядра, или почему я десять раз подумаю прежде чем купить ещё один Xiaomi
Давайте я расскажу, что узнал об устройстве ядра андроида (я где-то уже говорил, что до августа 17 года вообще ничего не знал в этом направлении). Все более-менее рабочие ядра для нашего устройства основаны на ядре Linux 3.18.x с докинутыми для железок Qualcomm модулями. Где-то были какие-то потуги перетащить ядро 4.4, но оно окутано туманом войны и лени, так что хз что там творится.
Спойлер: Введениё
Кроме докинутых драйверов всяких Qualcomm'овских железок, ядро ещё содержит так называемое дерево устройств. Вкратце - это комплект файлов с расширениями .dts, в которых в виде дерева описано какое устройство на каких адресах памяти сидит, через какие контакты ввода-вывода общается с внешним миром и прочие настройки. В момент загрузки ядра система проходится по этим данным, потом просматривает список драйверов в ядре и по одному запускает все драйверы, для которых есть конфиги в дереве устройств. Причём по-хорошему дерево устройств состоит из двух частей: общей конфигурации, характерной для всех устройств на чипе MSM8953 и специфических отличиях конкретного нашего Redmi 4 Prime от сферического устройства в вакууме.
Спойлер: Как пацаны делают
Ну и в общем нормальные пацаны когда делают какой-то свой девайс то делают это так:
Проектируют электрическую часть устройства, разводят плату, ждут пока дизайнеры нарисуют свой уникальный ДИЗИГН, потом утаскивают с CodeAuroraForum последнюю версию ядра Qualcomm, добавляют в него драйверы экрана, сканера отпечатков, и прочие нестандартные железяки. Потом пишут те самые .dts-файлы с конфигом всего что получилось, чтобы драйверы знали чо куда подключено. Накладывают немного патчей (куда ж без костылей). И фигакс - хорошее более-менее стабильное ядро.
Спойлер: Инженерные решения Xiaomi
В Xiaomi поступили не так.
Они отдали проектирование и производство компании WingTech, в которой судя по всему работают самые низкооплачиваемые инженеры, живущие в районах с самой забористой травой. Эти инженеры посмотрели на типовой дизайн электрической части телефона на MSM8953 и сказали что-то типа "Насялиника, слицком дорага будита делат эту турюбка, нада эта, экономитя, а то никупют!". И понеслось. Сначала решили, что батареи будут покупать у трёх братьев Сяо, Ляо и Мяо (Feimatou, Coslight и что-то ещё), у каждого со своими параметрами и без физической возможности быстрой зарядки. Потом объявили тендер на сканер отпечатков между FPC и Goodix. Выиграла дружба, поэтому ставить стали и то и другое, только заносили на завод через разные двери. Затем скатали в Японию, выпили немного тёплого саке, поплевались от вкуса, зато решили что традицию надо продолжить и просто необходимо ставить два разных экрана. Поэтому у каждого сборщика лежат соробки с Tianma и EBBG, он кидал кубик и если выпадало чётное число - ставил tianma, а если нечётное - то ebbg. Заполировали всё, купив пару вёдер с многоцветными светодиодами Awinic 2013, которые умеют показывать любой цвет, умеют мигать, но вот нормально мигать любым цветом не могут (поэтому мы столько сексились с драйвером led). В последний момент забежал какой-то совсем уж щуплый мальчонка и кинул в углу сборочного цеха пакован с усилителями aw8736 для основного динамика. Остальные компоненты купили на местном радиорынке на вес и пошли за травой.
Когда нашли траву и немного распробовали, решили что надо написать драйверы. Сначала прикололись за светодиод и написали что-то своё, щедро заполнив код лапшой и непонятными решениями (ну не брать же из инета готовый драйвер, правда?). Оно как-то работало и мигало. Инженеры почувствовали вкус свободного творчества, покосились в угол сборочного цеха и прочитали надпись aw8736 на паковане. Участь аудиотракта была предрешена. Трава уже немного приотпустила, поэтому кодить им было лень и вместо нормального драйвера управления этим устройством они тупо похакали основной драйвер звука, щедро запихав туда недоеденную рисово-кодовую лапшу. Так появились известные щелчки в аудиотракте. На то, чтобы вытащить конфиг в DTS, у них вообще не хватило сил. Все легли спать.
На следующий день предстояло внедрить управление камерой. Все дружно закрыли немного заплывшие со вчера глаза и застучали по клавиатурам. Никто не знает что именно они там накодили, но главное - камера иногда запускалась. Подёрганную откуда-то конфигурацию кинули в какой-то уголок DTS и пока не пришёл директор быстро наговнокодили в остальные драйверы, чтобы к вечеру отчитаться о проделанной работе. Всё ещё заплывшие глаза несколько мешали смотреть в экраны, поэтому писали в режиме write-only, существующий код не читали и были очень рады возможности лечь спать под рабочими столами к вечеру. Предстояла работа над драйвером зарядки.
Когда все проснулись - было ещё рано, на столах и стульях образовалась роса. Но самое главное - в центре кабинета стояла здоровенная коробка отборной пакистанской. Парни не теряя времени взорвали по разику и написали свой драйвер зарядки под все три типа батарей и ещё что-то там. Вдумываться времени не было, прёт же. Так появился знаменитый баг с залипанием зарядки.
Дальше мне лень сочинять, но смысл все поняли. Где можно было сделать плохо - делали ещё хуже. Где нельзя - делали просто плохо. Ядро всё состоит из костылей, хаков и необдуманных решений, которые @Anomalchik, @Razziell и с некоторых пор я пытаемся понять, осмыслить что же хотел сказать автор (и всё это в отсутствие технической документации на железо и схемы соединений всего что там напаяно) и написать код уже "как надо". Особенно досталось драйверу зарядки, led и кажется камере (я в неё не смотрел, там сплошная БОЛЬ). В том самом дереве устройств (DTS) также творится что-то, сравнимое по масштабам только с содомским грехом, но кажется когда-нибудь кто-нибудь наберётся смелости это всё привести в порядок.
При этом я поглядываю в ядро соседнего mido (он же xiaomi redmi 4 note) - там дела на порядок лучше, потому что его проектировала сама xiaomi. Когда-нибудь наступит час, в который мы вынесем все глупости из нашего ядра и сольём деревья исходников в едином экстазе с mido.
А теперь выводы:
1. Решив купить Xiaomi - выясните, кто же его проектировал и производил. Разница между Foxconn и Wingtech может быть драматической.
2. Если Wingech - лучше не связываться.
3. Ковыряться в ядре без технической документации крайне сложно. Иногда - неразрешимо сложно из-за отсутствия банальной инфы куда какой проводок подключен и что там вообще за железки (не разбирать же устройство?).
4. Качество исходного ядра ниже всякой критики. В процессе поиска решений я много чего перечитал, наше - или самое плохое, или близко к тому.
5. Мы прорвёмся. Почти всё уже сделали.
6. В MSM8953 не восемь одинаковых ядер, а 4 "быстрых" ядра с кешем на 1МБ и 4 "экономичных" с кешем на 512Кб.
P.S. Под травой я имел в виду дикорастущий табак, конечно же.