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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
1 |  l$ |8 [1 K  k
% c$ l- s- z6 ~# \  .model small
& `! Z* o9 h2 a; o8 S  .386
/ ?  |* D2 h; H% {- r* X  CFG_ADDR EQU 0CF8h
3 e  D4 N3 |% ?- j( h  CFG_DATA EQU 0CFCh$ }  H" f; L* V  u1 n
  SMBUS_BUS EQU 0
9 r3 h- `+ B# U* v" A1 G- W! f  SMBUS_DEVICE EQU 31
! B# U9 r) H2 J# V  SMBUS_FUNC EQU 3
/ N' J1 f& e1 p$ U3 e9 [  ; p0 ]9 @4 k) X5 s# m/ W
  .stack 100h
- u% w, }* k# a7 U. [" j( c  .data# X( X  n5 H9 u8 ]. S" C7 i+ m
base dw ?  ;smbus I/O space. b" ~( C6 `& h6 e
num  db 0  ;byte select
/ ~& O4 C/ j# dSmbStatus db ?
8 r& }0 w$ W' y$ a- J5 g, m
; v6 c+ B8 F( M, N  .code7 q: R' k6 e- }. E* A

+ A6 T; }+ Z7 d" n1 K' lLF_CR MACRO/ ^3 k5 R% x0 O$ Z% s: a" b, A7 l4 k
  pusha
2 W( s7 r. c$ N0 n2 B9 z3 V  mov     dl,0dh      
: p3 {5 A3 }  | mov     ah,2# Z$ b* y) @+ B7 k% C; Z/ R
  int     21h
1 U# K. t" j9 z' v6 y$ m5 A  mov     dl,0ah   ;next line   7 J+ R- m. V7 i
  mov     ah,2! J1 Y" b0 P8 G
  int     21h# ~+ I8 A# |. u+ p0 W; O. M6 R' [) s
  popa  . v5 r! D/ U' y+ `4 I1 s
     ENDM" a7 c1 V' w" t2 @
9 A8 v3 `9 o: r' V8 w- j

. X8 S* I8 I6 C  Mmain proc far7 l3 G$ ^# U* S3 z  B$ M( M
mov ax,@data
, R* C5 ?7 y. V# `  a  H; o: o mov ds,ax
5 i' {% i9 l7 Q& y& S6 M3 \ : s+ X) \$ W, K) g
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h: o4 E' A% M) o) X; d0 O
mov dx,CFG_ADDR
% m/ ^" V" p, F' W out dx,eax' b4 }- F+ ^+ t7 u, ?: ^
mov dx,CFG_DATA/ h3 p5 W7 F$ W  V7 [
in eax,dx1 \+ }. p- C, W9 E: g
  0 p8 m: [# d  h9 X, \* r
shr ax,5     ;bit 15-5,the base address
5 z  k5 K0 H% g5 O, l6 F and ax,0000011111111111b9 z" P3 s9 |) g! U) |4 i$ r  `
mov base,ax5 J1 F- T; }2 O
  # c4 ~+ t  _* Z3 p1 Z( s9 D
