Анализ прошивки халдекс 3 поколения
Общая информация
Внутри блока используется процессор Siemens Super ST10. Флеш память разбита на 2 блока
- 0x0 - 0x8000 загрузчик и данные конфигурации CAN
- 0x18000 - 0x50000 основной код прошивки.
Оперативная память
- 0x8000 - 0xE000 такое, вроде, называют IRAM
- 0xF0000 - 0xF2800 расширенная память.
При загрузке прошивки в дизассемблер грузить её нужно по нулевому смещению.
Настроки для DPP регистров следующие
- DPP0 - 0x9
- DPP1 - 0xA
- DPP2 - 0x3C
- DPP3 - 0x3.
Логирование данных

Из коробки, прошивка халдекса gen 2 и gen 3 для Volvo не поддерживает возможность чтения данных контроллера. Во так выглядит секция разбора диагностического сообщения протокола D2 в прошивке S60R 2007 года
mov r13, r8
add r13, #D2RequestStruct.srvId
movb rl1, [r13]
cmpb rl1, #0A0h
jmpr cc_Z, loc_A0_process
cmpb rl1, #0A1h
jmpr cc_Z, loc_A1_process
cmpb rl1, #0A3h
jmpr cc_Z, loc_A3_process
cmpb rl1, #0A6h
jmpr cc_Z, loc_A6_process
cmpb rl1, #0ACh
jmpr cc_Z, loc_AC_process
cmpb rl1, #0AEh
jmpa cc_Z, loc_AE_process
cmpb rl1, #0AFh
jmpa cc_Z, loc_AF_process
cmpb rl1, #0B1h
jmpa cc_Z, loc_B1_process
cmpb rl1, #0B9h
jmpa cc_Z, loc_B9_process
cmpb rl1, #0BAh
jmpa cc_Z, loc_BA_process
jmpa cc_UC, loc_service_unsupported_process
Поддерживаются следующие сервисы
- A0 - Stop diagnostics session (остановить диагностическую сессию)
- A1 - No operation performed (просто эхо ответ)
- A3 - Security access mode (управление доступом)
- A6 - Request data by identifier (запрос данных по номеру)
- AC - Read freeze frame (прочитать слепок данных)
- AE - Read DTC (прочитать ошибки)
- AF - Clear DTC (стереть ошибки)
- B1 - Input output control by identifier (принудительно выставить какой-либо параметр по номеру)
- B9 - Read data block by offset (прочитать блок данных по смещению)
- BA - Write data block by address (записать блок данных по адресу).
Как видно из вышеописанного, возможности достать данные из оперативной памяти отсутствуют. Поэтому, для глубокого анализа поведения прошивки, была дописана функция, которая производит реализацию сервиса BB - Read data by addr (прочитать данные по адресу)
newProcessD2Request:
movb rl1, [r12+#8]
cmpb rl1, #0BBh
jmpr cc_Z, loc_BB_process
jmps 3, processD2Request
loc_BB_proccess:
jmps 3, processBB_D2Request
processBB_D2Request:
mov [-r0], r13
mov [-r0], r7
mov [-r0], r6
mov r1, #0
movb rl1, [r12+#9]
movb rl2, [r12+#0Ah]
movb rl3, [r12+#0Bh]
movb rl4, [r12+#0Ch]
movb rl7, rl4
cmpb rl4, #0
jmpr cc_NZ, loc_length_not_zero
calls 3, d2ErrorSubFuncNotSuppOrInvalMessForm
jmpr cc_UC, loc_return
loc_length_not_zero:
cmpb rl4, #40h
jmpr cc_ULE, loc_length_not_exceed
calls 3, d2ErrorSubFuncNotSuppOrInvalMessForm
jmpr cc_UC, loc_return
loc_length_not_exceed:
movbz r6, rl1
movbz r5, rl2
shl r5, #8
addb rl5, rl3
mov r3, r12
add r3, #0Dh
loc_loop:
exts r6, #1
movb rl1, [r5]
movb [r3], rl1
add r5, #1
addc r6, #0
add r3, #1
subb rl4, #1
jmpr cc_NZ, loc_loop
movb rl1, #0FBh
movb [r12+#D2RequestStruct.srvId], rl1
addb rl7, #5
movb [r12+#58h], rl7
mov r13, #0
mov [r12+#6], r13
loc_return:
mov r6, [r0+]
mov r7, [r0+]
mov r13, [r0+]
rets
Вызов изначального обработчика был замещён вызовом функции newProcessD2Request, таким образом появилась возможность получать содержимое оперативной памяти (флеша за одно) из контроллера халдекса.
Отключение проверки контрольной суммы
Следующим этапом было отключение проверки контрольной суммы. Нужно в прошивке найти место, которое отвечает за её проверку и переделать условный переход на истину в любом случае. Можно поступить и другим способом, разобрать алгоритм проверки контрольки, найти проверяемые области и обновлять прошивку правильными контрольками. Тут каждый поступает так, как считает нужным. Мне нужно было получить результат, поэтмоу пошёл максимально прямым путём. Как подсказку, могу сказать, что данный вопрос освещался на сайте nefariousmotorsports.com в теме про халдекс.
Что было выяснено
Прошивка принимает следующие параметры из CAN
- скорость всех колёс
- обороты мотора
- положение педали газа
- положение дроссельной заслонки
- момент мотора
- признак нажатия на педаль тормоза
- признак нажатия на педаль газа.
В прошивке есть некий параметр, текущий режим работы, он используется почти в 200 местах при выборке из карт и прочего. Параметр принимает значение от 0 до 8. Как именно он меняется, пока, не выяснено, но некоторые карты измеют разное значение по этой оси.
Прошивка S60R была сравнена с прошивками от XC90 2.5T и XC70 2.5T. По калибровкам, найдено только одно отличие. В обычных прошивках в одной из карт стоят нулевые значения, в эрочной прошивке эта карта заполнена отрицательными значениями. Осью в прошивке как раз является описанный в прошивке режим работы.

Дальнейшие работы
На текущий момент времени это всё, что удалось раскопать. Далее процесс анализа будет затрагивать следующие направления
- влияние момента мотора на степерь блокировки муфты. Ранее, при экспериментах со сдвигом момента для АКПП, было выснено, что занижение момента передаваемого в сеть приводит к более слабой блокировке муфты и пробуксовке передних колёс.
- влияние педали газа и дросселя на степерь блокировки
- выяснить принцип изменения режима работы блока управления
- найти карты, необходимые для изменения блокировки муфты по педали газа и моменту
- выяснить, есть ли возможность увеличить скорость и силу блокировки.