Готовимся копать EEPROM ЭБУ
Сегодня первый удачный день экспериментов с «невиданной фигней»))
Если вы не увидели связи между тем и тем, то заваривайте чаёк, постараюсь рассказать о своих планах.
Знаете почему нельзя просто так взять и поставить себе ЭБУ от другой точно такой же машины?
Потому, что не даст иммобилайзер.
Иммобилайзер в реализации крайслера — это не просто коробочка, которая считывает ключ зажигания и разрешает запуск двигателя. Он как Агент Смит из Матрицы прописывает свой уникальный код в разные блоки управления, чтобы те стали единым целым. И да, в блок управления двигателя он себя тоже прописывает. Именно поэтому система отторгнет чужой ЭБУ, считав с него код от чужого иммо, и заблокирует его после нескольких неудачных попыток завестись. И именно поэтому на рынке предлагается приобретать комплект с ключами, личинками, новым замком зажигания и блоком SKIM. Решение хоть и рабочее, но проблемное по установке и дорогое. К тому же, в ЭБУ будет прописан чужой VIN, а это не есть хорошо (читал о случаях проверки сканером в МРЭО с последующим изъятием). Наверное это можно решить дилерским сканером или еще каким другим, но это пока не наш метод)
Гораздо привлекательней приобрести себе ЭБУ от себринга или стратуса и «подружить» его со своим авто самостоятельно. Не будем дальше тянуть кота за хвост: место, где «живет» иммо в ЭБУ давно известно — это пара микросхем EEPROM на блоке. Он там хранится в незашифрованном виде и даже без контрольных сумм в виде VIN-номера авто.
Также удалось выяснить, что в качестве этих ПЗУ используются микрухи ST M95040 или M95080. Стоят эти восьминожки каких-то смешных денег — 28 р/шт (можно взять с запасом на эксперименты)
А вот с программатором не все так просто в плане денег: профессиональные решения стоят очень не кисло. и так как я никогда не имел дела с программаторами, то мне в первых строках гугло-поиск предлагал именно их))
Совершенно случайно нашел программатор, который производит контора энтузиастов с пафосным названием «Электронные войска»)
Что ж, прикладываем к нему пустую микросхему и пробуем залить на нее дамп от Конкорда (не от самолета, конечно, от Крайслера))
…А перед этим сходим в магазин и купим кабель miniUSB! ))) Потому, что там распаян ни фига microUSB, а этот старый mini, от которого у меня уже ни устройств, ни шнуров не осталось.
ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ: ЕЕПРОМ
Забросил я уроки для начинающих, сегодня поговорим о EEPROM — энергонезависимой памяти.
Эта память одно из главных составляющих в функционале поделок на микроконтроллерах, любой начинающий микроконтроллерщик подходит к этапу освоения этой энергонезависимой памяти. Оно и ежу понятно, что сохранять настройки очень часто надо, нужно и без этого нельзя.
В даташитах все рассусолено сухим техническим языком про особенности работы еепром, я же остановлюсь на основополагающих правилах использования этой памяти, правильную на мой взгляд.
Объявляется еепром так же как и переменная, работают с еепром так же как с переменной, кроме некоторых но. Пример (Code Vision AVR):
unsigned char a; // объявляем беззнаковую переменную размером 8 бит
unsigned char eeprom eea; // объявляем «переменную» в еепром такого же типа, этого достаточно, всю остальную работу делает компилятор.
Переменную я обозвал в кавычках, ибо с ней можно обращаться как с обычной переменной, а в остальном она ведет себя по другому:
1. — значение хранимое в ЕЕПРОМ по умолчанию равно максимально возможному числу, в нашем случае после объявления в eea лежит число 255 или оно же 0xFF или оно же 0b11111111.
2- количество циклов стирания-записи у памяти ЕЕПРОМ относительно мало, поэтому нужно максимально ограничивать число записей в алгоритме программы.
Вот поучительная история про то, как фирма BLAUPUNKT лоханулась и проигнорировала второй пункт: www.audi.org.ua/materials/2954.html
3. Память ЕЕПРОМ самый тормозной тип данных, это нужно учитывать. Особенно при записи в ЕЕПРОМ. Можно получить каку, например, запихнув обработку еепром в прерываниях. В особо ответственных моментах можно использовать флаги состояния памяти ЕЕПРОМ, бывает очень полезно.
После обявления еепром и переменной я делаю команду присвоения числа из еепром в переменную, до начала основного цикла и как правило до начала работы прерываний:
После этого я верчу как хочу эту переменную, пишу в нее, читаю, используя ее в алгоритме и в нужный момент, когда нужно сохранить делаю так, чтоб данные закатились из этой переменной обратно в ЕЕПРОМ единожды:
Вот пример куска кода записи в ЕЕПРОМ:
unsigned char a; // объявляем беззнаковую переменную размером 8 бит
unsigned char eeprom eea; // объявляем еепром такого же типа,
unsigned char trig; // объявляем переменную, которая будет помнить, что кнопка нажата.
Далее идет основанная часть программы void main(void), в ней :
a=eea; // загоняем данные в с еепром в переменную
Далее идет главный цикл while(1) и в теле цикла:
if(key==1) // если кнопка настройки нажата, то:
<
trig=1; // включаем триггер, который запоминает, что кнопка нажата
a*b+b^2 ; //тут что то делаем нужное, когда кнопка нажата
>
else // если кнопка отжата
<
LED=1 ; //тут что то делаем нужное, когда кнопка отжата
if(trig) //если кнопка отжата и триггер включен, то:
<
eea=a; // пишем переменную а в еепром
trig=0; // сбрасываем триггер
>
>
Запись в ЕЕПРОМ срабатывает по отжатию кнопки единожды, когда триггер равен единице.
Коррекция пробега своими силами, или как прошить память EEPROM
Аккуратно ее выпеваем.
Теперь нужно считать ее прошивку, для этого нужен программатор.
Если по чистой случайности у вас его нет, то собираем с нуля.
Для сбора простейшего программатора вам потребуется COM порт (RS-232) если на задней панели компьютера его нет то вам потребуется переходник USB-COM (RS-232)
Дальше нужно собрать простейшую цепь для подключения память к разъему com порта.
Проверяйте по 10 раз как вы все подключили перед подключением к ПК!
У меня получилась вот такая ЗАЛИПУХА 🙂
Далее дело за программной частью
Незабываем устанавливливать драйвера на переходник USB-COM
Качаем с просторв интернет программулину PonyProg
Ну я по старинке пользовался IC-PROG (только для ОС XP)
Не забывайте о разрядности вашей ОС ищите программы для вашей ОС.
interface Setup»>
Далее, выбираем в правом верхнем углу тип памяти и название,
Ну и пытайтесь считать прошивку.
Должно считать примерно так
Далее сохраняем прошивку в качестве гарантии, что бы можно было вернуть прошивку в первоначальном виде.
Теперь нам понадобиться программа калькулятор пробега, программа под названием carculator V-1.07
Находим в программе свое авто, (моего авто не было, по анологии понял куда вписывать новые данные).
Вбиваем в программу нужный пробег, и нажимаем Calculate он выдает преобразованный пробег в шестнадцатеричном виде, далее ставим галочку swap и опять нажимаем Calculate, мы получили набор символов который нужно вставить в определенную область памяти. Программа carculator v1.07 при выборе авто показывает в какие строки и ячейки нужно вставить новые данные с примером.
Далее меняем в программе редактора памяти значения на новые, и программируем контроллер.
Ворачиваем его в приборку, для удобства в приборку припаял сокет 8 ног, что бы постоянно не выпаивать микруху а просто вставлять.
Метаморфозы моего пробега ))
Работа с параметрами в EEPROM, как не износить память
Введение
Доброго времени суток. Прошлая моя статья про параметры в EEPROM была, мягко говоря, немного недопонята. Видимо, я как-то криво описал цель и задачу которая решалась. Постараюсь в этот раз исправиться, описать более подробно суть решаемой проблемы и в этот раз расширим границы задачи.
А именно поговорим о том, как хранить параметры, которые необходимо писать в EEPROM постоянно.
Особенность таких параметров заключается в том, что их нельзя писать просто так в одно и то же место EEPROM, вы просто израсходуете все циклы записи EEPROM. Например, если, необходимо писать время работы один раз в 1 минуту, то нетрудно посчитать, что с EEPROM в 1 000 000 циклов записей, вы загубите его меньше чем за 2 года. А что такое 2 года, если обычное измерительное устройство имеет время поверки 3 и даже 5 лет.
Кроме того, не все EEPROM имеют 1 000 000 циклов записей, многие дешевые EEPROM все еще производятся по старым технологиям с количеством записей 100 000. А если учесть, что 1 000 000 циклов указывается только при идеальных условиях, а скажем при высоких температурах это число может снизиться вдвое, то ваша EEPROM способно оказаться самым ненадежным элементом уже в первый год работы устройства.
Поэтому давайте попробуем решить эту проблему, и сделать так, чтобы обращение к параметрам было столь же простым как в прошлой статье, но при этом EEPROM хватало бы на 30 лет, ну или на 100 (чисто теоретически).
Итак, в прошлой статье, я с трудом показал, как сделать, так, чтобы с параметрами в EEPROM можно было работать интуитивно понятно, не задумываясь, где они лежат и как осуществляется доступ к ним
Для начала проясню, для чего вообще нужно обращаться по отдельности к каждому параметру, этот момент был упущен в прошлой статье. Спасибо товарищам @Andy_Big и @HiSER за замечания.
Если использовать способ, который предложил пользователь @HiSER- это будет означать, что для перезаписи одного параметра размером в 1 byte, я должен буду переписать всю EEPROM. А если алгоритм контроля целостности подразумевает хранение копии параметров, то для 200 параметров со средней длиной в 4 байта, мне нужно будет переписать 1600 байт EEPROM, а если параметров 500, то и все 4000.
Малопотребляющие устройства или устройства, питающиеся от от токовой петли 4-20мА должны потреблять, ну скажем 3 мА, и при этом они должны иметь еще достаточно энергии для питания модема полевого интерфейса, графического индикатора, да еще и BLE в придачу. Запись в EEPROM очень энергозатратная операция. В таких устройствах писать нужно мало и быстро, чтобы средний ток потребления был не высоким.
Очевидно, что необходимо, сделать так, чтобы микроконтроллер ел как можно меньше. Самый простой способ, это уменьшить частоту тактирования, скажем до 500 КГц, или 1 Мгц (Сразу оговорюсь, в надежных применениях использование режима низкого потребления запрещено, поэтому микроконтроллер все время должен работать на одной частоте). На такой частоте, простая передача 4000 байт по SPI займет около 70 мс, прибавим к этому задержку на сохранение данных в страницу (в среднем 7мс на страницу), обратное вычитывание, и вообще обработку запроса микроконтроллером и получим около 3 секунд, на то, чтобы записать один параметр.
Поэтому в таких устройствах лучше чтобы доступ к каждому параметру был отдельным, и обращение к ним должно быть индивидуальным. Их можно группировать в структуру по смыслу, или командам пользователя, но лучше, чтобы все они не занимали больше одной страницы, а их адреса были выравнены по границам страницы.
Как работать с EEPROM, чтобы не износить её
Те кто в курсе, можете пропустить этот раздел. Для остальных краткое, чисто мое дилетантское пояснение.
Как я уже сказал, число записей в EEPROM ограничено. Это число варьируется, и может быть 100 000, а может и 1 000 000. Так как же быть, если я хочу записать параметр 10 000 000 раз? И здесь мы должны понять, как внутри EEPROM устроен доступ к ячейкам памяти.
Итак, в общем случае вся EEPROM разделена на страницы. Страницы изолированы друг от друга. Страницы могут быть разного размера, для небольших EEPROM это, скажем, 16, 32 или 64 байта. Каждый раз когда вы записываете данные по какому-то адресу, EEPROM копирует все содержимое страницы, в которой находятся эти данные, во внутренний буфер. Затем меняет данные, которые вы передали в этом буфере и записывает весь буфер обратно. Т.е. по факту, если вы поменяли 1 байт в странице, вы переписываете всю страницу. Но из-за того, что страницы изолированы друг от друга остальные страницы не трогаются.
Таким образом, если вы записали 1 000 000 раз в одну страницу, вы можете перейти на другую страницу и записать туда еще 1 000 000 раз, потом в другую и так далее. Т.е. весь алгоритм сводится к тому, чтобы писать параметр не в одну страницу, а каждый раз сдвигаться в следующую страницу. Можно закольцевать эти действия и после 10 раз, снова писать в исходную страницу. Таким образом, вы просто отводите под параметр 10 страниц, вместо 1.
Анализ требований и дизайн
Все требования можно сформулировать следующим образом:
Пользователь должен задать параметры EEPROM и время обновления параметра
На этапе компиляции нужно посчитать количество необходимых страниц (записей), чтобы уложиться в необходимое время работы EEPROM. Для этого нужно знать:
Количество циклов перезаписи
Время обновления параметра
Время жизни устройства
Хотя конечно, можно было дать возможность пользователю самому задавать количество записей, но что-то я хочу, чтобы все считалось само на этапе компиляции.
Каждая наша переменная(параметр) должна иметь уникальный начальный адрес в EEPROM
Мы не хотим сами руками задавать адрес, он должен высчитываться на этапе компиляции
При каждой следующей записи, адрес параметра должен изменяться, так, чтобы данные не писались по одному и тому же адресу
Это также должно делаться автоматически, но уже в runtime, никаких дополнительных действий в пользовательском коде мы делать не хотим.
Мы не хотим постоянно лазить в EEPROM, когда пользователь хочет прочитать параметр
Обычно EEPROM подключается через I2C и SPI, передача данных по этим интерфейсам тоже отнимает время, поэтому лучше кэшировать параметры в ОЗУ, и возвращать сразу копию из кеша.
При инициализации мы должны найти самую последнюю запись, её считать и закешировать.
За целостность должен отвечать драйвер.
За алгоритм проверки целостности отвечает драйвер, если при чтении он обнаружил несоответствие он должен вернуть ошибку. В нашем случае, пусть в качестве алгоритма целостности будет простое хранение копии параметра. Сам драйвер описывать не буду, но приведу пример кода.
Ну кажется это все наши хотелки. Как и в прошлой статье давайте прикинем дизайн класса, который будет описывать такой параметр и удовлетворять нашим требованиям:
Посмотрим на то, как реализуются наши требования таким дизайном.
Пользователь должен задать параметры EEPROM и время обновления параметр
При каждой следующей записи, адрес параметра должен изменяться, так, чтобы данные не писались по одному и тому же адресу
Еще одной особенностью нашего противоизносного параметра является тот факт, что кроме самого значения, мы должны хранить еще и его индекс. Индекс нужен нам для двух вещей:
По нему мы будет рассчитывать следующий адрес записи
Для того, чтобы после выключения/включения датчика найти последнюю запись, считать её и проинициализировать значением по адресу этой записи кеширумое значение в ОЗУ.
Давайте посмотрим как реализован метод расчета текущего адреса записи:
Мы не хотим постоянно лазить в EEPROM, когда пользователь хочет прочитать параметр
Теперь самое интересное, чтобы проинициализировать копию в ОЗУ правильным значением, необходимо при запуске устройства считать все записи нашего параметра и найти запись с самым большим индексом. Наверняка есть еще разные методы хранения данных, например, связанный список, но использование индекса, показалось мне ну прямо очень простым.
В общем-то и все класс готов, полный код класса:
Результат
Собственно все, теперь мы можем регистрировать в списке любые параметры:
Что произойдет в этом примере, когда мы будем писать 10,11,12. 15 в наш параметр. Каждый раз при записи, адрес параметра будет смещаться на размер параметра + размер индекса + размер копии параметра и индекса. Как только количество записей превысит максимальное количество, параметр начнет писаться с начального адреса.
На картинке снизу как раз видно, что число 15 с индексом 5 записалось с начального адреса, а 10 теперь нет вообще.
В данном случае после сброса питания, при инициализации, будет найдена запись с индексом 5 и значением 15 и это значение и индекс будут записаны в кэшируемую копию нашего параметра.
Вот и все, надеюсь в этой статье цель получилось пояснить более детально, спасибо за то, что прочитали до конца.
Читаем дамп EEPROM из BSI (Valeo J03-00) Citroen C5
Всем доброго, в статье пойдет речь о том как узнать код для привязки чипов ключей ситроена с5.
Если вы не знаете для чего пин-код, и что с ним делать то читайте тут или тут.
Тем читателям у которых нет хотя бы базового оборудования и опыта паяния статья мало чем поможет.
Если у Вас не тресутся руки, когда держите паяльник, у Вас есть время и деньги на «Упс, что пошло не так…» и Вы хотите получить пин-код вложив 2-5$, не переплачивая ключникам, то этот материал для Вас.
Убедительно прошу не писать в коментах типа «Я лучше бы заплатил 40$ за ключ или обратился к профессионалам и т.д.», » Дурак, мог бы потерять дамп и потом иметь гемор по подбору похожего и связи блоков.» Прошу по делу. Я, прежде чем полез в BSI с паяльником, трезво взвесил все риски и экономическую выгоду.
Поехали. В блоке BSI авто храниться инфа о пробеге, пин коде, вин коде и др. от других блоков авто, я так понял, часть тупо для резервирования данных.
Сами данные хранятся в энергонезависимой памяти в микросхеме которую называют EEPROM, данные с нее читает микроконтроллер, обращаясь к ней по SPI шине, но об этом чуть позже.
Для того что бы понять что у меня в блоке я его сначала снял, находится он в С5 за бардачком в районе левой ноги водителя.
Конкретно в моем случае было:
BSI Valeo J03-00
FNR:9651197580
FNC:9651196880
Boot: 9.31
Вбиваем в гугл «9651197580 EEPROM», гугл любезно предоставит ссылки на сайты с дампами прошивок где в их описании ищем тип еепром, в моем случае это была EEPROM ST M95160
Следующий вопрос гуглу звучит так «M95160 Datashet» гугл даст ссылку на документацию в PDF
Понимаем, что тут уже кто-то побывал и подпаивался к нашей еепромке для отмотки одометра.
Нюанс в том, что я не нашел в сети инфы какой именно пятачок идет к какой именно ножки еепром, а епромка была припаяна снизу платы и простого доступа к ней нет и пришлось разбирать блок что бы понять, что и куда выходит.
Если у вас БСИ такая же как у меня, то пропускайте пару абзацев по разборке и смотрите распиновку в конце статьи.
У микросхемы 8 ножек, нумерация начинается с левого нижнего угла относительно написания маркировки.
Согласно даташита кому интересно, :
1. пин это Chip select выбор активного устройства на шине
2. пин это выход данных
3. пин системный подтянут к +5в через резистор.
4. пин это «GND», минус или «Масса»
5. пин это входные данные
6. пин это шина синхронизации
7. пин системный соеденен с 8м
8. пин это питание самой микросхемы +5в.
Вот сейчас можно проследить какой пин выходит на обратную сторону платы к которой подпаивались люди до меня.
Большинство епромок попадавшихся мне в руки имели такую же распиновку, будь там телевизор или мультиварка.
Кладем микросхему в панельку программатора и читаем ее в Hex или BIN файл.
Конкретно свой PIN-код я читал в Hex Edition Neo редакторе, но пришлось хорошо подумать, просто открыв в блокноте вы его не увидите, можете поискать программки которые сделают это за Вас, или спросить на форуме. Сам алгоритм чтения я не раскрою, но если вы найдете в дампе куски своего VINа, то пин вы найдете быстро, если не получится шлите в личку скриншот програмки с куском кода начиная с адреса 0000610 по 0000700.
Собираем крышки в обратном порядке.
Программатор для 59160 вы можете спаять сами.
Выкладываю пиноут для чтения дампа без разбора и выпайки еепром, так как это делают на СТО. Цифрами показаны номера ножек микросхемы, красной стрелкой колодец по которому идет питание на ЕЕПРОМ с наружного слоя платы на внутренний, красным помечены дорожки которые следует перерезать перед подключением программатора, если вы не знаете как заглушить процессор (подпаиватся к колодцу между крестиками). Многие читают еепром запитывая всю плату, но для этого нужно «заткнуть процессор», что-бы последний не мешал процессу. Заглушить процессор на время чтения программатора можно закоротив выводы его кварцевого резонатора, нов моем случае не вариант так как, он распаян снизу платы), или подтянуть ножку RES процессора к массе, а куда эта ножка выходит я и не глянул, и фоток не осталось с маркировкой процессора.
Да простят меня СТО-шники за то, что я раскрыл часть их секретов, но до этого я дошел сам, мне никто не помогал, и тут все честно.