Audi A3 Sedan (8V) (Авуді)

CarPlay в Audi A3 8V: патч китайської голови для виправлення поведінки кнопки на кермі

Про встановлення китайської приставки CarPlay/Android Auto я вже писав раніше. Вона підключається до штатної системи через LVDS і CAN, залишає рідний екран та MMI й додає бездротовий CarPlay.


Ще в коментарях до того допису розповідав про дивну поведінку кнопки на кермі та невдалу спробу переробити прошивку. Виробник нічого робити не хотів, тому я знову взявся самостійно. Для цього довелося розібрати образ, додати власне логування, зняти події кнопок у машині та пропатчити прошивку.



Що саме бісило

На кермі A3 8V є кнопка із зірочкою і у штатному меню Audi їй призначено перехід до наступного треку.


Натискаю зірочку, музика перемикається. Одночасно CarPlay виходить із карти на головний екран. Наступні натискання починають перемикати екрани туди-сюди, іноді перше натискання проходить нормально, але далі все повторюється.

Тобто хотів наступну пісню, а отримував ще й екскурсію інтерфейсом.


У першому дописі я описував реакцію кнопки як Enter - після оновлення від продавця, яке додало роботу звуку через штатний Bluetooth, треки почали перемикатися, але залишилася ця зайва дія Home.


Який блок і яка прошивка

Приставка від RoadTop Store. На сторінці версій мого блока:

  • SDK Version:  25.0.0.7.0.0.2.0
  • CUST Version: AR179R1
  • MCU Version:  23.10.27.122
  • HW Version:   Au_hdmi_G

Патч зробив на базі прошивки AR179R1, під показаний вище блок.


Що всередині прошивки

У цих образах Linux для платформи Sunplus SPHE8388. GEMINI_PACK.BIN містить оболонку GEMINI, внутрішній формат Gemini_ISP_image, скрипти оновлення та дані розділів.


Файлові системи мають формат SquashFS 4 зі стисненням LZO. Це стиснені образи для читання: щоб змінити файл усередині, треба зібрати файлову систему заново та повернути її в контейнер прошивки.


Обробка кнопок проходить через кілька шарів. У спрощеному вигляді кнопка автомобіля → CAN → MCU приставки → mcusrv → інтерфейс блока/CarPlay.

Під час попередньої спроби зробити з залізкою щось, я зламався на прошивці - змінений образ не встановлювався, оновлення скидалося приблизно на 70%, тому була підозра на цифровий підпис.


Під час розбору знайшов конкретні перевірки цілісності:

  • Очікувані MD5 для перевірки даних після запису, для зміненого розділу їх 9
  • CRC заголовка та вмісту скриптів оновлення, упакованих у формат uImage

Якщо змінити файл усередині SquashFS, зміняться байти стисненого розділу, старі MD5 вже не збігатимуться. Якщо оновити MD5 у скрипті, зміниться сам скрипт, отже потрібно перерахувати і його CRC.


Пошук джерела зайвого Home

1. Від’єднав штатний Bluetooth Audi.

Після цього зірочка перестала перемикати трек, але продовжила перемикати екран CarPlay. Отже, музикою керувала штатна система, а зайву команду навігації додавав китайський блок.


2. Перевірив кнопку поза CarPlay


У меню приставки відкрив Setup → Audio і натиснув ту саму зірочку. Блок повернувся на свій головний екран, тобто роблема існувала ще до передачі команди в CarPlay.


3. Знайшов значення у mcusrv

Розпакував прошивку й шукав потрібний компонент серед її файлів. Далі пошук звузився до призначення функцій та ланцюжка викликів.

Усередині образу міститься файлова система Linux з окремими програмами та бібліотеками. У mcusrv збереглися імена функцій на C++:

  • GpMcu::processData приймає повідомлення від MCU
  • GpMcu::parseKey аналізує події кнопок
  • MCUKey::doCommand обробляє команду та використовує таблицю кодів

За допомогою дизасемблера вдалося простежити шлях події та знайти перетворення коду 0x09 у Home, але це ще не доводило, що зірочка надсилає саме 0x09, тому для перевірки потрібні були події з реального блока.


Збірка логів

Зробив окрему діагностичну прошивку - у mcusrv додав запис повідомлень перед обробкою кнопок, самі кнопки на цьому етапі працювали як раніше.


У машині натиснув тричі зірочку, потім тричі Menu. Обидві кнопки дали однакові записи:

  • a3 06 02 00 09 01
  • a3 06 02 00 09 00

Стало зрозуміло, що на цьому етапі зірочка та Menu вже нерозрізнювані, тобто якщо прибрати цю команду Home, вона зникне в обох кнопок. Мене такий варіант влаштовував: трек перемикає штатна система Audi через Bluetooth, а коротким Menu в китайскій голові я ніколи і не користувався.


Залишалося перевірити кнопку Back, бо у CarPlay вона поводилася схоже, але втратити ще й її не хотілося. Зняв додатковий лог:

  • a3 06 02 00 03 01
  • a3 06 02 00 03 00

Код виявився іншим: 0x03. Отже, можна прибрати 0x09 і зберегти роботу кнопки Back.


Як виглядає патч 


У mcusrv додав маленький фільтр перед обробником кнопок. Для повідомлень типу 0x06 він перевіряє дві умови: довжина дорівнює двом байтам, а код кнопки дорівнює 0x09.


Логіка така:

  • Код 0x09 у такому повідомленні → ігнорувати
  • Усі інші повідомлення → обробляти як раніше

Прошивка та встановлення

Завантажити прошивку можна тут. В архіві готовий GEMINI_PACK.BIN та інструкція.


Оновлюється прошивка наступним чином:

1. Скопіювати `GEMINI_PACK.BIN` із архіву в корінь флешки FAT32
2. На стоячому автомобілі підключити флешку до USB приставки
3. Відкрити меню оновлення, ввести PIN 8032
4. Вибрати тип оновлення - System
5. Дочекатись завершення й перезапуску, не вимикаючи живлення

Реклама
Ремонтуємо Li-ion акумулятори — нова послуга в автосервісі Master Service Electro
Пробіг 229000 км.
Опубліковано: 19 вересня 18:51
1 0 0

Коментарі

Щоб залишати коментарі, потрібно авторизуватись.
Я їжджу на Audi S5 (2G), Audi A5 (1G)
Красавчік, оце розкопав!
1
20 вересня 01:51