SPI-программатор с интерфейсом USB на базе чипа FTDI FT232H



Доброе время суток, уважаемое сообщество.

Давно уже читаю как основной сайт, так и сайт сообщества, но решил все таки перестать молчать, зарегистрироваться и написать свой первый пост. Как раз и повод для этого появился.
Дело в том, что я уже давно интересуюсь модификацией и прошивкой BIOS'ов, веду соответствующую тему на overclockers.ru и разрабатываю софт для облегчения процесса модификации и прошивки для простых пользователей (мой профиль на GitHub).
Т.к. модификации BIOS'а довольно сложно тестировать на виртуальном железе, то приходится постоянно пользоваться аппаратным SPI-программатором.
Программировать SPI-чипы, рассчитанные на напряжение 3,3 В можно практически чем угодно и через что угодно, но на рынке отсутствуют одновременно дешевые (до 20 евро) и быстрые (прошивка 64Mbit чипа за 2 минуты) решения, а покупать себе полноценный программатор за 50 евро при необходимости шить, фактически, 3-5 наименований чипов с одинаковыми характеристиками — дорого и неинтересно.
Исходя из этого, я решил разработать свой собственный дешевый программатор 3.3 В SPI-чипов.


За основу был взят OpenBiosProg-SPI, но для него автор использует довольно дорогие комплектующие (танталовые конденсаторы за 1,5 евро штука, например), да и FT2232H, на которой он основан, очень сильно избыточен для этого применения.
В итоге за основу моего программатора, который я назвал RushSPI, был взят относительно новый чип FTDI FT232H. От всем известного и хорошо описанного в статьях DIHALT'а на главной FT2232H он отличается присутствием только одного канала MPSSE и наличием встроенного преобразователя из 5 В в 3.3 В, так что необходимости во внешнем больше нет.
Большая часть схемы взята из даташита, но ее пришлось немного упростить, чтобы снизить количество элементов и себестоимость всей платы.
Во время работы над схемой было решено не лишать пользователя возможности использовать чип FT232H так, как он сам пожелает, для чего был предусмотрен джампер JP2, убирающий подтяжку SPI_WP и SPI_HOLD к питанию, и добавлена гребенка, на которую выведены все GPIO-выводы чипа, а также сигнал RESET.
Также был добавлен джампер JP1, которым можно выбрать источник питания — внешнее либо от USB.
Схему нарисовал в KiCAD'е, разводку платы делал там же. Разводил вручную, получилось уместить все на плате 40х30 мм с деталями только на одной стороне.

Схема:

Верх:

Низ:

UPD: обновил разводку согласно рекомендациям, спасибо огромное всем откликнувшимся.
Схема и разводка в формате KiCAD — на GitHub.

В домашних условиях плату решил не травить, слишком много всего придется купить, да и заказать пробную партию на PCB-POOL получается с ценой в ~7 евро за штуку, что хоть и не дешево, но терпимо, тем более, что излишки можно запаять и продать через EBay.

Теперь о софте. В качестве программной части используется утилита flashrom, в последней версии которой имеется поддержка программаторов на используемом чипе. Утилита поддерживает гору разных чипов и может быть собрана практически под любую ОС.

UPD: Спасибо огромное всем, особенно товарищу Vga за критику и дополнения. Все получилось.
Заказал платы на www.pcb-pool.com, за 11 штук без паяльной маски и шелкографии вышло чуть больше 60 евро, что недешево, но для Европы нормально.
Срок исполнения был выбран максимальный из доступных — 8 рабочих дней. Не подвели, ровно на 8 день вечером платы были отправлены.
В комплект к платам положили вырезанный лазером из листа нержавейки шаблон для нанесения паяльной пасты, а также отсос для припоя в качестве подарка за первый заказ. Общение с фирмой понравилось, буду пользоваться их услугами и дальше, если придется делать что-то небольшой партией.

Теперь, как и обещал, результаты бенчмарка:
1. Чтение 64Мбит чипа Winbond W25Q64 — 67 секунд.
2. Стирание этого же чипа — 120 секунд.
3. Полный цикл чтение/стирание/запись — 145 секунд.
Для прошивки использовалась утилита flashrom версии 0.9.6.1.

