Развенчание мифа о сложности разбора прошивки

Все вопросы по увеличению мощности путем прошивки ЭБУ.
Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 21 дек 2015, 07:24

Многие не хотят разбирать программу управления своим двигателем самостоятельно, потому что считают это сложным, скучным и трудозатратным делом. Но на самом деле это легко и весело, как искать ночью в густом лесу клад, имея при себе фонарик и куски карт.

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

Следующий компонент - железо нашего контроллера (Z27A):
M32R Family SOFTWARE MANUAL - Renesas Electronics - базовый документ, первые пару дней придётся держать его под рукой, потом его сложно забыть.
32170/32174 Group USER'S MANUAL - Renesas Electronics - весь документ можно не читать, достаточно глав о загрузке, таблице прерываний. Другие - по необходимости.
- если очень хочется - можно отпаять плату от разъёмов и составить принципиальную электрическую схему, это позволит разбирать программу "снизу вверх". пример

И финальный компонент - информация о системе управления:
- Рекомендую почитать гайд Мерлина о настройке эво. Некоторые его главы не применимы для кольтов, но и ошибок там мало. Управление кольтом - смесь эво9 (mivec на впуске), и эво10(hot-film maf).
- Таблица MUT очень сильно упростит поиски нужных частей и именование переменных.
- Расшифровки кодов OBD помогут разобраться там, где ничто другое не помогает.

objdump/IDA в руки и вперёд. Я верю, у вас всё получится.
Последний раз редактировалось Rcus Stackwalker 21 дек 2015, 07:28, всего редактировалось 1 раз.

Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 21 дек 2015, 15:41

Продолжу тему.

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

Mitsubishi в контроллерах управления двигателем используют арифметику с фиксированной точкой. Это позволяет легко контролировать погрешность вычислений, и более эффективно в плане потребления памяти (супротив чисел с плавающей точкой не надо хранить порядок).

Но при разборе программы это доставляет некоторые неудобства в понимании природы констант. Также при арифметических операциях приходится использовать специальные функции, чтобы не терять точность, и не допускать ошибок переполнения. "Нельзя просто взять и сложить два числа".

Код: Выделить всё

uint_fast16_t s_add16(uint_fast16_t l, uint_fast16_t r);                                                                               
uint32_t add16(uint_fast16_t l, uint_fast16_t r);                                                                                     
uint32_t s_add32(uint32_t x, uint32_t y);                                                                                             
void memzero16(uint16_t *begin, uint16_t *end);                                                                                       
void s_dec_u16a_atomic(uint16_t *start, uint16_t *end);                                                                               
void s_inc_u16a_atomic(uint16_t *start, uint16_t *end);                                                                               
uint8_t s_16to8(uint16_t v);                                                                                                           
uint16_t s_32to16(uint32_t v);
uint16_t mid16(uint16_t x, uint16_t y, uint16_t z);                                                                                   
uint32_t mid32(uint32_t x, uint32_t y, uint32_t z);                                                                                   
uint16_t s_mul_divu16(uint16_t x, uint16_t y, uint16_t z);                                                                             
uint32_t s_mul32_16_divu16(uint32_t x, uint16_t y, uint16_t z);                                                                       
uint16_t ps_mul_divu16(uint16_t x, uint16_t y, uint16_t z);                                                                           
uint32_t ps_mul32_16_divu16(uint32_t x, uint16_t y, uint16_t z);                                                                       
uint16_t s_scale_base128(uint16_t x, uint16_t y);                                                                                     
uint32_t s32_scale_base128(uint32_t x, uint32_t y);                                                                                   
uint16_t ps_scale_base128(uint16_t x, uint16_t y);
uint32_t ps32_scale_base128(uint32_t x, uint16_t y);
uint16_t s_scale_base256(uint16_t x, uint16_t y);
uint32_t s32_scale_base256(uint32_t x, uint16_t y);                                                                                   
uint16_t ps_scale_base256(uint16_t x, uint16_t y);                                                                                     
uint32_t ps_mul32_16(uint32_t x, uint16_t y);
uint8_t conv8f8_uint(uint16_t x);                                                                                                     
uint16_t conv16f16_uint(uint32_t x);                                                                                                   
uint16_t conv_u8_8f8(uint8_t x);                                                                                                       
uint32_t conv_uint_16f16(uint32_t x);                                                                                                 
uint8_t p_conv8f8_u8(uint16_t v);                                                                                                     
uint16_t p_conv32_16(uint32_t v);
uint16_t swap_bytes16(uint16_t v);
uint16_t to_g16(uint8_t v);
uint16_t s_divu16(uint16_t l, uint16_t r);                                                                                             
uint16_t s16_divu32_16(uint32_t l, uint16_t r);
uint32_t s32_divu32_16(uint32_t l, uint16_t r);
uint16_t ps_divu16(uint16_t l, uint16_t r);                                                                                           
uint16_t ps16_divu32_16(uint32_t l, uint16_t r);                                                                                       
uint32_t prec_sat32_divu32_16(uint32_t l, uint16_t r);                                                                                 
uint16_t aprxu16_256(uint16_t p0, uint16_t p1, uint16_t rat256);//higher rate - more of p0                                             
uint16_t aprxu32(uint32_t p0, uint32_t p1, uint16_t rat);                                                                             
uint16_t aprxu16_255(uint16_t p0, uint16_t p1, uint16_t rat255);//higher rate - more of p0                                             
uint32_t p_aprx16f16_255(uint32_t p0, uint32_t p1, uint16_t rat255);                                                                   
uint_fast16_t map8u16(const void *ptr);
uint_fast16_t mapu16(const void *ptr);                                                                                                 
uint_fast16_t multimap8u16(const void *ptr);
uint_fast16_t multimapu16(const void *ptr);
uint8_t *multiu8a(uint8_t * const *ptr);
void *multivoidstar(void * const *ptr);
uint8_t multiu8(const uint8_t *ptr);
uint16_t multiu16(const uint16_t *ptr);
uint16_t p_aprxu16_255_2(uint16_t p0, uint16_t p1, uint16_t rate);
void calc_axis(const void *ptr);
uint16_t s_mul16(uint16_t l, uint16_t r);
uint32_t mul16(uint16_t l, uint16_t r);
uint32_t s_mul32(uint32_t l, uint32_t r);
uint_fast16_t s_sub16(uint_fast16_t l, uint_fast16_t r);
uint32_t s_sub32(uint32_t l, uint32_t r);


