Полезное в сети

Всегда в теме

Статистика


Яндекс.Метрика


Онлайн всего: 1
Гостей: 1
Пользователей: 0

Рекомендуем



Главная » Статьи » Разное » Интересного много

Искусcтво перешивки BIOS (часть 3,4)
Часть третья. Для тех, кому, всё же, нужно разобраться. Азы.

Что ж, если дочитали досель - значит начнём с самого начала. Которое я пропустил из-за того, что очень многие его не читают smile , предпочитая середину или даже сразу конец.

Немного о принципах работы.



"Обычная" флэшка имеет следующие сигналы:
- 8 линий данных DQ0-DQ7
- 17-18 линий адреса A00-A16/17 (в зависимости от объёма: 1Mbit - 17, 2Mbit - 18)
- CE# (ChipEnable) - "чипселект" (разрешение на работу с микросхемой)
- OE# (OutputEnable) - RE (возможность считать байт данных)
- WE# (WriteEnable) - WE (возможность записать байт данных)

Короче, достаточно примитивно и понятно, даже если вы не обладаете особыми познаниями в электронике.

И уже из этого видно, что уже только из-за 8-битной шины данных (в современных Nforce2 - она 128-bit) скорость выборки данных из флэшки (которая к тому же ещё больше ухудшается из-за больших задержек самой флэшпамяти) превратила бы загрузку даже самого быстрого компьютера в мучительное ожидание. Поэтому флэшка подключена особым способом к южному мосту, что позволяет "отображать" ("Shadow") её содержимое на "реальную" память, эмулируя при этом память ReadOnly (ПЗУ по-нашенски) и снимая ограничение по скорости.

Опять же, из сказанного ещё один вывод: ежели вы засунули совсем нездоровую флэшку либо вставили её неправильно - пострадать может не только сама микросхема (что обычно и случается при вставлении "задом наперёд"), но и напрямую_подключённый_южный_мост (из неоднократного sad личного опыта).

В адресном пространстве флэшка занимает самые верхние адреса E0000-FFFFF (верно для 1Mbit, для остальных аналогично, потому разберём на примере именно 1Mbit/AwardBIOS). После включения компьютера и окончании сигнала RESET# процессор выполняет свою первую команду по адресу F000:FFF0. После самой первичной инициализации происходит проверка различных контрольных сумм (их много в биосе), главная из которых - контрольная сумма E000:0-FFFF+F000:0-BFFC. Если она нарушена происходит запуск бутблока, расположенного по "самым" верхним адресам (F000:C000/E000-FFFF - последние 8/16kB), который производит инициализацию дисковода и пытается считать с него систему и/или запустить прошивальщик с прошивкой.

Отсюда ещё один интересный вывод: если вы хотите принудительно запустить бутблок (для перешивки) можно испортить CRC "вручную" - закоротив адресные линии "выше" бутблочных. Например, я обычно корочу рядом расположенные A15 и A16 (pin 2 и 3) . Объём бутблока = 16kB = 2^14 в результате чего он никак не пострадает, а контрольная сумма "остального", понятно, собъётся. Если вам не совсем понятно, зачем это может быть нужно, то когда столкнётесь с запаянной флэшкой, в которую залили "похожую" прошивку - поймёте. wink И, кстати, для линий адреса это (корочение) совершенно безопасно.

После проверки CRC биос "шадовится" (операция Shadow), т.е. происходит копирование содержимого флэшки в "реальную" память, сама флэшка отключается (южным мостом), а для того, чтоб программы поверили, что обращаются к ПЗУ на область адресов биос вешаются атрибуты ReadOnly посредством программирования регистров SB (и/или MSR процессора для AMD K7/K8). Вся дальнейшая работа происходит только с "зашадовленным" образом флэшки.

Вывод: Именно по этим причинам мы можем беспрепятственно вытаскивать флэшку, сразу же, как только увидим строчку "Starting Windows/DOS/linux".

Если же потребуется работа именно с самой флэшкой (например, запись в неё ESCD/DMI), то для этого используются соответствующие процедуры, специфичные для каждого чипсета - нужно будет опять подключить флэшку к шине и снова отключить после окончания операции.

Вывод: из-за различных способов программирования подключения/отключения флэшки (для различных чипсетов) прошивальщик должен уметь это делать, т.е. "знать" чипсет, на котором происходит перешивка.

Особенности программирования микросхем Intel 28Fxxx.

Если в вашей плате стоит флэшка от Intel - будьте трижды осторожны при прошивке. Дело в том, что интельные микросхемы используют аппаратную защиту бутблока. Что это значит? А это значит, что в них присутствует ещё один сигнал - RP# (pin 30) - разрешение на программирование бутблока. В двухмегабитках - это A17, 1Mbit - NC (NotConnected, не используется).

Т.е. для того, чтоб корректно прошилась вся_область_флэшки на ножке RP# должно присутствовать +12V. Именно это задают распространённые на многих Socket7-матерях перемычки с названием Flash Type: Intel / Non-Intel.

Вывод: Если в плате стоит Intel 28Fxxx, а разводка платы не предусматривала правильную коммутацию для программирования Intel-флэшей (что является очень распространённым явлением) - BIOS погибнет при первой же попытке перешивки без особых шансов на восстановление (на этой плате).

Для перешивки Intel 28Fxxx на таких платах (без разводки RP#) нужно подать на pin30 вручную +12V, но так, чтоб оно не пошло на саму плату (а это A17) - для это можно просто отогнуть эту лапку, т.е. чтоб она не втыкалась в сам разъём.

Программные особенности программирования флэшек.

Главный аспект, на который хотелось бы обратить внимание - флэшка не перепрограммируется "зараз" (сразу одним блоком) и, наоборот, нельзя перезаписать один отдельно взятый байт. Флэшка поддерживает лишь "блочную" запись (секторизация). У разных типов флэшек разная секторная организация. Например у распространённой Intel 28F001BX есть следующие блоки:

1. Первый блок, в начале, самый большой, "главный" - 112kB. В нём обычно располагается всё "тело" упакованного биоса (поэтому самый большой).

2. Дальше два одинаковых блока по 4kB - в этих адресах обычно хранятся изменяемые данные типа ESCD/DMI/CMOS/пароли и т.п.

3. Последний блок - 8kB - бутблок.

Т.е. говоря техническим языком - i28F001BX имеет организацию 112+4x2+8

Достаточно понятная и логичная организация: самый большой блок в 112kB, всё равно, переписывается лишь при обновлении биоса, дальше - постоянно изменяемые данные, потому сделаны два маленьких блока (чтоб легче и быстрей было перезаписывать эти "куски") и в конце - неизменяемый обычно бутблок (специально отдельно от других - для защиты биоса в смысле возможности запуска аварийного восстановления с дисковода) - он всегда сделан отдельно, что его "не трогали" при обычных перезаписях других блоков.

Некоторые флэшки имеют очень мелкую сеторизацию, например, та же SST29EE020 (2Mbit) имеет целых 2048 одинаковых секторов по 128 байт. Однако большинство, всё ж, придерживается организации схожей с вышеприведенной, потому как маленький блок имеет и свои отрицательные стороны (например, в плане более сложной защиты от перезаписи).

Часть четвёртая. "Хабовые" флэши.

Как всё было просто в старые добрые времена - шина адреса, шина данных, CE/WE/OE… wink Но прогресс (особенно в отдельно взятой фирме wink не стоял на месте и с появлением чипсетных наборов i8xx получило распространение это страшное и многим малопонятное название - "хабовые" флэшки.

LPC-интерфейс.

В конце 97-го года Intel решила, что у мощного процессора обязательно должен быть баальшой биос (4-8MBit и больше, хотя большинство фирм до сих пор используют в основном лишь 2Mbit), а для этого никак не хватит ног (для линий адреса) на широкораспространённых "обычных" PLCC32-флэшках. Сказано - сделано, так появился стандарт LPC (LowPinCount - "малоколичественноножное" соединение, хотя корпус по понятным причинам оставили прежним - PLCC32). Кроме возможности использования больших (до 4Gb!) объёмов флэшей одной из самых главных причин называлась скорая погибель ISA-шной шины, отстутствие которой снимало потребность разводить линии адреса/данных и позволяло ограничиться меньшим количеством линий для общения, в первую очередь, "мультика" (SuperIO) и южного моста (очевидная возможность же интеграции SIO в сам SB скромно умалчивалась;). В LPC для этого используется лишь пять проводов: LAD0-LAD3 + LFRAME# (поэтому "lowpin…"). Применительно к флэшам (т.к. использовать LPC-интерфейс могут разные устройства) этот стандарт вылился в следующее воплощение:



() - в скобках - значение ножки в режиме LPC или FWH

Как видно, такая флэшка может работать сразу в двух различных режимах - LPC-mode и PP-mode (Parallel-Programming). Режим работы выбирается уровнем на ножке IC (Interface Configuration Pin) во время старта компьютера- "0" - LPC-mode, "1" - PP-mode.

Режим PP наиболее близок к "обычным" флэшкам и совместим с ними по многим (но не по всем) ножкам, с учётом только того, что линий адресов всего 11 (0-10), но зато они мультиплексируются, т.е. сначала выдаётся/считывается значение A00-A10, а затем A11-A21. С учётом этого (мультиплексирования адресов) и "пропажи" сигнала CE всё остальное полностью аналогично "обычным" флэшкам.

В режиме LPC общение между мостом и флэшкой происходит лишь по четырёхбитной шине, а пятый LFRAME# служит в качестве стартового (для начала операции по обмену данными). Плюс LRESET# и LCLK#, которые полностью аналогичны своим собратьям на материской плате - вот и весь набор нужных проводов (остальные - опционально). В общем, это есть попытка максимально упростить интерфейс, но не скатиться до "абсолютно последовательного", типа I2C, оставив возможность использования даже режимов DMA и BusMaster-инга (которые могут использоваться, например, в устройствах типа DiskOnChip/LPC).

Режим PP используется при "заводской" прошивке флэшки (он, ведь, понятно - быстрей, что и важно при массовом производстве) , а LPC - при работе в составе плат. Только вот для работы с такими флэшами нужно, чтоб южный мост умел это делать - в результате такой стандарт стал реально популярен лишь с приходом популярного Nforce2 (потому как он никогда и не слышал про ISA-шину… smile

FWH-интерфейс.

В результате достигнутых высот в области стандартизации wink , компания Intel, с выходом чипсетных наборов i8xx продолжила нести знамя родителя новых стандартов. Так появился ещё один режим работы - FWH (FirmWareHub, от которого, собственно, и пошло название "хабовые"). Он был полностью аналогичен LPC электрически (по ножкам/разъёму), но (дальше сами догадаетесь;) - абсолютно _несовместим_ по протоколу передачи данных. Как можно прочитать в некоторых документах, это было сделано для возможности поставить в систему кроме LPC-устройства ещё и FWH, повесив их на одну и ту же шину (ведь они электрически совместимы, но при передаче пакетов данных каждый будет брать свой из-за разных протоколов), при чём "хабовых" флэшей можно было навешать до шестнадцати штук, т.к. в них появились дополнительные ID0-ID3 сигналы.

(прим. автора: все мои уколы в сторону родителя x86 просьба воспринимать как шутку, хотя как известно - в каждой шутке есть доля шутки… wink

см. рис. выше.

Как видно, картина совершенно аналогично LPC, только названия LAD0-3 + LFRAME# заменены на FWH0-3 + FWH4.

Режим PP совершенно тот же.

FWH отличается от LPC протоколом, т.е. все команды для операций имеют совершенно другие кодовые значения в полях обмена данными. Плюс возможность использовать несколько (до 16) FWH-устройств, благодаря введению новых "идентификационных" сигналов ID0-3. По умолчанию для работы в качестве флэшки на матплате принимается ID=0000 (что и запросто можно проверить, прозвонив соответсвующие ножки (9-12) на вашей интеловской плате (они все "на земле").

Вообще, универсальным способом отличить флэшку по типу хабовая/обычная можно просто прозвонив ножку pin28 - в хабовой она будет строго на земле, в то время как в "обычной" будет что-то в районе килоома ("звонить" надо в колодке самой матплаты, хотя некоторые флэшки тоже "звонятся" - для этого используйте pin16/28).

Собственный "перешивочный" комплекс.

Если вы по работе постоянно имеете дело с потребностью в перешивке могу дать несколько рекомендаций. Кто-то может посоветовать использовать в таком случае именно программатор, хотя я так не считаю и даже не советую. Для этого есть две простые и веские причины - во-первых, программатор не знает всех типов микрух (правильней, конечно - есть такие, что знают, но их цена исчисляется тремя нулями без преувеличения), во-вторых, даже не самый крутой программатор просто дороже.
Для перешивки 99.9% флэшек (к матплатам, конечно) вам понадобятся три платы:

1. Что-нибудь подревнее, под Pentium1 - для перешивки очень распространённых Intel-флэшей 1Mbit.

2. Что-нибудь под P2 с 2Mbit-ным биосом - для перешивки остальных "обычных" 1- и 2Mbit флэшек.

3. Что-нибудь под P3 из серии i8xx - для перешивки "хабовых" флэшек.

4. (Добавлен в последней версии статьи - прим.ред.) Что-нибудь на nForce (1/2/3).

В качестве п.1 я использую Asus на i430HX (конкретно - P55T2P4). Для таких случаев (1Mbit и /или Intel-флэшки) рекомендуется именно Asus по причине возможности использовать исключительно удобный асусовский прошивальщик - старый pflash или поновее aflash - элементарные в использовании, не пристают с глупыми вопросами и показывают адрес повреждённой области микросхемы в случае ошибки.

В качестве п.2 я использую плату на i440BX (конкретно - PCPartner-928). Она 2Mbit-ная, что позволяет шить и 1- и 2Mbit-ные "обычные" флэшки. Тип разъёма на ней DIP32, для перешивки PLCC32 используется переходничок PLCC32->DIP32, сделанный из старой неисправной платы с PLCC32 колодкой (см. фото).

Фото самодельного переходника PLCC32->DIP32 (сделан путём фигурной резьбы лобзиком по неисправным материнским платам;) плюс допаянные вручную ножки)



В качестве п.3 я использую плату на i820 (конкретно - Chaintech 6CTA2). На ней стоит i82802AB (4Mbit), что позволяет шить как сами интеловские "хабы" так и "хабовые" 2- и 4Mbit-ные флэшки.

В качестве п.4 я использую плату на nForce (первый который, но не принципиально) - Abit NV7-133R. Она предназначена для самых тяжёлых случаев - для перешивки "чисто" LPC-шных флэшек. /Просто многие (даже, видимо - большинство) производители плат на nForce1/2/3 (а LPC стал использоваться именно на них) обычно используют флэшки с поддержкой и LPC и FWH, что позволяет шить их на п.3)/.

Вообще никаких особых условий по выбору конкретной модели или фирмы (кроме случая с Асус для Intel-флэшей) нет. Не нужно стремится брать для такой цели "крутые" и "навороченные" платы. Нужно строго наоборот - чем "безвестнее" и примитивнее плата - тем более лучший получится из неё "программатор". Т.е. для этого просто идеальны всякие Акорпы да PCPartner-ы, а вот любые платы даже с минимальными "претензиями" всегда ухудшают "универсальность". Плюс, конечно, другим важным условием является хороший и удобный доступ к гнезду флэшки.

В качестве главного программного обеспечения используются amiflash (конкретно - версия 8.37, только с ключами). Он знает большинство чипсетов/флэшей и очень удобен в работе благодаря удобной коммандной строке (батфайлик для него прилагался выше).

Для редких случаев, когда не справляется amiflash (некоторые типы флэшек и/или экзотные чипсеты) - используется awdflash (обязательно с ключом /f).

Для тяжёлых случаев (как правило очень экзотные флэши/биосы/чипсеты, очень старые, либо, наоборот, самые новые матплаты) используется Uniflash. Он же может быть использован с целью визуальной проверки места проблем во флэшке. Плюс особенно стоит обратить на него внимание счастливым обладателям современных плат на Nforce2, использующие LPC-флэшки типа PMC (как правило - Epox/Gigabyte). PMC-шки умеют работать сразу во всех трёх режимах (LPC/FWH/PP) и, может быть, из-за этого часто "стандартные" прошивальщики некорректно их перешивают (а то и зависают в процессе перешивки) - uniflash же это делает исключительно корректно.

п.с. последние версии uniflash стали настолько корректными и удобными, что теперь я в основном только им и пользуюсь...

Экстремальные способы перешивки/восстановления.

В некоторых совсем клиниеских случаях приходится прибегать к использованию сразу двух прошивальщиков - например, прошиваете сначала с помощью amiflash, а после этого сразу же с помощью uniflash. После первой попытки амифлэш ругнётся, что прошил некорректно, а uniflash перешьёт уже корректно. В то время как другая последовательность действий (например, сначала uniflash, а потом amiflash и т.п.) может не принести должного результата. Это, скорей всего, связано с разными алгоритмами перешивки конкретных флэшей, когда одному прошивальщику удаётся правильно сделать первую часть операции, а другому - заключительную.
(п.с. и это всё, кстати, не бред сумасшедшего, а реальный опыт прошивки флэшей, например, типа AMD, имеющих нестандартную защиту от записи или флэшек, имеющих повреждённую и/или нестабильную область)

Когда у вас есть под рукой только "одномегабитная" плата, а нужно прошить двухмегабитку ("обычную") можно сначала прошить первую половину (1Mbit), а потом "отдельно", вторую половину. Для этого разбиваете файл биоса на две части (по 1Mbit=128kB) с помощью любого hex-редактора и прошиваете сперва последнюю часть. После этого коротите ножку 30 (A17 в 2Mbit и NC в 1Mbit) на землю и заливаете "начальную" половину.
(п.с. Ограничение данного способа может возникнуть, если флэшка не будет поддерживать нужную для такого случая секторизацию записи)

Другим развитием (вариантом) предыдущей ситуации может быть заливка лишь "конечной" части (по сути нам нужен лишь бутблок). После этого таким образом "недошитая" микросхема вставляется в родную плату, где автоматически из-за неоответствия CRC начнёт грузится бутблок. С помощь которого уже в родной плате всё можно будет банально восстановить "с дискетки".

Прошивка флэшек с различными напряжениями перерограммирования.

Различные типы флэшей рассчитаны на разные вольтажи программирования. Самые распространённые - это 12V/5V для старых плат, для современных, это 3.3V/3V/2.7V и меньше. Теоретически, для каждого типа нужно выставлять нужное конкретной флэшке напряжение с помощью перемычек на матплате (если такие, конечно, имеются). Практически же получается, что флэшки с более меньшим напряжением программирования совершенно благополучно шьются более высоким напряжением.

Т.е. если на матери стоит 5V-овая флэшка (например, большинство серии 29xxxx), то флэшки с более низким уровнем перепрошивки тоже на ней прошьются на ура без всяких претензий по его завышенному значению. И без хоть какой-то вероятности повреждения более низковольтных клиентов.

В случае обратного соотношения - перешивка 12V-овых флэшек на 5V-овых матерях (или с перемычками установленными на 5V) тоже часто имеет благополучный исход. Хотя здесь он уже и не является правилом - поэтому при программировании микросхем серии 28xxxx (большинство которых - 12V) - будьте бдительны по поводу правильно выставленных перемычек и не стоит пытаться их перешивать хотсвопом на современных платах (т.к. 12V-ые были лишь P1-P2), т.е. чем древней, тем больше шансов на корректную перешивку.

Если перемычки на плате не подписаны - можете просто померять напряжение на pin32 (справа сразу от ключа, если смотреть ключом вверх). В самом крайнем случае, если на плате нет перемычек - можно отогнуть эту ногу из сокета и подать на неё 12V "вручную" (например прямо от разъёма БП).
Категория: Интересного много | Добавил: Wrecker (01.05.2012)
Просмотров: 1164 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Поиск

Вход

Гость
  • Вход
  • Регистрация
  • Читаемое

    Категории

    Заходи не жди