Себестоимость всего устройства получилась ~17 евро, цель уложиться в диапазон «меньше 20» достигнута.

UPD2: Проект принят в список поддерживаемых flashrom'ом программаторов.
Англоязычное описание проекта вместе со списком материалов вы можете найти на RandomProjects.org.

Еще раз спасибо всем. Удачных паек и прошивок!
  • +4
  • 10 ноября 2012, 04:29
  • CodeRush

Комментарии (72)

RSS свернуть / развернуть
ух, щайтанама!:) только вчера хотел начать делать себе плату USB/SPI, а тут нА тебе — готовое решение:)
0
НА FT2232C взлетит? Или только на H версиях?
0
В пинборде ж вроде D, а не С?
0
А есть разница? Там и та и другая стоит по доставаемости.
0
Ну, это тебе лучше знать… А С тоже умеет MPSSE и все такое?
0
Умеет, разница между C, D и L практически отсутствует.
0
The FT2232D is lead free and pin compatible with the original FT2232C and FT2232L devices. All the original device features are supported with some additional features available including a CPU-style FIFO mode and an extended operating temperature range.
http://www.ftdichip.com/Products/ICs/FT2232D.htm
0
Надо уточнить у разработчиков флешрома, но скорее всего взлетит.
flashrom.org/FT2232SPI_Programmer — вот тут они пишут о поддержке JTAGKey v1, который на FT2232D, емнип.
0
Посмотрел внимательно в код, если добавить свой DEVICE_ID, то все должно работать без изменений. По крайней мере, в коде поддержка не high-speed чипов имеется.
0
Корпус USB прямо на на земле сидит? Нехорошо это.
0
Почему? Вроде как наоборот так делать советуют.
0
Лучше как раз не садить, но в таких девайсах обычно садят.
Алсо я бы убрал термопереходы и вообще сделал земли под ушами корпуса побольше. Чтобы не оторвалось вместе с гнездом.
+1
Хорошая идея, сделаю.
0
Было три варианта подключения, которые я нашел — через резистор и конденсатор на землю, через резистор 0 Ом на землю и просто на землю. Из соображений стоимости был выбран последний. У меня все мелкие USB-устройста, которые я нашел, подключены именно так.
0
Дорожки от кварца не слишком длинные?
0
Дорожки то ладно, а вот разводка земли к конденсаторам кварца — думаю, лучше переделать в соответствии с easyelectronics.ru/razvedenie-pitaniya.html
+1
Спасибо, действительно стоит, тем более, что там место есть еще для маневра.
0
Я бы поменял местами кварц и нечто в DIP8. Алсо, не уверен в необходимости бусин на линиях данных, я бы лучше уделил внимание правильной их трассировке как печатной витой пары.
0
Нечто в DIP8 — это сокет для SPI-чипов. :) Можно попробовать, но это уже косметика, по моему.
Совсем без защиты линии данных оставлять тоже неправильно, мне кажется. Я видел несколько вариантов и остановился на тех суппресорах, что рекомендует FTDI.
По поводу разводки — насколько я помню, они должны быть по возможности одинаковой длины и без резких углов. Есть какие-то еще требования к разводке таких линий?
0
0
+1
По поводу разводки — насколько я помню, они должны быть по возможности одинаковой длины и без резких углов. Есть какие-то еще требования к разводке таких линий?
Все так плюс для USB есть требования к волновому сопротивлению линии. Правда, я их не помню. В принципе, при такой длине скорее всего достаточно вести их параллельно и близко.
Что до защиты — ферритовые бусины в линиях данных я не видел ни разу. Они не похерят сигнал так, что вообще ничего работать не будет? Если бусину и ставить, то в VCC. Ну и без защиты многие девайсы (даже не совсем китайские) вполне обходятся, но если ставить — то либо сборочку USB HS защиты, или, хотя бы, пару резисторов на 22 ома.
Нечто в DIP8 — это сокет для SPI-чипов. :) Можно попробовать, но это уже косметика, по моему.
Нет. DIP там ничем не привязан, зато занимает место, откуда ближе всего кварц тянуть. Ну и землю кварца не так надо тянуть. Ее нужно подсоединить напрямую к земляному пину FT-шки (возможно — к какому-то конкретному) и больше ничего к этой линии не подключать.

