• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Прошиваем маршрутизатор подручными средствами

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,178
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
В этой статье мы изготовим программатор микросхем 25-й серии из клона Arduino UNO, рассчитаем резистивный делитель для согласования уровней напряжения, подключим к программатору трехвольтовый чип памяти, сделаем резервную копию его содержимого и запишем новые данные.
Нас повсюду окружают электронные цифровые устройства. Многие телевизоры, автомагнитолы, мониторы, маршрутизаторы, материнские платы компьютеров и ноутбуков хранят свои управляющие программы в микросхемах памяти SPI Flash. Иногда для ремонта или расширения функциональности таких устройств требуется перепрошивка. А может, ты задумываешься о надежном хранении небольших объемов ценной для тебя информации? Тогда читай о том, как можно использовать для этой цели SPI Flash!


Вещь в себе​

Однажды мне в руки попал SOHO-маршрутизатор Ethernet/Wi-Fi, который на поверку оказался одним из брендированных вариантов ZTE H118N. Он включался, работал, но был практически бесполезен без контракта с интернет‑провайдером. Настройки в веб‑интерфейсе оказались заблокированными, сетевые службы — отключенными, а поиск в интернете показал, что превратить его во что‑то более‑менее пригодное можно лишь путем замены firmware — программного обеспечения, хранящегося в микросхеме постоянного запоминающего устройства. Изготовитель маршрутизатора позаботился о том, чтобы пресечь программный способ замены содержимого постоянной памяти. Но путь «перепрошивки» с помощью программатора остался открытым.


info​



Что мы будем делать?​

Увы, мои надежды получить компактное универсальное Linux-устройство разбились о суровую действительность. Сняв крышку корпуса, я увидел микропроцессор RTL8676S, о котором очень мало технической информации в свободном доступе, а интерес к нему со стороны сообщества OpenWrt пропорционален объему этой информации. Но почему бы не дать этому маршрутизатору шанс, заменив его прошивку стандартной, использующейся на аналогичных устройствах?

Электронная плата маршрутизатора ZTE H118N с микросхемой ПЗУ Winbond 25Q128FVSG

У края платы нетрудно заметить 8-выводную микросхему постоянного запоминающего устройства W25Q128FVSG, вокруг которой будут развиваться дальнейшие события. Из спецификации мы можем узнать, что она представляет собой память, реализованную по технологии NOR Flash, доступ к которой выполняется с помощью последовательного интерфейса SPI. Информационная емкость микросхемы составляет 128 Мбит (16 Мбайт), и работает она в диапазоне напряжения от 2,7 до 3,6 В.

www​


info​


  1. Подготовить рабочую среду на персональном компьютере.
  2. Собрать в рабочей среде скетч frser-duino из исходных текстов.
  3. Записать скетч frser-duino в клон Arduino UNO — получится UNO-программатор.
  4. Подключить микросхему SPI Flash к UNO-программатору.
  5. Записать firmware из файла образа в SPI Flash.

Подготовка рабочей среды​

Работу над программным обеспечением я выполнял в привычной мне среде Bodhi Linux 4.5 64 бит, базирующейся на Ubuntu 16.04. Так что описанные действия должны подойти для любых более‑менее современных дистрибутивов Linux, производных от Ubuntu. Понадобится только установить следующие пакеты:

  • build-essential — средства для сборки программного обеспечения из исходных текстов;
  • arduino-core — метапакет, содержащий кросс‑компилятор gcc-avr для микроконтроллеров AVR и утилиту для их программирования avrdude;
  • flashrom — утилита для управления программаторами микросхем памяти.
Установка перечисленных инструментов из репозитория выполняется командой

sudo apt install build-essential arduino-core flashrom
Подключение платы клона Arduino к рабочему компьютеру с помощью USB-кабеля сопровождается созданием файла последовательного порта /dev/ttyUSB0:

crw-rw---- 1 root dialout 188,0 ... /dev/ttyUSB0
Для проверки работы можно воспользоваться следующей командой:

avrdude -c arduino -p atmega328p -P /dev/ttyUSB0 -b 115200
В этой команде параметр -c указывает тип программатора, -p (строчная буква) — модель программируемого микроконтроллера, -P (прописная буква) — файл последовательного порта программатора, -b — скорость информационного обмена. На экране должна появиться следующая информация:

Код:
avrdude: AVR device initialized and ready to accept instructions
Reading | ### ... ## | 100% 0.00s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: Fuses OK (E:00, H:00, L:00)
avrdude done. Thank you.

Если вместо этого ты видишь строку