Вот список функций стандартной библиотеки арифметики контроллеров MMC.

Значения компонентов имён:
s_ - safe/saturated
p_ - precision
ps_ - precision saturated
add - сложение
sub - вычитание
mul - умножение
div - деление
scale_baseX(l,r) - аналог l*r/X
aprx - линейная аппроксимация
calc_axis - функция расчёта значения оси (указатели на входное и выходное значение хранятся в сткруктуре оси)
map - расчёт по карте (тип 2D/3D и указатели на входные данные хранятся в структуре карты)

Впрочем, эти имена вы не встретите нигде в самой прошивке, это мои личные догадки :)

Вариаторная часть хранит в себе ещё немного функций, не используемых в двигательной части, но этого для начала должно быть достаточно. В контроллерах Z27 библиотека начинается с адреса 0x4f000. Удачи.
Последний раз редактировалось Rcus Stackwalker 21 дек 2015, 15:45, всего редактировалось 1 раз.

Аватара пользователя
Shadow
Постоянный участник
Сообщения: 577
Зарегистрирован: 04 дек 2015, 22:42
Откуда: Москва
Автомобиль: Colt Ralliart (Z27A), Version-R (Z27AG) MT
Благодарил (а): 326 раз
Поблагодарили: 21 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Shadow » 21 дек 2015, 15:55

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

Аватара пользователя
Олег
Новичок
Сообщения: 45
Зарегистрирован: 10 дек 2015, 16:02
Откуда: Иркутск
Автомобиль: MMC colt ralli art 424
Благодарил (а): 91 раз
Поблагодарили: 19 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Олег » 21 дек 2015, 16:20

Как сложно! :shock:

Аватара пользователя
Олег
Новичок
Сообщения: 45
Зарегистрирован: 10 дек 2015, 16:02
Откуда: Иркутск
Автомобиль: MMC colt ralli art 424
Благодарил (а): 91 раз
Поблагодарили: 19 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Олег » 21 дек 2015, 16:35

допустим я ниче из этого не знаю!) Сколько мне нужно убить времени чтобы дойти до последнего твоего слова в записи?)

Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 21 дек 2015, 16:59

Всмысле до последнего слова? Тут все от подготовки зависит. Для меня найти и разобрать до болтика библиотеку арифметики на принципиально новом контроллере - дело пары дней наверно. Но сколько ушло в начале - могу позже по системе контроля версий глянуть

