<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://re-engr.ru/feed.xml" rel="self" type="application/atom+xml" /><link href="http://re-engr.ru/" rel="alternate" type="text/html" /><updated>2025-01-31T10:21:41+00:00</updated><id>http://re-engr.ru/feed.xml</id><title type="html">Реверс-инжиниринг?.. Это просто!</title><subtitle>исследование устройств, ремонт, разработка</subtitle><entry><title type="html">Ремонт WABCO Electronic Level Control (ELC). Scania.</title><link href="http://re-engr.ru/scania-wabco-elc-eeprom/" rel="alternate" type="text/html" title="Ремонт WABCO Electronic Level Control (ELC). Scania." /><published>2025-01-29T00:00:00+00:00</published><updated>2025-01-29T00:00:00+00:00</updated><id>http://re-engr.ru/scania-wabco-elc-eeprom</id><content type="html" xml:base="http://re-engr.ru/scania-wabco-elc-eeprom/"><![CDATA[<p><img src="/images/scania-elc/elc-label.jpg" alt="_config.yml" /><br />
Из-за некорректно проведенной процедуры калибровки повторная калибровка стала невозможна с помощью имеющихся средств, а именно диагностического оборудования SDP3.</p>

<p>Полагаю, что есть какой-то другой путь решения проблемы, не связанный со снятием микросхемы EEPROM, внесением изменений в дамп и т.д., так как в интернете эта неисправность особо не обсуждается. Но работа была произведена. Получен положительный результат. Возможно, собранная информация кому-то чем-то поможет.</p>

<p>Данные по блоку:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>| WABCO 115 34/07       | CONTROL UNIT ELC  |
| 051872  446 170 216 0 | SCANIA            |
| ECAS 6x2/BUS          | PART NO.: 1851677 |
| 24V e1 032063         | HW NO.: 1759698   |
|                       | 6870              | 
</code></pre></div></div>

<h2 id="в-чем-проблема">В чем проблема?</h2>
<p>После ремонта тягача потребовалась настройка уровня подвески. Это делается в SDP3 за 5 шагов:</p>
<ol>
  <li>Перейти в режим калибровки и согласиться на её проведение;</li>
  <li>Установить ходовой уровень (средний) подвески;</li>
  <li>Установить максимальный уровень подвески;</li>
  <li>Установить минимальный уровень подвески;</li>
  <li>Рассчитать калибровочное значение и записать его в EEPROM.</li>
</ol>

<p>На этапе 1 в EEPROM удаляется значение предыдущей калибровки. Если после этого процесс прервется или завершится с ошибкой, то возникнет описываемая проблема. На этапах 2-4 в EEPROM записываются показания с датчиков уровня подвески: один передний и один задний. На этапе 5, на основании полученных значений, производится расчет нового калибровочного коэффициента (тот, что был удален на этапе 1).</p>

<p>Если подвеска имеет какие-то неисправности, либо есть неисправность датчиков, либо нарушен порядок действий на этапах 2-4, то на этапе 5 будет рассчитан некорректный коэффициент, имеющий отрицательное значение. Он будет сохранен в EEPROM, и после этого повторная калибровка становится невозможной, по крайней мере через то же самое меню в SDP3.</p>

<p>На фото представлено окно, на котором можно увидеть неисправность. Вместо значений “-36” и “-34” мм отображается “-300” (вроде был) и шкала имеет красный фон. Слева, возле текстового описания, отображается по одному знаку вопроса. В логах диагностики фиксируется ошибка по блоку ELC. Если отключить датчик уровня, то возле знака вопроса появляется еще какой-то значок, вроде желтый треугольник.</p>

<p><img src="/images/scania-elc/elc_values.jpg" alt="config.yml" /></p>

<p>Значение не изменяется при изменении уровня подвески, и это может вызвать подозрения на датчики уровня. В моём случае был нарушен регламент проведения процедуры калибровки. На этапе 3 был установлен минимальный уровень, и этот же минимальный уровень был записан на этапе 4. (об это ниже)</p>

<h2 id="как-решить">Как решить?</h2>
<p>Нужно изменить значение калибровки на корректное. Это позволит снова войти в режим калибровки в программе SDP3.</p>

<p>На основании анализа дампов EEPROM и экспериментов с режимом калибровки была получена нужная информация.</p>

<p>Ниже показаны первые 128 байт из 2 КБ. (используется AT93C86). <strong>Дамп рабочий.</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
00000000   00 86 0B 56 13 F8 0C EA  15 05 0F 64 19 00 7D 00    † V ш к   d  } 
00000010   7D C4 86 24 77 00 7D EB  06 12 CE 03 16 05 CF 0C   }Д†$w }л  О   П 
00000020   9A 15 B4 0E 14 19 00 7D  00 7D C4 86 24 77 00 7D   љ ґ    } }Д†$w }
00000030   D4 06 0C 17 FF FF 2C 1A  68 02 9C 19 FF FF B4 02   Ф   яя, h њ яяґ 
00000040   FF FF 27 06 FF FF 0E 05  FF FF 4B 05 8B 06 5D 04   яя' яя  яяK ‹ ] 
00000050   96 04 00 00 00 00 02 05  D7 04 BE 03 4B 04 EE 02   –       Ч ѕ K о 
00000060   CE 04 72 24 18 05 10 27  F3 05 54 2E 37 03 CB 03   О r$   'у T.7 Л 
00000070   B8 24 13 04 10 27 38 05  22 2E 86 02 00 00 00 00   ё$   '8 ".†     
</code></pre></div></div>

<p>Данные по адресам 0x4E…0x5F относятся к калибровке подвески. Формат int16, little-endian.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
00000040                                              5D 04   яя' яя  яяK ‹ ] 
00000050   96 04 00 00 00 00 02 05  D7 04 BE 03 4B 04 EE 02   –       Ч ѕ K о 
</code></pre></div></div>
<p>Запишу в столбец и переверну байты.</p>

<table>
  <thead>
    <tr>
      <th>Addr</th>
      <th>hex</th>
      <th>dec</th>
      <th>Описание</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0x4E</td>
      <td>045D</td>
      <td>1117</td>
      <td>Ходовой уровень датчик 1</td>
    </tr>
    <tr>
      <td>0x50</td>
      <td>0496</td>
      <td>1174</td>
      <td>Ходовой уровень датчик 2</td>
    </tr>
    <tr>
      <td>0x52</td>
      <td>0000</td>
      <td>0000</td>
      <td>Не используется</td>
    </tr>
    <tr>
      <td>0x54</td>
      <td>0000</td>
      <td>0000</td>
      <td>Не используется</td>
    </tr>
    <tr>
      <td>0x56</td>
      <td>0502</td>
      <td>1282</td>
      <td>Верхний уровень датчик 1</td>
    </tr>
    <tr>
      <td>0x58</td>
      <td>04D7</td>
      <td>1239</td>
      <td>Верхний уровень датчик 2</td>
    </tr>
    <tr>
      <td>0x5A</td>
      <td>03BE</td>
      <td>0958</td>
      <td>Нижний уровень датчик 1</td>
    </tr>
    <tr>
      <td>0x5C</td>
      <td>044B</td>
      <td>1099</td>
      <td>Нижний уровень датчик 2</td>
    </tr>
    <tr>
      <td>0x5E</td>
      <td>02EE</td>
      <td>0750</td>
      <td>Калибровочное значение</td>
    </tr>
  </tbody>
</table>

<p>(Датчик 1 - вероятно это передний, 2 - задний. Отдельно я это не проверял. )</p>

<p>Значение по адресу 0x5E-0x5F = 0x02EE. Положительное. Это данные из успешно откалиброванной подвески.</p>

<p>Теперь данные из дампа с которым пришел блок. <strong>Дамп не рабочий.</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000040                                              A4 04                 ¤ 
00000050   92 04 00 00 00 00 F4 03  48 04 F4 03 48 04 3A FC   ’     ô H ô H :ü
</code></pre></div></div>
<p>Запишу в столбец и переверну байты.</p>

<table>
  <thead>
    <tr>
      <th>Addr</th>
      <th>hex</th>
      <th>dec</th>
      <th>Описание</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0x4E</td>
      <td>04A4</td>
      <td>1188</td>
      <td>Ходовой уровень датчик 1</td>
    </tr>
    <tr>
      <td>0x50</td>
      <td>0492</td>
      <td>1170</td>
      <td>Ходовой уровень датчик 2</td>
    </tr>
    <tr>
      <td>0x52</td>
      <td>0000</td>
      <td>0000</td>
      <td>Не используется</td>
    </tr>
    <tr>
      <td>0x54</td>
      <td>0000</td>
      <td>0000</td>
      <td>Не используется</td>
    </tr>
    <tr>
      <td>0x56</td>
      <td>03F4</td>
      <td>1012</td>
      <td>Верхний уровень датчик 1</td>
    </tr>
    <tr>
      <td>0x58</td>
      <td>0448</td>
      <td>1096</td>
      <td>Верхний уровень датчик 2</td>
    </tr>
    <tr>
      <td>0x5A</td>
      <td>03F4</td>
      <td>1012</td>
      <td>Нижний уровень датчик 1</td>
    </tr>
    <tr>
      <td>0x5C</td>
      <td>0448</td>
      <td>1096</td>
      <td>Нижний уровень датчик 2</td>
    </tr>
    <tr>
      <td>0x5E</td>
      <td>FC3A</td>
      <td>-966</td>
      <td>Калибровочное значение</td>
    </tr>
  </tbody>
</table>

<p>Значение по адресам 0x5E, 0x5F = 0xFC3A. Старший бит равен 1, число отрицательное. Записано в дополнительном коде. По модулю это будет 0x3C6 или 966 в десятичной системе. То есть, как-то совпадает с рабочим значением, только вот знак минус.</p>

<p>Видно, что для верхнего и нижнего уровней установлено одно и то же значение, и оно меньше, чем ходовой уровень. Отсюда я предположил, что это стало причиной возникновения проблемы.</p>

<h2 id="рекомендации-по-ремонту">Рекомендации по ремонту</h2>
<ol>
  <li>Считать EEPROM;</li>
  <li>Сохранить копию оригинала;</li>
  <li>Посмотреть что по адресу 0x5F. Если значение 0xF в старшей тетраде, или старший бит установлен, то “отремонтировать” EEPROM с помощью значений из рабочего дампа. Переписать только калибровочный коэффициент или все 18 байт;</li>
  <li>Провести повторную калибровку;</li>
  <li>В случае неудачи, понаблюдать за значениями уровней датчиков:
    <ul>
      <li>Они должны иметь такой же диапазон занчений как в рабочем дампе 900…1500 (dec);</li>
      <li>Должно сохраняться неравенство между ходовым уровнем, верхним, нижним;</li>
    </ul>
  </li>
  <li>Если значения уровней не в указанном диапазоне (900…1500) или не различаются (различаются на малую величину), то проверить работоспособность датчиков;</li>
</ol>

<p>При некоторых значениях, которые я хотел проверить и заливал их в EEPROM, подвеска жила своей жизнью. Поднималась, опускалась, задиралась морда. Ничего такого, просто надо быть готовым.</p>

<p>Может быть что после прошивки EEPROM с непонятными, но корректными значениями, на шкале уровней подвески будут значения не соответсвующие дейтсивтельности. Например, на горизонтально поднятой подвеске будет “200” мм перед и “-150” мм зад. После успешной калибровки это пройдет.</p>

<p>Микросхему EEPROM можно найти здесь:
<img src="/images/scania-elc/elc_bot.jpg" alt="_config.yml" /></p>

<p>А это обратная сторона платы. 
<img src="/images/scania-elc/elc_top.jpg" alt="_config.yml" /></p>

<p>Автоматчиески установился ходовой уровень. Все в порядке. 
<img src="/images/scania-elc/elc_done.jpg" alt="_config.yml" /></p>

<p>Если у вас остались вопросы или вы хотите предложить отремонтировать подобное оборудование - <a href="/about/">пишите</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Из-за некорректно проведенной процедуры калибровки повторная калибровка стала невозможна с помощью имеющихся средств, а именно диагностического оборудования SDP3.]]></summary></entry><entry><title type="html">Ремонт Mitsubishi MDS-R-V2-4040. MDS-R series Offline Monitor</title><link href="http://re-engr.ru/mitsubishi-mds-r-v2-4040/" rel="alternate" type="text/html" title="Ремонт Mitsubishi MDS-R-V2-4040. MDS-R series Offline Monitor" /><published>2024-06-14T00:00:00+00:00</published><updated>2024-06-14T00:00:00+00:00</updated><id>http://re-engr.ru/mitsubishi-mds-r-v2-4040</id><content type="html" xml:base="http://re-engr.ru/mitsubishi-mds-r-v2-4040/"><![CDATA[<p><img src="/images/mitsubishi-mds-r-v2-4040/mitsubishi-mds-r-v2-4040.png" alt="_config.yml" />
Сервопривод остановился с ошибками 12-53.</p>

<ul>
  <li><strong>Alarm No. 12: Memory error 1: A CPU error or an internal memory error was detected during the power ON self-check.</strong></li>
  <li><strong>Alarm No. 53: Excessive error 2: A difference between the actual and theoretical motor positions during servo OFF exceeded the setting
value.</strong></li>
</ul>

<p>В данном случае ошибка 53 была следствием ошибки 12. Для поиска и устранения неисправности пришлось прибегнуть к исследованию прошивки. Аппарат построен на TMS320C6712D. Прошивка храниться во внешней ПЗУ S29AL004D70TFI02, для хранения настроек используется EEPROM AT25020.</p>

<p>Неисправность была устранена. Попутно, в ходе реверс-инжиниринга исполняемого кода, был обнаружен <a href="/debug-monitor/">Offline Monitor</a> доступный через последовательный порт RS422 выведенный на разъем CN4. 
<img src="/images/mitsubishi-mds-r-v2-4040/cn4_rs422_mds_r_monitor.png" alt="_config.yml" /></p>