avrdude: ser_open(): can't open device "/dev/ttyUSB0": permission denied
значит, у тебя нет прав на доступ к порту. Для их получения надо стать членом группы dialout и повторно зайти в систему:

sudo usermod -aG dialout xakep && exit
Вместо xakep используй имя своего пользователя. Проверить членство в группах можешь командой groups.

Получилось? Тогда перед тем, как двигаться дальше, сделай резервную копию флеш‑памяти твоего клона Arduino с находящимися там сейчас скетчем и загрузчиком:

avrdude -c arduino -p atmega328p -P /dev/ttyUSB0 -U flash:r:uno_backup.hex:i
На экран снова будет выведено несколько информационных строк, а в текущем каталоге появится файл uno_backup.hex, содержащий образ флеш‑памяти в формате Intel HEX.

info​


Сборка скетча для UNO-программатора​

Чтобы превратить клон Arduino в UNO-программатор, надо записать в него машинный код скетча frser-duino, который мы прямо сейчас соберем из исходных текстов. Для получения исходников из интернет‑репозитория можно выполнить следующие команды:

Код:
wget -O frser-duino.zip https://github.com/urjaman/frser-duino/archive/refs/heads/master.zip
wget -O libfrser.zip https://github.com/urjaman/libfrser/archive/refs/heads/master.zip

Дальнейшая подготовка исходных текстов заключается в их распаковке из архивов:

Код:
unzip frser-duino.zip
cd frser-duino
unzip ../libfrser.zip
rmdir libfrser
mv libfrser_master libfrser

С точки зрения frser-duino, клон Arduino UNO с чипом CH340G представляет собой устройство с FTDI, только максимальная скорость обмена данными с ним составляет не 2 000 000, а всего 115 200 бит/c. Команды для сборки скетча приведены в разделе VISduino файла README.md:

DFLAGS=-DFTDI make clean all
SERIAL_DEV=/dev/ttyUSB0 make program
Вторая команда не только компилирует исходные тексты, но и сразу записывает получившийся машинный код в устройство, подключенное к порту /dev/ttyUSB0. Поэтому перед ее выполнением имеет смысл подключить клон Arduino к USB-порту. Если ты этого не сделал, то можешь прошить скетч из файла frser-duino.hex позже с помощью команды

avrdude -c arduino -p m328p -P /dev/ttyUSB0 -b 115200 -U flash:w:frser-duino.hex
Эта команда очищает содержимое flash-памяти устройства, записывает в него машинный код и выполняет сверку. Все происходит за считаные секунды:

Код:
avrdude: AVR device initialized and ready to accept instructions
Reading | ###...## | 100% 0.00s
...
avrdude: erasing chip
...
avrdude: writing flash (1418 bytes):
Writing | ###...## | 100% 0.25s
...
avrdude: verifying flash memory against frser-duino.hex:
Reading | ###...## | 100% 0.22s
...
avrdude: 1418 bytes of flash verified
avrdude: safemode: Fuses OK (E:00, H:00, L:00)
avrdude done. Thank you.

Неужели у нас теперь есть UNO-программатор? Проверить это можно утилитой flashrom:

flashrom -p serprog:dev=/dev/ttyUSB0:115200
На экран будут выведены сведения о самой утилите, о программаторе и о микросхеме памяти:

(1) flashrom v0.9.9-rc1-r1942 on Linux 4.4.262
(2) flashrom is free software, get the source code at Для просмотра ссылки Войди или Зарегистрируйся
(3) Calibrating delay loop... OK.
(4) serprog: Programmer name is "frser-duino"
(5) serprog: requested mapping AT45CS1282 is incompatible: 0x1080000 bytes at 0xfef80000.
(6) No EEPROM/flash device found.
(7) Note: flashrom can never write if the flash chip isn't found automatically.

Если ты видишь в 4-й строке имя программатора frser-duino, то тебя можно поздравить! На остальные сообщения пока что не обращай внимания. В 6-й и 7-й строках говорится о том, что не была обнаружена память для программирования. Это неудивительно, потому что мы пока что не подключили к UNO-программатору микросхему SPI Flash. А странная запись о какой‑то несовместимости в 5-й строке будет преследовать нас и дальше. Но, насколько я смог убедиться, на качестве работы UNO-программатора это никак не сказывается.

Если же вместо описанного ты увидел такое сообщение:

...
Код:
Calibrating delay loop... OK
Error: cannot synchronize protocol - check communications and reset device?
Error: Programmer initialization failed

то, скорее всего, в твоем клоне Arduino отсутствует скетч frser-duino или он почему‑то не работает. Попробуй повторить запись. Надеюсь, ты преодолеешь это затруднение.


Подключение микросхемы SPI Flash​

