Про встановлення китайської приставки CarPlay/Android Auto я вже писав раніше. Вона підключається до штатної системи через LVDS і CAN, залишає рідний екран та MMI й додає бездротовий CarPlay.
Ще в коментарях до того допису розповідав про дивну поведінку кнопки на кермі та невдалу спробу переробити прошивку. Виробник нічого робити не хотів, тому я знову взявся самостійно. Для цього довелося розібрати образ, додати власне логування, зняти події кнопок у машині та пропатчити прошивку.
Що саме бісило
На кермі A3 8V є кнопка із зірочкою і у штатному меню Audi їй призначено перехід до наступного треку.
Натискаю зірочку, музика перемикається. Одночасно CarPlay виходить із карти на головний екран. Наступні натискання починають перемикати екрани туди-сюди, іноді перше натискання проходить нормально, але далі все повторюється.
Тобто хотів наступну пісню, а отримував ще й екскурсію інтерфейсом.
У першому дописі я описував реакцію кнопки як Enter - після оновлення від продавця, яке додало роботу звуку через штатний Bluetooth, треки почали перемикатися, але залишилася ця зайва дія Home.
Який блок і яка прошивка
Приставка від RoadTop Store. На сторінці версій мого блока:
Патч зробив на базі прошивки AR179R1, під показаний вище блок.
Що всередині прошивки
У цих образах Linux для платформи Sunplus SPHE8388. GEMINI_PACK.BIN містить оболонку GEMINI, внутрішній формат Gemini_ISP_image, скрипти оновлення та дані розділів.
Файлові системи мають формат SquashFS 4 зі стисненням LZO. Це стиснені образи для читання: щоб змінити файл усередині, треба зібрати файлову систему заново та повернути її в контейнер прошивки.
Обробка кнопок проходить через кілька шарів. У спрощеному вигляді кнопка автомобіля → CAN → MCU приставки → mcusrv → інтерфейс блока/CarPlay.
Під час попередньої спроби зробити з залізкою щось, я зламався на прошивці - змінений образ не встановлювався, оновлення скидалося приблизно на 70%, тому була підозра на цифровий підпис.
Під час розбору знайшов конкретні перевірки цілісності:
Якщо змінити файл усередині SquashFS, зміняться байти стисненого розділу, старі MD5 вже не збігатимуться. Якщо оновити MD5 у скрипті, зміниться сам скрипт, отже потрібно перерахувати і його CRC.
Пошук джерела зайвого Home
1. Від’єднав штатний Bluetooth Audi.
Після цього зірочка перестала перемикати трек, але продовжила перемикати екран CarPlay. Отже, музикою керувала штатна система, а зайву команду навігації додавав китайський блок.
2. Перевірив кнопку поза CarPlay
У меню приставки відкрив Setup → Audio і натиснув ту саму зірочку. Блок повернувся на свій головний екран, тобто роблема існувала ще до передачі команди в CarPlay.
3. Знайшов значення у mcusrv
Розпакував прошивку й шукав потрібний компонент серед її файлів. Далі пошук звузився до призначення функцій та ланцюжка викликів.
Усередині образу міститься файлова система Linux з окремими програмами та бібліотеками. У mcusrv збереглися імена функцій на C++:
За допомогою дизасемблера вдалося простежити шлях події та знайти перетворення коду 0x09 у Home, але це ще не доводило, що зірочка надсилає саме 0x09, тому для перевірки потрібні були події з реального блока.
Збірка логів
Зробив окрему діагностичну прошивку - у mcusrv додав запис повідомлень перед обробкою кнопок, самі кнопки на цьому етапі працювали як раніше.
У машині натиснув тричі зірочку, потім тричі Menu. Обидві кнопки дали однакові записи:
Стало зрозуміло, що на цьому етапі зірочка та Menu вже нерозрізнювані, тобто якщо прибрати цю команду Home, вона зникне в обох кнопок. Мене такий варіант влаштовував: трек перемикає штатна система Audi через Bluetooth, а коротким Menu в китайскій голові я ніколи і не користувався.
Залишалося перевірити кнопку Back, бо у CarPlay вона поводилася схоже, але втратити ще й її не хотілося. Зняв додатковий лог:
Код виявився іншим: 0x03. Отже, можна прибрати 0x09 і зберегти роботу кнопки Back.
Як виглядає патч
У mcusrv додав маленький фільтр перед обробником кнопок. Для повідомлень типу 0x06 він перевіряє дві умови: довжина дорівнює двом байтам, а код кнопки дорівнює 0x09.
Логіка така:
Прошивка та встановлення
Завантажити прошивку можна тут. В архіві готовий GEMINI_PACK.BIN та інструкція.
Оновлюється прошивка наступним чином:
1. Скопіювати `GEMINI_PACK.BIN` із архіву в корінь флешки FAT32
2. На стоячому автомобілі підключити флешку до USB приставки
3. Відкрити меню оновлення, ввести PIN 8032
4. Вибрати тип оновлення - System
5. Дочекатись завершення й перезапуску, не вимикаючи живлення
1