<p>Статья состоит из трех разделов:</p>
<ul>
  <li><a href="#part_monitor">Возможности программы Offline Monitor</a>;</li>
  <li><a href="#part_fix">Устранение неисправности</a>;</li>
  <li><a href="#part_th">Некоторые детали которые могут пригодиться тем кто будет исследовать контроллеры из серии Mitsubishi MDS-R</a>;</li>
</ul>

<h2 id="part_monitor">Monitor</h2>

<p>Монитор позволяет читать/писать все доступные области памяти (flash/ram/eeprom/bus_io), получать диагностические сообщения, запускать внутренние тесты. Поддерживает 38 команд. Распиновка разъема для подключения приведена <a href="/images/mitsubishi-mds-r-v2-4040/cn4_rs422_mds_r_monitor.png">здесь</a>. Для входа в режим монитора достаточно передать любой символ. При успешном переходе в этот режим, на 7seg индикаторе отобразиться надпись “On”.</p>

<p>Для некоторых команд привожу описание, примеры использования и вывод.</p>

<table>
  <thead>
    <tr>
      <th>Команда</th>
      <th>Описание</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><a href="#mm">mm</a></td>
      <td>Пример вывода</td>
    </tr>
    <tr>
      <td>mm.w</td>
      <td> </td>
    </tr>
    <tr>
      <td>mm.h</td>
      <td> </td>
    </tr>
    <tr>
      <td>mm.b</td>
      <td> </td>
    </tr>
    <tr>
      <td><a href="#md">md</a></td>
      <td>Дамп памяти. &gt;md 80010000 1000</td>
    </tr>
    <tr>
      <td>md.w</td>
      <td> </td>
    </tr>
    <tr>
      <td>md.h</td>
      <td> </td>
    </tr>
    <tr>
      <td>md.b</td>
      <td> </td>
    </tr>
    <tr>
      <td><a href="#mf">mf</a></td>
      <td>Зафилить память</td>
    </tr>
    <tr>
      <td>mf.w</td>
      <td> </td>
    </tr>
    <tr>
      <td>mf.h</td>
      <td> </td>
    </tr>
    <tr>
      <td>mf.b</td>
      <td> </td>
    </tr>
    <tr>
      <td>mv</td>
      <td> </td>
    </tr>
    <tr>
      <td><a href="#sum">sum</a></td>
      <td>Пример вывода</td>
    </tr>
    <tr>
      <td><a href="#rst">rst</a></td>
      <td>Перезапустить устройство</td>
    </tr>
    <tr>
      <td>?#</td>
      <td> </td>
    </tr>
    <tr>
      <td>?</td>
      <td> </td>
    </tr>
    <tr>
      <td>.</td>
      <td> </td>
    </tr>
    <tr>
      <td>fe</td>
      <td> </td>
    </tr>
    <tr>
      <td><a href="#fw">fw</a></td>
      <td>Записать данные (вероятно во flash)</td>
    </tr>
    <tr>
      <td><a href="#fdv">fdv</a></td>
      <td>ID производителя и оборудования</td>
    </tr>
    <tr>
      <td><a href="#ed">ed</a></td>
      <td>Коды ошибок сохраненные в EEP</td>
    </tr>
    <tr>
      <td><a href="#er">er</a></td>
      <td>Дамп eeprom</td>
    </tr>
    <tr>
      <td><a href="#ew">ew</a></td>
      <td>Записать в eeprom</td>
    </tr>
    <tr>
      <td><a href="#ef">ef</a></td>
      <td>Зафилить eeprom</td>
    </tr>
    <tr>
      <td>ei</td>
      <td> </td>
    </tr>
    <tr>
      <td><a href="#ec">ec</a></td>
      <td>Стереть еепром (не всю, только некоторые параметры)</td>
    </tr>
    <tr>
      <td>em</td>
      <td> </td>
    </tr>
    <tr>
      <td><a href="#dl">dl</a></td>
      <td>Пароль “Flash Memory Programing” Загрузить по X-MODEM новую прошивку</td>
    </tr>
    <tr>
      <td>go</td>
      <td> </td>
    </tr>
    <tr>
      <td>led</td>
      <td>Проверить 7seg индикатор</td>
    </tr>
    <tr>
      <td><a href="#base">base</a></td>
      <td>Пример вывода</td>
    </tr>
    <tr>
      <td><a href="#card">card</a></td>
      <td>Пример вывода</td>
    </tr>
    <tr>
      <td><a href="#di">di</a></td>
      <td>Digital input</td>
    </tr>
    <tr>
      <td><a href="#ad">ad</a></td>
      <td>Analog input</td>
    </tr>
    <tr>
      <td><a href="#ver">ver</a></td>
      <td>Версия ПО</td>
    </tr>
    <tr>
      <td><a href="#err">err</a></td>
      <td>Показать наличие ошибок</td>
    </tr>
    <tr>
      <td>ram</td>
      <td> </td>
    </tr>
  </tbody>
</table>

<h3 id="mm">mm</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;mm
00000000 : 802A  ? 
00000002 : 0100  ? 
00000004 : 006A  ? 
00000006 : 0148  ? 
00000008 : 0362  ? M
</code></pre></div></div>

<h3 id="md">md</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;md 865c
0000865C : 520A 4D41 4F20 0A4B - 4F52 204D 4B4F 450A           .RAM OK.ROM OK.E
0000866C : 434E 4F20 0A4B 4545 - 5250 4D4F 4F20 004B           NC OK.EEPROM OK.
0000867C : 540A 4D49 494D 474E - 5320 4154 5554 2053           .TIMMING STATUS 
0000868C : 4B4F 0000 430A 5241 - 2044 5453 5441 5355           OK...CARD STATUS

&gt;md 01940000 100
01940000 : 0384 0000 FFFF FFFF - B19F 7EC7 FFFF FFFF           ...........~....
01940010 : 0384 0000 FFFF FFFF - D631 7ECF FFFF FFFF           ...........~....
01940020 : 0384 0000 FFFF FFFF - 1700 7ED7 FFFF FFFF           ...........~....
01940030 : 0384 0000 FFFF FFFF - 6A11 7EE0 FFFF FFFF           .........j.~....
01940040 : 0384 0000 FFFF FFFF - B6B8 7EE8 FFFF FFFF           ...........~....
01940050 : 0384 0000 FFFF FFFF - 96E8 7EF0 FFFF FFFF           ...........~....
01940060 : 0384 0000 FFFF FFFF - B370 7EF8 FFFF FFFF           ........]..~....
01940070 : 0384 0000 FFFF FFFF - CE65 7F01 FFFF FFFF           ................
01940080 : 0384 0000 FFFF FFFF - EBC2 7F09 FFFF FFFF           ................
01940090 : 0384 0000 FFFF FFFF - 158D 7F11 FFFF FFFF           ........z.......
019400A0 : 0384 0000 FFFF FFFF - 7D3F 7F1A FFFF FFFF           ........,}......
019400B0 : 0384 0000 FFFF FFFF - C476 7F22 FFFF FFFF           ........d.".....
019400C0 : 0384 0000 FFFF FFFF - B4BE 7F2A FFFF FFFF           ..........*.....
019400D0 : 0384 0000 FFFF FFFF - D173 7F32 FFFF FFFF           ........a.2.....
019400E0 : 0384 0000 FFFF FFFF - ED84 7F3B FFFF FFFF           ........q.;.....
019400F0 : 0384 0000 FFFF FFFF - 099D 7F43 FFFF FFFF           ..........C.....
</code></pre></div></div>

<h3 id="mf">mf</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;mf a001ffa0 100 00
&gt;md.b a001ffa0
A001FFA0 : 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
A001FFB0 : 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
A001FFC0 : 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
A001FFD0 : 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
</code></pre></div></div>

<h3 id="sum">sum</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;sum
Sum : 00000000 - FFFFFFFF = 0000
</code></pre></div></div>

<h3 id="rst">rst</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;rst

************************************************************************
MITSUBISHI DRIVE SYSTEM
 MDS-R series Offline Monitor
 BND- 563W000-A1  (1.10)  (Apr  6 2006, 18:41:24)
 COPYRIGHT (C) 2003 MITSUBISHI ELECTRIC CORPORATION ALL RIGHTS RESERVED         
************************************************************************
Card Infomation
 NAME   : RL115-12/22(V2)
 MAC521 : OFF
 FLASH  : 0x90000000-????????[????byte) [??????????:Un known]
Digital Input
  EI1:L(400V)  EI2:L(CR Int)  EI3:L(Rsv)  EI4:L(ElcEMG)
  SW :L(0) M(1)
Analog Input
 CH Sym   min   max    pp    av
  1.IUL: 1458  1470    12  1464
  2.IVL: 1458  1468    10  1462
  3.IUM: 1457  1465     8  1460
  4.IVM: 1460  1468     8  1463
  5.STL:    0     0     0     0 [45s]
  6.STM:    0     0     0     0 [45s]
  7.THR:    0     0     0     0
  8.DIP:    0     5     5     0 [00]
System S/W: BND- 585W000-A4  (1.40)
************************************************************************
</code></pre></div></div>

<h3 id="fw">fw</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;fw 90000000 1 2a
Program error
</code></pre></div></div>

<h3 id="fdv">fdv</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;fdv
 Manufacture ID : 01
 Device code    : 22BA
</code></pre></div></div>

<h3 id="ed">ed</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;ed
 Drive No. : 6829300 
 Ron Time  : 00016983
 MC count  : 00002387
 Maintenance
  #0 :   
  #1 :   
  #2 :   
  #3 :   
 Status    :  
 Alarm
  #0 :  50-00015232  50-00011735  00-00000000
  #1 :  50-00015232  50-00010130  00-00000000
  #2 :  50-00015232  50-00009893  00-00000000
  #3 :  50-00015232  51-00009891  00-00000000
  #4 :  50-00015232  52-00007771  00-00000000
  #5 :  50-00015232  50-00006422  00-00000000
  #6 :  52-00014310  50-00006105  00-00000000
  #7 :  52-00014310  50-00003693  00-00000000

</code></pre></div></div>

<h3 id="er">er</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;er
00 : 36 38 32 39 33 30 30 20 20 20 20 20 20 20 20 20 
10 : 58 42 00 C1 57 42 00 C1 53 09 00 00 00 00 20 00 
20 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
30 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
40 : 80 3B 00 50 80 3B 00 50 80 3B 00 50 80 3B 00 50 
50 : 80 3B 00 50 80 3B 00 50 E6 37 00 52 E6 37 00 52 
60 : 00 31 1F 03 13 2E 00 00 00 00 00 00 00 00 00 00 
70 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
80 : D7 2D 00 50 92 27 00 50 A5 26 00 50 A3 26 00 51 
90 : 5B 1E 00 52 16 19 00 50 D9 17 00 50 6D 0E 00 50 
A0 : 00 31 0E 00 07 2E 00 00 00 00 00 00 00 00 00 00 
B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
</code></pre></div></div>
<h3 id="ew">ew</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;ew 0 2
&gt;er
00 : 02 38 32 39 33 30 30 20 20 20 20 20 20 20 20 20 
10 : 58 42 00 C1 57 42 00 C1 53 09 00 00 00 00 20 00 
20 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
30 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
40 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
50 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
60 : 00 31 1F 03 13 2E 00 00 00 00 00 00 00 00 00 00 
70 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
80 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
90 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
A0 : 00 31 0E 00 07 2E 00 00 00 00 00 00 00 00 00 00 
B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
</code></pre></div></div>
<h3 id="ef">ef</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;ef 0 ff ff
&gt;er
00 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
10 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
20 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
30 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
40 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
50 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
60 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
70 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
80 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
90 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
A0 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
B0 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
C0 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
D0 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
E0 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
F0 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 
</code></pre></div></div>

<h3 id="ec">ec</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;ec 
y/n ? y
&gt;
&gt;ed
 Drive No. : 
 Ron Time  : 00000000
 MC count  : 1229539657
 Maintenance
  #0 : II
  #1 : II
  #2 : II
  #3 : II
 Status    : I
 Alarm
  #0 :  00-00000000  00-00000000  00-00000000
  #1 :  00-00000000  00-00000000  00-00000000
  #2 :  00-00000000  00-00000000  00-00000000
  #3 :  00-00000000  00-00000000  00-00000000
  #4 :  00-00000000  00-00000000  00-00000000
  #5 :  00-00000000  00-00000000  00-00000000
  #6 :  00-00000000  00-00000000  00-00000000
  #7 :  00-00000000  00-00000000  00-00000000
</code></pre></div></div>

<h3 id="dl">dl</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;dl
password : 
* XMODEM/128(SUM) Recieving ... 
Flash Sum = 0000
</code></pre></div></div>

<h3 id="base">base</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;base
 Base name : 45s : 45s
</code></pre></div></div>

<h3 id="card">card</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;card
Card Infomation
 NAME   : RL115-12/22(V2)
 MAC521 : OFF
 FLASH  : 0x90000000-????????[????byte) [??????????:Un known]
</code></pre></div></div>
<h3 id="di">di</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;di
Digital Input
  EI1:L(400V)  EI2:L(CR Int)  EI3:L(Rsv)  EI4:L(ElcEMG)
  SW :L(0) M(1)
</code></pre></div></div>

<h3 id="ad">ad</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;ad
Analog Input
 CH Sym   min   max    pp    av
  1.IUL: 1460  1469     9  1464
  2.IVL: 1458  1468    10  1462
  3.IUM: 1455  1466    11  1460
  4.IVM: 1458  1468    10  1463
  5.STL:    0     0     0     0 [45s]
  6.STM:    0     0     0     0 [45s]
  7.THR:    0     0     0     0
  8.DIP:    0     6     6     0 [00]
</code></pre></div></div>

<h3 id="ver">ver</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;ver
Boot   S/W: BND- 563W000-A1  (1.10)
System S/W: BND- 585W000-A4  (1.40)
</code></pre></div></div>