Чтобы запрограммировать микросхему, ее надо подключить к нашему UNO-программатору. Причем сделать это следует правильно. Под «правильно» имеются в виду два аспекта. Во‑первых, контакты чипа памяти должны быть подключены к тем выводам программатора, которые использует его управляющая программа. Во‑вторых, надо обеспечить соответствие уровней питания, сигналов микросхемы и программатора.


Схема коммутации​

Первое требование выполнить довольно легко. Достаточно лишь проявить внимательность и следовать схеме, изображенной на рисунке. Контакты 10–13 зарезервированы для использования шиной SPI. Их обозначения различаются в разных спецификациях, но ты можешь ориентироваться на такое соответствие между обозначениями Arduino, шиной SPI и микросхемой SPI Flash:

  • D10 — SS — SS — /CS — 1;
  • D11 — COPI — MOSI — DI — 5;
  • D12 — CIPO — MISO — DO — 2;
  • D13 — SCK — SCK — CLK — 6.
Схема подключения микросхемы SPI Flash к UNO-программатору

Кроме того, микросхема SPI Flash должна быть включена в цепь питания, для чего к ее 8-му контакту Vcc подключается вывод стабилизатора 3,3 В, а к 4-му контакту GND — общий провод.

warning​


Контакт 4 (/HOLD — удержание) позволяет приостанавливать работу микросхемы памяти на время, пока на него подан низкий уровень напряжения (о чем нас опять информирует наклонная черта в обозначении). Поскольку в наши планы никакие перерывы не входят, на него тоже подается высокий уровень напряжения.


Согласование уровней сигналов​

Что касается второго требования, то здесь придется поработать мозгами и паяльником. Наличие у UNO-программатора стабилизатора питания 3,3 В не отменяет того факта, что сам он, получая питание от USB-разъема, функционирует в 5-вольтовой логике. В соответствии с таблицей в разделе 28.2 «DC Characteristics» («Характеристики постоянного тока») Для просмотра ссылки Войди или Зарегистрируйся, выходное напряжение на линиях данных может составлять от 4,1 до 5 В. Это значит, что логическая единица по линиям данных, изображенным на приведенной схеме пунктирными линиями, будет передаваться уровнем напряжения около 5 В, на что микросхема памяти не рассчитана.

warning​


Делитель напряжения на резисторах

Если сопротивление выхода программатора мало по сравнению с R1, а сопротивление входа микросхемы памяти велико по сравнению с R2, то напряжение на выходе делителя можно рассчитать по формуле

Uвых = Uвх * R2 / (R1 + R2)

Из разделов «Electrical characteristics» («Электрические характеристики») спецификаций на микроконтроллер ATmega328P, являющийся центральным элементом UNO-программатора, и микросхему W25Q128FV мы можем узнать возможные значения напряжения низкого (логический 0) Vol и высокого (логическая 1) Voh уровней на выходах микроконтроллера, а также допустимые значения напряжения низкого Vil и высокого Vih уровней на входах микросхемы памяти:

  • Vol — от 0 до 0,8 В;
  • Voh — от 4,1 В до Vcc;
  • Vil — от –0,5 В до 0,3Vcc;
  • Vih — от 0,6Vcc до Vсс + 0,5.
С учетом того что напряжение питания Vcc микроконтроллера составляет 5 В, а микросхемы памяти — 3,3 В, получаем картину, показанную на рисунке.

Возможное напряжение на выходах UNO-программатора (слева) и допустимое напряжение на входах микросхемы памяти (справа).

Как видишь, напряжение низкого уровня попадает в допустимый диапазон, чего нельзя сказать о напряжении высокого уровня.

www​

Рекомендации по согласованию уровней напряжения UNO-программатора и микросхем SPI Flash ты можешь найти на Для просмотра ссылки Войди или Зарегистрируйся.
Коэффициент резистивного делителя K = R2 / (R1 + R2) надо выбрать таким, чтобы в допустимый диапазон попадали как верхняя граница возможного напряжения выходов микроконтроллера, так и нижняя. Посчитаем максимальное и минимальное значения коэффициента:

  • Kмакс = 3,70 : 5,00 = 0,74,
  • Kмин = 2,31 : 4,10 = 0,56.
Теперь можно подбирать резисторы. На сайте программы flashrom в качестве примера предлагается использовать R1 = 10 кОм и R2 = 15 кОм. Коэффициент такого делителя равен 15/25 = 0,6. Действительно, он удовлетворяет рассчитанным требованиям.

info​