А так, кроме USB и кварца напортачить тут особо негде.
0
Ее нужно подсоединить напрямую к земляному пину FT-шки (возможно — к какому-то конкретному) и больше ничего к этой линии не подключать.
Вроде бы так и сделал, даже добавил разрыв, чтобы вся земля под кварцем, на которой стоят C2 и С4 оказалась подключена к земле МК и больше ни к чему.
Суппрессоры эти стоят на схеме из даташита, и на референсной плате. Я тут посмотрел на разные USB-штуковины на МК, что вокруг меня лежат — либо используются диодные сборки вроде такой, либо просто напрямую без ничего.
0
Вроде бы так и сделал, даже добавил разрыв, чтобы вся земля под кварцем, на которой стоят C2 и С4 оказалась подключена к земле МК и больше ни к чему.
А, действительно… Я бы убрал полигон и оставил только дорожку, собирать на эту землю помехи совршенно ни к чему.
Суппрессоры эти стоят на схеме из даташита, и на референсной плате.
У тебя на плате разведены не супрессоры (это стибилитроноподобные диоды и ставятся они не в разрыв линии, а между линией и землей), а ферритовые бусины (вот они как раз ставятся в разрыв). Я такого ни разу не видел и подозреваю, что на HS бусины задавят сигнал (хотя хз). От статики они, к тому же, все равно не защитят, они от ВЧ помех, но USB оно не нужно AFAIK.
0
У меня не было хорошего обозначения для этой детали на схеме, использовал то что есть, каюсь, надо было нарисовать. FB1 и FB2 — это вот такая деталька.
PulseGuard ESD Suppressors help protect sensitive
electronic equipment against electrostatic discharge (ESD).
They supplement the on-chip protection of integrated
circuitry and are best suited for low-voltage, high-speed
applications where low capacitance is important. Data ports
utilizing such high-speed protocols as USB 2.0, IEEE1394,
HDMI and DVI can benefit from this new technology
0
Если и правда такая — то ты их неправильно включаешь. Так они сигнал задавят с гарантией. Сапресоры нужно включать между землей и защищаемой линией, а не в разрыв линии.
+1
Вот и нашелся баг столетия. :)
Спасибо, сейчас исправлю.
0
Исправил, поменял местами DIP и осциллятор, новые схема и разводка пока во вложении, т.к. хостинг картинок что-то пока не работает. Как заработает — добавлю обратно.
0
piccy.info рулит.
0
403 Your Country Is Blacklisted.
Но IH поднялся, картинки сейчас залью.
0
видимо только Украина и что-то еще.
0
Так лучше. Еще бы убрать мелкие косячные полигоны (как та же земля кварца — там какой-то ошметок полигона остался, и еще в одном-двух местах такое).
Ну и косяк в принципе можно было полечить, поставив вместо супрессоров перемычки или резисторы (правда, защиты бы уже не было).
0
правда, защиты бы уже не было
И супрессоры уже купленные пришлось бы обратно в стол убрать.
С полигонами сейчас разберусь, мне и самому они нравятся не сильно. Спасибо тебе огромное, тов. Vga, за конструктив. Именно за этим я сюда и пришел в первую очередь. В большинстве сообществ подобного рода пост быстро оброс бы комментариями вроде «вали отсюда дно позорное». А тут не просто не гонят, но и помогают еще. Буду дальше писать. :)
0
В линиях данных ставят не ферритовые бусинки, а Common Mode Choke (Синфазные дроссели). Они синфазную по двум линиям помеху давят. Там две индуктивности намотаны на один магнитопровод. Соответственно когда токи противоположны, то они свои магнитные потоки гасят и спокойно проходят(диф. сигнал), а синфазные сигналы суммируют свои потоки и гасятся как на обычной индуктивности.
Как пример вот:http://www.tdk.co.jp/tefe02/e9713_acm.pdf
А меня тут заинтерсовало… А ведь супрессоры надо ставить до ферритов, хотя обычно ставят после в схемах? Или это не существенно?
0
Такие суппрессоры, как стоят у меня, надо ставить как можно ближе к источнику помехи, в данном случае, к разъему USB.
Common Mode Choke на тех USB-устройствах, которые я рассматривал как примеры, не было. Или ничего вообще, или диодная сборка, или резистор на 0 Ом. Но смотрел я их всего штук 5, так что это не статистика.
0
Переразвел кварц и линии данных в соответствии с рекомендациями.