<h3 id="err">err</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;err
12-53 : EEPROM ERR
00 : 36 38 32 39 33 30 30 20 20 20 20 20 20 20 20 20 
10 : 58 42 00 C1 57 42 00 C1 53 09 00 00 00 00 20 00 
20 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
30 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
40 : 80 3B 00 50 80 3B 00 50 80 3B 00 50 80 3B 00 50 
50 : 80 3B 00 50 80 3B 00 50 E6 37 00 52 E6 37 00 52 
60 : 00 31 1F 03 13 2E 00 00 00 00 00 00 00 00 00 00 
70 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
80 : D7 2D 00 50 92 27 00 50 A5 26 00 50 A3 26 00 51 
90 : 5B 1E 00 52 16 19 00 50 D9 17 00 50 6D 0E 00 50 
A0 : 00 31 0E 00 07 2E 00 00 00 00 00 00 00 00 00 00 
B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

&gt;err
RAM OK
ROM OK
ENC OK
EEPROM OK
TIMMING STATUS OK : 3.5msec COUNT ERR : 37
CARD STATUS    OK : ID:02 (exi2:0 trac:0 tin0:0 tin1:0)
</code></pre></div></div>

<h2 id="part_fix">Неисправность</h2>
<p>Проблема заключалась в том, что контрольная сумма (далее КС) одного из параметров в eeprom была некорректной. Для данных по адресам 0x10…0x13 и 0x14…0x17 рассчитывается КС (сумма по модулю 256) и она должна быть равна 0x5A.</p>

<p>Командой <a href="#er">er</a> получаем дамп eeprom. Берем 8 байт с адреса 0x10. В моем случае это: <code class="language-plaintext highlighter-rouge">0x58 0x42 0x00 0xC1 0x57 0x42 0x00 0xC1</code>.
Для первых 4 байт КС равна: <code class="language-plaintext highlighter-rouge">(0x58 + 0x42 + 0x00 + 0xC1) % 0xFF = 0x5B</code>.
Для следующих четырех байт: <code class="language-plaintext highlighter-rouge">(0x57 0x42 0x00 0xC1) % 0xFF = 0x5A</code>.
КС 0x5B вызывает ошибку. Я исправил первое значение так, что бы оно соответствовало второму: заменил 0x58 на 0x57. Не помню почему именно так сделал.</p>

<p>Выполнить модификацию значения можно с помощью команды <a href="#ew">ew</a>
<code class="language-plaintext highlighter-rouge">ew 10 57</code>. Проверяем командой <a href="#er">er</a> <code class="language-plaintext highlighter-rouge">10 : 0x57 0x42 0x00 0xC1 0x57 0x42 0x00 0xC1 ...</code>
После перезагрузки контроллера, на 7seg было рабочее значение “Ab” без каких либо ошибок. 
<img src="/images/mitsubishi-mds-r-v2-4040/mitsubishi_ab.png" alt="_config.yml" /><br />
В логах команды <a href="#err">err</a> можете увидеть два вывода. Первый при некорректной КС, второй после исправления.</p>

<h2 id="part_th">Заключение</h2>

<p>Здесь можно скачать дамп <a href="/images/mitsubishi-mds-r-v2-4040/S29AL004D70TFI02.BIN">flash</a> и <a href="/images/mitsubishi-mds-r-v2-4040/25020_eep_repair.BIN">eeprom</a>.</p>

<p>В архиве собрана различная документация и логи накопившееся за время выполнения ремонта. <a href="/images/mitsubishi-mds-r-v2-4040/mitsubishi-MDS-R-V2-4040.zip">Ссылка на архив</a>.<br />
Там есть какие-то дампы участков памяти. Может пригодиться тем кто будет исследовать такой же или подобный сервопривод.</p>

<p>Здесь хранятся фото устройства. <a href="https://photos.app.goo.gl/pBo2FWdqYoFqTL7w7">Ссылка</a></p>

<p>Если у вас остались вопросы или вы хотите предложить покопаться в подобном оборудовании - пишите в <a href="https://t.me/reengrru">Telegram-чат</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Сервопривод остановился с ошибками 12-53.]]></summary></entry><entry><title type="html">Ремонт пресса RIDGID RP300-B. Выход из состояния Service.</title><link href="http://re-engr.ru/ridgid-rp300-b/" rel="alternate" type="text/html" title="Ремонт пресса RIDGID RP300-B. Выход из состояния Service." /><published>2023-07-18T00:00:00+00:00</published><updated>2023-07-18T00:00:00+00:00</updated><id>http://re-engr.ru/ridgid-rp300-b</id><content type="html" xml:base="http://re-engr.ru/ridgid-rp300-b/"><![CDATA[<p><img src="/images/ridgid-rp300-b/logo.jpg" alt="_config.yml" /> <br />
Сброс счётчика обжатий.</p>

<p>При включении загораются зелёный и жёлтый светодиоды, раздаётся звуковой сигнал. В инструкции есть расшифровка этой ошибки:
<img src="/images/ridgid-rp300-b/err_code.png" alt="_config.yml" /><br />
Указано, что <strong><em>только для RP100-B</em></strong>, но, как оказалось, актуально и для RP300-B. Колличество обжатий достигло 22000. Требуется обслуживание.</p>

<h2 id="eeprom">EEPROM</h2>
<p>На плате установлена EEPROM Microchip 93LC46C. Корпус SOIC-8. Вывод ORG низкий (x8). Микросхема на фото в центре.<br />
<img src="/images/ridgid-rp300-b/pcb_top.png" alt="_config.yml" /></p>

<p>Дамп памяти с состоянием Service:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   A3 56 F1 55 00 F1 55 AA  00 00 00 04 FF FF FF FF   £VñU ñUª    ÿÿÿÿ
00000010   E6 01 E9 01 E9 01 E6 01  E7 01 E5 01 E6 01 E7 01   æ é é æ ç å æ ç 
00000020   E5 01 E7 01 E6 01 E6 01  E6 01 E6 01 E7 01 E5 01   å ç æ æ æ æ ç å 
00000030   27 DA 14 33 06 96 20 4E  F0 55 0A 73 1F 0F 0A 00   'Ú 3 – NðU s    
00000040   00 30 31 35 30 30 39 30  36 31 39 30 39 32 30 30    015009061909200
00000050   36 68 65 FF FF FF FF FF  FF FF FF FF FF FF FF FF   6heÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000060   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000070   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
</code></pre></div></div>

<p>Число 22000 в hex имеет вид 0x55F0. Видно, что по адресам 0x2 и 0x5 лежат значения 0x55F1 (16-bit little-endian). В десятичке это 22001. По адресу 0x38 находится вообще ровно то, что нужно - 0x55F0.<br />
После некоторых экспериментов с содержимым памяти удалось восстановить структуру данных, при которой пресс начал функционировать. 
Ниже представлен дамп, в котором значение счётчика равняется 1:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   A3 56 01 00 00 01 00 22  00 00 00 02 FF FF FF FF   £V     "    ÿÿÿÿ
00000010   E6 01 E6 00 E9 01 E6 01  E7 01 E5 01 E6 01 E7 01   æ æ é æ ç å æ ç 
00000020   E5 01 E7 01 E6 01 E6 01  E6 01 E6 01 E7 01 E5 01   å ç æ æ æ æ ç å 
00000030   27 DA 14 33 06 96 20 4E  F0 55 0A 73 1F 0F 0A 00   'Ú 3 – NðU s    
00000040   00 30 31 35 30 30 39 30  36 31 39 30 39 32 30 30    015009061909200
00000050   36 68 65 FF FF FF FF FF  FF FF FF FF FF FF FF FF   6heÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000060   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000070   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>адрес</th>
      <th>значение</th>
      <th>описание</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0x02</td>
      <td>0x0001 (16-bit little-endian)</td>
      <td>Значение счётчика</td>
    </tr>
    <tr>
      <td>0x05</td>
      <td>0x0001 (16-bit little-endian)</td>
      <td>Значение счётчика (копия)</td>
    </tr>
    <tr>
      <td>0x07</td>
      <td>0x22</td>
      <td>Не должно быть 0xAA</td>
    </tr>
    <tr>
      <td>0x0B</td>
      <td>0x02</td>
      <td>Удвоенное значение младшего байта счётчика</td>
    </tr>
    <tr>
      <td>0x10..2F</td>
      <td>Check sum (16-bit)</td>
      <td>Кольцевой буфер</td>
    </tr>
    <tr>
      <td>0x38</td>
      <td>0x55F0 (16-bit little-endian)</td>
      <td>Значение счётчика при котором включится режим Service</td>
    </tr>
    <tr>
      <td>0x41..48</td>
      <td>01500906</td>
      <td>Serial No.</td>
    </tr>
  </tbody>
</table>

<p><a href="/images/ridgid-rp300-b/rp300b_93lc46_counter1.BIN">Рабочий дамп. Значение счётчика 1.</a></p>

<p>Значение для включения режима Service проверил в действии. Установил этот параметр равный трём. Результат на видео.<br />
<a href="https://www.youtube.com/watch?v=SlTkXktp_uk" title="Service"><img src="https://img.youtube.com/vi/SlTkXktp_uk/0.jpg" alt="3-2-1" /></a></p>

<h2 id="рекомендации">Рекомендации</h2>
<ol>
  <li>Помимо сброса счетчика, проведите тех. обслуживание оборудования.</li>
  <li>Не изменяйте уставку включения режима Service (22000). Лучше сбросить счётчик. Не известно как поведёт себя программа и какие у неё там могут быть переполнения.</li>
</ol>

<h2 id="материалы">Материалы</h2>
<ol>
  <li><a href="/images/ridgid-rp300-b/ridgid_rp.pdf">Паспорт на пресс</a>;</li>
  <li><a href="/images/ridgid-rp300-b/rp300b_93lc46_counter1.BIN">Дамп EEPROM со значением счетчика 1</a>;</li>
  <li><a href="/images/ridgid-rp300-b/rp300b_93lc46_original.BIN">Дамп EEPROM с режимом Service</a>;</li>
  <li><a href="/images/ridgid-rp300-b/pcb_bot.jpg">Фото обратной стороны платы</a>;</li>
  <li><a href="/images/ridgid-rp300-b/thermo.jpg">Подключение температурного сенсора</a>;</li>
</ol>]]></content><author><name></name></author><summary type="html"><![CDATA[Сброс счётчика обжатий.]]></summary></entry><entry><title type="html">Пульт оператора KEB 00F5060-L100</title><link href="http://re-engr.ru/keb-00F5060-L100/" rel="alternate" type="text/html" title="Пульт оператора KEB 00F5060-L100" /><published>2023-01-06T00:00:00+00:00</published><updated>2023-01-06T00:00:00+00:00</updated><id>http://re-engr.ru/keb-00F5060-L100</id><content type="html" xml:base="http://re-engr.ru/keb-00F5060-L100/"><![CDATA[<p><img src="/images/eep-keb-00F5060-L100/logo-f5.jpg" alt="_config.yml" /> <br />
Восстановление eeprom. Схема кабеля. Подключение к Combivis.</p>

<blockquote>
  <p>Перед подключением компьютера к частотному преобразователю убедитесь в отсутствии гальванической связи между землей (сигнал GND) и входным напряжением (сеть 230/400В). Используйте развязывающий трансформатор или ноутбук без подключения ЗУ.</p>
</blockquote>

<h2 id="eeprom">EEPROM</h2>
<p>Мигающий красный светодиод LED6 сигнализирует о проблеме. При нормальной работе устройства светодиод LED6 светится постоянно.<br />
<img src="/images/eep-keb-00F5060-L100/led6.png" alt="_config.yml" /> <br />
<em>Рис. 1 Разъемы и светодиоды</em></p>

<p>В таблице приведены режимы работы светодиода
<img src="/images/eep-keb-00F5060-L100/led6_error.png" alt="_config.yml" /></p>

<p>В случае некорректных данных в EEPROM пульта режим мигания следующий:
<code class="language-plaintext highlighter-rouge">Double lightning (200 ms ON/200 ms OFF/200 ms ON/1000 ms OFF)</code></p>

<h3 id="структура-памяти">Структура памяти</h3>

<p><img src="/images/eep-keb-00F5060-L100/f5_eep.png" alt="_config.yml" /><br />
<em>Рис. 2 Местоположение EEPROM на плате</em></p>

<p>Данные хранятся в блоке размером 0x555 байт. Смещение внутри блока последнего полезного байта с данными - 0x1C3. Далее следуют байты 0xFF которые, по всей видимости, не несут никакой полезной информации. Возможно блок имеет размер меньший чем 0x555 байт, но больше или равен 0x1C4. Это не так важно.<br />
В памяти хранятся <strong><em>три идентичных блока</em></strong> с данными. Вероятно это сделано для восстановления информации по мажоритарному принципу. Контрольная сумма отсутствует.</p>

<p>Смещения блоков следующие:<br />
<code class="language-plaintext highlighter-rouge">Block 0: 0x0-0x554</code><br />
<code class="language-plaintext highlighter-rouge">Block 1: 0x555-0xAA9</code><br />
<code class="language-plaintext highlighter-rouge">Block 2: 0xAAA-0xFFE</code></p>

