找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 11285|回复: 2

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
$ V8 Z, h2 W' U- K3 @  S( p4 L9 u$ l( c  x9 n, w. T" p$ A# c
  .model small
& Z$ j; W. l+ E2 I6 m  .386, ]2 E' D3 S( B& r6 ?3 i9 j# c
  CFG_ADDR EQU 0CF8h4 |; |, W6 ]% b+ Z) |3 f, C7 B
  CFG_DATA EQU 0CFCh
( |( ]$ w5 c' a  SMBUS_BUS EQU 0
2 `* q. s4 r8 W8 [; }4 z  SMBUS_DEVICE EQU 310 K  b( W9 J8 d
  SMBUS_FUNC EQU 36 ]" F8 i* B. ?4 O0 @
  & R; d9 j. b8 X. r* p6 s- W9 J% s9 V
  .stack 100h9 N  ?7 _8 T, F2 H4 P& n' m
  .data. X6 L6 h; ^3 U; [" q4 n$ p* s( _/ s
base dw ?  ;smbus I/O space3 A5 \9 I! l# f7 h9 E3 F. Z# M
num  db 0  ;byte select% K6 q+ N( G: p
SmbStatus db ?5 J# Q; k5 E" l
2 [* W, ]- X% G, ]
  .code
# C+ f$ d5 H8 ~2 e4 F 8 r9 K) q5 j) v9 \, u( x# B3 V4 ?
LF_CR MACRO
/ \0 _5 _% k' B: u$ m: Q) ^% X  pusha7 S. N: i* q: U' H% [' ]% g* ]: b
  mov     dl,0dh      
' z* V. f: U. I% A6 `, ]) P mov     ah,2
1 j" q" W% X" I! A' m5 P  int     21h
) J7 W9 t! a& f  mov     dl,0ah   ;next line   
' K: |# i2 o4 U8 b% A9 u  mov     ah,2
; v9 [  m& _! R2 g  int     21h
- e$ D% u) g0 L( }& D  popa  $ f8 R! c) l; ?, B/ q9 Z% `
     ENDM
: }0 b: N* |- V- @0 X2 l& v* i$ G4 C4 M) }' Y
* S! z; a4 h% W
main proc far$ N0 V% I# P: U; G  Z# W
mov ax,@data& T+ g+ c! g$ L% b) e: J
mov ds,ax/ M2 T' ]  \0 x3 C, `4 h# ]

) A2 t' m, r; Q2 b mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h5 H) U9 n6 N! q  t/ ~: p
mov dx,CFG_ADDR
6 i& Y5 F% X; [% ? out dx,eax
* ~' q# ?7 B9 d, ` mov dx,CFG_DATA
! M+ Y' F* d/ P0 y9 ` in eax,dx4 A8 y4 E9 u* ?9 P" U
  
9 G9 Q3 o% f- K shr ax,5     ;bit 15-5,the base address, v& h2 H/ h' X5 v( x0 H
and ax,0000011111111111b
. D' u$ G- u3 f2 a* D; i; U mov base,ax
9 [$ g0 a1 ^; S9 ?0 G  
  g  F) o+ K  z! |% k call ReadSpd
" g; @. ^) ^7 D! T" e0 U9 S% [exit:
1 `/ ]- O; ]) Q6 j6 J mov ax,4c00h2 L6 f/ V) ]' a+ u% J: K
int 21h4 _; i8 a6 w( A! t" u
main endp7 w. @' r' X$ U) ]

) ^/ C- f( N% {% L) |; \- D5 U# i+ c
8 a% m) U5 A, h9 `- U) u  L
ReadSpd proc% j6 m- l+ R1 S( `5 K
pusha
4 ?3 S: x/ p4 i) ~2 x4 n' |* KAgain:
. y  b8 s2 W  M! b3 O1 N mov ah,num9 x1 w* u% @" `4 i3 R
  and ah,00001111b2 r6 I& w) y  {; D9 H
.if(ah==15d) ;CR_LF7 h% }" q) c: ^  O
  LF_CR. a& L  C% ^$ V! D* s
.endif. M$ E" k* H, Q9 O
+ `3 H% P3 X0 B
.repeat
9 p! t5 c4 P0 j% a( t  mov dx,base   ;reset host,claim host in use
, V) j& C" i6 M/ N2 Y+ a  add dx,0- B8 z1 @# @" N! w8 U9 S  Q
  mov al,40h
$ L) l) v. P8 O- X  out dx,al* t- m( A% ~; j( I. R
  
0 u- m, i1 G) r/ ]  Z  mov dx,base   0 d8 Q, a: Y: [: X0 c
  in al,dx* s$ q: L8 x& N/ d" |( b* n* ^9 z
  mov SmbStatus,al
; k6 k; [+ P9 v) l2 i3 X* ]  
, ~4 \. n( I3 X% [/ |9 X  mov dx,base   ;clear all status bits
3 j/ R( F7 C- n$ S  mov al,1Eh   ;host status register' B/ W9 `0 A  u( r9 U+ k" N
  out dx,al
: V8 |9 V# s, n' b& g  / z" Y7 s" I2 ^# ^, S( L+ V
  mov dx,base   ;set offset to read & H# b; I  X5 o+ W6 R
  add dx,3    ;host command register
! G* C# j( h7 S  mov al,num7 W; e- s# B. o+ J" o; B
  out dx,al4 I2 N# q8 F3 j  l  g4 K( Z& f
  : u" e, x# [- L* V. ]9 O
  mov dx,base   ;Transimit Slave Address register' D  y$ E, n8 B# |
  add dx,45 \" {# A+ w5 ]
  mov al,0a1h2 f8 m# ]2 P1 I8 B' t" y, [
  out dx,al
$ s+ M5 P- \; V5 Z5 a# c/ O& L/ }  % Y5 ]7 B2 [! F$ Q  M. Q3 g
  mov dx,base   ;set "Read Word" protocol and start bit6 w& V( p$ d$ ?! `, O" o8 ~
  add dx,2    ;Host Control register
$ E5 i/ u2 [3 T( Q8 J0 D# d0 F  mov al,48h  - R5 s5 B+ p+ K3 `9 u# }6 I
  out dx,al
6 Q( m  A0 ]7 v1 I 3 U$ p- i  D$ k3 p, @5 W. w
3 w7 H7 h* s  X: p1 n# i; I
  3 i/ F4 v' v) N9 g. d- A. \1 Z
  mov dx,base/ N2 g' J% Z% h
  in al,dx: z# U3 b& ?3 N- b
  mov SmbStatus,al: c: O. m+ a- ]; ~+ b( X5 R$ D
  and al,1Eh+ G9 L) N# Z4 t1 I7 }: \! C
  .while (al==0) ;check repeatly until any of+ Q0 q3 Z! D& X0 j0 _+ K
    mov dx,base      ;FAIL,BERR,DERR,INTR
' P) k. H6 ]+ S    in al,dx' {. e: W! ~5 Y- c
    mov SmbStatus,al
- X' w6 M, h# p9 E    and al,1Eh ; }- b; X2 c5 F2 w  A& P$ q
  .ENDW
. ]. [, [0 |: {' ]  
& m: c$ R1 b4 L! b' I9 ^  mov al,SmbStatus   
2 R0 r$ O& o- a+ z4 W! a0 P/ Z' J  and al,1Ch
/ d( O) h" C$ \3 A* R  .if (al!=0)    ;check for errors  5 R. @7 X; e8 C/ [- p8 s# O
   mov al,SmbStatus3 v6 ?8 f5 _/ Z' l% P
   and al,08h   8 U# G, P5 X' v
   .continue .if (al!=0)  ( {! a3 f# h0 {; t; c! j" M
   jmp @F  
( r7 b! C; n$ O  ~ .else1 N+ R/ i+ t/ f! q  q1 R4 ]
  mov dx,base
$ k1 r& o7 M+ R' @4 g: _" Y/ @  add dx,5h# D; g: d8 f* X( ]2 ]4 I. c
  in al,dx  / C/ z/ e/ r/ t
  call binhex / z% Y- A+ f4 B, [
  .break3 I3 c! d! v: g: A
.endif* q4 k9 r0 O8 C0 U
  
. I- B) k4 q$ I9 P& }/ Z# ]. w  .until (0)
5 O, k5 \" g' ]: y" c" K& r( ^0 Z  
, `0 d6 E7 W8 }% {" q# h . c/ ?8 ?3 j. m6 U" J+ C
: v6 M) J- l# x+ H( d. _7 r
mov dl,20h ;output a space% y$ @: q- O1 j. v$ K" `$ ^$ I( {
mov ah,2% I2 q$ Z0 D' y- [$ T, c6 j
pusha
2 k) V$ u) R9 }. Z& R6 P int 21h8 l( B7 w: {6 I4 m# A9 O; G
popa
& m5 y! q6 L- M6 x+ S. \ inc num
6 }2 `2 G/ n0 M, }, d3 e2 A
2 C. g) y; x! R# K cmp num,80h ;get first spd 128 bytes
- _8 e' L  H' V' L jnz Again. A  L8 o5 n1 D7 U1 m

2 G. Q$ k; k0 N1 q& L' }% z' g0 s@@:
& Z' B" \  P# N9 ~6 B8 | popa0 V" c) h8 r3 C: V  G
ret
  a! G) n" h$ lReadSpd endp; g+ _" \) ~6 B8 z5 a7 W
4 u. w2 C; m! P; [' E. x5 r

" W2 u; t# p: k' D; A- X0 U4 S
8 _/ A+ f7 O6 e* mbinhex proc
* j1 `5 f- G! C: L( {) X pusha
. h2 y2 x1 {3 {/ z( x
1 M+ L- g% o% ~1 S$ p) e) d/ J mov ch,2 ;2 hexadecimal digits to be printed
2 ]* y0 I' Y' _1 V* y4 Z: M7 wloop3:0 T7 `$ G; H5 z0 u& E
mov cl,4 ;bits to be shifted
, Y7 ?; z8 g  }. C- d$ t+ s rol al,cl
2 _3 \& O+ y& L+ s: \9 ? mov bl,al
. t9 Z2 F% d, p# x+ `8 m- _* d. d and bl,0fh ;mask the 4-bit Msb1 r3 k) n' G6 v; {0 U' Z
add bl,30h
% O8 G* _6 i, g0 R5 m cmp bl,3ah
, F# e# }8 {7 t$ q4 q jl next1  ;number or alpha?" L, x- E& t( W3 G( ]
add bl,7
+ S( Q$ {% y0 ~/ X' t  @1 Rnext1: ' ~' e" m7 R6 D$ |4 i% ~+ u) D
mov ah,2  ;print one hexadecimal digit
! f( ^, @, z$ o- q/ F  L mov dl,bl
6 I0 ~( A/ M) d4 Y1 D2 @! b pusha( N6 Y4 C1 D% g/ f8 ^* F0 F0 ?% e
int 21h
, x' l6 B2 i6 k* \5 I/ e% Q/ H# K popa9 n$ @5 f" z9 ]- L0 Y2 h( O
dec ch0 s/ J! r+ I' U  H  X" {
jnz loop3# ]3 Z, O# i" b9 t9 T* G
popa& X, l* j- c" @  R' r4 Y, O
ret: C* Y$ ]1 f% F  T7 e$ ?" M
binhex endp9 h% w* s# H. g. h  w0 J0 K9 ~0 e/ Z
   end main
 楼主| 发表于 2009-7-21 12:30:37 | 显示全部楼层
问题已解决
回复

使用道具 举报

发表于 2009-7-21 13:40:23 | 显示全部楼层
我做过一个可以支持SIS968/962/961 VIA8235 Intel ICHx/ICH7/8/9 ATI SB400/600 NV CK804的SPD tool.  ICH9的读法应该是和ICH7/8一致的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-4-4 14:31 , Processed in 0.560412 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表