Теперь воюю с KiCAD за разводку земли на USB-разъеме. Никак не могу ему объяснить, что мне нужно просто поставить все 4 пятака на сплошную землю. Может их просто удалить?
0
дорогие комплектующие (танталовые конденсаторы за 1,5 евро штука, например)
Вы откуда рухнули-то? Что локальные ценники, что прайс со старины имеют на порядок меньшую цифру. К тому же вы ремонтник, не откуда выпаять что-ли?
да и заказать пробную партию в 8 шт на PCB-POOL получается с ценой в 7 евро за штуку,
Волистатьйте статьи и форум. Упомянуто было достаточное количество китайских сервисов б более низкой ценой.
0
Рухнул оттуда же, откуда и все остальные. Вот пример локальных цен. Никто не спорит, что можно найти и за 80 центов, но это далеко не первая причина, почему мне не нравится OpenBiosProg-SPI. Один только FT2232 за 7 евро, от которого используются всего 8 I/O-выводов, стоит того, чтобы разработать что-то свое.
Заказывать из Китая стоит большой заказ, 8 штук того не стоят, будут идти месяц и потом еще разбираться с таможней, доказывая, что это не военная жлектроника и ты не китайский шпион. :) С местным поставщиком проще, хоть и дороже.
0
Кхе… RS Components локальный?1