Аватара пользователя
Олег
Новичок
Сообщения: 45
Зарегистрирован: 10 дек 2015, 16:02
Откуда: Иркутск
Автомобиль: MMC colt ralli art 424
Благодарил (а): 91 раз
Поблагодарили: 19 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Олег » 21 дек 2015, 17:11

Короче если я в этом не шарю, сам хер Че пойму и не научусь.?

Для меня просто что тут написано пипец космос)))

Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 21 дек 2015, 17:15

Ну я же научился. Из подготовки у меня было только знание "C", и небольшой опыт охоты на баги по ассемблеру ARM. А ещё желание сделать что-то такое, и год свободных вечеров

Аватара пользователя
Олег
Новичок
Сообщения: 45
Зарегистрирован: 10 дек 2015, 16:02
Откуда: Иркутск
Автомобиль: MMC colt ralli art 424
Благодарил (а): 91 раз
Поблагодарили: 19 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Олег » 21 дек 2015, 17:20

Понял)

Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 22 дек 2015, 07:28

Для затравки одна загадка, к которой у меня пока нет решения.

Есть вариаторная прошивка кольта. Внутри исходя из скорости вторичного вала рассчитывается скорость движения по формуле vehicle_speed = secondary_shaft_speed * 38 * X / Y;

Где:
secondary_shaft_speed - скорость выходного вала с дискретностью 1 об/мин,
vehicle_speed - скорость движения с дискретностью 0.01 км/ч,
Х=73, Y=1336.

При перепроверке через передаточное число дифференциала (5.22) и размер штатных колёс (205/45R16) всё сходится, но физический смысл констант 38, X и Y мне пока не понятен. X и Y всегда задействованы парой, но есть другие расчёты, в которых скорость выходного вала умножают на 16*X/Y...
Последний раз редактировалось Rcus Stackwalker 22 дек 2015, 07:29, всего редактировалось 1 раз.

Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 22 дек 2015, 11:27

Решение:
IMG_20151222_132532.jpg
IMG_20151222_132532.jpg (477.36 КБ) 13215 просмотров

Аватара пользователя
IceD
Участник
Сообщения: 163
Зарегистрирован: 09 дек 2015, 22:44
Откуда: Краснодар
Автомобиль: Colt Ralliart Version R
Благодарил (а): 19 раз
Поблагодарили: 97 раз

Развенчание мифа о сложности разбора прошивки

Сообщение IceD » 22 дек 2015, 13:37

Ааааам :shock:

Лёха! Ты чО !?!? 

Да проще мотор перебрать самому с книжкой,ни разу этого не делая :D



 

Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 22 дек 2015, 13:59

Всё исключительно из любви к человечеству :)

Вокруг этой темы довольно много мифов, и вообще часто считают это магией.

Или бывает противоположное мнение: что труд по разбору и выходное описание по сути ничего не стоит. Подумаешь пару килобайт xml, то ли дело железка какая: в руки берёшь и осознаёшь ценность.
Последний раз редактировалось Rcus Stackwalker 22 дек 2015, 14:00, всего редактировалось 1 раз.

Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 27 дек 2015, 21:53

Хотелось бы отметить что разбор прошивки иногда заходит в тупик, выходу из тупика иногда помогают логи. Хоть какая-то радость :)

phpBB [video]

Аватара пользователя
Stas
Новичок
Сообщения: 2
Зарегистрирован: 02 янв 2016, 21:33
Откуда: Москва
Автомобиль: Colt

Развенчание мифа о сложности разбора прошивки

Сообщение Stas » 02 янв 2016, 22:23

Ты все делаешь через mut-3?

Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 03 янв 2016, 19:30

У меня нет диагностического комплекса MUT-3. Да и зачем он мне, если я разбираю программу. А для логов и перепрограммирования контроллера (для тестов) вполне хватает Tactrix OpenPort 2.0

Аватара пользователя
CARAMBA1978
Новичок
Сообщения: 27
Зарегистрирован: 13 дек 2015, 23:25
Откуда: Новороссийск
Автомобиль: Кольт Раллиарт
Благодарил (а): 6 раз
Поблагодарили: 11 раз

Развенчание мифа о сложности разбора прошивки

Сообщение CARAMBA1978 » 03 янв 2016, 21:57

Объясни пожалуйста для новичков что такое:  "знание "C", и небольшой опыт охоты на баги по ассемблеру ARM"?