call ReadSpd
8 Z: f2 @2 g; V0 x0 w  v  Hexit:8 e$ C" p% U# i2 {& @' }8 |
mov ax,4c00h
0 G. Q2 x5 z& i7 S2 f int 21h' v" Y. f5 T$ M
main endp
! S/ }6 S5 ?( R8 r3 d1 z$ d* k
0 j: \, r  ~2 r) B  T" f2 e* m- J* }: p  X* @1 B2 T
+ u9 g/ x+ _3 i  g/ q0 O1 K, D3 K
ReadSpd proc
" \! c" E2 h/ m6 j* L1 D pusha0 x. }7 C+ T1 t/ K' W9 u) X
Again:
4 j3 p  J2 A- H/ D: q mov ah,num
: r! f. i" ^8 S# h0 N7 _  and ah,00001111b  o# W5 b& y3 ]
.if(ah==15d) ;CR_LF
& h7 W( e  f& G  LF_CR
) m. r- x) k6 i' f3 m& \ .endif
1 F8 c+ j& q3 P! [; K" q
: {4 O0 @9 W! Q; ? .repeat
* G7 {& b& }# \/ j; ^' o  mov dx,base   ;reset host,claim host in use
- y' p4 K( I4 m& z/ `  add dx,0
7 M! V$ z6 A  y  mov al,40h3 z. N) a8 C" r' E1 s6 e/ E* C" I
  out dx,al
' |7 ]) H: ]! W  
2 x. x; X* [* q1 e2 ^  mov dx,base   
# h3 j; }( y2 ^$ I  in al,dx0 \9 s0 q8 [* |% f6 U  D
  mov SmbStatus,al
8 ~9 G' t2 K% Y0 Q3 z; v  
2 J6 B6 M+ c/ p$ O3 v  mov dx,base   ;clear all status bits* ^* |. e8 H- W0 H8 Z3 l8 H
  mov al,1Eh   ;host status register
$ I; O. g' R* h9 _1 e5 {  out dx,al' ]- o: \. n- O, z) U+ M
  
5 C) l; z+ j) h  y" L, m$ e- u  mov dx,base   ;set offset to read ; T0 B5 W# R; @1 K+ v
  add dx,3    ;host command register
( ]# ]9 h# o+ b% Z8 `  mov al,num6 q- {# x/ ]% P$ j0 M7 @
  out dx,al: z$ k3 l5 I+ |
  
& n# I# |7 u9 j9 t/ T  mov dx,base   ;Transimit Slave Address register/ V* W( B- @; E0 C8 Y. ?: ?/ u
  add dx,4% N) W1 \1 U. q( f$ r8 r
  mov al,0a1h
8 S' a* e" z. G9 ?  out dx,al- a, U; O7 V0 h* V( x; T+ Z
  ) ?7 I. n) F2 z( f1 r5 j7 d
  mov dx,base   ;set "Read Word" protocol and start bit
  m8 ]! M$ M( {- B1 b+ q" D% K& A9 O( A2 |  add dx,2    ;Host Control register4 f. S) `7 W7 g! ^  u4 B) E5 \
  mov al,48h  # p% h" w) G7 ?+ K, }2 \$ l
  out dx,al
0 M0 p3 t7 b  w' m: ~. p1 T+ X6 C; \ & e  r$ L, ]1 |1 V/ [

