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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
0 @1 ]" o7 ^, r1 s) {* X
* @  i$ T5 F. F3 o8 L  .model small" u" _7 m- J" P7 f  v5 t4 [7 R7 f
  .386
8 r, D. q& D1 \, Y! o  CFG_ADDR EQU 0CF8h: P  c% _( p8 R7 E" ^
  CFG_DATA EQU 0CFCh
" o: ]' d% `8 [' }( G" T3 T. P  SMBUS_BUS EQU 07 x5 [  _1 W; s2 ~( u6 L
  SMBUS_DEVICE EQU 311 b0 T' H% q% |# Q
  SMBUS_FUNC EQU 3# X. h! [% u7 t
  
6 F3 y+ T! E( J2 q; G: ^  .stack 100h0 n* u4 p1 _: R3 H! T! C" D
  .data
2 H$ \. Z0 o7 n( v$ O, o9 [8 P) [. nbase dw ?  ;smbus I/O space+ J7 x- o% R& u& J6 B% q' ]
num  db 0  ;byte select1 o7 ~! o% k0 t4 N+ L. d
SmbStatus db ?
+ B* S2 ~1 y) }/ U" b
0 n3 L+ \7 o# l* n. ?$ B% o  .code- n3 O$ q; B0 t- q  g

7 [5 T: v3 K( ~% q- }LF_CR MACRO5 x1 l; H+ R4 w/ Q) j
  pusha
2 f1 [1 W3 o6 f8 f1 m2 d/ s! R  mov     dl,0dh      " R- t# j; {; v& u: O
mov     ah,2
! }- _1 i& s2 O. l7 ^1 s  int     21h
2 y9 W, K$ a. M  mov     dl,0ah   ;next line   . ]# D# L. |3 E6 {, z
  mov     ah,25 e8 x; [: g1 G) X  Y/ |- n+ ?+ }0 I
  int     21h
/ P6 s3 s! q& a3 W  popa  
/ q% v3 B, o+ z9 ?6 E) X' q. @     ENDM
& a% M+ Z' P- c+ p: N' i" \0 s& l  u* w; S" a
: x$ H8 }8 w# Y6 H2 U9 z3 o
main proc far
2 d1 Z4 r4 v6 ~4 E) Q1 ^) P mov ax,@data  D' W4 u) P4 {" k5 y$ N
mov ds,ax
9 v8 ]8 k) v. T8 s, B0 ~! B / ~# A) O. t0 @- b3 h3 U
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
! f3 M: [- l! i. V mov dx,CFG_ADDR# `& q- r! b  @: P, w, _
out dx,eax0 m; j' L3 F) r, L
mov dx,CFG_DATA
5 @  C# _1 m0 n) U! U* P/ z# l8 K1 v" Y in eax,dx% n8 X2 L8 z2 b5 _! @8 T2 r/ p6 e
  4 \- U0 T1 Z7 [4 {/ p
shr ax,5     ;bit 15-5,the base address
5 k- S. Z$ ?5 K) U( ^' o9 U and ax,0000011111111111b% b- ^# K. `$ n& |% H$ E' {6 L
mov base,ax7 a7 c3 r+ h' g* y3 Z$ b+ ?
  , E% O, J5 n% J8 [5 U7 x  l
call ReadSpd) t" J6 L2 f& s0 e
exit:
6 ]4 R6 m+ i1 `0 j. V. q mov ax,4c00h1 |$ ^+ h' _/ D, E, f
int 21h- G* S4 r) w( i0 z& M
main endp
! J8 t! u, _0 z4 K. C, k) f, K
8 w  L* x6 ^% y& |  Q+ t* m5 K& L! D$ e

" s8 m! v5 h; U' M( d. p/ ?. X- ?ReadSpd proc
1 x2 y! ?2 z. n: P9 H pusha6 z: t, g6 d7 N; U
Again:4 Q% Q, O$ A2 _( I' k
mov ah,num1 ^$ Q* S0 [1 z6 y3 F! [
  and ah,00001111b( J0 c0 v6 q; i3 M6 A6 U  i
.if(ah==15d) ;CR_LF6 f/ X" Y# D% q" v7 C& T. A7 P- h
  LF_CR
& L( ?8 w: `' D1 R7 l .endif
/ _- o0 ~! A2 u  y) A* x0 i . I+ F7 O2 F+ U( u4 u
.repeat4 ?% U, Q$ k- ^( s0 N" |. ~
  mov dx,base   ;reset host,claim host in use
% |' H9 F7 X5 W$ v7 ]  add dx,01 B  i) z& _# s+ S  ~
  mov al,40h$ T# I4 v! J* ^( s
  out dx,al! ~% Q5 G5 f. I* ^
  % v2 `. f1 e6 Z  N
  mov dx,base   ! K" f9 Z; w# ~- |& ~) ?; F. R
  in al,dx, {* X" D# a+ Z% ~" a" E, m
  mov SmbStatus,al6 ^5 `/ d7 O9 z
  # ~( o, p$ H* A, K  f$ L9 j
  mov dx,base   ;clear all status bits! d5 r+ J7 [( `8 C; `- K' V0 k, f
  mov al,1Eh   ;host status register
  u  v: n9 N7 T! b1 j9 `; w# h  out dx,al( u% W3 p; p* {% o$ N* d, V
  7 G0 C$ T# P( v. y- z. ^& }
  mov dx,base   ;set offset to read
; K9 A$ @# q8 T4 m  add dx,3    ;host command register, C$ G. `7 M0 i5 \& H, U( M2 B
  mov al,num6 C: Y! \2 o4 p: R1 p+ x
  out dx,al+ U/ O: y2 ^. n* w/ p
  
% M9 x  L1 d) q% h# M0 f' `  mov dx,base   ;Transimit Slave Address register
9 C% @+ W& K  }$ B6 a' T" `  add dx,4# A$ g6 F0 x# X0 N; o" d
  mov al,0a1h; i9 o2 i! h/ e1 M4 v
  out dx,al/ [- u1 R" W6 W( l$ N5 u' {4 I
  
: a2 I! c3 L) E( ?5 S/ i) g! ~% D  mov dx,base   ;set "Read Word" protocol and start bit( l, H0 K7 t: q
  add dx,2    ;Host Control register# x! O/ R( W  |
  mov al,48h  
5 G- |5 W- [. w& q' h! ^  [  out dx,al
& }% @& u4 ?7 P. U( I; C9 L & k; d4 ~" T4 ]
7 z/ Y8 @. F# R* J& i5 I
  + [4 S: b; p5 Y7 S& |! J( a
  mov dx,base: q" j' F6 |( V$ i) ]# j
  in al,dx. K! |0 [+ R7 e( w4 @0 V& Q8 {
  mov SmbStatus,al
, a4 _- T0 R% \- ~/ v  and al,1Eh) X/ U: c+ d' O4 }1 ^4 a5 b4 z
  .while (al==0) ;check repeatly until any of
$ z# p  [* N3 e' {    mov dx,base      ;FAIL,BERR,DERR,INTR# j$ t: N' ^* c2 i( J4 I) M
    in al,dx3 C+ y3 W# l5 Z" N' B
    mov SmbStatus,al: L4 @* l. M" \" T6 f) h- Y* T
    and al,1Eh ( n) N7 J. R; j+ t3 N3 }2 k/ p
  .ENDW
' u; w  `3 {' m. g5 R$ H, d, ?* o& V  
6 ?- V$ \% }0 N# T) q6 ]$ ~, V  mov al,SmbStatus   
0 n; n- [1 q2 O  and al,1Ch
# A* n5 }4 G. I* X% X' @. e6 U  .if (al!=0)    ;check for errors  ; [+ q$ p4 l1 |9 \! H. L
   mov al,SmbStatus
7 a% T& r) T2 @/ l1 s( @1 A   and al,08h   % e- _% X% d! p& K" H# _; m
   .continue .if (al!=0)  
2 B! A8 L$ B6 s$ o   jmp @F  
' L$ c) |" v9 K( o3 N: z  p, ~; q .else
, Q% a* w/ l5 U  mov dx,base
# ~' x( M- a: S# N! S( V  add dx,5h
/ d/ L- a( P3 O5 i( s( R  in al,dx  - T9 V- j9 g; j2 r- b
  call binhex
& t0 S; O  {; R! @) R+ |4 G6 M7 a  .break0 W' a2 R& Z- x( ?$ J$ Q: [! i7 l
.endif" [! M4 f( g4 }+ J
  
, J9 \- V& d! M0 |/ t- G6 L) W8 G  .until (0)
* q3 e) I- x; c5 A& W6 U  ! O& e- M" e/ F0 M0 L

* u! D( x/ p! k0 e ; N1 K' q/ c6 ]% Y9 }( o- T. W/ q
mov dl,20h ;output a space0 o( ]6 S' E. P) F. f& V3 v# [, ~
mov ah,2
& b' b' v3 R! j+ N# G' K9 o pusha* U) o) N# }2 f$ S, a. f* a8 M) [
int 21h4 A; P  `7 Z) ~2 p4 g+ l: _
popa
; X# x% ^* h2 F inc num
" m8 H! ^, |9 p. D. g. @7 ~; Y) I/ \- z: y2 Z- s) b* R" Y
cmp num,80h ;get first spd 128 bytes + v/ d  m  {, C* S& ?" F  F: N
jnz Again& ~+ R9 M: b+ I
; m4 `) c* C1 P% t, h! S
@@:
. H1 |2 ^  Q& b/ x3 n; O: a popa
  B9 g. D- {) Y( Y ret
1 Q9 i5 g& w* `) l( N6 O; b/ `/ zReadSpd endp; {2 n( X4 i! @* j

' \, j$ c( ]# }) Y8 s. Q, s9 o7 Y2 k
: ^1 C/ o6 ^/ o- ^
binhex proc 3 \6 \  m- V7 l+ o% w) B, }; B$ b
pusha
  K* e, m  L* [# {3 ]" M . `: N0 o5 f/ l& w5 g
mov ch,2 ;2 hexadecimal digits to be printed
9 j! ~1 K  M3 t* aloop3:% O; \$ S$ A" L( z8 b( u% S+ {
mov cl,4 ;bits to be shifted
8 f. c+ `- c1 ^, m rol al,cl& ]; O2 ~9 _! W( c, p
mov bl,al
9 S! m2 ]0 ?/ B1 }! w" l and bl,0fh ;mask the 4-bit Msb
, z! d5 H1 J% M9 _  i( M add bl,30h
. n7 c5 W5 G, n. F. y; L+ ? cmp bl,3ah) o' _" p# o6 ]$ v2 R! G
jl next1  ;number or alpha?/ w9 M+ J' l7 }/ e* {' [
add bl,7 # j+ ]: {$ L5 d5 T: s* m) p
next1:
- ~$ ^+ N6 ]. p8 m3 W mov ah,2  ;print one hexadecimal digit0 D6 m# u+ |; \
mov dl,bl& f! R' ~5 T. P) B4 w
pusha0 Q* |; P( H) I5 S' n" H
int 21h
! u3 M; h2 \3 Q6 L. Y popa* @. @- |. k' l. _* f" H
dec ch
: v9 b. |7 Y3 d3 T# l jnz loop3" w2 Y4 u- ^: S: O0 Z4 Z% A% N
popa) [! g& s/ R& c4 F3 H' |. U
ret
7 k# H6 l/ A6 I; `binhex endp
* _# J' b% {/ {2 ]) ^: K   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-9-21 13:08 , Processed in 0.086280 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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