P.S.: посмотрел профиль, да, локальный.
0
Ну почему, если заказывать в prototyping service у какого-нить seeedstudio, то за десяток таких плат вроде десяток баксов спросят. Плюс, правда, доставка. К нам нормально такие платки приходят, а вот про вашу таможню ничего сказать не могу.
0
Зато я могу — раз на раз не приходится. Однажды без проблем пришел осциллограф за 300 евро, но бывало и просто за всякой мелочью приходилось ездить на таможенный склад в соседний город и платить пошлину, поэтому без необходимости я стараюсь у китайцев ничего не покупать.
0
Немного прочел вашу статейку на Оверклокерс.ру, чота даже руки зачесались :)
0
Много программеров хороших и разных, нафик придумывать велики?
Ладно, я неизвесно зачем написал это по-ходу.
0
Если звезды зажигают, значит это кому-нибудь нужно.
0
Вот Вы не поверите, я не имею ничего против, наоборот. Сам недавно искал подобное, нашел, зашил, долго да, для меня оказалось достаточно. Но Вы же ничего по-сути, окромя разводки не сделали и оатсльные аргументы типа «дорого» но по 7 евров за платку — разве дешевле?
Я Вас не критикую, ни в коем случае не подумайте, я спрашиваю: целесообразно-ли? За сколько он зашивает 32мбитную флешку?
0
Примерно за минуту, если он не хуже уже имеющегося у меня программатора на базе FT2232H. А он получается не хуже.
0
я тоже отказался покупать себе 2232H прикрутил к usbASP, благо тов. tifa написал на пк код. Да и сама FTDI меня расстроила, индексы в конце != различным упаковкам одного и того-же камня внутри. 30у.е. вроде как стоит китайпрогер, загоняет 32мбита за 12сек.
0
Пользовался несколькими китайцами от совсем простого на AtMega8 за 10 долларов до немного более интересных за 30 евро — все работали очень медленно. Проблема заказа из Китая в том, что надо месяц ждать с неизвестным результатом. Да и софт там, зачастую, совсем кривой и без исходников.
Я пользовался этими чипами от FTDI в составе различных готовых устройств — меня устраивают.
0
TL866CS вроде ничего. Правда, недешев и закрыт, зато весьма универсален.
0
версия с «а» поддерживает спи
софт нормальный с гуем вместо этого красноглазия
time flashrom -p ft2232_spi:type=2232H,port=A -E
0
Если брать готовое решение, то дешевле всего получается купить вот эту борду и спаять переходник из гребенки на сокет DIP8, как я уже однажды и сделал. Но переходник этот можно потерять, да и выглядит все это некрасиво, хотелось сделать готовое решение на одной плате, и желательно дешевле, чем предложеный выше способ.
0
Я вообще микры выпаивал из платы — так что норм и такое решение, ну и мне с моей «высоты» скоростя особо и не нужны, да, Вам — другое дело.
0
Ех, черт, Германия, у нас такое либо дохера дорого либо дохера долго ждать — надо менять место жительства.
0
Один вопрос: разве современные биосы идут в DIP8? Мне кажется уже давно везде безножечные. Как такие программировать не испортив плату?
0
Практически на всех современных платах с одной микросхемой BIOS стоят обычные DIP8 в сокетах, чтобы не выпаивать их в случае сбоя, а просто вытащить и поменять. Исключения — платы Gigabyte и EVGA, там стоят припаяные SOIC8, но они дублируются. Шить такие можно либо выпаяв и вставив в переходник SOIC8 -> DIP8, либо подключив контакты гребенки напрямую к чипу или к разъему SPI на плате, если он есть.
+1
Один из немногих примеров когда призводитель сохраняет здравый смысл и ремонтопригодность изделия. А как вообще ремонтнопригодность и целесообразность ремонта современных мамок по сравнению с 10-летними изделиями? А то у меня почему-то такое впечатление что на рынке постоянно есть только 4-5 нормальных плат, а остальное дикий ширпотреб. Думаю пара статей про современные материнки (особенности используемой электроники, диагностика наиболее частых глюков, ценный лут) будут интересны сообществу.
0
Писать там нечего, по сути.
Ремонтопригодность падает с каждым годом, т.к. деталей на плате все больше, а размер платы не меняется. Плюс появилась тенденция поставить на плату вообще все, что пришло в голову в 4 слоя, отчего лучше тоже не становится. Да и Intel сейчас очень сильно взялся за производителей, со всех сторон подперев их стандартами на все, и если на X58 еще можно было найти принципиально разные платы, то начиная с P67 все платы на рынке — клоны друг друга с небольшими вариациями, а после запуска Haswell они станут еще одинаковее, ведь контролер питания переезжает в процессор.
Смысла в ремонте плат практически нет, т.к. первые год-два от покупки можно просто отправить сломавшуюся плату по гарантии, а после двух лет вместо ремонта проще купить новую, тем более в европе, где одна только диагностика меньше 50 евро стоить не может, если ее делает не знакомый студент-железячник у себя дома в тайне от властей.
Самая противная поломка — выгорание дорожек во внутренних слоях. Если с каким-то редким и дорогим оборудованием еще заморачиваются, то ширпотреб вроде мат. платы просто выкидывается после такого.
Ценный лут — да все там неплохое, если насмерть не сгорело. Мосфетов мощных целая куча, контролеры питания, драйверы, японские твердотельные конденсаторы, просто мелочевка без счета. Конечно, чип SuperIO или LAN мало кому нужен отдельно от платы, как и разного рода разъемы, но остальное стоит того. Покупка за 20 евро сломанной платы, особенно если эта поломка физическая, вроде обломанных ног сокета, выгоднее покупки отдельно стоящих деталей примерно в 10 раз.
Единственная привлекательная область для ремонтника в европе — ноутбуки, остально все себя не окупает. Да и люди здесь намного сильнее наших пручены к мысли «сломалось — выброси и купи новое», потребительское общество, поэтому просто убедить, что можно отремонтировать и будет работать — та еще задача.
Плюс Китай отсюда далеко и заказать какую-нибудь редкую детальку, если нее нет в мозере, фарнеле и рс-компонентс — тот еще геморрой с кулак. В этом смысле особенно разочаровывают последние поколения видеокарт с чипами Volterra VT243MF и аналоги, а также TI со своими 59901. Ни то, ни другое достать практически нереально, только снять с трупа, а выходят они из строя массово. Как-то так.
+2
Спасибо. От себя могу только добавить что из-за погони за тонкостью и дешевизной механическое растрескивание материнки в дешевых ноутах стало обыденностью (особенно если их тосить за один угол открытыми) из-за изгибания платы вместе с корпусом. Эх, где же времена моего 440ВХ, который пережил несметные оверклокинги и реанимации, причем неродными компонентами…
0
Нравится мне когда микросхемки под углом стоят. Вот такую «сову» как-то разводил.
+1
Хорошая сова.
А мне нравится, когда дорожки не прямые и детали стоят «как насыпали», и плата напоминает нарисованную чернилами. ТопоР вроде бы так разводит, насколько я помню. В KiCAD такого не добиться без ухищрений, да и задача такая не стояла.
А углом эту плату я сделал просто потому, что так удобнее гребенку разводить, да и выглядит интереснее.
0
Обновил статью, добавил фотографию готового устройства, а также опыт работы с изготовителем плат и результаты бенчмарка.
Спасибо еще раз всем, кто помог довести разводку до ума.
0
Добавил информацию о добалении проекта в список поддерживаемых flashrom'ом, перенес схему на GitHub.
0
Я тут по результатам использования пришел к выводу, что таки сглупил в схеме. Совершенно бесплатно можно было сделать поддержку чипов 5 В, если поставить джампер, который переключал бы вывод POWER DIP-сокета на 5 В.
Думаю делать вторую ревизию с небольшим удорожанием, но с поддержкой 1.8 В чипов и, возможно, SOIC8 ZIF-сокета.
0
Я тут flashrom запустил с PinBoard2 и FT2232 не определяется. А при рассматривании исходников показалось, что чего-то не хватает…
Как его собрать из исходников, если поменять VID и PID?
Или кто-то может поделиться готовым exe-шником под windows, пересобранным для PinBoard?
0
C VID и PID разобрался, но все равно вот такое выдает:

flashrom v0.9.6.1-r1671 on Windows 5.1 (x86)
flashrom is free software, get the source code at http://www.flashrom.org

flashrom was built with GCC 4.7.2, little endian
Command line (5 args): flashrom.exe -V -p ft2232_spi:type=2232H,port=A -r 93c06.bin
Calibrating delay loop... OS timer resolution is 15625 usecs, 2797M loops per second, 10 myus = 0 us, 100 myus = 0 us, 1000 myus = 0 us
, 10000 myus = 0 us, 62500 myus = 46875 us, OK.
Initializing ft2232_spi programmer
Using device type FTDI FT2232H channel A.
Unable to open FTDI device: -3 (device not found).
Error: Programmer initialization failed.
Для продолжения нажмите любую клавишу . . .

divider пробовал разный, безрезультатно. Может, на Windows7 попробовать?
0
На PinboardII 2232 c буквой D. Функциональный аналог, но может для flashrom есть разница?
Если так указать: flashrom.exe -V -p ft2232_spi:type=2232,port=A -r 93c06.bin
0
У меня вообще FT2232С. Сейчас запустил пример, работает нормально. Исходники посмотрел, вроде тоже все логично. Драйверы VCP и D2xx менял местами, но показалось, что они одинаковые…
Параметр type может быть только 2232H для моего VID и PID :-{
0
Под семеркой то же самое. Отладчиком бы пройтись, но у меня ничего нет для С…
0
Эти адаптеры он поддерживает:
#define FTDI_VID 0x0403
#define FTDI_FT2232H_PID 0x6010
#define FTDI_FT4232H_PID 0x6011
#define TIAO_TUMPA_PID 0x8a98
#define AMONTEC_JTAGKEY_PID 0xCFF8

#define GOEPEL_VID 0x096C
#define GOEPEL_PICOTAP_PID 0x1449

#define FIC_VID 0x1457
#define OPENMOKO_DBGBOARD_PID 0x5118

#define OLIMEX_VID 0x15BA
#define OLIMEX_ARM_OCD_PID 0x0003
#define OLIMEX_ARM_TINY_PID 0x0004
#define OLIMEX_ARM_OCD_H_PID 0x002B
#define OLIMEX_ARM_TINY_H_PID 0x002A

У тебя С с каким PID?
0
0x6010
ftdi_init проходит нормально, а вот ftdi_usb_open говорит device not found.
0
А если пересобрать с #define FTDI_FT2232С_PID 0x6010 и в командной строке указать FT2232С?
0
С этим разобрался, libusb была левая какая-то, скопировал последнюю, все запустилось, только теперь нужной микросхемы нет в списке )))
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.