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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: & k2 {$ {# r+ L1 Z
! I& H1 \' e1 E# d: W0 y* g
  .model small
# S6 g: U) C# C; t  .386
/ N$ E' B6 T# a" c  CFG_ADDR EQU 0CF8h
0 x: |: D" L5 V  CFG_DATA EQU 0CFCh
3 ]. J5 ]0 }! H  SMBUS_BUS EQU 0/ w8 [, o  |$ s6 e  }6 X
  SMBUS_DEVICE EQU 31
. t& X. a/ A- ~- m7 u  SMBUS_FUNC EQU 3* s; n( y, U2 s
  * E# v6 K5 r( Q$ `2 Q
  .stack 100h8 l  _; t+ c! ~- ]& p" m/ R
  .data
  m4 [! A) @+ A9 Y( gbase dw ?  ;smbus I/O space
- N3 x6 P: H5 @num  db 0  ;byte select
$ n  k. z5 W' o1 U2 PSmbStatus db ?
: G+ m$ r- V+ r) k% s
4 \$ D1 D' M' o1 ?; o; M  .code# I, Z! ]. y, L: o

" E& e1 d- d! t! U/ l5 F6 S3 Z) V' }# {LF_CR MACRO' O  J) g5 {1 s, a8 w8 O
  pusha