<p>Ниже приведено содержимое одного блока (Block 0):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   2E 18 00 19 00 00 00 01  FF FF FF FF FA 02 D7 52   .       ÿÿÿÿú ×R
00000010   FA 02 D7 53 FA 02 D7 54  FF FF FF FF FF FF 01 F4   ú ×Sú ×Tÿÿÿÿÿÿ ô
00000020   00 FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000030   12 37 F9 A1 00 00 00 19  00 00 05 11 14 01 11 14    7ù¡            
00000040   01 00 00 FF FF FF FF FF  FF FF FF FF FF FF FF FF      ÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000050   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000060   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000070   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000080   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000090   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000000A0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000000B0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000000C0   FF FF 00 00 00 00 00 00  00 00 00 00 00 00 00 01   ÿÿ              
000000D0   03 00 00 29 01 10 00 32  01 10 00 34 01 10 00 00      )   2   4    
000000E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                   
000000F0   00 00 03 00 00 2A 01 10  00 33 01 10 00 35 01 10        *   3   5  
00000100   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                   
00000110   00 00 00 00 00 00 00 00  00 00 00 00 02 03 04 80                  €
00000120   00 00 00 02 00 00 04 82  00 00 02 02 00 00 00 00          ‚        
00000130   00 00 04 00 00 00 00 00  00 00 04 00 00 00 00 00                   
00000140   00 00 04 00 00 00 00 00  00 00 04 00 00 00 00 00                   
00000150   00 00 04 00 00 00 00 00  00 00 04 00 00 00 04 81                   
00000160   00 00 00 02 00 00 04 83  00 00 02 02 00 00 04 84          ƒ       „
00000170   00 00 04 02 00 00 00 00  00 00 06 00 00 00 00 00                   
00000180   00 00 06 00 00 00 00 00  00 00 06 00 00 00 00 00                   
00000190   00 00 06 00 00 00 00 00  00 00 06 00 00 00 30 30                 00
000001A0   66 35 30 36 30 2D 6C 31  30 30 20 20 20 20 20 20   f5060-l100      
000001B0   20 20 20 20 20 20 20 20  20 20 20 20 20 20 00 01                   
000001C0   F6 00 00 01 FF FF FF FF  FF FF FF FF FF FF FF FF   ö   ÿÿÿÿÿÿÿÿÿÿÿÿ
000001D0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000001E0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000001F0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000200   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000210   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000220   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000230   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000240   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000250   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000260   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000270   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000280   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000290   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002A0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002B0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002C0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002D0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002E0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002F0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000300   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000310   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000320   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000330   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000340   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000350   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000360   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000370   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000380   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000390   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003A0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003B0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003C0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003D0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003E0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003F0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000400   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000410   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000420   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000430   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000440   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000450   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000460   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000470   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000480   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000490   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000004A0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000004B0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000004C0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000004D0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000004E0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000004F0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000500   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000510   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000520   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000530   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000540   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000550   FF FF FF FF FF                                     ÿÿÿÿÿ
</code></pre></div></div>
<p>Представленные данные являются корректными и если их записать в EEPROM (в три блока), то пульт не будет сообщать об ошибке кодом <code class="language-plaintext highlighter-rouge">Double lightning (200 ms ON/200 ms OFF/200 ms ON/1000 ms OFF)</code></p>

<p>Для полного восстановления пульта необходимо записать в некоторые поля действительные MAC-адреса и серийный номер пульта.</p>

<p>В качестве примера приведу данные пульта продаваемого на <a href="https://www.ebay.com/itm/114736129437">eBay</a>.<br />
<img src="/images/eep-keb-00F5060-L100/shild_f5.png" alt="_config.yml" /><br />
<em>Рис. 3 Шильдик пульта с eBay</em></p>

<table>
  <thead>
    <tr>
      <th>Смещение</th>
      <th>Размер, байт</th>
      <th>Параметр</th>
      <th>Пример</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0x0C</td>
      <td>4</td>
      <td>MAC 0 (шасси)</td>
      <td>FA 02 D7 52</td>
    </tr>
    <tr>
      <td>0x10</td>
      <td>4</td>
      <td>MAC 1 (Port0)</td>
      <td>FA 02 D7 53</td>
    </tr>
    <tr>
      <td>0x14</td>
      <td>4</td>
      <td>MAC 2 (Port1)</td>
      <td>FA 02 D7 54</td>
    </tr>
    <tr>
      <td>0x30</td>
      <td>4</td>
      <td>Серийный номер</td>
      <td>12 37 F9 A1 (305658273)</td>
    </tr>
  </tbody>
</table>

<p><a href="/images/eep-keb-00F5060-L100/00f5060-l100-305658273.BIN">Скачать дамп eeprom</a></p>

<h2 id="кабель">Кабель</h2>
<p>В <a href="https://www.cnc-club.ru/forum/viewtopic.php?t=14633">этой теме</a> приведена схема кабеля (00.F5.0C0-0010) построенного на преобразователе MAX232 (для COM-порта). Там же есть <a href="http://www.servotechnica.spb.ru/keb/connect.html">ссылка на статью</a> от поставщика продукции KEB с разъяснением по существующим кабелям и протоколам.</p>

<p>Кабель 00.F5.0C0-0010 можно построить на USB/SerialUART преобразователе поддерживающим сигналы RTS/CTS. Например, FT2232. Возможно понадобиться сдвинуть выходные уровни FT2232 до 5В. Я сразу делал с выходными уровнями 5В и не проверял работу с более низкими.<br />
Через данный кабель возможно подключение только по протоколу HSP5. С протоколом HSP5 умеет работать COMBIVIS версий 5.x.</p>

<p>COMBIVIS 6.x подключается через последовательный порт только по протоколу DIN66019.<br />
Для подключения COMBIVIS 6.x через последовательный порт к порту пульта X6B или к порту частотного преобразователя нужен конвертер протоколов 00.58.060-0040 (из DIN66019 в HSP5).</p>

<p>В кабеле на FT2232 есть одна особенность из-за которой не сразу удалось установить связь между COMBIVIS и оборудованием. <br />
Дело было в сигнале RTS. Сигнал переходит в пассивное состояние (лог. 0) до окончания передачи. Это видно на экране логического анализатора:<br />
<img src="/images/eep-keb-00F5060-L100/f5_logic_1k_2k.png" alt="_config.yml" /> 
<em>Рис. 4 Различная длительность сигнала RTS</em></p>

<p>На картинке приведено рабочее значение (2000):<br />
<img src="/images/eep-keb-00F5060-L100/f5_rts2000.png" alt="_config.yml" /><br />
<em>Рис. 5 Окно параметров соединения COMBIVIS 5.x</em></p>

<p>Позже была обнаружена <a href="/images/eep-keb-00F5060-L100/Combivis_5_metodika_raboty.pdf#page=115">рекомендация от производителя</a> на тему сигнала RTS.</p>

<h3 id="распиновка-разъемов">Распиновка разъемов</h3>
<h4 id="x6b-diagnostic-interface">X6B Diagnostic interface</h4>
<p>Контакты 7,8 в разъеме X6B я не использовал, по этому достоверно не знаю их назначение. 
<img src="/images/eep-keb-00F5060-L100/f5_operator_x6b_pinouts.png" alt="_config.yml" /> 
<em>Рис. 6 Распиновка X6B</em></p>

<h4 id="разъемы-db9-между-частотным-преобразователем-и-пультом-оператора">Разъемы DB9 между частотным преобразователем и пультом оператора</h4>
<p>Взято из документа <a href="/images/eep-keb-00F5060-L100/spezifikation_hsp5.pdf#page=3">spezifikation_hsp5.pdf</a><br />
<img src="/images/eep-keb-00F5060-L100/f5_operator_db9_pinouts.png" alt="_config.yml" /> 
<em>Рис. 7 Распиновка DB9 пульта и частоного преобразователя</em></p>

<h3 id="ip-адрес">IP адрес</h3>
<p>К частотному преобразователю KEB, используя пульт KEB 00F5060-L100, так же можно подключиться через Ethernet-порт. <a href="/images/eep-keb-00F5060-L100/Combivis_5_metodika_raboty.pdf#page=5">Инструкция</a>. <br />
В случае когда IP адрес неизвестен, а он нужен для подключения, можно переключателями x16 и x1 включить режим <em>KEB production test</em>. Подробнее на картинке и в <a href="/images/eep-keb-00F5060-L100/61278441.pdf#page=7">документации</a> Вероятно сохраненный IP адрес, если он был установлен, сбросится в состояние по умолчанию: 0.0.0.0 . 
<img src="/images/eep-keb-00F5060-L100/f5_test_mode.png" alt="_config.yml" /> 
<em>Рис. 8 Установка адреса с помощью ротационных переключателей x16, x1</em></p>

<h2 id="материалы">Материалы</h2>
<ol>
  <li><a href="/images/eep-keb-00F5060-L100/info.zip">Архив с различной информацией</a>;</li>
  <li><a href="/images/eep-keb-00F5060-L100/00f5060-l100-305658273.BIN">Дамп EEPROM из статьи</a>;</li>
  <li><a href="https://www.cnc-club.ru/forum/download/file.php?id=102577&amp;sid=3a7ea8c1707d2473e47f412e1f8eb660&amp;mode=view&amp;mt=1">Схема кабеля 00.F5.0C0-0010, cnc-club</a>;</li>
</ol>]]></content><author><name></name></author><summary type="html"><![CDATA[Восстановление eeprom. Схема кабеля. Подключение к Combivis.]]></summary></entry><entry><title type="html">Ремонт JBL 86280-60650</title><link href="http://re-engr.ru/repair_i2c_8628060650/" rel="alternate" type="text/html" title="Ремонт JBL 86280-60650" /><published>2022-10-29T00:00:00+00:00</published><updated>2022-10-29T00:00:00+00:00</updated><id>http://re-engr.ru/repair_i2c_8628060650</id><content type="html" xml:base="http://re-engr.ru/repair_i2c_8628060650/"><![CDATA[<p><img src="/images/repair_i2c_8628060650/8628060650_logo.png" alt="_config.yml" />
Анализ шины I2C и определение неисправности.</p>

<h2 id="диагностика">Диагностика</h2>
<p>Потребление неисправного усилителя, при подаче сигнала ACC, поднималось c 0 мА до 800 мА на 1 сек., потом снижалось до 110 мА. Звука нет.<br />
На плате установлены три микросхемы УНЧ TDF8546TH/N2 подключенных к шине I2C. Выводы для подключения к шине показаны на картинке:
<img src="/images/repair_i2c_8628060650/8628060650_i2c_pinouts.png" alt="_config.yml" /><br />
Анализа данных передаваемых по шине I2C позволил выявить неисправность одной из микросхем УНЧ, что в конечном счете являлось основной неисправностью устройства.</p>

<h2 id="анализ-шины">Анализ шины</h2>
<p>Захват трафика производился с помощью логического анализатора LOGIC-U от компании 6-lab. Адреса микросхем на шине распределены следующим образом:
<img src="/images/repair_i2c_8628060650/8628060650_i2c_address.png" alt="_config.yml" /></p>

<p>В УНЧ имеется 10 регистров:</p>
<ul>
  <li>5 регистров для чтения DB1, DB2, DB3, DB4, DB5;</li>
  <li>5 регистров для записи IB1, IB2, IB3, IB4, IB5;</li>
</ul>

<p>Адресации регистров нет. Команда чтения читает 5 регистров для чтения, команда записи пишет в 5 регистров для записи. 
<a href="/images/repair_i2c_8628060650/TDF8546TH_N1.pdf#page=29">Описание регистров TDF8546TH</a></p>

<p>На шине будут присутствовать различные команды чтения/записи регистров, но для определения неисправности нужны регистры чтения в определенный момент времени. 
Необходимо найти посылки в которых процессор включает режим диагностики УНЧ. Это делается установкой бита D1 в регистре IB1.</p>

<p><strong>Instruction byte IB1</strong></p>

<table>
  <thead>
    <tr>
      <th>Bit</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>D1</td>
      <td>enable or disable start-up diagnostics</td>
    </tr>
    <tr>
      <td> </td>
      <td>0 = start-up diagnostics disabled</td>
    </tr>
    <tr>
      <td> </td>
      <td>1 = start-up diagnostics enabled</td>
    </tr>
  </tbody>
</table>

<p><img src="/images/repair_i2c_8628060650/8628060650_i2c_start_diag.png" alt="_config.yml" /></p>

<p>Запись значения 0x02 в регистр IB1 производится для трех микросхем УНЧ.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0.578961750000000,34,0xD4,0x02,Write,ACK
0.579022000000000,34,0xD4,0xE6,Write,ACK
0.579081125000000,34,0xD4,0x10,Write,ACK
0.579142000000000,34,0xD4,0x00,Write,ACK
0.579202875000000,34,0xD4,0xC0,Write,ACK
0.579344125000000,35,0xDC,0x02,Write,ACK
0.579404375000000,35,0xDC,0xE6,Write,ACK
0.579463500000000,35,0xDC,0x10,Write,ACK
0.579524375000000,35,0xDC,0x00,Write,ACK
0.579585250000000,35,0xDC,0xC0,Write,ACK
0.579725875000000,36,0xDE,0x02,Write,ACK
0.579786125000000,36,0xDE,0xE6,Write,ACK
0.579881500000000,36,0xDE,0x10,Write,ACK
0.579942375000000,36,0xDE,0x00,Write,ACK
0.580003250000000,36,0xDE,0xC0,Write,ACK
</code></pre></div></div>
<p>Через ~550 мс считывается результат диагностики.
<img src="/images/repair_i2c_8628060650/8628060650_i2c_result_diag.png" alt="_config.yml" /></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1.134253750000000,49,0xD5,0x20,Read,ACK
1.134307875000000,49,0xD5,0xA0,Read,ACK
1.134362125000000,49,0xD5,0x20,Read,ACK
1.134416375000000,49,0xD5,0x20,Read,ACK
1.134470375000000,49,0xD5,0x00,Read,NAK
1.134602625000000,50,0xDD,0x20,Read,ACK
1.134656750000000,50,0xDD,0xA0,Read,ACK
1.134711125000000,50,0xDD,0x20,Read,ACK
1.134765250000000,50,0xDD,0x20,Read,ACK
1.134819375000000,50,0xDD,0x00,Read,NAK
1.134951000000000,51,0xDF,0x22,Read,ACK &lt;-- проблема
1.135005250000000,51,0xDF,0xA0,Read,ACK
1.135059500000000,51,0xDF,0x20,Read,ACK
1.135113750000000,51,0xDF,0x20,Read,ACK
1.135204125000000,51,0xDF,0x00,Read,NAK
</code></pre></div></div>

<p>Если сопоставить полученные значения с <a href="/images/repair_i2c_8628060650/TDF8546TH_N1.pdf#page=33">регистрами</a>,
то получается что в УНЧ с адресами 0xD4 (0xD5) и 0xDE (0xDD) проблемы отсутствуют. Установлены биты открытых линий (не подключены динамики). <br />
Для УНЧ с адресом 0xDE (0xDF) содержимым регистра DB1 является значение 0x22. Установлены биты D5 и D1.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1.134951000000000,51,0xDF,0x22,Read,ACK
</code></pre></div></div>
<p><strong>Data byte DB1</strong></p>