У тебя может возникнуть вопрос: почему вместо 10 кОм и 15 кОм нельзя взять резисторы номиналом, к примеру, в тысячу раз меньше? Ведь коэффициент построенного на них делителя будет таким же?
А потому, что общее сопротивление такого делителя составит всего 25 Ом. При появлении на выходе микроконтроллера напряжения высокого уровня 5 В через делитель на общий проводник по закону Ома I = U/R потечет ток силой 5 В / 25 Ом = 200 мА, что значительно превышает нагрузочную способность выходной линии, Для просмотра ссылки Войди или Зарегистрируйся. Если высокий уровень будет держаться достаточно долго, UNO-программатор может выйти из строя.
Хорошо, а если номиналы резисторов не уменьшить, а увеличить в тысячу раз? Ну, во‑первых, тогда уже нельзя будет пренебречь влиянием сопротивления входа микросхемы на параметры делителя, а во‑вторых, резистор R1 величиной 10 МОм ограничит ток до величины 5 В / 10 МОм = 0,5 мкА, чего может оказаться недостаточно для того, чтобы микросхема обнаружила сигнал на входе. Сопротивление такой величины уже можно рассматривать просто как обрыв соединения.

Реальное воплощение​

Резисторов номиналом 15 кОм у меня не оказалось, зато было в достатке 10 кОм и 5,1 кОм. Если R1 = 5,1 кОм, а R2 = 10 кОм, то коэффициент делителя равен 100/151 = 0,66. Это тоже допустимый показатель, поэтому на таком варианте я и остановился. Для удобства использования я собрал на макетной плате схему, показанную на рисунке.

Три резистивных делителя для преобразования выходов UNO-программатора во входы SPI Flash.

warning​


No EEPROM/flash device found.
Возможно, для такого варианта подключения не хватило поступающей из USB-порта мощности питания. Раз внутриплатное программирование провалилось, то было решено снять микросхему с платы.

warning​


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

Плата подключения SPI Flash к программатору

Чтобы не ошибиться при переподключениях, я маркировал угол микросхемы возле контакта № 1 и угол панельки с соответствующим разъемом на плате белой краской с помощью текстового корректора.

warning​


Проверка готовности​

Для проверки работы всей системы в сборе надо:

  • правильно установить картридж с микросхемой W25Q128FVSG на плату SPI Flash;
  • правильно соединить UNO-программатор с платой SPI Flash гибкими проводниками;
  • подключить UNO-программатор к управляющему компьютеру кабелем USB и ввести команду
flashrom -p serprog:dev=/dev/ttyUSB0:115200
Если все было сделано правильно, ты увидишь такой ответ программатора:

Код:
flashrom v0.9.9-rc1-r1942 on Linux 4.4.262
...
Calibrating delay loop... OK.
serprog: Programmer name is "frser-duino"
serprog: requested mapping AT45CS1282 is incompatible: 0x1080000 bytes at 0xfef80000
Found Winbond flash chip "W25Q128.V" (16384 kB, SPI) on serprog.
No operations were specified.

Сообщение «Programmer name is "frser-duino"» говорит о том, что утилита flashrom смогла установить контакт с UNO-программатором через USB, а сообщение «Found Winbond flash chip "W25Q128.V"» информирует, что UNO-программатор установил контакт с микросхемой SPI Flash через набор проводников и определил ее модель. Если микросхема не определилась, то отсоедини UNO-программатор от компьютера и проверь правильность его соединения с платой SPI Flash. Ты можешь увидеть другие сообщения, например:

Код:
Found Generic flash chip "unknown SPI chip RDID" (0 kb, SPI) on serprog.

или

Код:
Found unknown flash chip "SFDP-capatible chip" (16384 kB, SPI) on serprog.

Скорее всего, это говорит о плохом контакте в соединениях между UNO-программатором и платой SPI Flash. Попробуй зачистить концы проводников, при необходимости немного изогни их так, чтобы они плотно держались в разъемах. Используй для сигнальных линий провода длиной не больше 10 см.

Когда добьешься успеха, прочитай два раза содержимое SPI Flash и сравни полученные файлы dump1.bak и dump2.bak:

Код:
flashrom -p serprog:dev=/dev/ttyUSB0:115200 -c "W25Q128.V" -r dump1.bak
flashrom -p serprog:dev=/dev/ttyUSB0:115200 -c "W25Q128.V" -r dump2.bak
cmp dump1.bak dump2.bak && echo "No differences found."

Обрати внимание, что в параметре -c надо указать модель микросхемы памяти, из которой производится чтение. Процесс считывания одного дампа занимает около 24 мин. Все это время на UNO-программаторе постоянно горят светодиоды on и rx, а светодиод tx подмигивает с интервалом около 2 с.

info​


