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

谁帮详细解释所有发给ec的60/64命令号码和意义

[复制链接]
发表于 2008-7-14 00:04:00 | 显示全部楼层 |阅读模式
bini殇,能帮详细解释一下bios post过程中的所有发给ec的60/64命令号码和意义吗?数据量比较大,截不住。
发表于 2008-7-14 12:09:38 | 显示全部楼层
转个别人发的,不知道LZ能不能用上  
. V) ~) a/ v3 {# a$ Z& O8 M0 J- H0 K: I" c2 k9 M% I  m# O
4.2.7 Command( f# Y1 q5 ]6 ?8 `
) i# j# T1 {7 J0 d+ Q2 y( w
通过8042芯片,可以:2 v7 U( ^) [3 ^1 L; X# t6 s  @" i
向8042芯片发布命令(通过64h),并通过60h读取命令的返回结果(如果有的话),或通过60h端口写入命令所需的数据(如果需要的话)。
# i' j( n/ K$ m. I2 D, g  B& q读取Status Register的内容(通过64h);( S6 N( z# o2 [  U
向8048发布命令(通过60h);
% A$ |6 n3 u4 `; {0 @读取来自于Keyboard的数据(通过60h)。这些数据包括Scan Code(由按键和释放键引起的),对8048发送的命令的确认字节(ACK)及回复数据。. j' g$ R2 v; a- K& r- H; [

' _: l, M3 ]7 Y" @; {6 H; d再次强调一遍,Command(命令)分为发送给8042芯片的命令和发送给8048的命令。它们是不相同的,并且使用的端口也是不相同的(分别为64h和60h)。
/ @8 h' q0 k! i/ m9 U* m2 n
: v6 H9 t" d1 j* P' V% k) |. N4 D, E$ d2 V4 K8 E1 a9 H; H+ P

% s: T% g# X: k$ K- W. B$ I    * 64h端口(读操作)
; j$ ~0 t: h/ m( v7 v5 z. g* G
3 ?* `. I* x  X# x7 i
+ D: G- q  V! D对64h端口进行读操作,会读取Status Register的内容。
9 |1 Q5 \$ ^" I) h% d, K+ U0 `: l: `
, Y7 @, Q3 k/ G) Zinb %0x64$ V( c4 D# E  ~7 F9 b
执行这个指令之后,AL寄存器中存放的就是Status Register的内容。) }% V# A, O9 n/ i' t
) l" a& \) M) i6 y
    * 64h端口(写操作)