<table>
  <thead>
    <tr>
      <th>Bit</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>D5 and D4</td>
      <td>10 = open load</td>
    </tr>
    <tr>
      <td>D1</td>
      <td>channel 2 short to VP</td>
    </tr>
    <tr>
      <td> </td>
      <td>0 = no short to VP</td>
    </tr>
    <tr>
      <td> </td>
      <td>1 = short to VP</td>
    </tr>
  </tbody>
</table>

<p>D5 and D4 - это открытая линия, а D1 - это короткое замыкание на + питания. <br />
При такой неисправности перепроверить результаты диагностики можно омметром. Сопротивление между одной из линий канала 2 и плюсом питания действительно составляло несколько ом, в отличии от десятков кОм на других линиях.</p>

<h2 id="ремонт">Ремонт</h2>
<p>Неисправная микросхема была демонтирована. График потребления  тока изменился. Потребление поднималось до ~550 мА и оставалось на этом уровне.
При подключении к ГУ усилитель воспроизводил звук по оставшимся каналам.</p>

<p>Новая микросхема TDF8546TH/N2 была заказана на <a href="https://aliexpress.ru/item/1005003136804516.html">Aliexpress</a><br />
Исправный усилитель без подключенния к ГУ потребляет 800 мА.</p>

<h2 id="материалы">Материалы</h2>
<ol>
  <li><a href="/images/repair_i2c_8628060650/AK4613-AKM.pdf">Datasheet AK4613</a>;</li>
  <li><a href="/images/repair_i2c_8628060650/REN_r01uh0249ej0500_v850essg3_MAH_20120227.pdf">Datasheet V850. Размер 6.7 Мб</a>;</li>
  <li><a href="/images/repair_i2c_8628060650/TDF8546TH_N1.pdf">Datasheet TDF8546TH</a>;</li>
  <li><a href="/images/repair_i2c_8628060650/8628060650_connectors.png">Схема подключения усилителя</a>;</li>
  <li><a href="/images/repair_i2c_8628060650/8628060650_scan_top.jpg">Слой TOP в высоком разрешении. Размер 9.4 Мб</a>;</li>
  <li><a href="/images/repair_i2c_8628060650/8628060650_scan_bot.jpg">Слой BOT в высоком разрешении. Размер 10.2 Мб</a>;</li>
</ol>]]></content><author><name></name></author><summary type="html"><![CDATA[Анализ шины I2C и определение неисправности.]]></summary></entry><entry><title type="html">Программное восстановление ZigBee устройств Aqara/Xiaomi</title><link href="http://re-engr.ru/jn5169-monitor-repair/" rel="alternate" type="text/html" title="Программное восстановление ZigBee устройств Aqara/Xiaomi" /><published>2022-05-23T00:00:00+00:00</published><updated>2022-05-23T00:00:00+00:00</updated><id>http://re-engr.ru/jn5169-monitor-repair</id><content type="html" xml:base="http://re-engr.ru/jn5169-monitor-repair/"><![CDATA[<p><img src="/images/jn5169-monitor-repair/jn5169-mon-rep-logo.png" alt="_config.yml" /><br />
Замечено, что некоторые устройства (роутеры) подвержены программному сбою. Перезагрузка или удерживание кнопки для входа/выхода из сети проблемы не решает. Признаками программного сбоя могут быть:</p>
<ul>
  <li>Индикация присутствует, нет реакции на кнопку (клавиши, входы);</li>
  <li>Устройство не подключается к сети;</li>
  <li>Индикация отсутствует, нет реакции на кнопку. По “железу” полный порядок;</li>
</ul>

<p>Ранее была опубликована статья по ремонту привода штор. (<a href="/aqara_curtain/">ссылка</a>) Способ универсальный, стирающую прошивку можно заливать в другие устройства, но это более трудоемкий процесс по сравнению с описываемым.<br />
В версии <code class="language-plaintext highlighter-rouge">May 17 2022</code> <a href="https://github.com/re-engr/jn5169-monitor"><strong>JN5169-monitor</strong></a> добавлены функции: стирания PDM, стирание EEPROM и восстановление <strong><em>MAGIC NUMBER</em></strong>. Подробно как работает monitor написано <a href="/jn5169-fw-lock/#Wire_exploit">здесь</a>.</p>

<p>Стирание PDM и стирание EEPROM различаются тем, что первая производит очистку памяти функциями “файловой системы”, а вторая стирает память вместе с “файловой системой”.</p>

<p>Функция восстанволения <strong><em>MAGIC NUMBER</em></strong> нужна для возврата работоспособности девайса без процедуры перепрошивки памяти микроконтроллера JN5169.</p>

<h3 id="шаги">Шаги</h3>
<ol>
  <li>Разберите устройство и подключите USB-UART адаптер к пинам порта. Распиновку для некоторых устройств можно найти <a href="https://github.com/re-engr/zigbee_firmware/">здесь</a>;</li>
  <li>Переведите JN5169 в режим bootloader замкнув вывод /BOOT на GND и подав питание;</li>
  <li>Скачайте проект <a href="https://github.com/re-engr/jn5169-monitor"><strong>JN5169-monitor</strong></a>;</li>
  <li>В папке <code class="language-plaintext highlighter-rouge">/wire</code> найдите скрипт <code class="language-plaintext highlighter-rouge">upload.py</code>. Откройте его в текстовом редакторе и укажите правильный номер порта (port=’COMx’,);</li>
  <li>Запустите скрипт. При правильном подключении и настройке Вы увидите следующий результат:
  <a href="/images/jn5169-monitor-repair/jn5169-mon-load.png"><img src="/images/jn5169-monitor-repair/jn5169-mon-load.png" alt="_config.yml" /></a></li>
  <li>Перезагрузите устройство в нормальный режим (высокий уровень /BOOT);</li>
  <li>Подключитесь к последовательному порту с помощью Putty или подобной программы. Параметры порта <code class="language-plaintext highlighter-rouge">115200 8n1</code>;</li>
  <li>Нажмите Enter. Вы увидите сообщение:
  <a href="/images/jn5169-monitor-repair/jn5169-mon-start.png"><img src="/images/jn5169-monitor-repair/jn5169-mon-start.png" alt="_config.yml" /></a></li>
  <li>Нажмите на клавиатуре последовательно .p (символ точка, символ ‘p’). Эта команда выполнит стирание PDM.
  <a href="/images/jn5169-monitor-repair/jn5169-mon-p.png"><img src="/images/jn5169-monitor-repair/jn5169-mon-p.png" alt="_config.yml" /></a></li>
  <li>Нажмите на клавиатуре последовательно .r (символ точка, символ ‘r’). Эта команда вернет устройство в рабочее состояние. 
  <a href="/images/jn5169-monitor-repair/jn5169-mon-r.png"><img src="/images/jn5169-monitor-repair/jn5169-mon-r.png" alt="_config.yml" /></a></li>
</ol>

<p>Если после перезагрузки устройство не заработало, то либо это был не программный сбой, либо в процессе восстановления что-то пошло не так.  В любом случаи обращайтесь в <a href="https://t.me/reengrru">Telegram-чат</a>, постараемся помочь.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Замечено, что некоторые устройства (роутеры) подвержены программному сбою. Перезагрузка или удерживание кнопки для входа/выхода из сети проблемы не решает. Признаками программного сбоя могут быть: Индикация присутствует, нет реакции на кнопку (клавиши, входы); Устройство не подключается к сети; Индикация отсутствует, нет реакции на кнопку. По “железу” полный порядок;]]></summary></entry><entry><title type="html">Безопасность ZigBee. Дверной звонок.</title><link href="http://re-engr.ru/jn5169-monitor-key/" rel="alternate" type="text/html" title="Безопасность ZigBee. Дверной звонок." /><published>2022-05-17T00:00:00+00:00</published><updated>2022-05-17T00:00:00+00:00</updated><id>http://re-engr.ru/jn5169-monitor-key</id><content type="html" xml:base="http://re-engr.ru/jn5169-monitor-key/"><![CDATA[<p><img src="/images/jn5169-monitor-key/jn5169-mon-logo.png" alt="_config.yml" /><br />
Вход в ZigBee сеть “без стука”.</p>

<p>Прежде всего хочу обратить Ваше внимание на следующее:</p>
<blockquote>
  <p>Все эксперименты проводите только со своим оборудованием. Скорее всего доступ к ZigBee сети соседа, без его согласия, является <strong>негласным получением информации</strong>.</p>
</blockquote>

<p>Способ основывается на уязвимости чипа JN5169. Первый материал на эту тему <a href="/jn5169-fw-lock/">здесь</a>.
Мы продолжили развитие проекта <a href="https://github.com/re-engr/jn5169-monitor"><strong>JN5169-monitor</strong></a> и добавили функцию, которая позволяет прочитать <strong>Network key</strong> из EEPROM.</p>

<p>В большинстве систем домашней автоматизации, основанных на ZigBee с профилем Home Automation, используется стандартный ключ шифрования APS именуемый <strong>Link key</strong>: <code class="language-plaintext highlighter-rouge">ZigBeeAlliance09 (5A 69 67 42 65 65 41 6C 6C 69 61 6E 63 65 30 39)</code> Для профиля ZLL (лампочки Hue), используется ключ <code class="language-plaintext highlighter-rouge">9F 55 95 F1 02 57 C8 A4 69 CB F4 2B C9 3F EE 31</code> (1)<br />
Зная <strong>Link key</strong> можно построить карту сети, выяснить тип устройства, по MAC адресу определить производителя чипа (косвенно может указывать на производителя устройства). Полезные данные и команды шифруются другим ключом который называется <strong>Network key</strong>. Все девайсы получают и сохраняют его при добавлении в сеть.</p>

<p><strong>Network key</strong> генерируется при создании сети и, как правило, не меняется на протяжении длительного времени. Имея этот ключ можно присоеденится к сети.
<br />
<br /></p>

<p>Хорошим примером является устройство Aqara WXKG12LM. Это универсальная кнопка. Одним из применений, предложенным производителем, может быть дверной звонок (Smart Doorbell).(2) Предполагается что устройство располагается в общедоступном месте. 
Как вы сможете убедиться, чтение ключа занимает немного времени. Факт чтения нигде не фиксируется. После всех манипуляций устройство сохраняет свою работоспособность.</p>

<ol>
  <li>Разберите WXKG12LM и подключите USB-UART адаптер к <a href="https://github.com/re-engr/zigbee_firmware/tree/main/aqara/sensor_switch/WXKG12LM">обозначенным на фото контактам</a>;</li>
  <li>Переведите JN5169 в режим bootloader замкнув вывод /BOOT на GND и подав питание;</li>
  <li>Скачайте проект <a href="https://github.com/re-engr/jn5169-monitor"><strong>JN5169-monitor</strong></a>;</li>
  <li>В папке <code class="language-plaintext highlighter-rouge">/wire</code> найдите скрипт <code class="language-plaintext highlighter-rouge">upload.py</code>. Откройте его в текстовом редакторе и укажите правильный номер порта (port=’COMx’,);</li>
  <li>Запустите скрипт. При правильном подключении и настройке Вы увидите следующий результат:
  <a href="/images/jn5169-monitor-key/jn5169-mon-load.png"><img src="/images/jn5169-monitor-key/jn5169-mon-load.png" alt="_config.yml" /></a></li>
  <li>Перезагрузите устройство в нормальный режим (высокий уровень /BOOT);</li>
  <li>Подключитесь к последовательному порту с помощью Putty или подобной программы. Параметры порта <code class="language-plaintext highlighter-rouge">115200 8n1</code>;</li>
  <li>Нажмите Enter. Вы увидите сообщение:
  <a href="/images/jn5169-monitor-key/jn5169-mon-start.png"><img src="/images/jn5169-monitor-key/jn5169-mon-start.png" alt="_config.yml" /></a></li>
  <li>Нажмите клавишу ‘n’. Если устройство было в сети, то в ответ получите всю необходимую информацию. (3)
  <a href="/images/jn5169-monitor-key/jn5169-mon-n.png"><img src="/images/jn5169-monitor-key/jn5169-mon-n.png" alt="_config.yml" /></a>
    <ul>
      <li>Channel - канал ZigBee;</li>
      <li>PanID - идентификатор сети;</li>
      <li>NwkAddr - короткий адрес устройства в сети;</li>
      <li>ExtPanID - MAC адрес координатора;</li>
      <li>Key - <strong>Network key</strong>;</li>
    </ul>
  </li>
  <li>Нажмите на клавиатуре последовательно .r (символ точка, символ ‘r’). Эта команда вернет устройство в рабочее состояние. 
  <a href="/images/jn5169-monitor-key/jn5169-mon-r.png"><img src="/images/jn5169-monitor-key/jn5169-mon-r.png" alt="_config.yml" /></a></li>
</ol>

<p>Проверить ключ можно с помощью <a href="/zigbee-sniffer/">Wireshark</a>.</p>

<p>Вместо WXKG12LM может быть любое другое устройство построенное на микроконтроллере JN5169.</p>

<h3 id="ссылки">Ссылки</h3>
<ol>
  <li><a href="https://www.reddit.com/r/hackernews/comments/2zzt2x/zigbee_light_link_master_key/">ZLL master key</a></li>
  <li><a href="https://www.aqara.com/us/wireless_mini_switch.html">WXKG12LM на сайте Aqara</a></li>
  <li><a href="https://zigate.fr/documentation/deplacer-le-pdm-de-la-zigate/">Идентификаторы PDM выделенные для ZigBee стека</a></li>
