stihl не предоставил(а) никакой дополнительной информации.
В этой статье мы изготовим программатор микросхем 25-й серии из клона Arduino UNO, рассчитаем резистивный делитель для согласования уровней напряжения, подключим к программатору трехвольтовый чип памяти, сделаем резервную копию его содержимого и запишем новые данные.
Нас повсюду окружают электронные цифровые устройства. Многие телевизоры, автомагнитолы, мониторы, маршрутизаторы, материнские платы компьютеров и ноутбуков хранят свои управляющие программы в микросхемах памяти SPI Flash. Иногда для ремонта или расширения функциональности таких устройств требуется перепрошивка. А может, ты задумываешься о надежном хранении небольших объемов ценной для тебя информации? Тогда читай о том, как можно использовать для этой цели SPI Flash!
Электронная плата маршрутизатора ZTE H118N с микросхемой ПЗУ Winbond 25Q128FVSG
У края платы нетрудно заметить 8-выводную микросхему постоянного запоминающего устройства W25Q128FVSG, вокруг которой будут развиваться дальнейшие события. Из спецификации мы можем узнать, что она представляет собой память, реализованную по технологии NOR Flash, доступ к которой выполняется с помощью последовательного интерфейса SPI. Информационная емкость микросхемы составляет 128 Мбит (16 Мбайт), и работает она в диапазоне напряжения от 2,7 до 3,6 В.
Подключение платы клона Arduino к рабочему компьютеру с помощью USB-кабеля сопровождается созданием файла последовательного порта /dev/ttyUSB0:
Для проверки работы можно воспользоваться следующей командой:
В этой команде параметр -c указывает тип программатора, -p (строчная буква) — модель программируемого микроконтроллера, -P (прописная буква) — файл последовательного порта программатора, -b — скорость информационного обмена. На экране должна появиться следующая информация:
Если вместо этого ты видишь строку
значит, у тебя нет прав на доступ к порту. Для их получения надо стать членом группы dialout и повторно зайти в систему:
Вместо xakep используй имя своего пользователя. Проверить членство в группах можешь командой groups.
Получилось? Тогда перед тем, как двигаться дальше, сделай резервную копию флеш‑памяти твоего клона Arduino с находящимися там сейчас скетчем и загрузчиком:
На экран снова будет выведено несколько информационных строк, а в текущем каталоге появится файл uno_backup.hex, содержащий образ флеш‑памяти в формате Intel HEX.
Дальнейшая подготовка исходных текстов заключается в их распаковке из архивов:
С точки зрения frser-duino, клон Arduino UNO с чипом CH340G представляет собой устройство с FTDI, только максимальная скорость обмена данными с ним составляет не 2 000 000, а всего 115 200 бит/c. Команды для сборки скетча приведены в разделе VISduino файла README.md:
Вторая команда не только компилирует исходные тексты, но и сразу записывает получившийся машинный код в устройство, подключенное к порту /dev/ttyUSB0. Поэтому перед ее выполнением имеет смысл подключить клон Arduino к USB-порту. Если ты этого не сделал, то можешь прошить скетч из файла frser-duino.hex позже с помощью команды
Эта команда очищает содержимое flash-памяти устройства, записывает в него машинный код и выполняет сверку. Все происходит за считаные секунды:
Неужели у нас теперь есть UNO-программатор? Проверить это можно утилитой flashrom:
На экран будут выведены сведения о самой утилите, о программаторе и о микросхеме памяти:
(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-программатора это никак не сказывается.
Если же вместо описанного ты увидел такое сообщение:
...
то, скорее всего, в твоем клоне Arduino отсутствует скетч frser-duino или он почему‑то не работает. Попробуй повторить запись. Надеюсь, ты преодолеешь это затруднение.
Схема подключения микросхемы SPI Flash к UNO-программатору
Кроме того, микросхема SPI Flash должна быть включена в цепь питания, для чего к ее 8-му контакту Vcc подключается вывод стабилизатора 3,3 В, а к 4-му контакту GND — общий провод.
Контакт 4 (/HOLD — удержание) позволяет приостанавливать работу микросхемы памяти на время, пока на него подан низкий уровень напряжения (о чем нас опять информирует наклонная черта в обозначении). Поскольку в наши планы никакие перерывы не входят, на него тоже подается высокий уровень напряжения.
или Зарегистрируйся, выходное напряжение на линиях данных может составлять от 4,1 до 5 В. Это значит, что логическая единица по линиям данных, изображенным на приведенной схеме пунктирными линиями, будет передаваться уровнем напряжения около 5 В, на что микросхема памяти не рассчитана.
Делитель напряжения на резисторах
Если сопротивление выхода программатора мало по сравнению с R1, а сопротивление входа микросхемы памяти велико по сравнению с R2, то напряжение на выходе делителя можно рассчитать по формуле
Uвых = Uвх * R2 / (R1 + R2)
Из разделов «Electrical characteristics» («Электрические характеристики») спецификаций на микроконтроллер ATmega328P, являющийся центральным элементом UNO-программатора, и микросхему W25Q128FV мы можем узнать возможные значения напряжения низкого (логический 0) Vol и высокого (логическая 1) Voh уровней на выходах микроконтроллера, а также допустимые значения напряжения низкого Vil и высокого Vih уровней на входах микросхемы памяти:
Возможное напряжение на выходах UNO-программатора (слева) и допустимое напряжение на входах микросхемы памяти (справа).
Как видишь, напряжение низкого уровня попадает в допустимый диапазон, чего нельзя сказать о напряжении высокого уровня.
или Зарегистрируйся.
Коэффициент резистивного делителя K = R2 / (R1 + R2) надо выбрать таким, чтобы в допустимый диапазон попадали как верхняя граница возможного напряжения выходов микроконтроллера, так и нижняя. Посчитаем максимальное и минимальное значения коэффициента:
А потому, что общее сопротивление такого делителя составит всего 25 Ом. При появлении на выходе микроконтроллера напряжения высокого уровня 5 В через делитель на общий проводник по закону Ома I = U/R потечет ток силой 5 В / 25 Ом = 200 мА, что значительно превышает нагрузочную способность выходной линии, Для просмотра ссылки Войдиили Зарегистрируйся. Если высокий уровень будет держаться достаточно долго, UNO-программатор может выйти из строя.
Хорошо, а если номиналы резисторов не уменьшить, а увеличить в тысячу раз? Ну, во‑первых, тогда уже нельзя будет пренебречь влиянием сопротивления входа микросхемы на параметры делителя, а во‑вторых, резистор R1 величиной 10 МОм ограничит ток до величины 5 В / 10 МОм = 0,5 мкА, чего может оказаться недостаточно для того, чтобы микросхема обнаружила сигнал на входе. Сопротивление такой величины уже можно рассматривать просто как обрыв соединения.
Три резистивных делителя для преобразования выходов UNO-программатора во входы SPI Flash.
No EEPROM/flash device found.
Возможно, для такого варианта подключения не хватило поступающей из USB-порта мощности питания. Раз внутриплатное программирование провалилось, то было решено снять микросхему с платы.
Дабы не лишать себя удобства при программировании, я собрал для этого картриджа специальную плату, позволяющую таким же простым образом подключать его к UNO-программатору. На рисунке не указаны соединительные проводники линий данных, чтобы не загромождать его. Просто соедини перемычкой каждый цветной круглый пятак с квадратом вывода панельки DIP8 такого же цвета.
Плата подключения SPI Flash к программатору
Чтобы не ошибиться при переподключениях, я маркировал угол микросхемы возле контакта № 1 и угол панельки с соответствующим разъемом на плате белой краской с помощью текстового корректора.
Если все было сделано правильно, ты увидишь такой ответ программатора:
Сообщение «Programmer name is "frser-duino"» говорит о том, что утилита flashrom смогла установить контакт с UNO-программатором через USB, а сообщение «Found Winbond flash chip "W25Q128.V"» информирует, что UNO-программатор установил контакт с микросхемой SPI Flash через набор проводников и определил ее модель. Если микросхема не определилась, то отсоедини UNO-программатор от компьютера и проверь правильность его соединения с платой SPI Flash. Ты можешь увидеть другие сообщения, например:
или
Скорее всего, это говорит о плохом контакте в соединениях между UNO-программатором и платой SPI Flash. Попробуй зачистить концы проводников, при необходимости немного изогни их так, чтобы они плотно держались в разъемах. Используй для сигнальных линий провода длиной не больше 10 см.
Когда добьешься успеха, прочитай два раза содержимое SPI Flash и сравни полученные файлы dump1.bak и dump2.bak:
Обрати внимание, что в параметре -c надо указать модель микросхемы памяти, из которой производится чтение. Процесс считывания одного дампа занимает около 24 мин. Все это время на UNO-программаторе постоянно горят светодиоды on и rx, а светодиод tx подмигивает с интервалом около 2 с.
Если же расхождений не обнаружено, можешь приниматься за программирование SPI Flash. Но на этом пути есть еще одна важная остановка.
Здесь утилита dd извлекает из неисчерпаемого источника нулей /dev/zero нужное количество значений, которые утилита tr превращает в FF (\777 — это запись шестнадцатеричного числа FF в восьмеричной системе счисления), после чего они конструкцией командной оболочки >> дописываются в файл образа.
Когда емкость новой микросхемы памяти кратна емкости старой, часто советуют использовать образ, состоящий из нужного количества дубликатов исходной прошивки. Для рассматриваемого случая такой образ zte_h118n.new нетрудно подготовить с помощью команды
В ходе процесса, который длится примерно полтора часа, выполняются следующие операции:
После записи я, не теряя времени, установил микросхему памяти в маршрутизатор и включил его... Увы! Меня постигло полное разочарование. Сколько я ни ждал, индикаторы на его панели так и не загорелись.
Ну, во‑первых, мы превратили клон Arduino UNO в полезное устройство — UNO-программатор. Во‑вторых, мы выполнили расчеты делителя напряжения на резисторах и собрали плату‑адаптер для безопасной работы с микросхемами SPI Flash, рассчитанными на напряжение питания 3,3 В. В‑третьих, мы научились готовить образ данных требуемого размера для записи в микросхемы SPI Flash. И наконец, в‑четвертых, мы использовали UNO-программатор для чтения и записи микросхемы памяти. Так что теперь у нас есть гораздо больше знаний, навыков и возможностей, чем было в начале пути.
UNO-программатор с платой‑адаптером для программирования SPI Flash.
Помимо всего прочего, микросхемы SPI Flash сами по себе занятные штуковины. В спецификациях заявлено, что они выдерживают 100 тысяч циклов перезаписи, а записанные в них данные могут храниться там до двадцати лет. Конечно, емкость этих микросхем уступает современным флешкам, а во время записи с помощью UNO-программатора можно даже немного вздремнуть. Зато их необычный форм‑фактор и нестандартный способ подключения надежно защитят ценные для тебя сведения от посторонних глаз. Ведь вместо образа firmware ничто не мешает записать в микросхему какой‑нибудь ZIP-архив.
И тем не менее, встает вопрос о том, куда двигаться дальше. По исходному имени найденного файла с оригинальным дампом можно предположить, что его извлекли из микросхемы Macronix MX25L6406E. Спецификация говорит о том, что ее электрические и геометрические параметры совместимы с уже хорошо знакомой нам микросхемой Winbond 25Q128FVSG, только емкость памяти в два раза меньше. Тогда почему бы не попробовать записать в нее образ прошивки, вдруг тогда маршрутизатор «оживет»?
Так и сделаем! Но это уже совсем другая история.
Нас повсюду окружают электронные цифровые устройства. Многие телевизоры, автомагнитолы, мониторы, маршрутизаторы, материнские платы компьютеров и ноутбуков хранят свои управляющие программы в микросхемах памяти SPI Flash. Иногда для ремонта или расширения функциональности таких устройств требуется перепрошивка. А может, ты задумываешься о надежном хранении небольших объемов ценной для тебя информации? Тогда читай о том, как можно использовать для этой цели SPI Flash!
Вещь в себе
Однажды мне в руки попал SOHO-маршрутизатор Ethernet/Wi-Fi, который на поверку оказался одним из брендированных вариантов ZTE H118N. Он включался, работал, но был практически бесполезен без контракта с интернет‑провайдером. Настройки в веб‑интерфейсе оказались заблокированными, сетевые службы — отключенными, а поиск в интернете показал, что превратить его во что‑то более‑менее пригодное можно лишь путем замены firmware — программного обеспечения, хранящегося в микросхеме постоянного запоминающего устройства. Изготовитель маршрутизатора позаботился о том, чтобы пресечь программный способ замены содержимого постоянной памяти. Но путь «перепрошивки» с помощью программатора остался открытым.info
Если ты думаешь, что против отвертки и паяльника бессильно любое электронное устройство, то спешу тебя разочаровать. Некоторые компоненты информационных систем финансового сектора, например платежные терминалы и банкоматы, помимо программной защиты, имеют защиту физическую. При попытке вскрыть корпус таких устройств хранящиеся в них данные могут быть безвозвратно утрачены из‑за отключения поддерживающего электропитания или физически разрушится носитель информации, например подачей электрического импульса от предусмотрительно установленной батарейки. В последнем случае возможны даже шумо‑дымовые эффекты.
Продолжив изучать вопрос, я узнал, что на некоторые маршрутизаторы подобного класса можно установить Для просмотра ссылки Войдиили Зарегистрируйся на основе Linux, значительно расширяющую их возможности. Заодно не без интереса почитал на форумах дискуссии, посвященные восстановлению маршрутизаторов, «окирпиченных» (не подающих признаков жизни) неудачными попытками такой установки. В особо тяжелых случаях эта процедура сводится к загрузке «дампов» (образов firmware) с помощью программатора. К тому же оказалось, что маршрутизаторы разных производителей, построенные на одной или схожей аппаратной платформе, могут функционировать под управлением программного обеспечения конкурентов. В общем, вся информационная среда подталкивала к тому, чтобы провести над имеющимся у меня устройством смелые эксперименты.
Что мы будем делать?
Увы, мои надежды получить компактное универсальное Linux-устройство разбились о суровую действительность. Сняв крышку корпуса, я увидел микропроцессор RTL8676S, о котором очень мало технической информации в свободном доступе, а интерес к нему со стороны сообщества OpenWrt пропорционален объему этой информации. Но почему бы не дать этому маршрутизатору шанс, заменив его прошивку стандартной, использующейся на аналогичных устройствах?
У края платы нетрудно заметить 8-выводную микросхему постоянного запоминающего устройства W25Q128FVSG, вокруг которой будут развиваться дальнейшие события. Из спецификации мы можем узнать, что она представляет собой память, реализованную по технологии NOR Flash, доступ к которой выполняется с помощью последовательного интерфейса SPI. Информационная емкость микросхемы составляет 128 Мбит (16 Мбайт), и работает она в диапазоне напряжения от 2,7 до 3,6 В.
www
Спецификация микросхемы Winbond 25Q128FVSG доступна Для просмотра ссылки Войдиили Зарегистрируйся.
Широко используемое для программирования подобных «микросхем 25-й серии» приспособление — недорогой USB-программатор на конвертере CH341A. Для внутрисхемного программирования (то есть без снятия микросхемы с платы) он комплектуется специальным зажимом‑прищепкой, который обхватывает микросхему памяти и обеспечивает необходимый контакт. В моем арсенале такого чудесного инструмента не оказалось, зато нашелся клон Arduino UNO. Для него есть скетч frser-duino, превращающий его в UNO-программатор, с которым умеет работать утилита flashrom.
info
Как ты знаешь, Arduino — это проект по разработке «дружественных» к пользователю наборов электронных компонентов, спецификации которых публикуются под открытой лицензией. Одним из самых успешных изделий стала плата UNO, на которой «центральный» микроконтроллер ATMega328P, дополненный необходимой для функционирования обвязкой и удобными контактными линейками, оснащен «соконтроллером» ATMega8U2 (версии R1 и R2) или ATMega16U2 (версия R3), реализующим функцию конвертера USB-serial, что упрощает загрузку программ в устройство. Кстати, программные проекты для Arduino и скомпилированный из них двоичный код называют скетчами (sketch).
Благодаря открытой лицензии и большому числу поклонников Arduino UNO другие производители освоили выпуск аналогичных устройств, внося в оригинальную схему некоторые изменения. В частности, для снижения стоимости изделий сопряжение USB-serial часто реализуется не универсальным программируемым «соконтроллером», а специализированным интерфейсным чипом CH340G.
Чтобы перепрограммировать наш подопытный маршрутизатор, придется выполнить следующие шаги.
- Подготовить рабочую среду на персональном компьютере.
- Собрать в рабочей среде скетч frser-duino из исходных текстов.
- Записать скетч frser-duino в клон Arduino UNO — получится UNO-программатор.
- Подключить микросхему SPI Flash к UNO-программатору.
- Записать 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
В последней команде я не указал параметр, задающий скорость обмена. Программа avrdude использует значение 115200 для программатора arduino по умолчанию. Но если по какой‑то причине ты получил серию сообщений о неправильной скорости обмена, вот таких:
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x9f
то попробуй вернуть этот параметр в команду.
Сборка скетча для 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 должна быть включена в цепь питания, для чего к ее 8-му контакту Vcc подключается вывод стабилизатора 3,3 В, а к 4-му контакту GND — общий провод.
warning
На стороне UNO-программатора непосредственно под контактом 3,3 В находится контакт 5 В. Будь внимателен и не подключи микросхему к повышенному напряжению!
Имей в виду, что встречаются микросхемы SPI Flash, которые внешне ничем не отличаются от нашего «пациента», но рассчитаны на напряжение 1,8 В. Использовать их с нашим UNO-программатором нельзя. Обязательно проверяй маркировку чипов и уточняй их параметры по спецификациям производителя!
Тебя может удивить, что на рисунке линия питания подведена не только к 8-му контакту микросхемы, но еще и к 3-му и 7-му. Контакт 3 (/WP — Write Protect, защита от записи) предназначен для предотвращения модификации информации в микросхеме памяти. Наклонная черта в его обозначении говорит о том, что он управляется низким уровнем. То есть, когда на этот контакт подано низкое напряжение логического нуля, данные из микросхемы можно только читать. Согласись, что такая защита не будет лишней для микросхемы BIOS на системной плате. Но в нашем случае ее надо отключить, для чего на контакт подается высокий уровень напряжения, соответствующий логической единице.
Контакт 4 (/HOLD — удержание) позволяет приостанавливать работу микросхемы памяти на время, пока на него подан низкий уровень напряжения (о чем нас опять информирует наклонная черта в обозначении). Поскольку в наши планы никакие перерывы не входят, на него тоже подается высокий уровень напряжения.
Согласование уровней сигналов
Что касается второго требования, то здесь придется поработать мозгами и паяльником. Наличие у UNO-программатора стабилизатора питания 3,3 В не отменяет того факта, что сам он, получая питание от USB-разъема, функционирует в 5-вольтовой логике. В соответствии с таблицей в разделе 28.2 «DC Characteristics» («Характеристики постоянного тока») Для просмотра ссылки Войдиwarning
В разделе 9 «Electrical characteristics» («Электрические характеристики») спецификации чипа W25Q128FV написано, что напряжение питания Vcc может достигать 4,6 В, а напряжение на сигнальных линиях Vio допускается до Vcc + 0,4 В. В нашем случае Vcc = 3,3 В, и тогда абсолютный максимум для сигналов составляет 3,7 В, но никак не 5 В.
В интернете можно встретить сообщения об успешной работе с SPI Flash на повышенном напряжении, но производитель английским языком предупреждает, что это может привести к поломке изделия. Если ты несколько раз успешно перебежал дорогу на красный свет, это не значит, что светофоры теперь можно убирать.
В школе на уроках физики нам рассказывали, что понизить напряжение можно с помощью делителя на двух резисторах — такого, как на рисунке.

Если сопротивление выхода программатора мало по сравнению с 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.

Как видишь, напряжение низкого уровня попадает в допустимый диапазон, чего нельзя сказать о напряжении высокого уровня.
www
Рекомендации по согласованию уровней напряжения UNO-программатора и микросхем SPI Flash ты можешь найти на Для просмотра ссылки ВойдиКоэффициент резистивного делителя K = R2 / (R1 + R2) надо выбрать таким, чтобы в допустимый диапазон попадали как верхняя граница возможного напряжения выходов микроконтроллера, так и нижняя. Посчитаем максимальное и минимальное значения коэффициента:
- Kмакс = 3,70 : 5,00 = 0,74,
- Kмин = 2,31 : 4,10 = 0,56.
info
У тебя может возникнуть вопрос: почему вместо 10 кОм и 15 кОм нельзя взять резисторы номиналом, к примеру, в тысячу раз меньше? Ведь коэффициент построенного на них делителя будет таким же?А потому, что общее сопротивление такого делителя составит всего 25 Ом. При появлении на выходе микроконтроллера напряжения высокого уровня 5 В через делитель на общий проводник по закону Ома I = U/R потечет ток силой 5 В / 25 Ом = 200 мА, что значительно превышает нагрузочную способность выходной линии, Для просмотра ссылки Войди
Хорошо, а если номиналы резисторов не уменьшить, а увеличить в тысячу раз? Ну, во‑первых, тогда уже нельзя будет пренебречь влиянием сопротивления входа микросхемы на параметры делителя, а во‑вторых, резистор R1 величиной 10 МОм ограничит ток до величины 5 В / 10 МОм = 0,5 мкА, чего может оказаться недостаточно для того, чтобы микросхема обнаружила сигнал на входе. Сопротивление такой величины уже можно рассматривать просто как обрыв соединения.
Реальное воплощение
Резисторов номиналом 15 кОм у меня не оказалось, зато было в достатке 10 кОм и 5,1 кОм. Если R1 = 5,1 кОм, а R2 = 10 кОм, то коэффициент делителя равен 100/151 = 0,66. Это тоже допустимый показатель, поэтому на таком варианте я и остановился. Для удобства использования я собрал на макетной плате схему, показанную на рисунке.
warning
Во избежание повреждения UNO-программатора и микросхем SPI Flash коммутацию проводников выполняй только на отключенном от USB-питания программаторе. А перед включением внимательно осмотри собранную конструкцию на предмет правильности выполненных соединений и отсутствия контактов между проводниками там, где их быть не должно. Наибольшую опасность представляет короткое замыкание линии питания VCC и общего провода GND.
Сначала я попробовал подпаяться к ножкам микросхемы SPI Flash прямо на плате маршрутизатора, и технически мне это удалось. Но UNO-программатор упрямо сообщал, что никакой микросхемы он не видит:
No EEPROM/flash device found.
Возможно, для такого варианта подключения не хватило поступающей из USB-порта мощности питания. Раз внутриплатное программирование провалилось, то было решено снять микросхему с платы.
warning
Контактные площадки, к которым припаяна микросхема SPI Flash, довольно чувствительны к механическим нагрузкам, поэтому, снимая микросхему обычным паяльником, ты очень рискуешь их повредить. Если у тебя нет соответствующего опыта и инструмента, лучше обратиться для выполнения этой операции к специалистам мастерской.
Поскольку я планировал поэкспериментировать с устройством, то, во избежание постоянных воздействий на плату, присоединил к освободившимся контактным площадкам панельку DIP8 с помощью восьми гибких проводов длиной около 5 см, изготовленных из ненужного шлейфа для флоппи‑дисковода. А микросхему SPI Flash установил на плату‑переходник SOP8 — DIP8, в отверстия которой впаял контактные гребенки, оставив длинные концы их штекеров свободными. Получился «картридж», который можно многократно подключать к плате маршрутизатора и отсоединять от нее.
Дабы не лишать себя удобства при программировании, я собрал для этого картриджа специальную плату, позволяющую таким же простым образом подключать его к UNO-программатору. На рисунке не указаны соединительные проводники линий данных, чтобы не загромождать его. Просто соедини перемычкой каждый цветной круглый пятак с квадратом вывода панельки DIP8 такого же цвета.

Чтобы не ошибиться при переподключениях, я маркировал угол микросхемы возле контакта № 1 и угол панельки с соответствующим разъемом на плате белой краской с помощью текстового корректора.
warning
Не забудь, что электролитический конденсатор емкостью около 1 мкФ, включенный в линию питания, требует соблюдения полярности подключения.
Проверка готовности
Для проверки работы всей системы в сборе надо:- правильно установить картридж с микросхемой 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
Узким местом нашей установки является последовательный интерфейс, работающий через USB-подключение между управляющим компьютером и UNO-программатором: из‑за использования в последнем недорогой микросхемы CH340G надежный информационный обмен возможен на скоростях, не превышающих 115 200 бит/с. Скорость передачи данных между UNO-программатором и микросхемой SPI Flash гораздо выше.
Если вместо фразы «No differences found» ты увидел сообщение о различиях в прочитанных файлах, то придется заняться поиском их причины. Скорее всего, это плохие контакты или слишком длинные соединительные провода.
Если же расхождений не обнаружено, можешь приниматься за программирование SPI Flash. Но на этом пути есть еще одна важная остановка.
Подготовка файла firmware
Файл firmware — это образ содержимого микросхемы памяти. Если это содержимое считывается в файл, то никаких сложностей не возникает. Но при записи может оказаться так, что имеющийся образ меньше, чем емкость памяти микросхемы. В нашем случае микросхема способна хранить 16 Мбайт, а найденный файл был прочитан из микросхемы емкостью 8 Мбайт. UNO-программатор в такой ситуации отказывается проявлять сообразительность и «опускает руки» — в ответ на команду записи дампа из файла zte_h118n.binпрограмма сообщает:flashrom -p serprog:dev=/dev/ttyUSB0:115200 -c "W25Q128.V" -w zte_h118n.bin
Поэтому нам самим придется подогнать файл под емкость памяти. Проще всего дописать в него недостающие байты FF в количестве 8 Мбайт следующей командой:Error: Image size (8388608 B) doesn't match the flash chip's size (16777216 B)
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-программатор для чтения и записи микросхемы памяти. Так что теперь у нас есть гораздо больше знаний, навыков и возможностей, чем было в начале пути.

Помимо всего прочего, микросхемы SPI Flash сами по себе занятные штуковины. В спецификациях заявлено, что они выдерживают 100 тысяч циклов перезаписи, а записанные в них данные могут храниться там до двадцати лет. Конечно, емкость этих микросхем уступает современным флешкам, а во время записи с помощью UNO-программатора можно даже немного вздремнуть. Зато их необычный форм‑фактор и нестандартный способ подключения надежно защитят ценные для тебя сведения от посторонних глаз. Ведь вместо образа firmware ничто не мешает записать в микросхему какой‑нибудь ZIP-архив.
И тем не менее, встает вопрос о том, куда двигаться дальше. По исходному имени найденного файла с оригинальным дампом можно предположить, что его извлекли из микросхемы Macronix MX25L6406E. Спецификация говорит о том, что ее электрические и геометрические параметры совместимы с уже хорошо знакомой нам микросхемой Winbond 25Q128FVSG, только емкость памяти в два раза меньше. Тогда почему бы не попробовать записать в нее образ прошивки, вдруг тогда маршрутизатор «оживет»?
Так и сделаем! Но это уже совсем другая история.