5 T- U; |& e9 K4 m8 ]' f! d; ^6 _& [7 g/ i
向64h端口写入的字节,被认为是对8042芯片发布的命令(Command):
- ?9 ]" t. ?0 G6 q$ h: w+ Z) AŸ: Y- Q0 v4 J- @; Q
写入的字节将会被存放在Input Register中;. h* U3 I3 h3 l' s2 M) F  S
Ÿ$ a) S$ ?$ U) l) k  C4 U. y$ C
同时会引起Status Register的Bit-3自动被设置为1,表示现在放在Input Register中的数据是一个Command,而不是一个Data;' H& [- m4 L) g- X: I) i7 W) o
Ÿ! j) w3 n1 j" P+ Q. w3 y
在向64h端口写某些命令之前必须确保键盘是被禁止的,因为这些被写入的命令的返回结果将会放到Output Register中,而键盘如果不被禁止,则也会将数据放入到Output Register中,会引起相互之间的数据覆盖;
- V& g6 d( q. }. [Ÿ- c! h( m( e! f2 {9 u
在向64h端口写数据之前必须确保Input Register是空的(通过判断Status Register的Bit-1是否为0)。
& |6 ?& I( A! A' M! H; I3 p
' n$ x' g4 Q  J. ^1 _; ?void wait_input_empty(void)
7 k: I# e6 W. R% t2 H{/ Z/ O" p2 Q4 k+ i7 u+ t% Y* ?+ p* I
   char __b;% d% C6 s+ c- s9 z$ P# K
9 c6 C" W, H  l4 K+ d
   do{
- m& e! K' ]" M# U! h7 Q+ S     __b = inb(0x64);
1 \8 |5 {: A" u) g5 _9 M' j/ @   }while(!(__b&0x02));
4 N( ?7 C! M; q8 p% [$ P8 _}$ R+ U6 ^  V/ r' T+ z
5 k. ?  c7 w! b
void disable_keyboard(void)' H& u  O% y; Q  i0 J
{$ {1 L# W0 |& n' l8 z/ R8 \
   wait_input_empty();
. h7 {7 a: U( k/ s8 P( h. B1 G: l   outb(0x64, 0xAD);
2 V1 ]; x0 P: x. G}[size=+0]# A% U' d* U- F" u6 A# x0 `% Z
* O  Y0 N$ @; m4 ^6 t# e) |8 d
    * 60h端口(读操作): b; H1 _1 R- A
% j6 Q/ D2 E% K' S- R
对60h端口进行读操作,将会读取Output Register的内容。Output Register的内容可能是:
4 G2 U8 W* [$ ]% VŸ           来自于8048的数据。这些数据包括Scan Code,对8048发送的命令的确认字节(ACK)及回复数据。& j9 t* ?) E$ S9 P2 v) f
Ÿ           通过64h端口对8042发布的命令的返回结果。! O: B8 B. \. {. Z* B) z9 y

+ G# k7 q$ Q' e0 U, {9 a在向60h端口读取数据之前必须确保Output Register中有数据(通过判断Status Register的Bit-0是否为1)。
- P& m0 a8 o- Gvoid wait_output_full(void)
, @! g& c9 m2 x6 v7 y1 N{1 I! _7 ~: L$ u9 Z
   char __b;
# m0 K0 m! Q; M& J  ]* x# ~) i- k. Q7 F% _2 D' J
   do{
. ^% r# n" I9 `" e. e+ E     __b = inb(0x64);
% }, s. s0 T' O: y   }while(__b&0x01);- ^+ y. t7 A9 [3 Y/ w# U, f' ]( c
}
4 P8 {6 W: ~/ _9 R/ V% f7 Q; f) i0 c( y
unsigned char read_output(void)
% _# D/ T/ o0 |. V" E5 I{
) P( ?9 e1 P' K$ X' F   wait_output_full();" o- J; v% `/ r5 n" h
   return inb(0x60);4 s! i% t& s8 D8 u# j; [  ]
}
5 d. D4 X: \* p! @
% r( n/ L7 A1 D+ V    * 60h端口(写操作)) W, |- \7 x# d- u2 F! O. b% s8 e
- q# ^  i# j( Y2 W- i
向60h端口写入的字节,有两种可能:4 O) R* M3 h' h
1.如果之前通过64h端口向8042芯片发布的命令需要进一步的数据,则此时写入的字节就被认为是数据;
! Q6 l) u7 G% I7 `; _  v2.否则,此字节被认为是发送给8048的命令。
3 L' K5 C6 y" I1 f% a6 N0 h. A$ W7 }& |; A& }, W) J  p
在向60h端口写数据之前,必须确保Input Register是空的(通过判断Status Register的Bit-1是否为0)。3 e9 |+ j, E, p4 N2 K8 B
$ j" _8 Q: f" B* B$ z% B2 U
; ]: u2 C9 Q5 F+ d
[size=+0]4.2.7.1 发给8042的命令' a* c; [4 K  r  g/ N9 ?6 J7 g! y3 U
" h# k' K2 f1 P0 |* K" b9 Z. a
    * 20h 2 X1 W# x9 p; `  D

8 T' S8 K5 p1 Y/ y准备读取8042芯片的Command Byte;其行为是将当前8042 Command Byte的内容放置于Output Register中,下一个从60H端口的读操作将会将其读取出来。
- T2 c7 W0 z0 K$ C) C" x8 d2 S
, z) l* G$ v1 S8 ^+ r. `
; F* K% H0 x/ I3 z5 r8 cunsigned char read_command_byte(void)5 P4 Q# P5 C! |! T" L
{
5 K+ Y# U( u6 U: H1 Y% h   wait_input_empty();
9 ^" H2 ]% q/ X- Q! g: G; m0 N' z1 G   outb(0x64,0x20);9 K/ U$ p; A) @; @" f) G
   wait_output_full();
+ v! r% r8 }' {% z: f, K   return inb(0x60);   
/ v9 R2 X# {& k" I# D# T5 q. ]}+ a; |: `4 D# Q. E' O3 N9 P7 c. O2 F+ @
+ _- |( d8 o, ?8 L
    * 60h
1 {8 q7 P# q9 D9 Z2 u2 P
6 Y7 E; Y; j/ }( B3 m' s* P准备写入8042芯片的Command Byte;下一个通过60h写入的字节将会被放入Command Byte。
7 o. b- n4 p, [6 n: f: e. _& L% F& {  u2 m! P1 Q' y
; V& w2 m6 M% e0 ^+ ^
void write_command_byte(unsigned char command_byte)
) I1 z! j5 ~) \4 r3 `{
+ N0 o! [/ }5 z6 a5 t   wait_input_empty();
! W: R, ^) h4 u& S# ?& S9 T3 \   outb(0x64,0x60);
+ l1 G4 e* ^5 S' V  `3 [4 @7 q  V5 p( }   wait_input_empty();
6 o+ @! c+ B: ^! {   outb(0x60,command_byte);6 V) \/ E; ?0 Z
}
, U1 [$ v  B2 A9 c1 ~
( h. v) {2 B' \- [% e
4 L9 [/ c5 M: x0 I4 g! Q    * A4h9 i, ]5 C  f# y$ T5 p9 [" g0 n

  t+ B2 g. y) v2 s. I测试一下键盘密码是否被设置;测试结果放置在Output Register,然后可以通过60h读取出来。测试结果可以有两种值:FAh=密码被设置;F1h=没有密码。
5 X4 t$ d, @0 h8 Ibool is_set_password(void)
3 U9 |9 e( G5 y/ x% S: C{
  e8 x$ L2 L0 T4 b/ c   wait_input_empty();! h6 x' N7 G- X
   outb(0x64,0xA4);
% v& b5 b, l% S/ c& j; _   wait_output_full();
# D) R! y* ]* j  j   return inb(0x60)==0xFA?true:false;   6 O! v8 P: _; @" Q/ U5 i4 z* t
}) G! M9 f# s+ I9 o$ R0 I. H. g

- b) y% `1 b4 H% [+ {0 I- \    * A5h
# w9 o  F) t- p& K: N3 R& d6 W; x' t' P2 }5 u5 `* Z
设置键盘密码。其结果被按照顺序通过60h端口一个一个被放置在Input Register中。密码的最后是一个空字节(内容为0)。/ t$ ?" c+ b8 v2 l- m- p2 O
void set_password(unsigned char* password)
. a( _2 p. E" n+ y! x{3 l: W; r& q# x9 n/ j( k/ O
   char* p = password;
% @6 N& |. N$ p9 O3 q2 m3 d0 H' _- m5 Q
   if(p == NULL)7 }- V. V  w9 o+ U0 {5 C. G0 H, N
      return;0 Q& I( ]9 n6 T; `: H4 t' z2 P6 r( O
" M% Z) l$ ~% N: a/ Y
   wait_input_empty();- h# H5 X3 J. r0 s/ m
   outb(0x64,0xA5);6 Q7 n' a8 e) ]& j, g+ a/ W
5 |6 J! P' Z/ R
   do{5 x* H/ w# R0 F- O
      wait_input_empty();! E9 w& _9 z; O, R0 ^6 v0 I
      outb(0x60, *p);
+ u2 B. l% R# M3 I# F1 ?. |   }while(*p++ != 0);
3 |6 c( z, _- S( n" |}  i7 [) N* b! Q  n! L( \# A
. B' r1 x! }* e' w2 s! [- q) E
    * A6h) ^1 }9 ^) o6 b3 R* \9 P) v
3 D" S# I" x' |
让密码生效。在发布这个命令之前,必须首先使用A5h命令设置密码。
" r. o; z3 H6 y2 V9 g1 N! ~9 Xvoid enable_password(void)
' X0 j0 e  k% s; {. X5 v{
! S7 Y. w7 i0 y- y% m8 ?   if(!is_set_password())2 \$ {  U) P1 a3 R) R0 \  L
      return;
9 O2 l. A! Q; f$ o  M: u+ A
  i0 n& v% E% [5 y6 Q" Y: B   wait_input_empty();
& H: N" s0 s2 N" @$ q8 s   outb(0x64,0xA6);   % A& p( Z4 N9 N) @7 L
}- `* Y# U  G% d* N9 z

# a- A+ Y2 Z4 R- u+ r8 x- E0 [+ f    * AAh' R2 E6 w, g1 b: `) I2 p
  i' ]2 G# W9 _, m; A4 f% w1 k  C
自检。诊断结果放置在Output Register中,可以通过60h读取。55h=OK。
. h) j4 `0 j0 P6 o7 h0 F
3 Q  A5 O4 H; y' L6 W9 t
9 {! W) K5 U+ k" u: `* E3 q/ Rbool is_test_ok(void)
! W* l* j$ z4 P* O- R$ c) U* c{
$ G  G7 f; r) O   wait_input_empty();
( ^4 T5 G; s) M. S   outb(0x64,0xAA);- ]/ Q6 V0 g7 Q
" n% ]6 h5 U" k8 \: T
: _$ o1 P- T3 @% |3 K
   wait_output_full();3 x/ B" O$ R: }2 }8 d4 M+ p
   return inb(0x60)==0x55?true:false;   
8 t& }9 Y9 ^8 k5 }1 U, q}* ?! S9 e  D+ {
" G; i8 K- H/ ^" I7 l

" c4 p9 R$ J" I: }; l    * ADh0 i. A) _- \* v* y" ~  z$ ~$ X
% E7 w+ }" U' X- U( }# V
禁止键盘接口。Command Byte的bit-4被设置。当此命令被发布后,Keyboard将被禁止发送数据到Output Register。
" a8 w# b$ {$ bvoid disable_keyboard(void)
- d  ]* h% @  a9 ?{
9 o4 G/ o) h: ^   wait_input_empty();
# L+ E8 {  P: q; j8 E   outb(0x64,0xAD);
) @+ i; j% ~) T5 F3 I+ J
" L# _1 R: y, Y. _- c5 p3 q$ p' T}
. o3 j/ k" a: [" A. X. E7 j  c: [' W# x2 C7 Z
    * AEh
7 H4 ~1 {7 w) H# M4 c+ z5 j/ ]- p  b9 w3 a' E7 i6 e8 K! D0 r" P( s
打开键盘接口。Command Byte的bit-4被清除。当此命令被发布后,Keyboard将被允许发送数据到Output Register。3 v0 n. D. }3 P* [
void enable_keyboard(void)
6 v2 U' a1 V" Y0 \# X{
5 S' ]4 f" x3 ~5 D. ]   wait_input_empty();
6 A. A! `$ F& ^" C) o   outb(0x64,0xAE);
1 ?$ R% T7 }5 n$ A9 ]# x( d" h+ z% C5 t) c+ R$ Z
}1 T+ U  W! ^, c
% F" y: z4 {" F( d. y
    * C0h: V0 g8 n# F5 a3 z
/ S. H/ b! }0 U
准备读取Input Port。Input Port的内容被放置于Output Register中,随后可以通过60h端口读取。! N( ?7 L5 T8 [
unsigned char read_input_port(void), ]& Q" U) X0 S% _3 p* M7 M" r1 |
{5 G4 w" I  r; H6 X! t
   wait_input_empty();
- ?% m6 S3 [/ ?) v( G   outb(0x64,0xC0);
& j9 |" y( D6 a& B+ P5 Z$ d' o# t
. e& N6 U( _$ F5 Q7 p1 ~   wait_output_full();8 y; @3 w! v# x( _5 k
% s/ X; t% K! V% ?8 F1 c; F
   return inb(0x60);
, s, k2 V2 `1 A% o# v2 t( u, A}# f: {  }6 Q* {2 h" I) N( ?  R. C
: E) w* O9 p" ]& I3 g
    * D0h