</ol>]]></content><author><name></name></author><summary type="html"><![CDATA[Вход в ZigBee сеть “без стука”.]]></summary></entry><entry><title type="html">Чтение прошивки из устройств Xiaomi/Aqara.</title><link href="http://re-engr.ru/jn5169-fw-lock/" rel="alternate" type="text/html" title="Чтение прошивки из устройств Xiaomi/Aqara." /><published>2022-01-10T00:00:00+00:00</published><updated>2022-01-10T00:00:00+00:00</updated><id>http://re-engr.ru/jn5169-fw-lock</id><content type="html" xml:base="http://re-engr.ru/jn5169-fw-lock/"><![CDATA[<p><img src="/images/jn5169_lockbit/5169_logo.jpg" alt="_config.yml" /><br />
2 способа прочитать залоченный JN5169.</p>
<h4 id="эта-статья-носит-образовательный-характер-если-что-то-сломаете-сами-будете-чинить">Эта статья носит образовательный характер. Если что-то сломаете, сами будете чинить.</h4>

<p><a href="#OTA_exploit">Способ первый. OTA exploit</a><br />
<a href="#Wire_exploit">Способ второй. Wire exploit</a><br />
<a href="#footer">Заключение</a></p>

<p>Мне известны два производителя Zigbee устройств использующих чипы JN5169 - это Heiman и Xiaomi (Aqara). <em>Далее просто Aqara</em>.<br />
У Heiman чипы открыты, так что нет никакого интереса их рассматривать. Xiaomi же наоборот, более распространены, имеют больший ассортимент датчиков и закрывают свои чипы для обратного чтения прошивки.</p>

<p>У такого подхода есть преимущества и недостатки. Начну с последнего. Большинство устройств не имеют функции OTA обновления. То что в них зашили на заводе, с тем они и будут, в свое время, утилизированы. Справедливости ради стоит заметить, что даже первые версии устройств 2015-2016 годов выпуска, нормально работают по сей день и нет особой нужды их обновлять. Но замечено, что эти же модели датчиков, купленные позже, имеют версию прошивки повыше. Списка изменений нет, но что-то исправляют.</p>

<p>Преимущество закрытого чипа связано с безопасностью. Например, размещение zigbee кнопки дверного звонка перед входной дверью, либо датчика температуры за окном, не должно вызывать беспокойство по причине их похищения. Цель похищения может состоять не только в завладении чужим имуществом, но так же и в желании завладеть ключами шифрования для доступа к вашей сети. А почему бы и нет? Последствия такой утечки данных предугадать сложно, но потрепать вам нервы мигающим светом или вывести из строя часть вашего оборудования - не составляет труда.</p>

<p>Помимо обновления ПО, есть несколько причин зачем нужен файл с прошивкой:</p>
<ol>
  <li>Замена микроконтроллера вышедшего из строя. Самопроизвольный выход из строя - история достаточно редкая, но не все просто смотрят на тот же “геркон”, некоторые в него еще и залезают;</li>
  <li>Сбой EEPROM. А это случается чаще. Суть в том, что при выходе из zigbee сети, в память может записаться некорректная информация и устройство больше не сможет вернуться в сеть. Решить проблему возможно только стиранием EEPROM. Особенностью JN5169 является то, что доступа к EEPROM из bootloader нет. Для его стирания прошивальщиком используется загрузка и исполнение кода в RAM. При уровне блокировки CRP=1 - загружать данные в RAM запрещено;</li>
  <li>Исследование. В прошивках можно найти много интересного. Большой объем flash памяти позволяет оставить в коде различные отладочные функции, либо сервисный режим, который может расширить функционал давно знакомого устройства;</li>
</ol>

<p><a name="OTA_exploit"></a></p>
<h2 id="способ-первый-ota-exploit">Способ первый. OTA exploit</h2>

<p>Способ не универсальный, подходит только для тех устройств которые могут обновляться через OTA.</p>

<h3 id="1-bootloader">1. Bootloader</h3>
<h4 id="11-code-read-protection">1.1 Code read protection</h4>
<p>Все чипы JN5169 имеют заводской bootloader. Для его запуска нужно установить на выводе 22 (DO1) низкий уровень и перезагрузить микроконтроллер. Информацию об этом можно найти на странице 77 в <a href="https://www.nxp.com/docs/en/data-sheet/JN5169.pdf#page=77">datasheet</a> и страница 6 <a href="https://www.nxp.com/docs/en/application-note/JN-AN-1003.pdf#page=6">Application Note: JN-AN-1003</a>
На странице 6 приведена диаграмма. По ней видно какие условия необходимо соблюсти, чтобы попасть в процедуру “Run UART-Flash
serial programmer”, которая позволит производить операции с внутренней flash памятью. Для операции чтения нужно чтобы “Code read protection level” (CRP) равнялся 0.  Об уровнях защиты написано на странице 10 <a href="https://www.nxp.com/docs/en/application-note/JN-AN-1003.pdf#page=10">Application Note: JN-AN-1003</a> и <a href="https://www.nxp.com/docs/en/application-note/JN-AN-1003.pdf#page=12">странице 12</a></p>

<table>
  <thead>
    <tr>
      <th>Bit</th>
      <th>Field</th>
      <th>Description</th>
      <th>Default</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>5:4</td>
      <td>CRP_LEVEL</td>
      <td>Code Read Protection (CRP) level:</td>
      <td>0x3</td>
    </tr>
    <tr>
      <td> </td>
      <td> </td>
      <td>00 = CRP level 2 (no programming allowed via UART)</td>
      <td> </td>
    </tr>
    <tr>
      <td> </td>
      <td> </td>
      <td>10 = CRP level 2 (no programming allowed via UART)</td>
      <td> </td>
    </tr>
    <tr>
      <td> </td>
      <td> </td>
      <td>01 = CRP level 1 (Flash read protection)</td>
      <td> </td>
    </tr>
    <tr>
      <td> </td>
      <td> </td>
      <td>11 = CRP level 0 (no protection)</td>
      <td> </td>
    </tr>
  </tbody>
</table>

<p>Посмотрим что там с уровнем CRP в aqara реле. Для этого понадобится UART преобразователь с уровнями 3.3V и утилита <a href="https://www.nxp.com/downloads/en/software-development-kits/JN-SW-4107.zip">JN51xx Production Flash Programmer</a> Мануал по утилите <a href="https://www.nxp.com/docs/en/user-guide/JN-UG-3099.pdf">здесь</a>.</p>

<p>Преобразователь подключить согласно <a href="https://github.com/re-engr/zigbee_firmware/blob/main/aqara/relay2/aqara_relay_prog0.jpg">схеме</a>. RX-TX, TX-RX. Перед подачей питания на плату реле, замкните вывод /BOOT на GND. Запустите утилиту JN51xx Production Flash Programmer, передав ей следующие параметры: 
<code class="language-plaintext highlighter-rouge">JN51xxProgrammer.exe -V 0 -s COM5 -P 115200 --deviceconfig</code>. <br />
Если все правильно настроено, то ответ будет следующим:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>COM5: Detected JN5169 with MAC address 00:15:8D:00:03:00:FF:9F
COM5: Device configuration: JTAG_DISABLE_CPU,VBO_200,CRP_LEVEL1,EXTERNAL_FLASH_NOT_ENCRYPTED,EXTERNAL_FLASH_LOAD_ENABLE
</code></pre></div></div>
<p>Из ответа следует что уровень защиты - <code class="language-plaintext highlighter-rouge">CRP_LEVEL1</code>. В <a href="https://www.nxp.com/docs/en/application-note/JN-AN-1003.pdf#page=25">таблице 8</a> перечислено что можно делать при таком уровне.</p>

<p>Ребята из команды <a href="https://alephsecurity.com/">alephsecurity.com</a> подробно изучили bootloader, архитекутру JN5169 и попытались обойти его защиту. Весь их опыт подробно описан в этих статьях: <a href="https://alephsecurity.com/2019/07/01/xiaomi-zigbee-1/">раз</a>, <a href="https://alephsecurity.com/2019/07/09/xiaomi-zigbee-2/">два</a>, <a href="https://alephsecurity.com/2019/07/15/xiaomi-zigbee-3/">три</a>. Рекомендую!</p>

<h4 id="12-magic-number">1.2 Magic number</h4>
<p>Перед тем как передать управление программе, bootloader должен найти ее в памяти. Это необходимо делать из-за возможности расположить прошивку со смещением относительно начального адреса. Чуть ниже я объясню зачем нужен этот механизм.<br />
В Application Note: JN-AN-1003, на странице <a href="https://www.nxp.com/docs/en/application-note/JN-AN-1003.pdf#page=7">7</a> подробно описан процесс поиска. Если кратко, то bootloader проверяет начало каждого сектора, начиная с нулевого, на наличие Boot Image Record (BIR). Главным признаком BIR является <code class="language-plaintext highlighter-rouge">Magic number</code>. Для JN5169 этот номер соответствует значению <code class="language-plaintext highlighter-rouge">0x123456781122334455667788</code>. На странице <a href="https://www.nxp.com/docs/en/application-note/JN-AN-1003.pdf#page=17">17</a> приведена структура BIR.
Если в начале какого-то сектора будет найден корректный <code class="language-plaintext highlighter-rouge">Magic number</code>, то производится проверка еще некоторых значений и в случае успеха управление передается программе. Если начало программы находится в отличном от нулевого секторе, то предварительно настраиваются регистры REG_SYS_FLASH_REMAP и REG_SYS_FLASH_REMAP2 <a href="https://www.nxp.com/docs/en/application-note/JN-AN-1003.pdf#page=8">страница 8</a>.</p>

<h3 id="2-ota-обновление">2. OTA-обновление</h3>
<p>Подробно про кластер OTA я напишу как-нибудь потом. Сейчас же, для того чтобы донести суть метода, обозначу основные моменты.</p>

<h4 id="21-header">2.1 Header</h4>
<p>В обновляемом девайсе должна быть реализована клиентская часть OTA кластера с необходимыми командами. Некоторые устройства выдают в ответе на Simple req. то что у них есть клиентская часть OTA, но по факту на все запросы отвечают что функция не поддерживается.</p>

<p>Для того чтобы начался процесс прошивки, необходимо верно указать параметры:</p>
<ul>
  <li>Manufacturer id;</li>
  <li>Версия прошивки;</li>
  <li>Image types;</li>
</ul>

<p>Значение перечисленных полей легко определить отправив с сервера команду <code class="language-plaintext highlighter-rouge">Image Notify</code>. Клиент ответит запросом <code class="language-plaintext highlighter-rouge">Query Next Image Request</code> в которой будет содержаться интересующая информация. Для aqara реле значения такие:</p>
<ul>
  <li>Manufacturer id = 0x115f;</li>
  <li>Версия прошивки. Желательно что бы версия была выше текущей (0x23). Можно указать 0xffffffff;</li>
  <li>Image types = 0x0101;</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ZigBee Cluster Library Frame
    Frame Control Field: Cluster-specific (0x01)
    Sequence Number: 199
    Command: Query Next Image Request (0x01)
    Payload
        Field Control: 0x00
        Manufacturer Code: Lumi United Techology, Ltd Shenzhen (0x115f)
        Image Type: Manufacturer Specific (0x0101)
        File Version: 0x00000023
            0000 0000 .... .... .... .... .... .... = Application Release: 0
            .... .... 0000 0000 .... .... .... .... = Application Build: 0
            .... .... .... .... 0000 0000 .... .... = Stack Release: 0
            .... .... .... .... .... .... 0010 0011 = Stack Build: 35
</code></pre></div></div>
<p>Есть еще один момент. В OTA заголовке есть какая-то строка с указанием зашифрован ли образ. Если она в новой прошивке отличается от того что записано в текущей, то процесс обновления будет прерван после получения нескольких блоков. Для всех обновляемых по OTA девайсов (Aqara) эта строка должна быть <code class="language-plaintext highlighter-rouge">DR1175r1v1UNENCRYPTED00000</code>. 
Если дать поиск по примерам от NXP, то значение <code class="language-plaintext highlighter-rouge">DR1175r1v1UNENCRYPTED00000</code> будет найдено в примере <code class="language-plaintext highlighter-rouge">DimmableLight</code>. <code class="language-plaintext highlighter-rouge">DR1175</code> - это маркировка платы Lighting/Sensor Expansion Board. Смею предположить, что ребята из LUMI взяли в качестве базового указанный выше пример, либо с него подтянули работу с OTA, так как значение <code class="language-plaintext highlighter-rouge">Image types</code> тоже совпадает.</p>

<h4 id="22-invalidate-current-image-and-validate-upgrade-image">2.2 Invalidate current image and validate upgrade image</h4>
<p>Объем памяти в JN5169 - 512 КБ. Этого достаточно, в большинстве случаев, чтобы использовать внутреннюю flash для хранения новой прошивки получаемой через OTA. Размер прошивки aqara реле примерно 180 КБ.</p>

<p>Теперь в чем вся суть. Например, текущая прошивка располагается в младшей половине памяти (Блок 0 = 0x00-0x3ffff). При OTA обновлении обновленная прошивка сохраняется в старшую половину памяти (Блок 1 - 0x40000-0x7ffff). После получения всего образа прошивки и проверки CRC происходит следующее:</p>
<ol>
  <li>Обновленная прошивка, записанная в блок 1, не имеет в своем заголовке <code class="language-plaintext highlighter-rouge">Magic number</code> (все байты 0xff). Если в данный момент процессор перезапустится, то загрузится текущая версия прошивки из блока 0;</li>
  <li>Текущая версия прошивки из блока 0 записывает <code class="language-plaintext highlighter-rouge">Magic number</code> в заголовок обновленной прошивки из блока 1. Если в данный момент проц перезапустится, то загрузится прошивка из блока 0 (в данном примере текущая версия);</li>
  <li>Текущая версия прошивки портит в своем заголовке <code class="language-plaintext highlighter-rouge">Magic number</code> (все 0x0) и программно ресетит процессор;</li>
  <li>Bootloader проверяет все сектора в поисках <code class="language-plaintext highlighter-rouge">Magic number</code> и находит его в начале блока 1, где располагается обновленная версия прошивки. Далее  настраиваются регистры ремапа и происходит запуск программы;</li>
  <li>Предыдущая версия прошивки в блоке 0, с испорченным <code class="language-plaintext highlighter-rouge">Magic number</code>, будет хранится во flash памяти до следующего обновления. Bootloader будет ее пропускать;</li>