Хочу научится )))

Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 03 янв 2016, 23:29

Си - язык программирования. Реализован практически для всех существующих архитектур.

"Охота на баги" или дебаггинг - рутина/развлечение программистов. Если дело дошло до отладки по ассемблеру, значит есть подозрение на баг-однопроцентник (ошибка в инструментах).

Аватара пользователя
Shadow
Постоянный участник
Сообщения: 577
Зарегистрирован: 04 дек 2015, 22:42
Откуда: Москва
Автомобиль: Colt Ralliart (Z27A), Version-R (Z27AG) MT
Благодарил (а): 326 раз
Поблагодарили: 21 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Shadow » 03 янв 2016, 23:51

А начать надо с различных математических дисциплин.. )) как минимум, с алгебры и дискретной математики.

Аватара пользователя
CARAMBA1978
Новичок
Сообщения: 27
Зарегистрирован: 13 дек 2015, 23:25
Откуда: Новороссийск
Автомобиль: Кольт Раллиарт
Благодарил (а): 6 раз
Поблагодарили: 11 раз

Развенчание мифа о сложности разбора прошивки

Сообщение CARAMBA1978 » 04 янв 2016, 09:20

9 часов назад, Rcus Stackwalker сказал:

"Охота на баги" или дебаггинг - рутина/развлечение программистов. Если дело дошло до отладки по ассемблеру, значит есть подозрение на баг-однопроцентник (ошибка в инструментах).

мои познания в данной концепции ассоциируют мистификацию парадоксальных иллюзий !
9 часов назад, Shadow сказал:

А начать надо с различных математических дисциплин.. )) как минимум, с алгебры и дискретной математики.

алгеброй владею отлично, а вот что такое "дискретная математика" ? чем она отличается от обычной евклидовой?

Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 04 янв 2016, 09:45

Понятия не имею зачем нужна алгебра, может чтобы отличать Z и Zn? Евклидова - геометрия (обычно). Дискретная математика - другое: в данном случае интересна теория автоматов и целочисленная арифметика
Последний раз редактировалось Rcus Stackwalker 04 янв 2016, 09:48, всего редактировалось 1 раз.

Аватара пользователя
Shadow
Постоянный участник
Сообщения: 577
Зарегистрирован: 04 дек 2015, 22:42
Откуда: Москва
Автомобиль: Colt Ralliart (Z27A), Version-R (Z27AG) MT
Благодарил (а): 326 раз
Поблагодарили: 21 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Shadow » 04 янв 2016, 22:02

Не вижу никаких противоречий с тем, что написано у меня. ))) Алгебра - это расширение арифметики. Имеется в виду элементарная алгебра, линейная конечно нужна не так часто. Дискретная математика нужна для понимания логических операций. А теория автоматов - это как раз раздел дискретной математики. )

Аватара пользователя
CARAMBA1978
Новичок
Сообщения: 27
Зарегистрирован: 13 дек 2015, 23:25
Откуда: Новороссийск
Автомобиль: Кольт Раллиарт
Благодарил (а): 6 раз
Поблагодарили: 11 раз

Развенчание мифа о сложности разбора прошивки

Сообщение CARAMBA1978 » 05 янв 2016, 01:24

В общем название темы - это прикол! ))  Всё равно что сделать тему :  "Развенчание мифа о сложности разбора вариатора" или "Капиталка - это просто!"  )))    Для начала вам понадобится общая подготовка по: термех, сопромат, теория ДВС, гидромеханика, теория турбин, термодинамика.
Последний раз редактировалось CARAMBA1978 05 янв 2016, 01:31, всего редактировалось 1 раз.

Аватара пользователя
Rcus Stackwalker
Новичок
Сообщения: 49
Зарегистрирован: 09 дек 2015, 13:41
Откуда: Минск
Автомобиль: Kawasaki EX250K (Colt czT in reserve)
Благодарил (а): 7 раз
Поблагодарили: 66 раз

Развенчание мифа о сложности разбора прошивки

Сообщение Rcus Stackwalker » 05 янв 2016, 07:18

Я серьёзно. Есть недопонимание сложности работы в обе стороны. Это как со сваркой кастом выпускного коллектора: пользователь видит выходное изделие, но без базовых знаний о сварке не может оценить сложность выполненной работы. С одной стороны - Эффект Даннинга-Крюгера, c другой - Третий закон Кларка


Вернуться в «Буст-ап и чип-тюнинг»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость