Похоже, проект Uniflash загнулся - полтора года без обновлений. Потому, чтобы убить сразу несколько зайцев завожу тут подобную тему, которая не только есть продолжение юнифлеша, но и разбор на его базе процесса перешивки на "атомном" уровне, которое когда-то давно предполагалось при написании статьи по перешивке.
Чтобы отличать его от проекта uniflash, но в то же время отражать прямую преемственность не напрягая фантазию назвал как runiflash.
Итак, приступим. (Скачать исходники юнифлеша можно на родном сайте или здесь.) Излагать буду в "черновом" варианте, потому исправления, дополнения и опровержения приветствуются. После все внесется в статью по перешивке биос.
Процесс перешивки с "практическо-железной" точки зрения представляет собой доступ в те области памяти, которые в "нормальном" режиме недоступны. Чтобы получить к ним доступ (здесь и далее все подразумевает то, как сделано именно в юнифлеше, даже с учетом, что это может быть не самый лучший способ и т.п.) делаются следующие вещи:
1. Переходим в линейный режим памяти. У него могут быть разные названия (Linear/UnReal/Flat), но смысл один и тот же - 32-битный доступ. (в досе, ко всей памяти).
2. "Размапливаем" северный мост (если требуется).
3. "Размапливаем" южный мост (если требуется).
4. "Размапливаем" мультик (если требуется).
5. "Размапливаем" GPIO (если требуется).
Операция "размапливания" подразумевает программирование логики на доступ к самой FlashROM. Все эти процедуры "железозависимые" и с претензиями на реальную универсальность требуют учета всех возможных вариантов использования "защиты от записи". В частности, именно поэтому "размапливание" делится на подобны градации - специфичные для северника-южника-мультика-гпио (в "стандартном" случае размапливание подразумевает лишь южник).
Далее идут процедуры уже конкретно работы с микросхемой, которые так же специфичны для различных типов-производителей флэшек.
После для возможности корректной работы при выходе нужно будет "замапить" все до этого "размапленные" пункты и вернуться в "нормальный" режим (адресации, 16 бит).
Вот коротко так выглядит работа юнифлеша для нашей темы. Главный файл, который ответственный за прошивку - PCI.pas - его и по-тихоньку начнем разбирать.
{$R-}
unit PCI; { Unit to communicate with chipsets }
interfaceuses Award, AMIBIOS, AsusBIOS, Phoenix;Const PCICfIdx = $CF8; PCICfData = $CFC;
Var
NorthFunc, SouthFunc, LPCFunc: Word;
NorthPos,SouthPos,PMUPos,CurPCIROM,PCIROMBus,PCIROMDev,PCIROMFun,LPCBase: Byte;
CurrentChipset, CurrentPCICard: string;
WantToUseAMI, AMIUsed, ChipsetFound, ROMEnabled, PCIROMEnabled: Boolean;
WantToUseAsus, AsusUsed: Boolean;
AwardUsed: Boolean; {1.42re}
PhoenixUsed: Boolean;{1.43re}PCIROMs: array[1..20] of
record
MaxSize : LongInt;
VenID, DevID : Word;
Bus, Pos : Byte;
end;
BIOSID: array[1..8] of Char; {v1.34}Procedure OPortD( Prt : Word; Val : LongInt );
Function IPortD( Prt : Word ) : LongInt;
Function GetPCIRegD( Bus, Dev, Func, Reg : Byte ) : LongInt;
Procedure SetPCIRegD( Bus, Dev, Func, Reg : Byte; Value : LongInt );
Function LocatePIIX : {byte}Boolean; {v1.22 byte->boolean}
procedure GetBIOSID;
Procedure RomEnable( Map : boolean);
procedure ShadowDisable_Aladdin; {v1.31}
procedure ShadowRestore_Aladdin; {v1.31}implementation Uses Tools,Flash,Crt,DMI;
{ PortD[ x ] := y }
Procedure OPortD( Prt : Word; Val : LongInt ); Assembler;
Asm
DB 66H
MOV AX,WORD PTR Val
MOV DX,Prt
DB 66H
OUT DX,AX
End;{ y := PortD[ x ] }
Function IPortD( Prt : Word ) : LongInt; Assembler;
Asm
MOV DX,Prt
DB 66H
IN AX,DX
DB 66H
MOV DX,AX
DB 66H
SHR DX,16
End;Описание дальнейших процедур опускаю и опишу позже, дабы разбираться "от общего к частностям". Потому и переходим сразу к главной процедуре:
Begin
if Port[$CFB]<>$FF then {v1.26}
Port[$CFB]:=Port[$CFB] or $1; {Set PCI configuration mechanism #1}
{Locate north bridge}
For Pos_ := 0 to $FF do
If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $00 ) and $FFFF ) <> $FFFF then
If ( GetPCIRegD( $00, Pos_ shr 3,
Pos_ and $07, $08 ) shr 8 ) = $60000 then Break;
If Pos_ = $FF then {v1.22}
Begin
LocatePIIX := False;
Exit;
End
else LocatePIIX:=True;
NorthPos := Pos_;
{Get north bridge MID & DID}
NorthMan := GetPCIRegD( $00, NorthPos shr 3, NorthPos and $07, $00 );
NorthId := GetPCIRegD( $00, NorthPos shr 3, NorthPos and $07, $00 ) shr 16;
{Get north bridge rev ID}
NorthRev := GetPCIRegD( $00, NorthPos shr 3, NorthPos and $07, $08 );
{Locate south bridge}
For Pos_ := 0 to $FF do
If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $00 ) and $FFFF ) <> $FFFF then
If ( GetPCIRegD( $00, Pos_ shr 3,
Pos_ and $07, $08 ) shr 8 ) = $60100 then Break;
If Pos_ = $FF then {v1.22 for i430MX}
For Pos_ := 0 to $FF do
If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $00 ) and $FFFF ) <> $FFFF then
If ( GetPCIRegD( $00, Pos_ shr 3,
Pos_ and $07, $08 ) shr 8 ) = $68000 then Break;
If Pos_ = $FF then {v1.31 for old chipsets}
For Pos_ := 0 to $FF do
If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $00 ) and $FFFF ) <> $FFFF then
If ( GetPCIRegD( $00, Pos_ shr 3,
Pos_ and $07, $08 ) shr 8 ) = $00000 then Break;
SouthPos := Pos_;
{Get south bridge MID & DID}
SouthMan := GetPCIRegD( $00, SouthPos shr 3, SouthPos and $07, $00 );
SouthID := GetPCIRegD( $00, SouthPos shr 3, SouthPos and $07, $00 ) shr 16;
{Get south bridge rev ID}
SouthRev := GetPCIRegD( $00, SouthPos shr 3, SouthPos and $07, $08 );
CurrentChipset := '';
NorthFunc := 0; {No special treatment necessary}
SouthFunc := 0; {Same}
LPCFunc := 0; {v1.27}
NorthName:='';
SouthName:='';
LPCName:='';
Определяем имя и процедуры размапления (если она нужна) северника по его ревизии.
{Id northbridge}
If NorthMan = $8086 {Intel} then
Begin
case NorthId of {case v1.21}
$4A3: if NorthRev>=$10 then NorthName:='i82433NX' else NorthName:='i82433LX';
$122D: NorthName:='i82437FX';
$1235: NorthName:='i82437MX';
$1237: NorthName:='i82441FX';
$1250: NorthName:='i82439HX';
$7030: NorthName:='i82437VX';
$7100: NorthName:='i82439TX';
$7180: NorthName:='i82443LX/EX';
$7190, $7192: NorthName:='i82443BX/ZX';
$71A0, $71A2: NorthName:='i82443GX';
$84C4: NorthName:='i82454KX/GX';
$7120: NorthName:='i82810';
$7122: NorthName:='i82810-DC100';
$7124: NorthName:='i82810E';
$1130: NorthName:='i82815';
$2500: NorthName:='i82820';
$3575: NorthName:='i82830M';
$1A21: NorthName:='i82840';
$1A30: NorthName:='i82845';
$2560: NorthName:='i82845G/P';
$2530: NorthName:='i82850';
$3580: NorthName:='i8285xGM';
$3340: NorthName:='i82855PM';
$2531: NorthName:='i82860';
$2570: NorthName:='i82865'; {v1.34}
$2578: NorthName:='i82875';
$255D: NorthName:='iE7205';
$2578: NorthName:='iE7210'; {v1.39}
$2588: NorthName:='iE7221'; {v1.39}
$3592: NorthName:='iE7320'; {v1.39}
$2540: NorthName:='iE7500';
$254C: NorthName:='iE7501';
$2550: NorthName:='iE7505';
$3590: NorthName:='iE7520'; {v1.39}
$359E: NorthName:='iE7525'; {v1.39}
$0500: NorthName:='iE8870'; {v1.39}
$2580: NorthName:='i829xxx'; {v1.37}
$2590: NorthName:='i829xxxM'; {v1.39}
End;
End else
If NorthMan = $1106 {VIA} then
Begin
case NorthId of {case v1.21}
$505: Begin {v1.37}
NorthFunc := $0100; {VIA A8/A9 scheme}
NorthName:='VT82C505';
End;
$576: Begin
NorthFunc := $0100; {VIA A8/A9 scheme}
NorthName:='VT82C576M';
End;
$585: NorthName:='VT82C585VP/VPX';
$595: NorthName:='VT82C595/AMD-640';
$597: NorthName:='VT82C597';
$598: NorthName:='VT82C598(AT)';
$685: Begin
NorthFunc := $0100; {VIA A8/A9 scheme}
NorthName:='VT82C685';
End;
$501: NorthName:='VT8501';
$691: NorthName:='VT82C691/693(A)/694X/T';
$693: NorthName:='VT82C693(A)';
$601: NorthName:='VT8601';
$605: NorthName:='VT8605';
$391: NorthName:='VT8371';
$305: NorthName:='VT8363(A)/8365';
$3099: NorthName:='VT8366(A)';
$3091: NorthName:='VT8633';
$3101: NorthName:='VT8653';
$3102: NorthName:='VT8662';
$3103: NorthName:='VT8615';
$3112: NorthName:='VT8361';
$3133: NorthName:='VT3133';
$3148: NorthName:='VT8751';
$3128: NorthName:='VT8753(A)/8754';
$3189: NorthName:='VT8377';
$3205: NorthName:='VT8378';
End;
End else
If NorthMan = $1022 {AMD} then {v1.20}
Begin
case NorthId of {case v1.21}
$7006: NorthName:='AMD-751';
$700E: NorthName:='AMD-761';
$700C: NorthName:='AMD-762';
$7454: NorthName:='AMD-8151'; {v1.36}
End;
End else
If NorthMan = $1039 {SiS} then
Begin
SouthFunc:=$0503; {SiS reg. 45 bits 5,2}
case NorthId of
$496: Begin
NorthFunc := $0200; {SiS reg. D0 scheme}
SouthFunc := 0;
NorthName:='SiS 85C496+497';
End;
$406: Begin
SouthFunc := $0501; {SiS internal reg. 80h}
NorthName:='SiS 501/5101/5501';
End;
$5511: Begin
SouthFunc := $0502; {SiS internal reg. 50h}
NorthName:='SiS 5511';
End;
$5571: NorthName:='SiS 5571';
$5591: NorthName:='SiS 5591/5592';
$5596: Begin
NorthName:='SiS 5596';
SouthFunc := $0502; {SiS internal reg. 50h}
LPCFunc:=LPCDetect; {v1.27}
End;
$5597: NorthName:='SiS 5597/5598/5581/5120';
$0530: NorthName:='SiS 530';
$0540: Begin
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
NorthName:='SiS 540';
End;
$5600: NorthName:='SiS 600';
$0620: NorthName:='SiS 620';
$0630: Begin
NorthName:='SiS 630';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect; {v1.27}
End;
$0635: Begin
NorthName:='SiS 635';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0640: Begin
NorthName:='SiS 640';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0645: Begin
NorthName:='SiS 645';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0646: Begin
NorthName:='SiS 645DX';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0648: Begin {v1.31}
NorthName:='SiS 648';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0650: Begin
NorthName:='SiS 650';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0651: Begin {v1.31}
NorthName:='SiS 651';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0655: Begin {v1.31}
NorthName:='SiS 655';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0730: Begin
NorthName:='SiS 730';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0733: Begin {v1.31}
NorthName:='SiS 733';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0735: Begin
NorthName:='SiS 735';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0740: Begin
NorthName:='SiS 740';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0745: Begin {v1.31}
NorthName:='SiS 745';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0746: Begin {v1.31}
NorthName:='SiS 746';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0748: Begin {v1.31}
NorthName:='SiS 748';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
$0755: Begin {v1.31}
NorthName:='SiS 755';
SouthFunc := $0504; {SiS reg. 45 bits 7,6}
LPCFunc:=LPCDetect;
End;
End;
End else
If NorthMan = $10B9 {ALi} then
Begin
case NorthId of
$1451: begin
NorthFunc := $0300; {ALi Aladdin}
NorthName:='M1451';
end;
$1489: begin
NorthFunc := $0301; {ALi FinALi}
NorthName:='M1489';
end;
$1521: NorthName:='M1521';
$1531: NorthName:='M1531(B)';
$1541: NorthName:='M1541/1542';
$1561: NorthName:='M1561'; {v1.31}
$1621: NorthName:='M1621';
$1631: NorthName:='M1631';
$1632: NorthName:='M1632M';
$1641: NorthName:='M1641';
$1647: NorthName:='M1647';
$1651: NorthName:='M1651'; {v1.31}
$1671: NorthName:='M1671'; {v1.31}
$1672: NorthName:='M1672'; {v1.31}
End;
End else If NorthMan = $1166 {Reliance/ServerWorks} then {v1.25}
Begin
case NorthId of
$0007: NorthName:='Reliance NB6635';
$0008: NorthName:='Reliance NB6536';
End;
End else If NorthMan = $1066 {PicoPower} then {v1.25}
Begin
case NorthId of
$0001: NorthName:='Vesuvius V1-LS';
End;
End else If NorthMan = $1078 {Cyrix} then {v1.25}
Begin
case NorthId of
$0001: NorthName:='MediaGX';
End;
End else If NorthMan = $1045 {OPTi} then {v1.26}
Begin
case NorthId of
$C557: NorthName:='OPTi 82C557(M)'; {v1.37}
$C567: NorthName:='OPTi 82C567';
end;
End else
If NorthMan = $3388 {HiNT} then {v1.26}
Begin
case NorthId of
$8011: NorthName:='HiNT VXPro-II North';
end;
End else
If NorthMan = $1060 {UMC} then {v1.28}
Begin
case NorthId of
$8881: NorthName:='UMC UM8881F';
end;
End else If NorthMan = $1344 {Micron} then {v1.29}
Begin
case NorthId of
$3320: NorthName:='Micron MT8LLN21PADF';
end;
End else If NorthMan = $1080 {Contaq/Cypress} then {v1.29}
Begin
case NorthId of
$0600: begin {CY82C599}
NorthFunc := $0400;
NorthName:='CY82C599';
end;
$C691: NorthName:='CY82C691';
end;
End else If NorthMan = $10DE {nVidia} then {v1.30}
Begin
case NorthId of
$1A4: NorthName:='nVidia IGP';
$1E0: NorthName:='nVidia IGP2';
$D1: NorthName:='nVidia nForce3 Host Bridge'; {v1.41re}
$E1: NorthName:='nVidia nForce3 250Gb Host Bridge'; {v1.41re}
end;
End else If NorthMan = $1002 {ATI} then {v1.46re}
Begin
case NorthId of
... тут может быть ваш чипсет ...
end;
End;
apple_rom - Подскажи пожалуйста, "поделиться айдишниками вашего железа" - через что его смотреть и какие параметры нужны? Думаю что что то получится найти.
По "UMC UM8886AF/UM8881F - это чипсет для 486 процов" типа пример: ZIDA TD-4IP-UMC-AIO UM8881F/UM8886BF SOCKET 3 (486-586).
... дорогу осилит идущий, если есть верный друг, отличный конь, толковый мудрец и цель...
За название респект
run I flash - беги и шей(если криво перевести I)
Я хоть и не отношёсь к "знающим" но помочь могу. Вобщем чем смотреть айдишники?
Unknown Flash Type
P.S. apple_rom , спасибо что начал эту тему, прошивальщик мощный и хотелось бы чтобы он жил... =D>
... дорогу осилит идущий, если есть верный друг, отличный конь, толковый мудрец и цель...
Смотреть можно чем угодно, даже в свойствах винды (Пуск->Настройка->Панель управления->Свойства системы->Диспетчер устройств->Системные устройства->Свойства ХХХ-чипсет (ваш) CPU - PCI мост->Сведения->Коды (ID) оборудования->строчка PCI\VEN_xxxx&DEV_yyyy&REV_zz - эти XXXX|YYYY|ZZ и нужны). Хотя есть куча других способов, я лично всегда пользуюсь стареньким wpcredit).
Пишем правильно: мультиметр, тестер, цифровой осциллограф (недорогой осциллограф), доступ интернет, AMD-V, ноутбук Toshiba, Dell 500, вольтметр, пирометр, лазерная резка, компьютерная помощь, ремонт мониторов, паяльная станция, ноутбуки Sony, радиатор.
По этому "уникуму" с ходу и не скажу - позже, может чего вспомню или кто подскажет сам.
По сему поводу имеется такое:
HiNT HB1 Zero-Clock-Latency PCI-PCI Bridge
Preliminary Data sheet, Rev 1.1, Aug 4, 1999
Достоверно известна одна-единственная плата PCChips на этом чипсете, поэтому, если о нем забыть, то ровным счетом ничего не произойдет...
Открытая книга: icbook.com.ua
Продолжим. Дальше идет детект южников. Смысл последовательности понятен - детектируем само железо, чтобы знать как "добраться" ("размапить") до флэшки.
{Id southbridge} If SouthMan = $8086 {Intel} then Begin if (Hi(SouthId)=$24) or (Hi(SouthId)=$25) then SouthFunc := $0200 else SouthFunc := $0100; {v1.21} if Hi(SouthId)=$26 then SouthFunc := $1700; {v1.37} if Hi(SouthId)=$27 then SouthFunc := $1700; {v1.46re} if Hi(SouthId)=$28 then SouthFunc := $1700; {v1.46re} case SouthId of {case v1.21} $484: Begin if SouthRev<$88 then SouthName:='i82378ZB SIO' else SouthName:='i82379AB SIO.A'; SouthFunc:=$0104; {v1.29} End; $122E: Begin SouthName:='i82371FB PIIX'; Inc( SouthFunc ); {v1.23} End; $1234: SouthName:='i82371MX MPIIX'; $7000: Begin SouthName:='i82371SB PIIX3'; Inc( SouthFunc ); End; $7110: Begin SouthName:='i82371AB/EB PIIX4(E)'; Inc( SouthFunc, 3 ); if NorthName='i82439TX' then SouthFunc:=SouthFunc+$10; {v1.33} End; $2410: SouthName:='i82801AA ICH'; $2420: SouthName:='i82801AB ICH0'; $2440: SouthName:='i82801BA ICH2'; $244C: SouthName:='i82801BAM ICH2-M'; $248C: SouthName:='i82801CAM ICH3-M'; $2480: SouthName:='i82801CA ICH3-S'; $24C0: SouthName:='i82801DB ICH4'; $24CC: SouthName:='i82801DBM ICH4-M'; $24D0: SouthName:='i82801EB ICH5(R)'; $2640: SouthName:='i82801FB/R ICH6(R)'; {v1.37} $2641: SouthName:='i82801FBM ICH6-M'; {v1.39} $2642: SouthName:='i82801F(R)W ICH6(R)W'; {v1.37} $27B0: SouthName:='i82801GH ICH7DH'; {v1.46re} $27B8: SouthName:='i82801GB/R ICH7(R)'; {v1.46re} $27B9: SouthName:='i82801GBM ICH7-M'; {v1.46re} $27BD: SouthName:='i82801GHM ICH7-M DH'; {v1.46re} $2810: SouthName:='i82801HB/R ICH8(R)'; {v1.46re} $2811: SouthName:='i82801HBM ICH8-M'; {v1.46re} $2812: SouthName:='i82801HH ICH8DH'; {v1.46re} $2814: SouthName:='i82801HO ICH8DO'; {v1.46re} $2815: SouthName:='i82801HHM ICH8DH-M'; {v1.46re} $25A1: SouthName:='i6300ESB ICH'; {v1.39} $2670: SouthName:='i631xESB/632xESB/3100 ICH'; {v1.46re} End; End elseДля старых ("нехабовых") южников назначаем первую процедуру, хабовым - вторую. Начиная с ICH6 (приходом PCIe) процедура размапливания изменилась, потому им даем 17-ую процедуру.
Здесь и дальше номера берутся из самого унифлеша, стиль не изменяется, даже если он имеет "неоптимизированный ("кривой"
if Hi(SouthId)=$27 then SouthFunc := $1700; {v1.46re}
if Hi(SouthId)=$28 then SouthFunc := $1700; {v1.46re}
... продолжают такой "неуклюжий" код, чтобы проще были видны изменения.
В частности, не изменились ли процедуры размапления в добавленных 7 и 8-м ICH я еще не смотрел - разберемся вместе по ходу.
If SouthMan = $1106 {VIA} then Begin SouthFunc := $0300; {VIA/AMD method} case SouthId of {case v1.21} $586: SouthName:='VT82C586(A|B)/AMD-645'; $596: Begin SouthName:='VT82C596(A|B)'; Inc( SouthFunc ); End; $686: Begin SouthName:='VT82C686(A|B)'; Inc( SouthFunc ); End; $8231: SouthName:='VT8231'; $3074,$3147: begin SouthName:='VT8233(A|C)'; SouthFunc := $0310; LPCFunc:=LPCDetect; end; $3177: begin SouthName:='VT8235'; SouthFunc := $0310; LPCFunc:=LPCDetect; end; $3227: begin SouthName:='VT8237'; SouthFunc := $0310; LPCFunc:=LPCDetect; end; {v1.39} End; End elseВиашке назначаем 3-ю функцию. С приходом Vlink (первые DDR-платы) изменилась процедура - даем 10-ю подфункцию.
If SouthMan = $1022 {AMD} then {v1.20} Begin SouthFunc := $0300; {AMD/VIA method} case SouthId of {case v1.21} $7408: SouthName:='AMD-756'; $7410: SouthName:='AMD-766'; $7440: SouthName:='AMD-768'; $7468: SouthName:='AMD-8111'; {v1.36} end; End elseПодтверждение ранее сказанного о процессе разработок небогатой коллекции чипсетов АМД, которые "вытекали" из продуктов от VIA. Идентичные процедуры размапливания (та же 3-я функция) лишнее подтверждение тому.
If SouthMan = $1039 {SiS} then Begin case SouthId of {v1.21} $8: SouthName:='SiS South Bridge'; {any SiS South Bridge} $18: SouthName:='SiS 950'; {SiS 950 can have $8 or $18} $964: SouthName:='SiS 964'; {v1.35} End; End elseВнимательный читатель заметит - у сисов нет назначенных функций для южных мостов. Сначала это может показаться странным, но если вспомнить, что в первое время своей деятельности южники не были в почете (известный упор на одночиповые решения), потому и все нужные процедуры были перененены в вышеописанные процедуры размапливания для северников (т.е. см. выше SiS и станет понятно).
If SouthMan = $10B9 {ALi} then {v1.18} Begin SouthFunc := $0400; {ALi method} case SouthId of $1449: begin SouthName:='M1449'; SouthFunc:=0; end; $1523: SouthName:='M1523(B)'; $1533, $1543, $1535: begin SouthName:='M1533/1543/1535'; Inc(SouthFunc); end; end; End elseАлишкам - 4-ю функцию.
If SouthMan = $1055 {SMSC} then {v1.21} Begin If SouthId = $9460 then {SLC90E66} {v1.21} Begin SouthFunc := $0600; {SMSC method} SouthName:='SMSC SLC90E66'; End; End elseДалее идет экзотика.If SouthMan = $10AD {Winbond/Symphony Labs} then {v1.21} Begin If SouthId = $0565 then {W83C553F/4F} {v1.21} Begin SouthFunc := $0700; {Winbond method} SouthName:='Winbond W83C553F/4F'; End; End elseСедьмая...If SouthMan = $1283 {ITE} then {v1.21} Begin case SouthId of $8872 : Begin SouthFunc := $0801; SouthName:='ITE IT8871F/2F'; End; $8888 : Begin SouthFunc := $0802; SouthName:='ITE IT8888F'; End; End; End elseВосьмая...If SouthMan = $1166 {Reliance/ServerWorks} then {v1.24} Begin SouthFunc:=$0900; case SouthId of $0200 : SouthName:='Reliance OSB4'; End; End elseДевятая...If SouthMan = $1066 {PicoPower} then {v1.25} Begin SouthFunc:=$1000; case SouthId of $0002,$8002 : SouthName:='Vesuvius V3-LS'; End; End elseДесятая...If SouthMan = $100B {National} then {v1.36} Begin SouthFunc:=$1100; case SouthId of $0500 : begin SouthName:='Geode SCx200'; LPCFunc:=LPCDetect; end; $0510 : begin SouthName:='Geode SC1100'; LPCFunc:=LPCDetect; end; End; End elseОдиннадцатая...If SouthMan = $1078 {Cyrix} then {v1.25} Begin SouthFunc:=$1100; case SouthId of $0000 : SouthName:='Cyrix Cx5510'; {v1.36} $0002 : SouthName:='Cyrix Cx5520'; {v1.36} $0100 : SouthName:='Cyrix Cx5530(A)'; End; End elseТоже одиннадцатая. Кто застал-видел Сайриксы (цыриксы, куриксы и куча других словообразованийIf SouthMan = $1045 {OPTi} then {v1.26} Begin SouthFunc:=$1200; case SouthId of $C558: SouthName:='OPTi 82C558(M)'; $C568: SouthName:='OPTi 82C568'; end; End elseПродолжение экзотики - двенадцать...If SouthMan = $3388 {HiNT} then {v1.26} Begin SouthFunc:=$1300; case SouthId of $8012: SouthName:='HiNT VXPro-II South'; end; End;Тринадцать...If SouthMan = $1060 {UMC} then {v1.28} Begin SouthFunc:=$1400; case SouthId of $886A: SouthName:='UMC UM8886BF'; end; End elseЧетырнадцать...If SouthMan = $1344 {Micron} then {v1.29} Begin case SouthId of $3470: SouthName:='Micron MT7LLN22NCNE'; end; End elseНастолько древнее, что даже функции не досталось.If SouthMan = $1080 {Contaq/Cypress} then {v1.29} Begin SouthFunc:=$1500; case SouthId of $C693: SouthName:='CY82C693(U/UB)'; end; End elseПятнадцать.If SouthMan = $10DE {nVidia} then {v1.30} Begin SouthFunc:=$1600; case SouthId of $01B2: begin SouthName:='nVidia MCP/MCP-D'; SouthFunc:=$1601; end; {v1.41re} $0060: begin SouthName:='nVidia MCP2'; SouthFunc:=$1602; end; {v1.41re} $0080: begin SouthName:='nVidia MCP2A/MCP2S'; SouthFunc:=$1602; end; {v1.41re} $00D0: begin SouthName:='nVidia nForce3 LPC Bridge'; SouthFunc:=$1602; end; {v1.41re} $00E0: begin SouthName:='nVidia nForce3 250Gb LPC Bridge'; SouthFunc:=$1602; end; {v1.41re} $0050: begin SouthName:='nVidia nForce4 LPC Bridge'; SouthFunc:=$1602; end; {v1.45re} $0030: begin SouthName:='nVidia MCP-04'; SouthFunc:=$1602; end; {v1.45re} end; End;У нВидии - шестнадцатая. В 1.40 для нее не было подфункций, что не есть правильно, ибо размапливание с nForce2 изменилось (потому в моих версиях сделано разделение на первую для nForce(1) и вторую для остальных).
Мне, честно говоря, не до конца понятно, даже почему работает для первого nForce, т.к. размапливание делается не совсем точно "как надо", но для всех случае, что лично сталкивался - оно четко срабатывает. Потому по закону программизма и не стал "трогать то, что работает".
В будущем посмотрим и внесем добавления по пятому нФорсу.
Так же в будущем добавим раздел для атишек.
Пишем правильно: мультиметр, тестер, цифровой осциллограф (недорогой осциллограф), доступ интернет, AMD-V, ноутбук Toshiba, Dell 500, вольтметр, пирометр, лазерная резка, компьютерная помощь, ремонт мониторов, паяльная станция, ноутбуки Sony, радиатор.
apple_rom, к сожалению, виндовс уже давно не пользуюсь.
Гм. lspci вот что выводит на примере моего i865PE:
(только интересные строчки)
00:00.0 Host bridge: Intel Corporation 82865G/PE/P DRAM Controller/Host-Hub Interface (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev c2)
00:1f.0 ISA bridge: Intel Corporation 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge (rev 02)
00:1f.3 SMBus: Intel Corporation 82801EB/ER (ICH5/ICH5R) SMBus Controller (rev 02)
Что тут надо?
Затем делаю lspci -n (опция показа численных id'ов)
00:00.0 Class 0600: 8086:2570 (rev 02)
00:1e.0 Class 0604: 8086:244e (rev c2)
00:1f.0 Class 0601: 8086:24d0 (rev 02)
00:1f.3 Class 0c05: 8086:24d3 (rev 02)
И ещё бы хорошо было, если бы посоветовали утилитку для доса.
Unknown Flash Type
Далее идет кусок не относящийся конкретно к прошивке, но он имеет важное значение в определении самого "чипсетного набора", как практической функции идентификации неизвестных плат, потому несмотря на его объемность последовательно пройдемся по всем пунктам.
{Id chipset as a whole} CurrentChipset := ''; if (NorthName='i82433LX') and ((SouthName='i82378ZB SIO') or (SouthName='i82379AB SIO.A')) then CurrentChipset:='Intel Mercury 430LX'; if (NorthName='i82433NX') and ((SouthName='i82378ZB SIO') or (SouthName='i82379AB SIO.A')) then CurrentChipset:='Intel Neptune 430NX'; if (NorthName='i82437FX') and (SouthName='i82371FB PIIX') then CurrentChipset:='Intel Triton 430FX'; if (NorthName='i82437MX') and (SouthName='i82371MX MPIIX') then CurrentChipset:='Intel 430MX (mobile)'; if (NorthName='i82441FX') and (SouthName='i82371SB PIIX3') then CurrentChipset:='Intel Natoma 440FX'; if (NorthName='i82439HX') and (SouthName='i82371SB PIIX3') then CurrentChipset:='Intel Triton II 430HX'; if (NorthName='i82437VX') and (SouthName='i82371SB PIIX3') then CurrentChipset:='Intel Triton II 430VX'; if (NorthName='i82439TX') and (SouthName='i82371AB/EB PIIX4(E)') then CurrentChipset:='Intel Triton III 430TX'; if (NorthName='i82443LX/EX') and (SouthName='i82371AB/EB PIIX4(E)') then CurrentChipset:='Intel AGPSet 440LX/EX'; if (NorthName='i82443BX/ZX') and (SouthName='i82371AB/EB PIIX4(E)') then CurrentChipset:='Intel AGPSet 440BX/ZX'; if (NorthName='i82443BX/ZX') and (SouthName='SMSC SLC90E66') then CurrentChipset:='SMSC VictoryBX-66'; if (NorthName='i82443GX') and (SouthName='i82371AB/EB PIIX4(E)') then CurrentChipset:='Intel AGPSet 440GX'; if (NorthName='i82454KX/GX') and ((SouthName='i82379AB SIO.A') or (SouthName='i82371FB PIIX') or (SouthName='i82371SB PIIX3')) then CurrentChipset:='Intel 450KX/GX'; if (NorthName='i82810') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0')) then CurrentChipset:='Intel 810'; if (NorthName='i82810-DC100') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0')) then CurrentChipset:='Intel 810-DC100'; if (NorthName='i82810E') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0')) then CurrentChipset:='Intel 810E'; if (NorthName='i82810E') and (SouthName='i82801BA ICH2') then CurrentChipset:='Intel 810E2'; if (NorthName='i82815') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0')) then CurrentChipset:='Intel 815(P/G)'; if (NorthName='i82815') and (SouthName='i82801BA ICH2') then CurrentChipset:='Intel 815E(P/G)'; if (NorthName='i82815') and (SouthName='i82801BAM ICH2-M') then CurrentChipset:='Intel 815EM'; if (NorthName='i82820') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0')) then CurrentChipset:='Intel 820'; if (NorthName='i82820') and (SouthName='i82801BA ICH2') then CurrentChipset:='Intel 820E'; if (NorthName='i82830M') and (SouthName='i82801CAM ICH3-M') then CurrentChipset:='Intel 830M(P/G)'; if (NorthName='i82840') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0')) then CurrentChipset:='Intel 840'; if (NorthName='i82845') and (SouthName='i82801BA ICH2') then CurrentChipset:='Intel 845'; if (NorthName='i82845') and (SouthName='i82801DB ICH4') then CurrentChipset:='Intel 845E'; {v1.31} if (NorthName='i82845G/P') and (SouthName='i82801DB ICH4') then CurrentChipset:='Intel 845G(E/L/V)/845PE'; {v1.31} if (NorthName='i82845') and (SouthName='i82801CAM ICH3-M') then CurrentChipset:='Intel 845MP/MZ'; {v1.31} if (NorthName='i82850') and (SouthName='i82801BA ICH2') then CurrentChipset:='Intel 850(E)'; if (NorthName='i8285xGM') and ((SouthName='i82801DBM ICH4-M') or (SouthName='i82801DB ICH4') or (SouthName='i6300ESB ICH')) then CurrentChipset:='Intel 852GM(E)/855GM(E)'; {v1.31} if (NorthName='i82855PM') and (SouthName='i82801DBM ICH4-M') then CurrentChipset:='Intel 855PM'; {v1.31} if (NorthName='i82860') and (SouthName='i82801BA ICH2') then CurrentChipset:='Intel 860'; if (NorthName='i82865') and (SouthName='i82801EB ICH5(R)') then CurrentChipset:='Intel 865P(E)/G(V)/848P'; {v1.34} if (NorthName='i82875') and ((SouthName='i82801EB ICH5(R)') or (SouthName='i6300ESB ICH')) then CurrentChipset:='Intel 875P'; {v1.31} if (NorthName='iE7205') and (SouthName='i82801DB ICH4') then CurrentChipset:='Intel E7205'; {v1.31} if (NorthName='iE7210') and (SouthName='i6300ESB ICH') then CurrentChipset:='Intel E7210'; {v1.39} if (NorthName='iE7221') and ((SouthName='i82801FB/R ICH6(R)') or (SouthName='i82801F(R)W ICH6(R)W')) then CurrentChipset:='Intel E7221'; {v1.39} if (NorthName='iE7500') and (SouthName='i82801CA ICH3-S') then CurrentChipset:='Intel E7500'; if (NorthName='iE7320') and ((SouthName='i82801EB ICH5(R)') or (SouthName='i6300ESB ICH')) then CurrentChipset:='Intel E7320'; {v1.39} if (NorthName='iE7501') and (SouthName='i82801CA ICH3-S') then CurrentChipset:='Intel E7501'; {v1.31} if (NorthName='iE7505') and (SouthName='i82801DB ICH4') then CurrentChipset:='Intel E7505'; {v1.31} if (NorthName='iE7520') and ((SouthName='i82801EB ICH5(R)') or (SouthName='i6300ESB ICH')) then CurrentChipset:='Intel E7520'; {v1.39} if (NorthName='iE7525') and ((SouthName='i82801EB ICH5(R)') or (SouthName='i6300ESB ICH')) then CurrentChipset:='Intel E7525'; {v1.39} if (NorthName='iE8870') and (SouthName='i82801DB ICH4') then CurrentChipset:='Intel E8870'; {v1.39} if (NorthName='i829xxx') and ((SouthName='i82801FB/R ICH6(R)') or (SouthName='i82801F(R)W ICH6(R)W')) then CurrentChipset:='Intel 910/915/925 series'; {v1.37} if (NorthName='i829xxxM') and (SouthName='i82801FBM ICH6-M') then CurrentChipset:='Intel mobile 910/915 series'; {v1.39}Все достаточно понятно, опять же, уточнения приветствуются. И дополнения - по новым наборам, чтобы внести в нашу новую версию.
if (NorthName='VT82C505') then CurrentChipset:='VIA 486 chipset with VT82C505'; {v1.37} if (NorthName='VT82C576M') then CurrentChipset:='VIA Apollo Master'; if (NorthName='VT82C585VP/VPX') and (SouthName='VT82C586(A|B)/AMD-645') then CurrentChipset:='VIA Apollo VP/VPX'; if (NorthName='VT82C595/AMD-640') and (SouthName='VT82C586(A|B)/AMD-645') then CurrentChipset:='VIA Apollo VP2/AMD 640'; if (NorthName='VT82C597') and ((SouthName='VT82C586(A|B)/AMD-645') or (SouthName='VT82C596(A|B)')) then CurrentChipset:='VIA Apollo (M)VP3'; if (NorthName='VT82C598(AT)') and ((SouthName='VT82C596(A|B)') or (SouthName='VT82C686(A|B)')) then CurrentChipset:='VIA Apollo MVP3'; if (NorthName='VT82C685') then CurrentChipset:='VIA Apollo P6'; if (NorthName='VT8501') and (SouthName='VT82C686(A|B)') then CurrentChipset:='VIA Apollo MVP4'; if (NorthName='VT82C691/693(A)/694X/T') and ((SouthName='VT82C596(A|B)') or (SouthName='VT82C686(A|B)')) then CurrentChipset:='VIA Apollo Pro (Plus/133(A|T))'; if (NorthName='VT82C693(A)') and ((SouthName='VT82C596(A|B)') or (SouthName='VT82C686(A|B)')) then CurrentChipset:='VIA Apollo Pro Plus/133(A)'; if (NorthName='VT8601') and (SouthName='VT82C686(A|B)') then CurrentChipset:='VIA Apollo ProMedia'; if (NorthName='VT8605') then CurrentChipset:='VIA Apollo Pro 133Z/PM133'; if (NorthName='VT8371') and (SouthName='VT82C686(A|B)') then CurrentChipset:='VIA Apollo KX133'; if (NorthName='VT8363(A)/8365') and (SouthName='VT82C686(A|B)') then CurrentChipset:='VIA Apollo KT133(A)'; if (NorthName='VT8363(A)/8365') and (SouthName='VT8231') then CurrentChipset:='VIA ProSavage KM133(A)'; if (NorthName='VT8366(A)') and ((SouthName='VT8233(A|C)') or (SouthName='VT8235')) then CurrentChipset:='VIA Apollo KT266(A)/KT333'; (* if (NorthName='VT8366(A)') and (SouthName='VT8235') then CurrentChipset:='VIA Apollo KT333'; {v1.31}*) if (NorthName='VT8377') and (SouthName='VT8235') then CurrentChipset:='VIA Apollo KT400(A)'; {v1.31} if (NorthName='VT8378') and ((SouthName='VT8233(A|C)') or (SouthName='VT8235') or (SouthName='VT8237')) then CurrentChipset:='VIA UniChrome KM400(A)'; {v1.39} if (NorthName='VT8633') and (SouthName='VT8233(A|C)') then CurrentChipset:='VIA Apollo Pro 266'; if (NorthName='VT8653') and (SouthName='VT8233(A|C)') then CurrentChipset:='VIA Apollo Pro 266T'; {v1.31} if (NorthName='VT8751') and (SouthName='VT8233(A|C)') then CurrentChipset:='VIA ProSavage P4M266'; if (NorthName='VT8753(A)/8754') and (SouthName='VT8233(A|C)') then CurrentChipset:='VIA P4X266(A)/P4X333/P4X400';Аналогично - ищем новое, уточняем старое.if (NorthName='M1451') and (SouthName='M1449') then CurrentChipset:='ALi Aladdin'; if (NorthName='M1489') then CurrentChipset:='ALi FinALi 486'; if (NorthName='M1521') and (SouthName='M1523(B)') then CurrentChipset:='ALi Aladdin III'; if (NorthName='M1531(B)') and (SouthName='M1533/1543/1535') then CurrentChipset:='ALi Aladdin IV/IV+'; if (NorthName='M1541/1542') and (SouthName='M1533/1543/1535') then CurrentChipset:='ALi Aladdin V'; if (NorthName='M1561') and (SouthName='M1533/1543/1535') then CurrentChipset:='ALi Aladdin 7'; {v1.31} if (NorthName='M1621') and (SouthName='M1533/1543/1535') then CurrentChipset:='ALi Aladdin Pro/Pro II'; if (NorthName='M1631') and (SouthName='M1533/1543/1535') then CurrentChipset:='ALi Aladdin Pro III (TNT2)'; {v1.31} if (NorthName='M1632M') and (SouthName='M1533/1543/1535') then CurrentChipset:='ALi CyberBLADE Aladdin i1'; {v1.31} if (NorthName='M1641') and (SouthName='M1533/1543/1535') then CurrentChipset:='ALi Aladdin Pro IV'; if (NorthName='M1647') and (SouthName='M1533/1543/1535') then CurrentChipset:='ALi ALiMAGiK/MobileMAGiK 1'; if (NorthName='M1651') and (SouthName='M1533/1543/1535') then CurrentChipset:='ALi Aladdin Pro 5(T/M)'; {v1.31} if (NorthName='M1671') and (SouthName='M1533/1543/1535') then CurrentChipset:='ALi Aladdin-P4'; {v1.31} if (NorthName='M1672') and (SouthName='M1533/1543/1535') then CurrentChipset:='ALi CyberAladdin-P4'; {v1.31}Тут - только уточняем старое, в виду отсутствия нового.if (NorthName='AMD-751') and (SouthName='AMD-756') then CurrentChipset:='AMD 750'; if (NorthName='AMD-761') and (SouthName='VT82C686(A|B)') then CurrentChipset:='AMD 760 (VIA South)'; if (NorthName='AMD-761') and (SouthName='AMD-766') then CurrentChipset:='AMD 760 (AMD South)'; if (NorthName='AMD-762') and (SouthName='AMD-766') then CurrentChipset:='AMD 760MP'; if (NorthName='AMD-762') and (SouthName='AMD-768') then CurrentChipset:='AMD 760MPX'; if (NorthName='AMD-8151') and (SouthName='AMD-8111') then CurrentChipset:='AMD 8000'; {v1.36}Снова - аналогично.if (NorthName='SiS 85C496+497') then CurrentChipset:='SiS 85C496+497'; if (NorthName='SiS 501/5101/5501') and (SouthName='SiS South Bridge') then CurrentChipset:='SiS 501/5101/5501'; if (NorthName='SiS 5511') and (SouthName='SiS South Bridge') then CurrentChipset:='SiS 5511+5513'; if (NorthName='SiS 5571') and (SouthName='SiS South Bridge') then CurrentChipset:='SiS 5571'; if (NorthName='SiS 5591/5592') and (SouthName='SiS South Bridge') then CurrentChipset:='SiS 5591/5592+5595'; if (NorthName='SiS 5596') and (SouthName='SiS South Bridge') then CurrentChipset:='SiS 5596+5595'; if (NorthName='SiS 5597/5598/5581/5120') and (SouthName='SiS South Bridge') then CurrentChipset:='SiS 5597/5598/5581/5120'; if (NorthName='SiS 530') and (SouthName='SiS South Bridge') then CurrentChipset:='SiS 530'; if (NorthName='SiS 540') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 540'; if (NorthName='SiS 600') and (SouthName='SiS South Bridge') then CurrentChipset:='SiS 600'; if (NorthName='SiS 620') and (SouthName='SiS South Bridge') then CurrentChipset:='SiS 620'; if (NorthName='SiS 630') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 630'; if (NorthName='SiS 635') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 635'; if (NorthName='SiS 640') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 640'; if (NorthName='SiS 645') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 645'; if (NorthName='SiS 645DX') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 645DX'; if (NorthName='SiS 648') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 648'; {v1.31} if (NorthName='SiS 650') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 650'; if (NorthName='SiS 651') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 651'; {v1.31} if (NorthName='SiS 655') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 655'; {v1.31} if (NorthName='SiS 730') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 730'; if (NorthName='SiS 733') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 733'; {v1.31} if (NorthName='SiS 735') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 735'; if (NorthName='SiS 740') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 740'; if (NorthName='SiS 745') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 745'; {v1.31} if (NorthName='SiS 746') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 746'; {v1.31} if (NorthName='SiS 748') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 748'; {v1.31} if (NorthName='SiS 755') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950')) then CurrentChipset:='SiS 755'; {v1.31}Сис - он и в африке сис. Простой как шланг - при желании можно даже написать одну общую процедуру для всех названий, теперешних и будущих.if (NorthName='Reliance NB6635') and (SouthName='Reliance OSB4') then CurrentChipset:='ServerWorks ServerSet III LE'; if (NorthName='Reliance NB6536') and (SouthName='Reliance OSB4') then CurrentChipset:='ServerWorks ServerSet III HE'; if (NorthName='Vesuvius V1-LS') and (SouthName='Vesuvius V3-LS') then CurrentChipset:='National PicoPower Vesuvius-LS'; if (NorthName='MediaGX') and (SouthName='Cyrix Cx5510') then CurrentChipset:='Cyrix MediaGX + Cx5510'; {v1.36} if (NorthName='MediaGX') and (SouthName='Cyrix Cx5520') then CurrentChipset:='Cyrix MediaGX + Cx5520'; {v1.36} if (NorthName='MediaGX') and (SouthName='Cyrix Cx5530(A)') then CurrentChipset:='National Geode GX1 + CS5530(A)'; if (NorthName='MediaGX') and (SouthName='Geode SC1100') then CurrentChipset:='AMD Geode SC1100'; {v1.36} if (NorthName='MediaGX') and (SouthName='Geode SCx200') then CurrentChipset:='AMD Geode SC1200/2200/3200'; {v1.36} if (NorthName='OPTi 82C557(M)') and (SouthName='OPTi 82C558(M)') then CurrentChipset:='OPTi Viper M/N/NK/N+/DP'; if (NorthName='OPTi 82C567') and (SouthName='OPTi 82C568') then CurrentChipset:='OPTi Viper Max/Vendetta 82C750'; if (NorthName='HiNT VXPro-II North') and (SouthName='HiNT VXPro-II South') then CurrentChipset:='HiNT VXPro-II (Utron UT85C50x)'; if (NorthName='UMC UM8881F') and (SouthName='UMC UM8886BF') then CurrentChipset:='UMC UM8881F + UM8886BF'; if (NorthName='Micron MT8LLN21PADF') and (SouthName='Micron MT7LLN22NCNE') then CurrentChipset:='Micron Copperhead+Coppertail'; if (NorthName='CY82C599') then CurrentChipset:='Cypress 386/486 chipset'; if (NorthName='CY82C691') and (SouthName='CY82C693(U/UB)') then CurrentChipset:='Cypress hyperCache';Одним словом - экзотика и артефакты.А вот эту часть нужно дописать.
И написать - для атишек.
ChipsetFound := ( NorthName<>'' ) or ( SouthName<>'' ); {One of 'm might be enough} {If chipset ID failed then show north & south bridge name or ID} If CurrentChipset = '' then Begin If NorthName<>'' then CurrentChipset := NorthName + ' + ' else CurrentChipset := '(' + Hw( NorthMan ) + ',' + Hw( NorthId ) + ',' + Hb( NorthRev ) + ') + '; If SouthName<>'' then CurrentChipset := CurrentChipset + SouthName else CurrentChipset := CurrentChipset + '(' + Hw( SouthMan ) + ',' + Hw( SouthId ) + ',' + Hb( SouthRev ) + ')'; End; if LPCName<>'' then CurrentChipset:=CurrentChipset+' + '+LPCName; {v1.27}Просто для отображения названия чипсетной логики - если иденцифицирован хотя бы один из мостов - выводим его название, иначе - выводим их айдишники. Плюс вывод названия мультика в случае его наличия-определения.If PhoenixCheckFor then {v1.43re} Begin PhoenixUsed := True; ChipsetFound := True; CurrentChipset := CurrentChipset + ' [Phoenix BIOS]'; LogWrite('Phoenix flash interface enabled'); EXIT; End; If AwardCheckFor then {v1.42re} Begin AwardUsed := True; ChipsetFound := True; CurrentChipset := CurrentChipset + ' [AWARD BIOS]'; LogWrite('AWARD flash interface enabled'); End; If AMICheckFor then {v1.42re} Begin AMIUsed := True; ChipsetFound := True; CurrentChipset := CurrentChipset + ' [AMI BIOS]'; LogWrite('AMI flash interface enabled'); End; { If WantToUseAsus and AsusCheckFor then} {v1.39} If AsusCheckFor then {v1.42re} Begin AsusUsed := True; ChipsetFound := True; CurrentChipset := CurrentChipset + ' [ASUS FLASH]'; LogWrite('Asus flash interface enabled'); End; end;Определения типа биоса, что в будущем позволяет выбрать способ "размапливания" - "классический" (универсальный), который мы здесь и рассматриваем. Или специальная процедура из конкретного биоса под свою плату. Чтобы не уходить от темы пока опустим "неклассический" вариант, подразумевая именно универсальный способ.procedure GetBIOSID; var Buf: array[1..80] of Char; b,e: Byte; begin MoveLinBlockB($FFFFFFE8,LongInt(Seg(BIOSID)) shl 4+LongInt(Ofs(BIOSID)),8); {v1.34} if (BIOSID=#0#0#0#0#0#0#0#0) or (BIOSID=#$FF#$FF#$FF#$FF#$FF#$FF#$FF#$FF) then {v1.39} begin BIOSID:=#0#0#0#0#0#0#0#0; MoveLinBlockB($FEC71,LongInt(Seg(Buf)) shl 4+LongInt(Ofs(Buf)),SizeOf(Buf)); e:=Pos(#0,Buf)-1; b := e; while ((Buf[b]<>'-') or (e-b<3)) and (b>1) do Dec(b); if e-b>8 then e:=b+8; Move(Buf[b+1],BIOSID,e-b); end; GotoXY(73,23); Write(BIOSID); {v1.38} LogWrite('Detected Award BIOS ID: '+BIOSID); end;Для знающих аварбиос все просто - получаем его BIOSID.Var PIIXReg, PIIXReg2, PIIXReg3, PIIXReg4, PIIXReg5 : LongInt; {Generic Intel chipset low ROM enable & ROM write access enable} Procedure ROMEnable( Map : Boolean ); Var Mask : LongInt; Pos_: Byte; Begin if ROMEnabled=Map then Exit; {v1.22} if PhoenixUsed then {1.43re} begin if Map then PhoenixEnable else PhoenixDisable; ROMEnabled:=Map; Exit; end; if AwardUsed then {1.42re} begin if Map then AwardEnable else AwardDisable; ROMEnabled:=Map; Exit; end; if AMIUsed then begin if Map then AMIEnable else AMIDisable; ROMEnabled:=Map; Exit; end; if AsusUsed then begin if Map then AsusEnable else AsusDisable; ROMEnabled:=Map; Exit; end;Запуск самой процедуры "размапливания". Ну и, как видно, "замапливания" перед выходом.Возможности и варианты для "биос-специфичных" вариантов (неуниверсальных) пока по-прежнему не рассматриваем.
Далее идет наш главный код по размапливанию.
Добавлено спустя 7 минут 54 секунды:
Gordon01 и др.
Для интелов, это "минимум" с ICH6 (а лучше 7), для nVidia - от nForce4, АТИшки интересуют все, сисы от 76х и т.п. - смотреть самые последние строчки в соответствующих вашему железу разделах (которые здесь в сообщениях я писал), если ваше железо там есть, интересно лишь, ежели ваши данные отличаются от указанных в юнифлеше.
Интересуют "реально" новые платы.
Добавлено спустя 53 минуты 22 секунды:
Сначала идет код, "специфичный" для северников.
Здесь, видимо, стоит уточнить. В реальном коде (как это сделано в биосе) нет "отдельных" процедур - для северника, южника и т.д. Ибо это и бессмысленно делить в коде и даже некорректно где-то по определению. Но для написания именно _универсального_ прошивальщика нужно было "стандартизировать" подход размапливания и "классифицировать" его для всего многообразия "защиты от записи". Потому авторы юнифлеша, думаю, совершенно оправданно его так поделили (NB/SB/SIO/GPIO). И, в частности, именно поддержка совсем древнего железа потребовала "специфичных" для северника процедур размапливания. Потому и указанную "северную" часть стоит рассматривать лишь с точки зрения "было же время"...
{Chipset northbridge stuff} Case Hi( NorthFunc ) of $01 : begin {older VIA chipsets} if Map then begin Port[$A8]:=$11; PIIXReg:=Port[$A9]; LogWrite('VIA old method: internal reg $11 = '+Hl(PIIXReg)); {v1.28} Port[$A8]:=$11; Port[$A9]:=PIIXReg or $40; {ROM Write enable} Port[$A8]:=$11; LogWrite('VIA old method: internal reg $11 changed to '+Hl(Port[$A9])); {v1.28} end elseИтак, первая функция для северника - для артефактных виашек. Если сейчас размапливаем (Map = TRUE), то в порт 0A8h закидываем 11h, после чего считываем байт управления (скорей всего - если захотите убедиться - сами поищите и почитайте эти древние папирусы по инициализиции подобного железа
иначе (процедура замапливания - Map = TRUE):
begin Port[$A8]:=$11; LogWrite('VIA old method: restoring internal reg $11 from '+Hl(Port[$A9])); {v1.28} Port[$A8]:=$11; Port[$A9]:=PIIXReg; end; End;В байт управления загоняем ранее предварительно сохраненное в PIIXReg предыдущее состояние (что было до размапливания).
Думая понятно, но замечу - здесь и далее PIIXReg (и аналогичные) - просто банальные переменные для временного хранения.
$02 : Begin {SiS 85C496+497 chipset} {v1.21} If Map then Begin PIIXReg := GetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $D0 ); LogWrite('SiS old method: reg $D0 = '+Hl(PIIXReg)); {v1.28} {write enable, 384K enable} SetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $D0, PIIXReg or $F8 ); LogWrite('SiS old method: reg $D0 changed to '+Hl(GetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $D0 ))); End else Begin LogWrite('SiS old method: restoring reg $D0 from '+Hl(GetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $D0 ))); {v1.28} SetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $D0, PIIXReg ); End; End;Теперь для артефактных сисов.
***************************************************************
Здесь стоит подробней остановится на постоянно используемых функциях GetPCIRegD/SetPCIRegD.
{Read PCI configuration reg} Function GetPCIRegD( Bus, Dev, Func, Reg : Byte ) : LongInt; Begin OPortD( PCICfIdx, $80000000 or ( LongInt( Bus ) shl 16 ) or ( ( LongInt( Dev ) and $1F ) shl 11 ) or ( ( LongInt( Func ) and $7 ) shl 8 ) or ( Reg and $FC ) ); GetPCIRegD := IPortD( PCICfData ); End;{Write PCI configuration reg} Procedure SetPCIRegD( Bus, Dev, Func, Reg : Byte; Value : LongInt ); Begin OPortD( PCICfIdx, $80000000 or ( LongInt( Bus ) shl 16 ) or ( ( LongInt( Dev ) and $1F ) shl 11 ) or ( ( LongInt( Func ) and $7 ) shl 8 ) or ( Reg and $FC ) ); OPortD( PCICfData, Value ); End;Без четкого понимания механизма программирования PCI понять это невозможно. Сам алгоритм несложный, описание можно найти, например, здесь:
support.mdl.ru/PC_COMPL/doc/IndespPC.Bok/chapt24/chapt24.6.html
support.mdl.ru/PC_COMPL/doc/IndespPC.Bok/chapt24/chapt24.7.html
***************************************************************
Так вот, для сисов нужно установить разрешающие биты в RxD0 (что читается как регистр PCI по смещению 0D0h в конфигурационном пространстве северного моста в нашем случае). При "замапливании" - их (биты) нужно сбросить (установить в 0).
$03 : begin {ALi Aladdin and FinALi} if Map then begin if Lo(NorthFunc)=0 then begin {ALi Aladdin M1451/1449} {v1.31} ROMBase:=$E0000; ShadowDisable:=ShadowDisable_Aladdin; ShadowRestore:=ShadowRestore_Aladdin; Flash_Read:=FIMemB_Flash_Low; Flash_ReadBlock:=MoveLinBlock_From_Flash_D_Low; Flash_Compare:=CompLinBlocks_Flash_Low; PIIXReg := GetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $4C ); LogWrite('ALi old method: reg $4C = '+Hl(PIIXReg)); {E and F segment write shadow disable} SetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $4C, PIIXReg and $00FFFFFF ); LogWrite('ALi old method: reg $4C changed to '+Hl(GetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $4C))); end else begin {ALi FinALi 486 M1489/1487} {v1.28} ROMBase:=$FFFF0000; Flash_Read:=FIMemB_Flash_FinALi; Flash_Write:=FOMemB_Flash_FinALi; Flash_ReadBlock:=MoveLinBlock_From_Flash_D_FinALi; Flash_WriteBlock:=MoveLinBlock_To_Flash_B_FinALi; Flash_Compare:=CompLinBlocks_Flash_FinALi; Port[$22]:=$03; Port[$23]:=$C5; Port[$22]:=$12; PIIXReg:=Port[$23]; LogWrite('ALi old method: internal reg $12 = '+Hl(PIIXReg)); Port[$22]:=$12; Port[$23]:=PIIXReg or $11; Port[$22]:=$12; LogWrite('ALi old method: internal reg $12 changed to '+Hl(Port[$23])); Port[$22]:=$21; PIIXReg2:=Port[$23]; LogWrite('ALi old method: internal reg $21 = '+Hl(PIIXReg2)); Port[$22]:=$21; Port[$23]:=PIIXReg2 or $20; Port[$22]:=$21; LogWrite('ALi old method: internal reg $21 changed to '+Hl(Port[$23])); Port[$22]:=$2B; PIIXReg3:=Port[$23]; LogWrite('ALi old method: internal reg $2B = '+Hl(PIIXReg3)); Port[$22]:=$2B; Port[$23]:=PIIXReg3 or $20; Port[$22]:=$2B; LogWrite('ALi old method: internal reg $2B changed to '+Hl(Port[$23])); Port[$22]:=$03; Port[$23]:=$00; end; end else begin if Lo(NorthFunc)=0 then begin {ALi Aladdin M1451/1449} {v1.31} LogWrite('ALi old method: restoring reg $4C from '+Hl(GetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $4C ))); SetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $4C, PIIXReg ); end else begin Port[$22]:=$03; Port[$23]:=$C5; Port[$22]:=$12; LogWrite('ALi old method: restoring internal reg $12 from '+Hl(Port[$23])); Port[$22]:=$12; Port[$23]:=PIIXReg; Port[$22]:=$21; LogWrite('ALi old method: restoring internal reg $21 from '+Hl(Port[$23])); Port[$22]:=$21; Port[$23]:=PIIXReg2; Port[$22]:=$2B; LogWrite('ALi old method: restoring internal reg $2B from '+Hl(Port[$23])); Port[$22]:=$2B; Port[$23]:=PIIXReg3; Port[$22]:=$03; Port[$23]:=$00; end; end; end;Много непонятного и сложного для восприятия в случае старых алишек. Пропускаю этот момент, ибо, честно говоря - нет никакого желания разбираться. Хоть и буду признателен, ежели кто объяснит смысл такой "хитровывернутой" инициализации.$04 : Begin {Contaq/Cypress CY82C599} {v1.29} If Map then Begin Port[$22]:=$12; PIIXReg:=Port[$23]; LogWrite('Cypress old method: internal reg $12 = '+Hl(PIIXReg)); Port[$22]:=$12; Port[$23]:=PIIXReg and $EF; Port[$22]:=$12; LogWrite('Cypress old method: internal reg $12 changed to '+Hl(Port[$23])); End else Begin Port[$22]:=$12; LogWrite('Cypress old method: restoring internal reg $12 from '+Hl(Port[$23])); Port[$22]:=$12; Port[$23]:=PIIXReg; End; End; End;Сходное с виашной раз северников у экзотичного "контака".Далее идет "специфичные" процедуры для южников - основной смысл нашего разбора, потому на каждой будем останавливаться максимально подробно.
Пишем правильно: мультиметр, тестер, цифровой осциллограф (недорогой осциллограф), доступ интернет, AMD-V, ноутбук Toshiba, Dell 500, вольтметр, пирометр, лазерная резка, компьютерная помощь, ремонт мониторов, паяльная станция, ноутбуки Sony, радиатор.
по поводу PCI ID:
pciids.sourceforge.net/
members.datafast.net.au/~dft0802/downloads/pcidevs.txt
в этих ресурсах уже есть такой "свежак" как NF4
Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P
Все эти ссылки (точней - много больше) у меня есть. Потому просьба не "понтоваться" ссылками, а указать конкретные ID.
).
А еще лучше - прямо написать код (на паскале), чтобы соблюсти взятый стиль изложения (и мне легче будет
п.с. Думаю, после первых же попыток решить это "простую" задачу (найти PCI ID, особенно с учетом их разных значений и названий в разных источниках) станет понятно, почему я попросил "помощи клуба".
Добавлено спустя 2 часа 36 минут 37 секунд:
Итак, главная часть - размапливание южников.
{Chipset southbridge stuff} Case Hi( SouthFunc ) of $01 : Begin {Intel method} If Map then Begin Mask := $00440000; {write & 128k enable} If ( SouthFunc and 1 ) <> 0 then Mask := Mask or $800000; {512k enable} If ( SouthFunc and 2 ) <> 0 then Mask := Mask or $2000000; {1M enable} If ( SouthFunc and 4 ) <> 0 then Mask := $C00000; {v1.29} PIIXReg := GetPCIRegD( $00, SouthPos shr 3, SouthPos and $7, $4C ); LogWrite('Intel method: reg $4C = '+Hl(PIIXReg)); {v1.23} SetPCIRegD( $00, SouthPos shr 3, SouthPos and $7, $4C, PIIXReg or Mask ); LogWrite('Intel method: reg $4C changed to '+Hl(GetPCIRegD( $00, SouthPos shr 3, SouthPos and $7, $4C ))); {v1.23}Итак, подробненько разберем, чего здесь понаписано.
Код реально шибко неудобный, но мы решили от него отталкиваться, потому и на будущее не будем возмущаться и предлагать все переписать, а просто "переведем на нормальный".
Одна из главных неудобностей следующая.
Например, у нас в коде фигурирует Rx4C. И если мы глянем даташит на старенькие нехабовые южники (например, PIIX4 от i430TX/i440LX), как известно, флешка "сидит" на функции "PCI to ISA Bridge", в которой регистр 4С
обозначает "IORT—ISA I/O RECOVERY TIMER REGISTER" --- в результате мы долго будем чесать тыковку, каким боком он тут затесался.
А ларчик открывается просто - нужно учитывать факт работы юнифлешных функций с 32-битными данными для общения по PCI. В результате, если обратить внимание, то видно, что в маске идет работа только с двумя старшими байтами. С учетом 32-битных обращений 00440000h обозначает работу с регистром 4С плюс два байта (пропускаем два младших, что не используются - к ним всегда операция "OR 0"): 4Ch + 2 = 4Eh и 4Dh. Смотрим в даташите:
Rx 4E-4F: X-BUS CHIP SELECT REGISTER (FUNCTION 0)
This register enables or disables accesses to an external RTC, keyboard controller, I/O APIC, a secondary controller, and BIOS. Disabling any of these bits prevents the device’s chip select and X-Bus output enable control signal (XOE#) from being generated. This register also provides coprocessor error and mouse functions.
То что нам и нужно. Потому размапливание для нехабовых интелов осуществляется работой с этими двумя регистрами (Rx4E и Rx4F), устанавливая биты:
bit 2: BIOSCS# Write Protect Enable (от маски 00440000), при установке в 1 снимается защита от записи.
bit 6: Lower BIOS Enable. (от маски 00440000), при установке в 1 разрешается доступ к 1Мбитным биосам (объем флэши = 1Мбит = 128кБайт).
bit 7: Extended BIOS Enable. (от Mask or $800000;), при установке в 1 разрешается доступ к 2-4Мбитным биосам (объем флэши = 2Мбит и 4Мбит = 256кБайт и 512кБайт).
bit 9: 1-Meg Extended BIOS Enable. (от Mask or $С00000;), при установке в 1 разрешается доступ к 8Мбитным биосам (объем флэши = 8Мбит = 1МБайт).
Это и есть характерный показатель, в нем и заключается главный момент "размапливания" флэшки, а значит и основа для ее корректной прошивки - найти нужные битики, которые отвечают за подобные характерные области адресов - доступ к "верхнему" (а значит - флэшка) мегабиту, двум, четырем, восьми (в самых новых - шестнадцати и больше). После этого (установки данных битов) при обращении по ним (адресам) мы будем иметь дело именно с флэшкой и дальше уже нужно будет, используя специфичные для разных флэшей команды, осуществить ее детект/чтение/запись.
Пишем правильно: мультиметр, тестер, цифровой осциллограф (недорогой осциллограф), доступ интернет, AMD-V, ноутбук Toshiba, Dell 500, вольтметр, пирометр, лазерная резка, компьютерная помощь, ремонт мониторов, паяльная станция, ноутбуки Sony, радиатор.
rd480 интересен?
Выход обычно есть. Но он не работает.
А подружите с 6100, плз!
Имеется Foxconn 6100K8MB-RS (GF6100+nF410). В POST: C51MCP51-6A61HFKAC-00. Флэш: SST49LF004B (LPC 4Mb). Прекрасно шьется этим: Awdflash 8.67, Winflash 1.72 и Gwflash 1.08t. Uniflash 1.42re виснет на запуске. Uniflash 1.40 при запуске выдает "PCI chipset: (1022,1100,00)+(10DE,0261,A2)". Я бы добавил к последней строчке эти пресловутые "айдишники железа"
, но не совсем уверен, что точно понимаю, что же именно нужно. Может это? (кусок из репорта PCI32 1.1)
========================================
Vendor 10DEh Nvidia Corp
Device 02F1h C51 Host Bridge
Vendor 10DEh Nvidia Corp
Device 02FFh C51 Host Bridge
Vendor 10DEh Nvidia Corp
Device 0242h GeForce 6100
Vendor 10DEh Nvidia Corp
Device 0270h MCP51 Host Bridge
Vendor 10DEh Nvidia Corp
Device 0261h MCP51 LPC Bridge
Vendor 10DEh Nvidia Corp
Device 0264h MCP51 SMBus
Vendor 10DEh Nvidia Corp
Device 026Fh MCP51 PCI Bridge
Vendor 1022h Advanced Micro Devices (AMD)
Device 1100h Athlon 64 / Opteron HyperTransport Technology Configuration
========================================
Если это те самые IDs, у меня под рукой еще Jetway K8T800Pro/8237. Тож не работает (хотя ЮМ указан как поддерживаемый в 1.39).
Man is the dream of the dolphine (2469/15.17)
>Uniflash 1.40 при запуске выдает "PCI chipset: (1022,1100,00)+(10DE,0261,A2)"
Отлично, как раз то, что нужно!
>rd480 интересен?
Конечно (и еще более, чем нВидиа), повторюсь, как и все другие атишные чипсеты (в том числе с неатишными южниками).
Добавлено спустя 19 минут 41 секунду:
Добавляем полученные айдишники - например, детект южников будет теперь выглядеть так:
If SouthMan = $10DE {nVidia} then {v1.30} Begin SouthFunc:=$1600; case SouthId of $01B2: begin SouthName:='nVidia MCP/MCP-D'; SouthFunc:=$1601; end; {v1.41re} $0060: begin SouthName:='nVidia MCP2'; SouthFunc:=$1602; end; {v1.41re} $0080: begin SouthName:='nVidia MCP2A/MCP2S'; SouthFunc:=$1602; end; {v1.41re} $00D0: begin SouthName:='nVidia nForce3 LPC Bridge'; SouthFunc:=$1602; end; {v1.41re} $00E0: begin SouthName:='nVidia nForce3 250Gb LPC Bridge'; SouthFunc:=$1602; end; {v1.41re} $0050: begin SouthName:='nVidia nForce4 LPC Bridge'; SouthFunc:=$1602; end; {v1.45re} $0030: begin SouthName:='nVidia MCP-04'; SouthFunc:=$1602; end; {v1.45re} $0261: begin SouthName:='nVidia MCP51';{добавлено} SouthFunc:=$1602; end; {v1.46re} end; End;Добавлено спустя 2 часа 35 минут 20 секунд:
Продолжим разбирать юнифлеш. Мы остановились на размапливании нехабовых интеловских южников. "Классическое" размапливание уже разобрано, теперь много более сложный кусок, который очень важен для понимания принципов снятия защиты от записи у "брэндов". Т.е. кусок "шаманских действий", которые нужны, чтобы забороть добавленные "продвинутыми" производителями _дополнительные_ (т.е. помимо "стандартно" имеющихся) железные способы защиты флэшки от перезаписи, без которых невозможно "добраться" (корректно размапить) до флэши.
Именно этот _дополнительный_ код обычно отличает "брэндовые" системы от "простых". И именно поэтому в моих рекомендациях всегда я обязательно советовал - шить только на "небрэндовых" платах (где, соответственно, нет этой _дополнительной_ защиты).
PIIXReg4:=0; if Lo(SouthFunc)=3 then {v1.29} begin if (BIOSID='6A69KA19') {Abit BF6, BE6-II v1.0 and v1.1} or (BIOSID='6A69KA1B') {Abit BE6-II v1.2} or (BIOSID='6A69KA1C') {Abit BE6-II v2.0 and BX133-RAID} or (BIOSID='2A69KA1Q') {Abit ZM6} or (BIOSID='2A69KA1U') then {Abit BE6} begin PIIXReg2 := GetPCIRegD( $00, SouthPos shr 3, 4, $40 ); {v1.29} LogWrite('Intel method: PM Base = '+Hl(PIIXReg2)); if PIIXReg2=-1 then begin PIIXReg4:=1; SetPCIRegD($00,SouthPos shr 3,3,$40,$6101); SetPCIRegD($00,SouthPos shr 3,3,$80,GetPCIRegD($00,SouthPos shr 3,3,$80) or 1); LogWrite('Intel method: PM Base set to '+Hl(GetPCIRegD($00,SouthPos shr 3,3,$40))); PIIXReg3:=Port[$6134] or LongInt(Port[$6135]) shl 8 or LongInt(Port[$6136]) shl 16 or LongInt(Port[$6137]) shl 24; LogWrite('Intel method: GPO status '+Hl(PIIXReg3)); Port[$6135]:=Port[$6135] and $FD; Port[$6137]:=Port[$6137] and $FB; {Abit BX133-RAID v1.29} LogWrite('Intel method: GPO changed to '+Hl(Port[$6134] or LongInt(Port[$6135]) shl 8 or LongInt(Port[$6136]) shl 16 or LongInt(Port[$6137]) shl 24)); end; end; end; End elseНе совсем уклюжий, опять же, но код.
Итак, ранее (выше, мы разбирали) был детект BIOSID, который как раз и используеются здесь, для "конкретизации" нашего универсального прошивальщика. Это значит, что авторы юнифлеша просто раскопали, как снимается _дополнительная_ защита от записи для конкретных абитовских плат и добавили ее снятие, которое применяется, как видно, только конкретно к этим платам. И применяется банально просто - по биосайди - если оно такое, то кроме "классического" размапливания проводим и _дополнительную_ процедуру (упомянутые "шаманские действия").
ВАЖНО: Что будет, если мы не проведем эти _дополнительные_ действия сказать сложно (как раз такое и происходит, когда прошивальщие "не до конца" знает плату). Можно точно сказать, что корректно прошить микросхему точно НЕ ПОЛУЧИТСЯ. А в большинстве случаев (если не было _дополнительного_ размапливания) не получится даже просто задетектить флэшку. И никакие принудительные установки типа флэши ("-force XXXX" и др. подобные ключики в прошивальщиках) тут не помогут - мы _не_добрались_ до флеши, потому и прошить не сможем.
Теперь по коду _дополнительного_ размапливания Абитов (BF6/BE6-II/ZM6/BX133). Для защиты используется обычные GPO.
Почему не пользоваться имеющимся - не знаю, можно предположить - просто для "перестраховки".
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GPO - General Purpose Output. По-простому это можно описать следующим образом. Помните, в антикварных компьютерах (до Pentium включительно) была просто тьма перемычек? А потом они "куда-то" исчезли, породив ставшие впоследствие стандартными "Jumper Less"-системы. Вот именно "в GPO" они и исчезли. GPO - это те же самые перемычки, только "внутричипсетные". Которые нам и нужно программно переставить в нужное положение. Именно это и делает приведенный _дополнительный_ кусок кода для некоторых абитных плат.
****************************************
Итак, разберем юнифлешовый способ переключения GPO-шных перемычек (установки оных для разрешения записи биоса). Код достаточно странный, но, что есть то есть.
Сначала получаем базовый адрес Power Management-a (Rx40 южника, третья функция) для того, чтобы... его потом поменять на свой.
Меняем его на свои 6100h (единичка на конце - это ReadOnly бит, потому запишется именно 6100). Теперь мы можем пользоваться областью портов 6100 для "нашего" PowerManagement-a. Предварительно сохраняем "родное" значение базового адреса PM, чтобы после (при выходе и "замапливании") все вернуть на родину.
Включаем доступ к "нашим" регистрам PM - Rx80 (MISCELLANEOUS POWER MANAGEMENT), бит 0 = Power Management IO Space Enable.
Сохраняем на будущее все GPO (т.е. запоминаем положение всех "внутричипсетных" перемычек, чтобы после наших манипуляций вернуть все как было).
GPO лежат смещению 34-37h:
7.2.16. GPOREG—GENERAL PURPOSE OUTPUT REGISTER (IO)
I/O Address: Base + (34h, 35h, 36h, 37h)
Default Value: 7FFFBFFFh
Attribute: Read/Write (Byte accesses only)
Видимо больше по приколу (хотя может и из маниакально-педантических соображений - для "экономии памяти"), но все четыре байта GPO засовываем в одну временную переменную PIIXReg3 (которая Dword).
И, наконец, виртуально снимаем перычку(-и) защиты от записи:
Port[$6135]:=Port[$6135] and $FD;
Port[$6137]:=Port[$6137] and $FB;
Все, "шаманские действия" закончились (про постоянное логгирование по ходу юнифлеша - думаю понятно, потому не комментирую).
Операция получилась мудреная, но, видимо, сказался опыт работы с большим количеством систем, потому логичная привычка максимальной перестраховки и породила такой достаточно "заумный" код.
Для сравнения приведу "реальный" код размапливания в самом биосе:
Как видно, все проще. Но мы же не ищем простых путей.
Пишем правильно: мультиметр, тестер, цифровой осциллограф (недорогой осциллограф), доступ интернет, AMD-V, ноутбук Toshiba, Dell 500, вольтметр, пирометр, лазерная резка, компьютерная помощь, ремонт мониторов, паяльная станция, ноутбуки Sony, радиатор.
apple_rom
там надо будет в специфических типах защиты еще IDшки добавить (точно для каких-то Абитов - надо форум перечитывать)
Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P
и про MSI не забудьте
особенно которые старших ревизий на VIA694x
Либо нечему гореть, либо нечем поджечь!
Подсоединил тут Jetway K8T8AS (K8T800Pro/VT8237). U1.40 опознает чипсет и флешку правильно (U1.42re виснет на старте), но вот если сделать дамп прошивки, в файле оказывается мусор. Строка PCI chipset такая: "(1106,0282,00)+ VT8237 + ITE IT8700F/05F".
И из отчета PCI32:
=========================================
Vendor 1106h VIA Technologies Inc
Device 0282h K8T880Pro CPU to PCI Bridge
Vendor 1106h VIA Technologies Inc
Device 3227h VT8237 PCI to ISA Bridge
=========================================
Man is the dream of the dolphine (2469/15.17)
вспомнил что же за матери Uniflash - не брал:
MS-6368, Abit ST6/SH6/SA6/SL30T (и пр. абиты на 815-м), были косяки с MS-6337 (я вроде 1-ю ревизию юзал)...
PS: наверное, есть смысл сделать дебуг ключики вроде /MSI_1 , /MSI_2 и /ABIT_1, /ABIT_2 для тестирования систем защиты от записи некоторых неподдерживаемых мамок...
Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P
Шьется штатным awdflash, uniflash 140 нормально работает, про 141 и 142 re докладывал в ветке по их альфе...
Выход обычно есть. Но он не работает.
Просьба не воспринимать етот пост как "понт сцылками" ибо вижу ето полезным для менее знающих,ето в добавку УРЛ которые РууТ дал:
:idea: pcidatabase.com/ :idea:
For LINUX : leenooks.com/PCI+id
Мои ID's :
Desktop :
Если что то не надо, модеры-потрите, если нужны дампы то нет проблем.
нужны лишь следующие айдишники:
-> "CPU to Host Bridge" (или чуть другие - все по-разному называют, но смысл такой же) - это для детекта северного моста.
-> "PCI to ISA Bridge" или "LPC Controller" (или чуть другие - все по-разному называют, но смысл такой же) - это для детекта южного моста.
Редактировано apple_rom
Intel(R) 82801EB LPC Interface Controller - 24D0
Chip: Intel Corporation 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge
Full Details
PNP ID
VEN_8086&DEV_24D0&SUBSYS_00000000&REV_02
На будущее: не надо интелов, если только самые-присамые последние (ICH8/9) - они достаточно хорошо докуменитрованы. apple_rom
Добавлено спустя 1 час 41 минуту 5 секунд:
Мои HP PAVILION Лаптоп :
RADEON IGP 320M
Unknown Device and Vender, PNPID: VEN_1002&DEV_4336&SUBSYS_0024103C&REV_00
Full Details
PNP ID
VEN_1002&DEV_4336&SUBSYS_0024103C&REV_00
PCI standard host CPU bridge
Unknown Device and Vender, PNPID: VEN_1002&DEV_CAB0&SUBSYS_00000000&REV_13
Full Details
PNP ID
VEN_1002&DEV_CAB0&SUBSYS_00000000&REV_13
Какой смысл от "Unknown Device and Vender" и неизвестной модели ноутбука???. apple_rom
Добавлено спустя 18 часов 8 минут 28 секунд:
еше один из моих десктопов:
VIA Standard Host Bridge
Unknown Device and Vender, PNPID: VEN_1106&DEV_3168&SUBSYS_00000000&REV_82
Full Details
PNP ID
VEN_1106&DEV_3168&SUBSYS_00000000&REV_82
VIA Standard PCI to ISA Bridge
Unknown Device and Vender, PNPID: VEN_1106&DEV_3177&SUBSYS_00000000&REV_00
Full Details
PNP ID
VEN_1106&DEV_3177&SUBSYS_00000000&REV_00
Виашки как и интелы тоже особенно не нужны, тем более, что их нонче свежих то практически и нет. apple_rom
Добавлено спустя 2 часа 11 минут 53 секунды:
еше один десктоп :
SIS PCI to ISA bridge
Unknown Device and Vender, PNPID: VEN_1039&DEV_0008&SUBSYS_00000000&REV_00
Full Details
PNP ID
VEN_1039&DEV_0008&SUBSYS_00000000&REV_00
PCI standard host CPU bridge
Unknown Device and Vender, PNPID: VEN_1039&DEV_0735&SUBSYS_00000000&REV_01
Full Details
PNP ID
VEN_1039&DEV_0735&SUBSYS_00000000&REV_01
Если внимательно посмотреть, я писал, что у сисов крайне "рабочекрестьянкая" идентификация - большинство южников имеет айдишник 0008, а северник соответствует своему же числу, итого из приведенного получаем банальный SiS735 (опять же, без модели - зачем?) . apple_rom
Добавлено спустя 1 час 49 минут 48 секунд:
и еше один:
PCI standard host CPU bridge
Unknown Device and Vender, PNPID: VEN_1022&DEV_1100&SUBSYS_00000000&REV_00
Full Details
PNP ID
VEN_1022&DEV_1100&SUBSYS_00000000&REV_00
PCI standard ISA bridge
Unknown Device and Vender, PNPID: VEN_10DE&DEV_0050&SUBSYS_00000000&REV_A3
Full Details
PNP ID
VEN_10DE&DEV_0050&SUBSYS_00000000&REV_A3
Опять без модели. Хоть по айдишникам понятно - nForce4-система. apple_rom
"there are 10 types of people-who can read binaries and who cannot"
www.google.com
Выход обычно есть. Но он не работает.
Можно внести посильный вклад в общее дело?
Поскольку у меня в ремонте бывают самые различные модели компов вот что пишет Uniflash перед зависанием "PCI chipset: (1022,1100,00)+(10DE,0050,A2)".
Мать Asus K8N4-E Deluxe rev. 1.01 (nForce4-4X CK8-04)
В копилку (если надо):
Материнская плата ASUS A8N-E (чипсет nForce4 Ultra, AMD):
UniflashRE v1.42 (перед тем как зависнуть) выводит следующее:
PCI chipset: (1022,1100,00) + (10DE,0050,A3) [AWARD FLASH]Кроме того, определяется также модель и ревизия мат. платы:
ASUSTeK Computer INC. A8N-E 2.XXP.S.
А ссылочку на UniflashRE v1.45 (или какая там последняя) никто не кинет? Или в первом посте (где-нить в начале) вписать... Tnx!
Мои выкладки были не совсем правильно поняты - код юнифлеша я рассматриваю пока именно для объяснения принципов работы на самом низком (почти самом
Хотя все, кто вникнет в суть излагаемого сможет самостоятельно написать для себя любимого и своей платы конкретный код, применив таким образом "классический" (а значит - и самый стабильный) способ перешивки с учетом специфики своей платы. Это, кстати, относится и ко всем, кто по ходу просил "добавить такую-то плату-чипсет" - вы _уже_ можете это сделать _самостоятельно_ добавив нужное, как я описывал выше в доступные исходники Uniflash_1.40 и скомпилировать в "Uniflash_1.40_My_Revision".
Добавлено спустя 40 минут 15 секунд:
Для всех - хороший пример самого хорошего способа помочь:
запускаем последний Uniflash (как минимум 1.40) - если он не распознал ваш чипсет (в этом случае вместо названия пишутся айдишники северника + южника в скобках) - вот именно их и присылайте, это как раз то, что нужно.
В частности, для nForce4 (и вариантов на нем):
(1022,1100,00) = AMD Athlon 64 / Opteron HyperTransport Technology Configuration
(10DE,0050,xx) = nVidia nForce4 PCI to ISA Bridge
Северник так детектится по простой причине особенностей AMD K8 платформы (встроенного контроллера памяти, который раньше всегда был самой главной частью северного моста) и наш старенький юнифлеш не в курсе про это. Но пока не будем отвлекаться, позже можно будет изменить алгоритм детекта для более корректного детекта AMD_K8-систем.
Пишем правильно: мультиметр, тестер, цифровой осциллограф (недорогой осциллограф), доступ интернет, AMD-V, ноутбук Toshiba, Dell 500, вольтметр, пирометр, лазерная резка, компьютерная помощь, ремонт мониторов, паяльная станция, ноутбуки Sony, радиатор.
Все понял, модели напишу/анкноун уберу (едит)
"there are 10 types of people-who can read binaries and who cannot"
www.google.com
Uniflash не пашет на KT7A & Co
Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P
То есть снимать лучше самим UniFlash? Тестить уже вышедшие RE на новых не будем?
Выход обычно есть. Но он не работает.
Кстати - у ivp есть KT7A.
P.S. Я уж и забыл... Илья - как там она? И веник.... В личку кинь.
А кому счас легко...
savely_s
Скинул...
- Ситчик веселенький есть?..
- Приезжайте, обхохочетесь!..
Тема интереснейшая...
обнаружил серьезную багу в Uniflash 1.40&URE1.41/1.42:
на MSI K7D Master с ключом /PCIROM шьются не Oprional PCI ROM PCI-карточек, а БИОС мамки с тем же размером... Странная тема
А я ведь так там силикон-3112 хотел зашить (начиная экшперименты с красной референсной(?) карточкой от geodimetr'a)
Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P
Отправить комментарий