</ol>

<p>А что, если в качестве OTA обновления передать программу, которая инициализирует UART и сделает кое что для нас изнутри процессора?</p>

<h3 id="3-действуем">3. Действуем</h3>

<p>Нам понадобится:</p>
<ol>
  <li>OTA-сервер. Я буду использовать координатор на чипе JN5169 и управляющую программу ZGWUI. Инструкцию по созданию координатора рекомендую посмотреть <a href="https://sprut.ai/client/article/4695?utm_source=telegram&amp;utm_medium=telegram&amp;utm_campaign=article">здесь</a>. При создании  статьи я прошил версию <code class="language-plaintext highlighter-rouge">ZiGate</code>. В тамошней версия ZigbeeNodeControlBridge почему-то сломан OTA, хотя  в оригинальной от NXP нормально работает. Скорость выбирайте 115200, на 1M не все USB-UART адаптеры корректно работают. <code class="language-plaintext highlighter-rouge">ZGWUI.exe</code> найдете в <a href="https://www.nxp.com/docs/en/application-note/JN-AN-1216.zip">примере от NXP</a>.<br />
Можно использовать zigbee2mqtt c любым поддерживаемым стиком, только необходимо <a href="https://github.com/Koenkk/zigbee-OTA/issues/45#issuecomment-858793283">перенести OTA репозиторий к себе на компьютер</a>, чтобы зазря не беспокоить Koenkk;</li>
  <li>Прошивка которая будет “подсунута” девайсу в качестве обновления. Скачать можно <a href="https://github.com/re-engr/jn5169-monitor/tree/master/ota/mon5169.ota">отсюда</a>.</li>
  <li>Терминал PuTTY или любой другой умеющий писать в логи непечатные символы;</li>
  <li>Редактор WinHex или аналогичный;</li>
  <li><a href="https://www.nxp.com/downloads/en/software-development-kits/JN-SW-4107.zip">JN51xx Production Flash Programmer</a>;</li>
  <li>USB-UART адаптер;</li>
  <li>Aqara реле (либо привод штор, розетка);</li>
</ol>

<h4 id="запустить-zigbee-сеть">Запустить Zigbee сеть</h4>

<p><a href="/images/jn5169_lockbit/jn5169_lock_main_zgwui.png"><img src="/images/jn5169_lockbit/jn5169_lock_main_zgwui.png" alt="_config.yml" /></a></p>

<ol>
  <li>Settings: port, 115200, 8n1, none flow control.</li>
  <li>Open port</li>
  <li>Нажмите Erase PD</li>
  <li>Установите желаемый канал. По умолчанию 11</li>
  <li>Нажмите Start NWK</li>
  <li>Нажмите Permit Join указав параметры: Address 0, Interval 0xFF</li>
</ol>

<p>Лог при выполнении пунктов 4-6. У вас должно быть что-то подобное</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Type: 0x8000
 (Status)
  Length: 5
  Status: 0x00 (Success)
  SQN: 0x00
  Message: 
Type: 0x8000
 (Status)
  Length: 5
  Status: 0x00 (Success)
  SQN: 0x00
  Message: 
Type: 0x8024
 (Network Up)
  Status: 0x01
  Short Address: 0x0000
  Extended Address: 0x158D00028C036A
  Channel: 11
Type: 0x8000
 (Status)
  Length: 5
  Status: 0x00 (Success)
  SQN: 0x00
  Message: 
</code></pre></div></div>
<p>После выполнения пункта 6, ваш координатор готов принять новые устройства. Активируйте на реле режим сопряжения.</p>

<p>После успешного добавления в сеть, в логах найдите анонс с коротким адресом реле. Скопируйте адрес без 0x. У меня это <code class="language-plaintext highlighter-rouge">B0AC</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> (End Device Announce)
  Short Address: 0xB0AC
</code></pre></div></div>

<p>Перейдите на вкладку OTA Cluster (номер 7 на картинке с ZGWUI).
Нажмите кнопку Load Image и выберите <a href="https://github.com/re-engr/jn5169-monitor/tree/master/ota/mon5169.ota">файл с обновлением</a>. 
Для кнопки Image Notify укажите следующие данные: Short, короткий адрес(B0AC),1,1,JITTER,1,1,1,1</p>

<p><a href="/images/jn5169_lockbit/jn5169_lock_ota_zgwui.png"><img src="/images/jn5169_lockbit/jn5169_lock_ota_zgwui.png" alt="_config.yml" /></a></p>

<p>Нажмите Image Notify. Если все сделано правильно, то начнет процесс передачи прошивки. Размер прошивки, конечно, великоват для своего функционала, нужно будет оптимизировать. Подождать придется 4 минуты 30 сек, если между реле и координатором 1 hop и в сети нет спамящих нодов.</p>

<p><a href="/images/jn5169_lockbit/jn5169_lock_ota_progress_zgwui.png"><img src="/images/jn5169_lockbit/jn5169_lock_ota_progress_zgwui.png" alt="_config.yml" /></a></p>

<p>Пока передается прошивка, можете запустить PuTTY. Укажите номер порта, скорость 115200 8n1. Логирование пока не включайте.</p>

<p>После завершения передачи файла (+ 5 секунд) устройство переключится на новую прошивку. В терминал будет отправлено приветствие с подсказкой.</p>

<p><a href="/images/jn5169_lockbit/jn5169_lock_ota_end_zgwui.png"><img src="/images/jn5169_lockbit/jn5169_lock_ota_end_zgwui.png" alt="_config.yml" /></a></p>

<ul>
  <li>f - чтение всей flash памяти (0x00080000 - 0x000FFFFF);</li>
  <li>w - программа сформирует файл прошивки (ID файла + корректный MAGIC_NUMBER + все данные прошивки) и выдаст его в терминал;</li>
</ul>

<p>Включите логирование и нажмите ‘w’. После прекращения передачи данных (оценить визуально в окне терминала) вам необходимо удалить из лога возможный заголовок, который формируют некоторые терминальные программы. В PuTTY это выглядит так:</p>

<p><a href="/images/jn5169_lockbit/winhex_hdr.png"><img src="/images/jn5169_lockbit/winhex_hdr.png" alt="_config.yml" /></a></p>

<p><code class="language-plaintext highlighter-rouge">0d 0a</code> - это последние символы заголовка PuTTY, далее идут данные прошивки (0f 03 00 0b…)</p>

<p><a href="/images/jn5169_lockbit/winhex_start_fw.png"><img src="/images/jn5169_lockbit/winhex_start_fw.png" alt="_config.yml" /></a></p>

<p>Полученный файл прошивки можно сразу же проверить, прошив его утилитой <a href="https://www.nxp.com/downloads/en/software-development-kits/JN-SW-4107.zip">JN51xx Production Flash Programmer</a></p>

<p><code class="language-plaintext highlighter-rouge">JN51xxProgrammer.exe -V 1 -s COM5 -P 115200 -f putty.bin</code></p>

<p>Устройство (реле) должно снова заработать как и прежде. Если этого не произошло, и вы не находите ошибки в своих действиях, просьба обратиться ко мне. Возможно потребуется доработать алгоритм. Контакты в разделе <a href="http://re-engr.ru/about/">About</a></p>

<p><a name="Wire_exploit"></a></p>
<h2 id="способ-второй-wire-exploit">Способ второй. Wire exploit</h2>

<p>Здесь информации будет поменьше, так как практически все что нужно представлено в описании первого способа.</p>

<p>Открываем описание на bootloader и смотрим <a href="https://www.nxp.com/docs/en/application-note/JN-AN-1003.pdf#page=25">таблицу 8</a></p>

<p>В последнем столбце указано какие действия можно совершать при CRP = 1. Среди всего прочего, есть такая операция как <code class="language-plaintext highlighter-rouge">Flash program request</code>. Запись до 128 байт по указанному адресу. 
Вспомните как bootloader выполняет поиск валидного образа прошивки в памяти и каким образом OTA клиент переходит на новую прошивку. Собрав эти знания в кучу, можно предположить такой подход:</p>

<ol>
  <li>Испортить MAGIC_NUMBER в текущей прошивке с помощью <code class="language-plaintext highlighter-rouge">Flash program request</code>;</li>
  <li>Записать свою прошивку куда-нибудь повыше, с корректным MAGIC_NUMBER, используя всё ту же <code class="language-plaintext highlighter-rouge">Flash program request</code>;</li>
</ol>

<p>Какой функционал заложить в свою прошивку, думаю, объяснять не стоит :)</p>

<p>Как правило, в устройствах которые не имеют возможности обновлять ПО через OTA, прошивка начинается с начального адреса.<br />
С OTA сложнее, там прошивка может быть в любой половине памяти, в зависимости от того сколько раз обновлялось ПО. Но если образ прошивки не занимает всю половину памяти (остается еще как минимум один свободный сектор), то проблем так же нет.</p>

<p><a href="https://github.com/re-engr/jn5169-monitor/tree/master/wire">Здесь</a> вы сможете найти прошивку и скрипт который все сделает. Функционал прошивки тот же что для OTA.</p>

<p>В этот раз предлагаю взять другое устройство, например датчик дверей и окон (геркон). Схема подключения <a href="https://github.com/re-engr/zigbee_firmware/blob/main/aqara/sensor_magnet/aqara_door11_bot.jpg">здесь</a></p>

<ol>
  <li>Перейдите в режим bootloader;</li>
  <li>Укажите в скрипте нужный порт;</li>
  <li>Запустите скрипт;</li>
  <li>Перезапустите JN5169 предварительно подключившись к нему терминальной программой (115200 8n1);</li>
</ol>

<p>Результат работы скрипта:
<a href="/images/jn5169_lockbit/upload_py.png"><img src="/images/jn5169_lockbit/upload_py.png" alt="_config.yml" /></a></p>

<p>Успешно запущенная программа:
<a href="/images/jn5169_lockbit/wire_term.png"><img src="/images/jn5169_lockbit/wire_term.png" alt="_config.yml" /></a></p>

<p>Со всеми неудачами и вопросами - пишите. Контакты в разделе <a href="http://re-engr.ru/about/">About</a></p>

<p><a name="footer"></a></p>
<h2 id="заключение">Заключение</h2>
<p>Теперь о том, что можно предпринять для повышения защиты.</p>

<p>В первом случае стоит подписывать свои прошивки или шифровать их, механизмы в функционале OTA это предусматривают. Запрещать обратное чтение прошивки.</p>

<p>Во втором случае. По началу я подумал про способ, когда все свободное пространство заполняется нулями, но потом посмотрел внимательнее таблицу 8 и нашел что команда <code class="language-plaintext highlighter-rouge">Sector erase request</code> доступна в CRP1.</p>

<p>Привязка прошивки к MAC адресу чипа, который лежит в OTP. Но это такое, просто повышается стоимость реверса и стоимость производства.</p>

<p>Исправить bootloader. Не проверял можно ли переписывать эту область flash.</p>

<p>Для необновляемых девайсов можно произвести своего рода обфускацию кода, чтобы он вырос в размерах на всю flash память. Но опять же, имея 2 девайса, можно частями достать прошивку.</p>

<p>У меня больше нет адекватных вариантов, кроме как установка CRP = 2. В виду того что биты CRP хранятся в OTP, то JN5169 из микроконтроллера с flash памятью, превращается в микроконтроллер с PROM.</p>

<hr />

<p>На этом вопрос чтения прошивки еще не закрыт. Есть еще один способ получения прошивки, но чтобы вы могли его повторить, нужно доделать некоторый инструментарий. Пусть это будет тема для последующей статьи.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[2 способа прочитать залоченный JN5169. Эта статья носит образовательный характер. Если что-то сломаете, сами будете чинить.]]></summary></entry><entry><title type="html">Альтернативная прошивка для Aqara Window Door Sensor (MCCGQ11LM)</title><link href="http://re-engr.ru/aqara_magnet_custom_fw/" rel="alternate" type="text/html" title="Альтернативная прошивка для Aqara Window Door Sensor (MCCGQ11LM)" /><published>2021-04-15T00:00:00+00:00</published><updated>2021-04-15T00:00:00+00:00</updated><id>http://re-engr.ru/aqara_magnet_custom_fw</id><content type="html" xml:base="http://re-engr.ru/aqara_magnet_custom_fw/"><![CDATA[<p><img src="/images/aqara-magnet-custom/aqara_magnet_logo.jpg" alt="_config.yml" /></p>

<p>Прошивка протестирована на устройстве с обозначением MCCGQ11LM. Допускаю что она подойдет для MCCGQ01LM.</p>

<p>Для того что бы сохранить возможность подключать датчики с новой прошивкой к родному координатору (для пользователей MiHome), все необходимые для этого идентификаторы в zigbee сети соответствуют MCCGQ11LM. Так же частично реализован функционал мануфактурного кластера 0xFF01.</p>

<h3 id="отличия">Отличия</h3>
<ol>
  <li>
    <p>В обновленной прошивке реализован механизм быстрого переподключения при потере родителя (rejoining). В оригинальной прошивке для этого нужно ждать несколько часов (по мои тестам около 7), причем генерация событий по срабатыванию геркона или нажатие на кнопку не ускоряют этот процесс.</p>
  </li>
  <li>
    <p>Добавлен клиентский кластер OnOff. Возможность передавать команды устройствам имеющие серверный кластер OnOff (реле, лампочки) без участия координатора (binding). Помимо передачи команды, датчик так же отправляет ReportAttribute координатору.</p>
  </li>
  <li>
    <p>Обновление прошивки через OTA. Обновление начинается только после уведомления со стороны OTA-сервера (Image Notify).</p>
  </li>
</ol>

<h3 id="режим-работы">Режим работы</h3>

<p>Подключение к zigbee сети производится удерживанием кнопки не менее 4 сек. Процесс поиска сопровождается миганием синего светодиода. Каналы сканируются последовательно с 11 по 26 один раз. На каждом канале отправляется по три Beacon request.</p>