' N# A( \/ D& t9 P2 M  mov     dl,0dh      
4 j$ O: F7 P8 p9 h# V; A+ \/ W mov     ah,29 U# ~/ l/ _* T4 Z" N' @8 l& r
  int     21h% n1 c  n1 ^0 S8 q* |  w2 ^6 U
  mov     dl,0ah   ;next line   & [( w' R1 ?4 @& G: s
  mov     ah,2$ n9 \( ^- b: I
  int     21h# q6 i0 `3 F4 y! r# j9 g& r3 {
  popa  
% _/ p9 G; S7 ^5 W     ENDM
/ i  r4 x0 W0 e6 S$ }7 I3 ?
) f, C* R2 e2 H* ~! O; k( X; @% R+ i& i) ^- F& {9 X' J: w* I
main proc far3 o# `0 U3 L. c, Z' z
mov ax,@data
# U3 g7 z+ r) F3 p+ f  y! f6 a mov ds,ax0 P( M: G$ J/ j7 {8 ]

$ |$ T# d- W4 O2 @: R mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
3 T/ i. \0 P# T mov dx,CFG_ADDR
& B& p! }2 W; C4 x' r out dx,eax
$ P2 h2 g" @8 M mov dx,CFG_DATA
" Z+ o7 h  f* M# A# Z' [& M3 V4 R7 T in eax,dx
4 W: v; j& p8 R& h& H  $ i$ Y( l/ Q) w9 k5 {
shr ax,5     ;bit 15-5,the base address
- v( K0 `% {- _- j+ W and ax,0000011111111111b
+ m0 U0 U1 ~1 q7 l6 f1 F9 o1 H) U mov base,ax
4 Z# a  |: ]# I  
3 o6 g) n4 v' m9 m9 t1 N call ReadSpd( _, E8 X1 c5 \+ z" u
exit:! v, N' g/ K% J" ]
mov ax,4c00h8 C  s% X' s, ^  o7 u
int 21h# R7 ]( c4 T/ |8 A/ c9 ~/ h
main endp
* _( K3 `! s& d' \* w/ t
. ^* F0 c) Q" ^% r0 I
3 g7 L" j$ U. Q6 D7 R# L/ v5 k- [: S0 \8 w
ReadSpd proc0 O% s* w; p- b5 l# C% D
pusha6 @2 N2 q9 ~  v7 l7 a& j
Again:
5 W$ w' n. z. }* R4 u6 @( I' Y mov ah,num
- q3 z; u/ q6 x8 z, D. M  and ah,00001111b
3 `% M7 F7 a  y. ~ .if(ah==15d) ;CR_LF
+ a1 h- C6 @, r$ h  LF_CR- I8 }6 M+ P+ O% p
.endif
& a5 y/ U6 W1 u; p/ D3 ]$ A- t   C* v4 S! C4 x
.repeat; y2 f$ H9 ?0 d; f; V- `
  mov dx,base   ;reset host,claim host in use
; _7 ^3 ~, P; L  add dx,08 k) p; y- \: o
  mov al,40h5 V0 b$ O( ~4 n6 l; m
  out dx,al; b* z7 K# q# c  K4 T
  
  e# A9 W9 B$ O+ ]( W$ o- y  mov dx,base   
" |2 g1 r8 J0 A# W7 h& k+ a  in al,dx( r7 k! N# p( W3 P
  mov SmbStatus,al! W5 ?8 {. S. ]3 @' s9 o3 @
  
, P0 S0 K2 D, N  a9 U3 `. |  D" P  mov dx,base   ;clear all status bits1 S" }. k) G. Y0 w; l# G
  mov al,1Eh   ;host status register
$ t- [6 l' A* z" @) c$ b  out dx,al$ i0 Y8 B5 R, o% f
  ! a/ z  l# x+ b* ]8 `% J
  mov dx,base   ;set offset to read
2 a5 ~. D9 |- r/ `  add dx,3    ;host command register
9 X0 L( u' n+ k, _& @  mov al,num
! w) \$ V) a( K& |/ f, Y  out dx,al
' V1 t/ s  S5 f2 r1 S5 T  
3 u7 [# o+ f0 F) N" n6 L. y# d2 X  mov dx,base   ;Transimit Slave Address register5 |4 E. f! p$ b1 ^, `
  add dx,4
- v5 m* j1 x) e: e  mov al,0a1h9 R1 N* N0 ]: ?) P. k! v
  out dx,al% d+ Y5 r0 R# Z* e% ~4 k+ M
  + ^+ Q7 y2 ?  U$ L4 U% P" y4 x8 c
  mov dx,base   ;set "Read Word" protocol and start bit; y& w4 |8 {, f$ @9 r1 v& E' w
  add dx,2    ;Host Control register6 K( |- h. F! Y0 W# ?
  mov al,48h  
$ H. B' T( k4 D! p; x1 c9 V( w4 g. p6 a  out dx,al
0 t+ l, C7 K' \. e+ ]
9 |. [9 i8 c- e9 M1 Z4 a+ b# Z  ?6 g  i' g1 z9 J$ f# i, L, S
  7 i: @8 Y( p. j$ l+ i: r
  mov dx,base: z8 [" T5 ^) d5 t
  in al,dx. i5 ?( O9 ]: E% W
  mov SmbStatus,al
: Z2 i9 {% m1 q, {/ b  and al,1Eh+ L  z2 _4 k8 G) A, j/ v+ F" j
  .while (al==0) ;check repeatly until any of) j' b' M4 R. h5 ?
    mov dx,base      ;FAIL,BERR,DERR,INTR
* f# o  }7 [3 H; X8 ?: _    in al,dx
5 U' N: N- y' K8 m    mov SmbStatus,al
% C7 |5 I% O3 ?    and al,1Eh
* d9 S6 O2 T7 k4 n  .ENDW
; k4 A( [+ h9 U$ D' \5 w7 X! a% J& u  $ q) V* t7 Z0 i* O; U
  mov al,SmbStatus   
" |) P$ ?; g5 O, j7 K  and al,1Ch) a! Q( B- p+ N! ]2 @$ g
  .if (al!=0)    ;check for errors  
, M; v1 x+ m1 q7 P, c* V   mov al,SmbStatus
! d" S' s+ K! A" ?1 K   and al,08h   
) ?* h) f$ n* B% K   .continue .if (al!=0)  ; K& m- p3 g  Y9 s3 ~0 c9 h
   jmp @F  & d# Z  m( Z/ q, J8 b! N3 t
.else3 j+ T4 `! j" {- @9 g# K
  mov dx,base  T; `- [% b+ A8 T
  add dx,5h
+ Q( z: r' @; P* Y) V' _4 C  in al,dx  
$ J2 C. v' T: V6 _  call binhex # @6 J6 S9 o, F' ^. v+ R# \3 z' e
  .break/ O$ F( `1 J( N7 u! z
.endif: `* b- b9 ?+ T0 M
  
- O2 ?0 c: s2 I3 W" h( W* h  .until (0)
; v' \0 j7 R  F3 Z% Y+ e- z  7 A4 J7 T7 ]9 a

& Q, R9 r1 h9 z: N/ | - }2 r/ ~1 H* B7 e: T
mov dl,20h ;output a space1 K% Q4 V9 z% @
mov ah,2
! y3 y( \" h9 p& b9 p5 N pusha0 n) T7 A+ g9 e
int 21h4 u+ s& D6 M& w1 G$ v
popa0 {  Q6 Y- z" I8 i
inc num+ @7 U8 p2 F$ t! h$ C  \
2 |- c6 \- v, `9 U% X
cmp num,80h ;get first spd 128 bytes
+ ]$ e# T+ r/ ^& _! ] jnz Again
& y# {$ e. C" ?  p& z: r6 ? 9 P: `0 p  G, ?
@@:
1 T9 M' {) D8 ? popa
# L& h" P. S) D+ h ret! N& C" Q$ x( f7 _5 H; u
ReadSpd endp- N9 r5 I% Z% Y4 P* {. W/ w" m
/ W4 O- M& Z' W; O  H
: Z- t% I5 E0 ]  g
7 F7 \  q( j7 s- L
binhex proc
  I- V& \/ ~# ]* @. K1 T pusha 1 u+ t, u8 ~0 t8 `2 K& B

% _, J! J2 y: d  n mov ch,2 ;2 hexadecimal digits to be printed
# T; x- L* X4 z+ vloop3:" a' D9 j! P  y9 x
mov cl,4 ;bits to be shifted
3 X8 G% ?9 e; s) y: S. p6 g rol al,cl/ S- ?! L, Q7 w/ Q( F. ?$ J, n* S' e
mov bl,al
7 H, K9 [/ t6 N& ^  N2 W3 W: D and bl,0fh ;mask the 4-bit Msb2 z0 U8 A  z) [, y. I
add bl,30h
% H4 Z' @9 c, G( I3 B cmp bl,3ah% r8 {1 U+ C* `7 c- u
jl next1  ;number or alpha?
: d& X4 L( D+ H' `. V4 }! T add bl,7 ( c/ A0 x2 v% X% c! \7 J6 a' H$ U
next1:
) T. ]% N3 V* N; ? mov ah,2  ;print one hexadecimal digit
3 Q5 E6 I: n2 v2 |0 q8 Y mov dl,bl
* @2 ]! E% N0 [/ k5 B* _& U pusha( ^' j* @, L% o% G  @4 j
int 21h) l& @- t! O' r' _) j% E
popa, E5 u; Z, @5 W2 b
dec ch- L6 d% `1 r; A4 z; _* ~& d/ ?
jnz loop33 G5 B3 W" `1 `3 x
popa) A) i! h  m* W4 D$ i& |% F9 i
ret
8 ~, C( Z( m9 q6 O" I" kbinhex endp
" e1 R2 Q9 A* g) l   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, 2025-6-17 13:55 , Processed in 0.205133 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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