- H- [5 b" ^6 t% {9 N* y: _5 F0 y, N. q7 r6 n; B5 n& J! Y
准备读取Outport端口。结果被放在Output Register中,随后通过60h端口读取出来。
6 P5 ~; M/ y. C4 i7 ?2 Junsigned char read_output_port(void)
. h9 Q3 S% U; ?. ^  m: ?- _{9 w2 |: V% o7 P/ ^6 O) d1 D/ t
   wait_input_empty();7 E/ n- t9 a/ R4 U. b2 b
   outb(0x64,0xD0);
" Q$ z5 s! H. E: K6 _; P" V# D" ^0 G. J7 D# F- s" {) G
   wait_output_full();' v( Q" I" x# f: d0 N
) H% \0 i9 o# P' x3 k  j
   return inb(0x60);
! }  r2 c. |) F1 U2 u}' J% G$ ?' Q; W0 M

9 d- G0 J. \! H% G( v% B* O" f    * D1h
5 E; ]* x- n1 j4 P$ o. v' ^* ~
; J6 p: _* D! U1 z3 o/ M7 S1 n准备写Output端口。随后通过60h端口写入的字节,会被放置在Output Port中。
4 I1 f* j5 z  Tvoid write_output_port(unsigned char __c)! ^% X9 G+ ^' k" x* ^7 j
{
/ C/ }3 m1 j! t! {" x) N   wait_input_empty();
' O1 q7 n1 T7 v2 {) l( `1 _   outb(0x64,0xD1);- N3 i/ q: L2 u3 Q9 X
$ g1 X7 H8 X* H% Q' r  {; r
   wait_input_empty();
7 @" S9 ?: ~7 R6 _2 m8 Y   outb(0x60,__c);
* w+ p* f9 Q2 h4 @0 w  i0 T; m
6 E) h; J4 {* S) X5 m6 m: ^9 |2 W}# C) F6 h! j* e- D& }! ]4 @; D

  d9 L. d$ O/ E. ]7 [0 I! c( i; T: k1 I' V! H
    * D2h4 a( H. B& z  A
0 G$ @# {( B6 @. L7 W* A. V# t
准备写数据到Output Register中。随后通过60h写入到Input Register的字节会被放入到Output Register中,此功能被用来模拟来自于Keyboard发送的数据。如果中断被允许,则会触发一个中断。
/ L2 ?- W9 @0 S# Y! r. bvoid put_data_to_output_register(unsigned char __data)' C+ S7 y$ Z& J9 O$ ^9 c/ p+ n
{
+ O3 z6 m8 ^5 @! P   wait_input_empty();* V, U+ J! k6 \, l3 h
   outb(0x64,0xD2);
- ]$ H1 w4 U& b( T( p, ^1 E' R! K9 X6 C# H. B3 b
   wait_input_empty();1 H6 X' W* F3 M
   outb(0x60,__c);% q, t- m/ u0 ?+ a3 B8 v; A
}- a3 `: N" u1 P$ [

) L5 d! y) c/ u4.2.7.2 发给8048的命令1 f9 B4 o8 ]5 A7 V7 m0 T! \/ b
4 L9 s! y7 t3 t$ q; U8 o
$ ?7 t7 ^% A# \9 X
    * EDh/ Z8 v. f+ G  H+ X) L
( }$ u4 {3 B0 b
设置LED。Keyboard收到此命令后,一个LED设置会话开始。Keyboard首先回复一个ACK(FAh),然后等待从60h端口写入的LED设置字节,如果等到一个,则再次回复一个ACK,然后根据此字节设置LED。然后接着等待。。。直到等到一个非LED设置字节(高位被设置),此时LED设置会话结束。
+ e. z8 v7 V! m$ |5 H* C! W0 c  v; }0 x5 B- V! p" @4 ~7 D
    * EEh
5 c- A& T* ?4 e) V. Q! x, I
* U; J; X6 i! p4 I诊断Echo。此命令纯粹为了检测Keyboard是否正常,如果正常,当Keyboard收到此命令后,将会回复一个EEh字节。
+ U1 c9 u, R3 g3 j% C( u# p+ A) I6 Z
    * F0h! O) q' B( h6 `5 G8 c9 t7 D

  g. F0 O! s) H6 S4 }选择Scan code set。Keyboard系统共可能有3个Scan code set。当Keyboard收到此命令后,将回复一个ACK,然后等待一个来自于60h端口的Scan code set代码。系统必须在此命令之后发送给Keyboard一个Scan code set代码。当Keyboard收到此代码后,将再次回复一个ACK,然后将Scan code set设置为收到的Scan code set代码所要求的。
. P- T  [+ v6 c7 ^" l( L# C
4 p9 ^6 O+ H, p    * F2
% Y  C& ~6 T$ _$ O* `- [3 L# Y3 _% v1 h; g, r9 ?
读取Keyboard ID。由于8042芯片后不仅仅能够接Keyboard。此命令是为了读取8042后所接的设备ID。设备ID为2个字节,Keyboard ID为83ABh。当键盘收到此命令后,会首先回复一个ACK,然后,将2字节的Keyboard ID一个一个回复回去。
* w, U" b/ q. e$ b* I
8 }' `5 }$ k# s8 G; G! c    * F3h
+ G, P( t& V  Y
- S& ~7 o2 Z- h设置Typematic Rate/Delay。当Keyboard收到此命令后,将回复一个ACK。然后等待来自于60h的设置字节。一旦收到,将回复一个ACK,然后将Keyboard Rate/Delay设置为相应的值。2 c% D* C" Z4 ^- r6 R- v
7 C6 u$ i0 v, |/ J5 N8 g
    * F4h
* B( `2 v3 t* @" n) w2 l  {9 L: R" I. d$ F8 p- Q. L
清理键盘的Output Buffer。一旦Keyboard收到此命令,将会将Output buffer清空,然后回复一个ACK。然后继续接受Keyboard的击键。
- g4 s7 F4 Y# b* P  ^  N* o* k5 ?/ b
    * F5h9 ]/ T! f, Z7 }4 N  D

9 B! I, G% Q6 \* Y6 @; R  S# i: c设置默认状态(w/Disable)。一旦Keyboard收到此命令,将会将Keyboard完全初始化成默认状态。之前所有对它的设置都将失效——Output buffer被清空,Typematic Rate/Delay被设置成默认值。然后回复一个ACK,接着等待下一个命令。需要注意的是,这个命令被执行后,键盘的击键接受是禁止的。如果想让键盘接受击键输入,必须Enable Keyboard。9 p, A3 C* e- ]# N8 m# [# ~( W- L

4 W$ W9 w4 T; z% }    * F6h) P! \# b; v- |/ [- Y1 H$ x* o1 F

, ~& ~0 {8 u  J9 c( B设置默认状态。和F5命令唯一不同的是,当此命令被执行之后,键盘的击键接收是允许的。
& e9 ~* T0 p3 T  x2 ~; o# x
3 l7 h; U* E" U% w# Y    * FEh
/ S3 i$ f% w4 m  B! [$ S( `+ ?5 L( x4 @# U5 v
Resend。如果Keyboard收到此命令,则必须将刚才发送到8042 Output Register中的数据重新发送一遍。当系统检测到一个来自于Keyboard的错误之后,可以使用自命令让Keyboard重新发送刚才发送的字节。9 `8 H! M- D! t
* v) X6 j& z7 J2 p& A. G3 g5 M
    * FFh% \& p6 {) L2 b% w0 g
* v: w- k1 |4 p8 @6 _: C/ T
Reset Keyboard。如果Keyboard收到此命令,则首先回复一个ACK,然后启动自身的Reset程序,并进行自身基本正确性检测(BAT-Basic Assurance Test)。等这一切结束之后,将返回给系统一个单字节的结束码(AAh=Success, FCh=Failed),并将键盘的Scan code set设置为2。
回复

使用道具 举报

发表于 2009-1-14 13:49:16 | 显示全部楼层
好贴!
9 Q( J# _) L! s1 l0 W' {$ p* i非常详细!5 _4 @5 l1 Q- _% G, B
谢谢!
回复

使用道具 举报

发表于 2009-2-25 17:37:28 | 显示全部楼层
2楼好帖!在helppc的Hardware Data and Specifications栏里有相应的寄存器和命令详细描述。+ W* |& f4 v& x# A& ?5 @

. R  l# K. I$ n5 T1 ^/ D$ F我的问题是,上述描述应该是针对老的8042的,在目前的使用EC的系统中,这些status register和command描述在哪个文档中可以找到?比如intel的santarosa,使用renessas的H8s 2104 EC,按道理上述状态寄存器,命令等的描述应该在2104 datasheet里,但是我怎么找都没有。还是有某个spec定义了这些命令格式?新手问题,高手莫笑
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-1 21:28 , Processed in 0.191126 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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