<p>Подключившись к сети, датчик репортит мануфактурный кластер 0xff01 и после этого в течение 10 секунд находится в активном состоянии опрашивая родителя запросами Data request. Далее он переходит в спящий режим. Потребление в спящем режиме составляет около 1мкА.</p>

<p>Датчик просыпается раз в 20 минут. Это время не настраивается. После просыпания, он репортит кластер 0xff01, пингует родителя отправляя data request и снова засыпает.</p>

<p>Замыкание/размыкание геркона сопровождается однократным миганием светодиода. Если был настроен binding, то отправляется соответствующая команда. Так же репортится координатору текущее состояние кластера OnOff вне зависимости от настроект биндинга.</p>

<p>Короткое нажатие на кнопку сопровождается однократным миганием светодиода. Коодинатору репортится атрибут с моделью устройства Model Identifier (0x0005), это нужно для работы с MiHome, а так же репортится мануфактурный кластер 0xff01. Поведение устройства повторяет поведение оригинального устройства MCCGQ11LM.</p>

<p>Все команды и репорты отправляются с флагом ожидания подтверждения (Acknowledgement Request: True). В случае отсутствия подтверждения в установленное время, запрос повторяется еще 4 раза и если не стало лучше, то устройство переходит в режим переподключения (rejoining). Сканируется сеть и если будет найден координатор, либо роутер, с тем же PANID, способный принять еще одно прямое подключение, то производится подключение к нему без выхода из сети. Это сработает даже в случаи выключенного координатора, если датчик реджойнится к роутеру. Событие, которое вызвало пробуждение датчика, будет отправлено уже новому родителю.<br />
Процесс переподключения занимает 1-4 секунды.</p>

<p>Если был зафиксирован момент потери родителя, но переподключится к новому не получилось (например выключили в доме электричество), то датчик засыпает и повторит попытку переподключения при следующем пробуждении.</p>

<p>При настройке биндинга, после отправки команды с координатора, спящий датчик нужно будить при помощи кнопки.</p>

<h3 id="кластеры-атрибуты">Кластеры, атрибуты</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Simple Descriptor
  Endpoint: 1
  Profile: Home Automation (0x0104)
  Application Device: 0x0002
  Application Version: 0x0001
  Input Cluster Count: 2
  Input Cluster List
    Input Cluster: Basic (0x0000)
      Attribute: ZCL Version (0x0000)
        Data Type: 8-Bit Unsigned Integer (0x20)
        Uint8: 1 (0x01)
      Attribute: Application Version (0x0001)
        Data Type: 8-Bit Unsigned Integer (0x20)
        Uint8: 100 (0x64)
      Attribute: Stack Version (0x0002)
        Data Type: 8-Bit Unsigned Integer (0x20)
        Uint8: 2 (0x02)
      Attribute: HW Version (0x0003)
        Data Type: 8-Bit Unsigned Integer (0x20)
        Uint8: 2 (0x02)
      Attribute: Manufacturer Name (0x0004)
        Data Type: Character String (0x42)
        String: LUMI
      Attribute: Model Identifier (0x0005)
        Data Type: Character String (0x42)
        String: lumi.sensor_magnet.aq2
      Attribute: Date Code (0x0006)
        Data Type: Character String (0x42)
        String: 20210420
      Attribute: Power Source (0x0007)
        Data Type: 8-Bit Enumeration (0x30)
        Power Source: Battery (0x03)
      Attribute: Software Build Id (0x4000)
        Data Type: Character String (0x42)
        String: 3000-0001
    Input Cluster: On/Off (0x0006)
  Output Cluster Count: 2
  Output Cluster List
    Output Cluster: OTA Upgrade (0x0019)
    Output Cluster: On/Off (0x0006)
</code></pre></div></div>
<p>Мне пока не удалось определить назначение некоторых значений мануфктурного кластера 0xff01 (ID 4 и ID 0xA), но основая его часть все таки реализована. Данные записаны в формате ID:DATA_TYPE:VALUE</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Attribute: 0xff01
Data Type: Character String (0x42)
String: 

1d                    размер блока данных  
01 21 16 0d           uint16 напряжение батарейки 0xd16 - 3350 - 3.35 V
03 28 19              int8 температура с сенсора в JN5169 0x19 - 25 C
04 21 00 00           uint16 назначение не определено
05 21 01 00           uint16 счетчик включений датчика. Сбрасывается после выхода из сети. Хранится в PDM. 0x0001 
06 24 18 00 00 00 00  uint40 счетчик переключений геркона. Сбрасывается после выхода из сети. Хранится в PDM. 0x0000000018 - 24
0a 21 00 00           uint16 назначение не определено 
64 10 01              boolean Состояние контактов геркона. 1 - open (on), 0 - close (off)
</code></pre></div></div>
<h3 id="обновление-прошивки">Обновление прошивки</h3>

<p>Смена прошивки с оригинальной на альтернативную производится через bootloader. Последующие обновления прошивки можно производить через OTA.</p>

<p>В соответствии с распиновкой подключить UART преобразователь. Уровень сигнала TX +3.3V. Для питания можно использовать штатную батарейку. 
Для перевода процессора в режим перепрошивки, необходимо что бы на момент подачи питания, либо выхода из RST, сигнал /BOOT имел низкий уровень (подключен к земле).</p>

<table>
  <thead>
    <tr>
      <th>JN5169</th>
      <th>USB-UART</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>GND</td>
      <td>GND</td>
    </tr>
    <tr>
      <td>+3.3V</td>
      <td>+3.3V</td>
    </tr>
    <tr>
      <td>RX</td>
      <td>TX</td>
    </tr>
    <tr>
      <td>TX</td>
      <td>RX</td>
    </tr>
    <tr>
      <td>/BOOT</td>
      <td>GND</td>
    </tr>
    <tr>
      <td>RST</td>
      <td>nc</td>
    </tr>
  </tbody>
</table>

<p><img src="/images/aqara-magnet-custom/aqara_door11_bot.jpg" alt="_config.yml" /> 
<img src="/images/aqara-magnet-custom/aqara_door11_top.jpg" alt="_config.yml" /> 
Существует несколько программ для работы с bootloader JN5169:</p>
<ul>
  <li><a href="https://www.nxp.com/pages/jn516x-zigbee-home-automation:ZIGBEE-HOME-AUTOMATION">JN51xx Production Flash Programmer</a>;</li>
  <li><a href="https://github.com/pscholl/jenprog">Jenprog</a>;</li>
  <li><a href="https://github.com/WRTIOT/JennicModuleProgrammer">JennicModuleProgrammer</a>;</li>
</ul>

<p>Загрузка прошивки через <em>JN51xx Production Flash Programmer</em> выглядит так:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>JN51xxProgrammer.exe -V 1 -s COM5 -P 115200 -f fw_mccgq11lm_100.bin
</code></pre></div></div>
<p>COM5 - номе порта;<br />
115200 - если преобразователь позволяет, можно указать 1000000 (1М);<br />
fw_mccgq11lm_100.bin - прошиваемый файл;</p>

<p><a href="https://github.com/re-engr/zigbee_firmware/tree/main/aqara/sensor_magnet">Прошивки лежат здесь</a></p>

<p>Если прошиваемый процессор не имеет Lock-бита (заменен на новый), то можно добавить ключи для верификации прошивки и стирания PDM <code class="language-plaintext highlighter-rouge">-v --eraseeeprom=full</code></p>

<p><a href="https://www.nxp.com/docs/en/user-guide/JN-UG-3099.pdf">Документация к JN51xx Production Flash Programmer</a></p>

<p>Успешное завершение процесса
<img src="/images/aqara-curtain-repair/aqara_curtain_flash_complete.png" alt="_config.yml" /></p>

<p>Для запуска прошитого датчика необходимо его перезагрузить, но при этом сигнал /BOOT должен быть высоким (отключен от земли).</p>

<p>После первого включения необходимо очистить PDM. Для этого нажмите и удерживайте кнопку не менее 4 сек. Это приведет к выходу из сети, если в PDM что-то осталось от предыдущей прошивки, и запустит процесс поиска новой сети.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Ремонт электропривода для штор Aqara Intelligent Curtain Motor (ZNCLDJ11LM)</title><link href="http://re-engr.ru/aqara_curtain/" rel="alternate" type="text/html" title="Ремонт электропривода для штор Aqara Intelligent Curtain Motor (ZNCLDJ11LM)" /><published>2021-04-06T00:00:00+00:00</published><updated>2021-04-06T00:00:00+00:00</updated><id>http://re-engr.ru/aqara_curtain</id><content type="html" xml:base="http://re-engr.ru/aqara_curtain/"><![CDATA[<p><img src="/images/aqara-curtain-repair/aqara_curtain_logo.jpg" alt="_config.yml" /> 
Программный ремонт устройства с очисткой PDM и перепрошивкой.</p>

<p>Из-за бага в оригинальной прошивке, существует вероятность получить неработоспособный прибор при попытке переподключить его к zigbee сети.</p>

<p>Из-за некорректных значений в PDM, электропривод не инициирует процедуру сопряжения с zigbee сетью, хотя присоединение разрешено и емкость сети позволяет принимать новые устройства. При этом синий светодиод на электроприводе индицирует процесс поиска сети в течении отведенного для этого времени.</p>

<p>Если проанализировать трафик захваченный сниффером, то видно что устройство рассылает <em>Beacon Request</em>, получает ответ в котором <em>Association Permit = True</em>, <em>Router Capacity = True</em>, <em>End Device Capacity = True</em>, но игнорирует его и через несколько секунд отправляет <em>Beacon Request</em> снова.</p>

<p><img src="/images/aqara-curtain-repair/aqara_curtain_sniffer.png" alt="_config.yml" /></p>

<p>Для того что бы вернуть устройство в рабочий вид, необходимо очистить EEPROM в контроллере JN5169. Из-за установленного Lock-бита , который не позволяет получить доступ к EEPROM из бутлоадера, нужно в начале загрузить прошивку которая очистит EEPROM “изнутри” и только после этого можно записывать рабочую прошивку электропривода.</p>

<h4 id="шаг-1">Шаг 1</h4>
<p>Извлечь плату с контроллером, отсоединив её от устройства.</p>

<h4 id="шаг-2">Шаг 2</h4>
<p>В соответствии с распиновкой подключить UART преобразователь с уровнем сигнала TX–  +3.3 вольта. Оптимально использовать USB-UART преобразователь с источником на 3.3 вольта для того что бы запитать плату.</p>

<p>Сигнал /BOOT необходимо подключить к GND. Учитывайте что на определенных шагах этот сигнал должен быть отключен от GND.</p>

<p>GND – GND<br />
+3.3V – +3.3V<br />
Rx – TX<br />
TX – RX<br />
/BOOT – GND<br />
RST – nc</p>

<p><img src="/images/aqara-curtain-repair/aqara_curtain_pinouts.png" alt="_config.yml" /></p>

<h4 id="шаг-3">Шаг 3</h4>
<p><a href="/images/aqara-curtain-repair/doc/lumi_curtain_rep_files.zip">Скачать архив</a>. Он содержит утилиту <a href="https://www.nxp.com/pages/jn516x-zigbee-home-automation:ZIGBEE-HOME-AUTOMATION">JN51xx Production Flash Programmer</a>, <a href="https://github.com/re-engr/zigbee_firmware/tree/main/aqara/curtain">прошивки</a> и bat-файлы для запуска прошивальщика.</p>

<h4 id="шаг-4">Шаг 4</h4>
<p>Подключить UART преобразователь к компьютеру.<br />
Подать питание на плату электропривода, если используется внешний БП.
В файле prog_erase.bat (и prog_curtain.bat) указать COM-порт к которому подключен преобразователь (в оригинальном файле указан COM5). Запустить скрипт.<br />
Так же процесс может быть запущен командой:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>JN51xxProgrammer.exe -V 1 -s COM5 -P 115200 -f lumi_curtain_erase_pdm_v1.bin
</code></pre></div></div>
<p>Процесс прошивки 
<img src="/images/aqara-curtain-repair/aqara_curtain_flash_progress.png" alt="_config.yml" /></p>

<p>Успешное завершение процесса
<img src="/images/aqara-curtain-repair/aqara_curtain_flash_complete.png" alt="_config.yml" /></p>

<h4 id="шаг-5">Шаг 5</h4>
<p>Обесточить плату. Отключить от GND сигнал /BOOT. Подать питание на плату. Красный светодиод должен мерцать (частота 20 Гц). 
Если это так, можно двигаться дальше (шаг 6). Отсутствие свечения красного светодиода, либо его ровное (постоянное) свечение, без мерцания, говорит о какой-то ошибке. Рекомендую начать с шага 2 внимательно повторяя все что написано.</p>

<h4 id="шаг-6">Шаг 6</h4>
<p>Обесточить плату. Сигнал /BOOT подключить к GND. Подать питание на плату. Запустить prog_curtain.bat
Так же процесс может быть запущен командой:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>JN51xxProgrammer.exe -V 1 -s COM5 -P 115200 -f lumi_curtain_0034_07172020.bin
</code></pre></div></div>

<p>На вопрос ответ “Y”
<img src="/images/aqara-curtain-repair/aqara_curtain_flash_y.png" alt="_config.yml" /></p>

<p>Процесс прошивки такой же как на шаге 4, только длиться в 2.5 раза дольше.</p>

<h4 id="шаг-7">Шаг 7</h4>
<p>Обесточить плату. Отключить от GND сигнал /BOOT. Так же можно отключить UART преобразователь так как процесс восстановления закончен.</p>

<h4 id="шаг-8">Шаг 8</h4>
<p>Проверить работоспособность электропривода подключив его к zigbee сети.</p>

<p>По мере выхода новых прошивок для электропривода будет обновляться <a href="https://github.com/re-engr/zigbee_firmware/tree/main/aqara/curtain">репозиторий</a>.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Программный ремонт устройства с очисткой PDM и перепрошивкой.]]></summary></entry></feed>