2 ?- S. L7 Z: ?' k2 R$ a4 I9 F  
- Q6 l* ]5 L4 R- K1 G  mov dx,base4 N8 ?+ o* H. s* I1 \" j9 s, N! U# n
  in al,dx+ s  t" H) U4 n$ g
  mov SmbStatus,al
) H) Z& J% H0 J; }1 N  and al,1Eh
  A5 E( m  }, X  .while (al==0) ;check repeatly until any of; O& e+ ], ~. t
    mov dx,base      ;FAIL,BERR,DERR,INTR
  f2 Q# s* W1 @; s' I- b, q5 [1 ?    in al,dx
) I( @  G- l2 _" |6 L  N% z    mov SmbStatus,al# w, A5 H+ Y; r2 D/ R  t
    and al,1Eh " ^& O% m/ T& ]- P8 M9 d8 v
  .ENDW  v5 a$ ~# u: Q' Y" z9 `& y
  
( Y9 r7 W4 q- n/ D  mov al,SmbStatus   + I5 [% a: J9 j: c! ?. ^) D; o
  and al,1Ch
! Q+ ?# B, ]4 B  x  .if (al!=0)    ;check for errors  
' W  \( j) `/ {& b, B. F# a# n# V: Q   mov al,SmbStatus5 t: y  E2 z; J9 }$ d& V# i
   and al,08h   ! K% a- i: r+ ^: {& `
   .continue .if (al!=0)  9 a4 F6 X, t# p" g' l2 B7 g) [& H
   jmp @F  7 h& x  w  ]+ Y; u9 q/ A' T+ h
.else
$ G4 f& n3 ^+ h4 J  mov dx,base
$ S# {7 v5 Z. Q/ v# l  add dx,5h
# J$ t7 A" g! L8 A* J  in al,dx  + H+ q+ O1 v, Y5 k# T9 w
  call binhex " ?) U$ q" |! C: S* I
  .break: P; S" u4 I4 L6 x8 l9 V( Z2 p: V8 Y+ o
.endif* l- A2 [6 k  N9 V& ~1 p- W" ]
  
8 o0 M& e& e( c( _  [# d  .until (0) ' k$ \% l1 V  h5 K' s) b
  
  l9 N: R$ O+ m# e' c" Q ) }: t% X% g; ~# k4 V

. @5 M2 P% T) v: W. J3 b mov dl,20h ;output a space. B4 Q( F- T4 o" ~
mov ah,26 X& P/ `4 f9 U
pusha
" S% L* c- J. E, z6 } int 21h. ^* ]+ p$ g2 b3 _2 S
popa1 t- D8 b( g# }, b9 H& i
inc num
- j9 c& \/ q" ]! Z
8 w! F" J- P' E cmp num,80h ;get first spd 128 bytes 0 p' ]; `- j1 J! m: a# Q$ z7 r
jnz Again& b$ B) X' ]7 o5 c
9 {% O5 w1 o0 P
@@:$ U2 }, s: d! A+ W
popa
8 Q, m; K8 z1 _1 M! Q0 ^1 ?3 w) e ret% P. U, s2 o3 h' D# I
ReadSpd endp5 z2 Z9 |& G9 `) r/ k" J4 t
! r- C: {; n; g8 J) ?

7 U, ?$ d+ e0 g) W) A8 [* _8 D4 m8 _/ g& a3 _
binhex proc
2 K; K, p- n9 X1 ?2 S pusha & g9 h) q  l; ?1 o
  o2 z6 k7 s; }' r( B# O* M
mov ch,2 ;2 hexadecimal digits to be printed
* m) X( v6 h9 u8 x+ kloop3:/ L1 Y4 k! d# x$ ~0 }9 q$ e9 p
mov cl,4 ;bits to be shifted
3 L) a! i' q* g7 v7 f3 X/ t; Q- C' \ rol al,cl
' l/ \  N/ X' n1 H& a7 F mov bl,al& X1 [4 |: q( W& L
and bl,0fh ;mask the 4-bit Msb/ |, N3 d4 Y) S# @+ R' S
add bl,30h
/ ~5 Z5 h$ J2 [; |$ K4 t/ R cmp bl,3ah
' A: `+ d" x+ t3 g3 j9 A3 K, L jl next1  ;number or alpha?5 |# q" ?( w5 |% m% X# q8 o
add bl,7
  f1 L. ^9 Y6 w* Knext1:   L6 `: C  {- ~7 A) G5 I4 ~& {
mov ah,2  ;print one hexadecimal digit
) k" c& S2 t( i( S, O( v mov dl,bl: s6 n' b$ ]# v$ N* J+ `/ h# \9 u
pusha5 N" d2 |0 e/ w& _' i* P- E7 `
int 21h# `$ ^' E0 G- u+ w' e5 {. }( L
popa: n0 d2 `* L' Z  F! ]* x
dec ch* u7 {& \' g  Y- v4 d) i
jnz loop3
7 |4 K$ |% }# a1 e popa/ D; L4 C/ A) A" i6 N7 x6 W
ret
* t4 I, C& r4 X" U) dbinhex endp
$ H+ \! ?3 `: L1 f   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-11-1 21:27 , Processed in 0.137302 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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