Если же расхождений не обнаружено, можешь приниматься за программирование SPI Flash. Но на этом пути есть еще одна важная остановка.


Подготовка файла firmware​

Файл firmware — это образ содержимого микросхемы памяти. Если это содержимое считывается в файл, то никаких сложностей не возникает. Но при записи может оказаться так, что имеющийся образ меньше, чем емкость памяти микросхемы. В нашем случае микросхема способна хранить 16 Мбайт, а найденный файл был прочитан из микросхемы емкостью 8 Мбайт. UNO-программатор в такой ситуации отказывается проявлять сообразительность и «опускает руки» — в ответ на команду записи дампа из файла zte_h118n.bin

flashrom -p serprog:dev=/dev/ttyUSB0:115200 -c "W25Q128.V" -w zte_h118n.bin
программа сообщает:

Error: Image size (8388608 B) doesn't match the flash chip's size (16777216 B)
Поэтому нам самим придется подогнать файл под емкость памяти. Проще всего дописать в него недостающие байты FF в количестве 8 Мбайт следующей командой:

dd if=/dev/zero bs=8388608 count=1 | tr '\0' '\777' >> zte_h118n.bin
Здесь утилита dd извлекает из неисчерпаемого источника нулей /dev/zero нужное количество значений, которые утилита tr превращает в FF (\777 — это запись шестнадцатеричного числа FF в восьмеричной системе счисления), после чего они конструкцией командной оболочки >> дописываются в файл образа.

Когда емкость новой микросхемы памяти кратна емкости старой, часто советуют использовать образ, состоящий из нужного количества дубликатов исходной прошивки. Для рассматриваемого случая такой образ zte_h118n.new нетрудно подготовить с помощью команды

cat zte_h118n.bin zte_h118n.bin > zte_h118n.new

Программирование​

Ты уже соединил выводы UNO-программатора с платой Flash-памяти, на которой установлен «картридж» с микросхемой W25Q128FVSG, и у тебя есть образ firmware нужного размера в файле zte_h118n.bin? Тогда подключай USB-кабель к управляющему компьютеру и вводи команду

flashrom -p serprog:dev=/dev/ttyUSB0:115200 -c "W25Q128.V" -w zte_h118n.bin
В ходе процесса, который длится примерно полтора часа, выполняются следующие операции:

  • считывание старого содержимого памяти;
  • стирание памяти и запись в нее нового содержимого из файла zte_h118n.bin;
  • проверка результата записи.
На экране ты увидишь такие сообщения:

Код:
Found Winbond flash chip "W25Q128.V" (16384 kB, SPI) on serprog.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.

После записи я, не теряя времени, установил микросхему памяти в маршрутизатор и включил его... Увы! Меня постигло полное разочарование. Сколько я ни ждал, индикаторы на его панели так и не загорелись.


Заключение​

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

Ну, во‑первых, мы превратили клон Arduino UNO в полезное устройство — UNO-программатор. Во‑вторых, мы выполнили расчеты делителя напряжения на резисторах и собрали плату‑адаптер для безопасной работы с микросхемами SPI Flash, рассчитанными на напряжение питания 3,3 В. В‑третьих, мы научились готовить образ данных требуемого размера для записи в микросхемы SPI Flash. И наконец, в‑четвертых, мы использовали UNO-программатор для чтения и записи микросхемы памяти. Так что теперь у нас есть гораздо больше знаний, навыков и возможностей, чем было в начале пути.

UNO-программатор с платой‑адаптером для программирования SPI Flash.

Помимо всего прочего, микросхемы SPI Flash сами по себе занятные штуковины. В спецификациях заявлено, что они выдерживают 100 тысяч циклов перезаписи, а записанные в них данные могут храниться там до двадцати лет. Конечно, емкость этих микросхем уступает современным флешкам, а во время записи с помощью UNO-программатора можно даже немного вздремнуть. Зато их необычный форм‑фактор и нестандартный способ подключения надежно защитят ценные для тебя сведения от посторонних глаз. Ведь вместо образа firmware ничто не мешает записать в микросхему какой‑нибудь ZIP-архив.

И тем не менее, встает вопрос о том, куда двигаться дальше. По исходному имени найденного файла с оригинальным дампом можно предположить, что его извлекли из микросхемы Macronix MX25L6406E. Спецификация говорит о том, что ее электрические и геометрические параметры совместимы с уже хорошо знакомой нам микросхемой Winbond 25Q128FVSG, только емкость памяти в два раза меньше. Тогда почему бы не попробовать записать в нее образ прошивки, вдруг тогда маршрутизатор «оживет»?

Так и сделаем! Но это уже совсем другая история.
 
Activity
So far there's no one here