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

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

[复制链接]
发表于 2008-7-14 00:04:00 | 显示全部楼层 |阅读模式
bini殇,能帮详细解释一下bios post过程中的所有发给ec的60/64命令号码和意义吗?数据量比较大,截不住。
发表于 2008-7-14 12:09:38 | 显示全部楼层
转个别人发的,不知道LZ能不能用上  
/ W; v; f- `4 A- J. N3 e
& a, s+ `# w3 ~6 V# r9 s# M4.2.7 Command8 i" d! Z$ |$ B8 Q
% w( P% f8 d  a1 _9 ~
通过8042芯片,可以:$ U& S3 s9 k2 X% d7 U( Y
向8042芯片发布命令(通过64h),并通过60h读取命令的返回结果(如果有的话),或通过60h端口写入命令所需的数据(如果需要的话)。
+ S$ f. J# m) ?% H7 P# r' m读取Status Register的内容(通过64h);
3 |- r8 _6 F5 Z. {. A向8048发布命令(通过60h);# E3 r. j0 O1 u1 x/ [) k  j
读取来自于Keyboard的数据(通过60h)。这些数据包括Scan Code(由按键和释放键引起的),对8048发送的命令的确认字节(ACK)及回复数据。7 K* j( v; N5 H9 w, D/ I2 v% ?

/ h/ v  d- y8 E4 ]2 o再次强调一遍,Command(命令)分为发送给8042芯片的命令和发送给8048的命令。它们是不相同的,并且使用的端口也是不相同的(分别为64h和60h)。
2 k+ E; C8 [" ]7 |" e
/ f5 W" E* y! ]& U3 Q$ P* S/ H& M! x9 I8 I  ]  z4 K2 n
; ?9 R4 h1 s# B5 E; @4 U
    * 64h端口(读操作)
* `$ g1 |: O# y6 {2 S1 n3 Y$ |; G, S& j4 N  N# D, s/ l& h
* ^: v. ~. C  Y6 b2 B+ B
对64h端口进行读操作,会读取Status Register的内容。
9 [, y. B9 t7 C5 D7 p; F2 |
9 u) @4 Z( ]' v5 Rinb %0x64
# D( G) |! g( P, T4 O执行这个指令之后,AL寄存器中存放的就是Status Register的内容。3 Y9 M$ C  ^% u" x) Q2 _

. t1 [5 n) k5 o/ @7 x) x    * 64h端口(写操作); u6 C" g* R, P1 y* R  B, S. O
. b$ N7 \. X& t" x- E( E6 E* p* o
向64h端口写入的字节,被认为是对8042芯片发布的命令(Command):
3 D7 W, t# z+ G" D; \Ÿ
5 t6 T7 Z- P2 R* S' L写入的字节将会被存放在Input Register中;4 @4 r2 V2 t. n- `" s- ?) e
Ÿ3 y6 F& j; j1 R4 z. A
同时会引起Status Register的Bit-3自动被设置为1,表示现在放在Input Register中的数据是一个Command,而不是一个Data;2 Q* Y  h0 X# R" d% z+ c  f
Ÿ' E# R' @+ }5 T- `5 V
在向64h端口写某些命令之前必须确保键盘是被禁止的,因为这些被写入的命令的返回结果将会放到Output Register中,而键盘如果不被禁止,则也会将数据放入到Output Register中,会引起相互之间的数据覆盖;- O* A# p# r3 Z/ |6 b# ~
Ÿ3 n- g) L* {" j
在向64h端口写数据之前必须确保Input Register是空的(通过判断Status Register的Bit-1是否为0)。
4 `6 y/ ^2 N+ p2 }5 _
( @' z! C) r8 b$ v! v* G" ivoid wait_input_empty(void)
# ]) ]' t% Y9 J0 U/ g8 ^) t4 F{+ U- e$ E. \* w5 e
   char __b;* F+ ^2 P0 @4 n. a. x% |! \
. `& H3 L# l/ |2 A; P
   do{
- f; E- q  m$ H     __b = inb(0x64);
' x3 }4 z% n+ f: X   }while(!(__b&0x02));- o8 i2 x9 J. m% h- X; l
}; x) k. A" n$ K. h

( c' z3 Q2 ~+ @8 {8 Qvoid disable_keyboard(void)
( M! i: [! N/ ?2 k. R2 ?/ c# d( H{
* m7 p) U. J, K9 c% Y& E   wait_input_empty();8 d% C, u- E6 O  r7 z, @
   outb(0x64, 0xAD);
. n: e- _3 u- r: N1 m0 V}[size=+0]
; L. J3 F* n! {0 \# X5 x# E6 m7 w2 C
    * 60h端口(读操作); W$ r6 Q5 P  P# e" q

0 u, P- T! [- C7 G. K8 n) m对60h端口进行读操作,将会读取Output Register的内容。Output Register的内容可能是:
% d/ g0 R. _( {% L# ?+ E. r4 \Ÿ           来自于8048的数据。这些数据包括Scan Code,对8048发送的命令的确认字节(ACK)及回复数据。
; U- t" k- E. @, X3 V6 L# b( q# qŸ           通过64h端口对8042发布的命令的返回结果。' n) w7 K2 b1 i9 t, p  O
! H: b5 F# l& [# ]& m+ b
在向60h端口读取数据之前必须确保Output Register中有数据(通过判断Status Register的Bit-0是否为1)。
' e% I( e$ D: Q. C1 j  g1 tvoid wait_output_full(void)
9 f) R( J& E$ _% @6 c, V7 k% J{
/ H& @0 n. {: N* ~! G   char __b;$ J) ?, U. w, N: p
( d# K  T0 j: Y- a' a
   do{
2 w0 ]1 h+ j# j% S) w' ^     __b = inb(0x64);# g8 ]: i4 y3 D& Z+ G! e
   }while(__b&0x01);
3 ?* r0 F$ V( L4 V. ~9 G}
! n) b6 Z) ]" ^2 G0 \, T% L$ I" S$ @6 h9 p' u2 ^. @1 \2 V
unsigned char read_output(void)0 O; }1 S( I2 ?9 V( C7 f
{
: B1 p8 w" O# X7 A   wait_output_full();
& z4 ]: o% x& r/ K& j+ a2 l7 O+ x% n   return inb(0x60);
3 g) k/ ]  M& c4 g9 h/ P- \}  p: X7 o; N8 A% t8 @7 w4 z  Q2 f
  B- t+ Y9 M& E( Z( a
    * 60h端口(写操作)* c: @' p7 P2 a/ U/ [; z

( |8 U1 J3 I% v* g; u) ^向60h端口写入的字节,有两种可能:8 H4 t# j/ |7 E  L  m  h
1.如果之前通过64h端口向8042芯片发布的命令需要进一步的数据,则此时写入的字节就被认为是数据;
5 z  d; v& w; r9 T! g2.否则,此字节被认为是发送给8048的命令。
# e! |$ e- l3 ^, t
$ w. C& r: U' M: f4 l8 x. i在向60h端口写数据之前,必须确保Input Register是空的(通过判断Status Register的Bit-1是否为0)。
9 o3 Z# q% ^. y! ~# {7 d) w; r3 @! L

6 E6 I4 s6 Z3 e6 }1 G# r[size=+0]4.2.7.1 发给8042的命令
5 d/ `, u: k& ]4 R6 S' M3 s% I2 H/ R- h  l
    * 20h & g; ~: o3 Y$ l4 y/ c5 f5 Y
- e* M& c( z, S, C$ u# @2 b
准备读取8042芯片的Command Byte;其行为是将当前8042 Command Byte的内容放置于Output Register中,下一个从60H端口的读操作将会将其读取出来。
0 h2 N4 W6 Y3 d/ o; l
! |: Q, @- ~/ I; w. X" w9 q4 `* v2 X& F  W3 E9 U* Q
unsigned char read_command_byte(void)
  m+ N8 {% j% S' g+ H; x{
" m- M7 U$ R/ K; |( x   wait_input_empty();
2 h' ]6 m& L' U  t+ V' ]! y7 ~   outb(0x64,0x20);
- F6 F4 m5 M' V3 z+ a  v   wait_output_full();
" ^$ s9 s2 p) |+ J9 o# O- J   return inb(0x60);   6 X  T0 w. S( a! @- X) r
}4 `8 P$ ~/ E* S/ X: Z& X
7 E# ^% G- c3 q
    * 60h% Z3 C$ m3 w5 C+ r5 B4 [# c3 U1 q5 m
4 s# O3 M; p6 M8 T8 H
准备写入8042芯片的Command Byte;下一个通过60h写入的字节将会被放入Command Byte。% z! c; f+ s0 o

# f$ m6 a* @6 ?5 m9 m  Q7 I# C! \" u, V; g. l/ K; Y8 Q3 Y4 h1 V
void write_command_byte(unsigned char command_byte)
7 H! E- `- w% r{/ {8 B; ^- V$ z) o  m
   wait_input_empty();$ T, ~! r% r1 I" E7 H4 }. t
   outb(0x64,0x60);8 \* |8 k) q4 \7 }. e) M0 E6 Q
   wait_input_empty();
7 Y/ E2 Z0 }0 R% {3 y) l   outb(0x60,command_byte);
  ^) [5 r" `* a}
1 ~5 ?/ C# [1 c+ z% l$ y& e
+ W* x; `- ~% r7 C  f$ |
4 f& d3 p! w; `& ^0 I: o    * A4h7 s2 D4 w3 }: ]3 e% G# ?: _- B9 \0 Z
! G) M) A, A7 w; q
测试一下键盘密码是否被设置;测试结果放置在Output Register,然后可以通过60h读取出来。测试结果可以有两种值:FAh=密码被设置;F1h=没有密码。+ ~! k6 M: E4 B' G- b( ~
bool is_set_password(void)
1 Y- Z3 ]3 e6 Y$ Q. s, M{
# m# c* r6 t2 J' Z$ d0 @1 c3 v$ }   wait_input_empty();
+ q; F) b( f/ \2 ^& ]   outb(0x64,0xA4);
* k& `9 V; O2 S: O$ b7 P+ E   wait_output_full();- S0 v5 u. N' J& k6 W
   return inb(0x60)==0xFA?true:false;   7 l4 P8 Q9 S2 D4 ^
}
: Q& H2 ?+ r+ i$ S
$ C! Q/ ^- J+ }$ b; y( z, \    * A5h
2 a% u" ^% c0 ^! K
; e+ [2 \3 |$ b设置键盘密码。其结果被按照顺序通过60h端口一个一个被放置在Input Register中。密码的最后是一个空字节(内容为0)。- q8 A, F5 e3 `; e: E9 c, f; U
void set_password(unsigned char* password)
  Q8 F& D7 H( B0 ?* {* j{
4 r/ d3 M; S. m8 n: ^5 `" _3 l   char* p = password;
* h# U3 n5 k/ G
- o7 L6 r6 K$ j& _0 U   if(p == NULL)- p. g3 b- z! V* f
      return;
6 `* S. q. ~+ z  R! S* N$ {0 F! h2 {3 \& G% m  ?* [7 c% u3 W, k/ V& z( h
   wait_input_empty();
; k$ \& u. d  l  @. q, P   outb(0x64,0xA5);+ ~9 i% m( b% ~5 ~( R
$ X  D2 c6 O- ?
   do{
, a+ ?/ l& [5 O# I5 x      wait_input_empty();
% x: H% w9 i6 c; m2 t      outb(0x60, *p);3 M' x7 j) S; F
   }while(*p++ != 0);/ n; s" t: r& B* ^5 f- p
}
& Q7 A2 `4 r% ?# k* J
' h6 W  C% |+ H6 m    * A6h
( e9 o1 ~2 I5 D( _. x/ }6 ~( j# Z4 }; c1 i. X+ e
让密码生效。在发布这个命令之前,必须首先使用A5h命令设置密码。
3 I) a2 x5 G8 c) ~, lvoid enable_password(void)7 u: S1 h. s* o7 l! I" Y; ~+ S* n
{
; ?3 y+ d8 c# `/ s5 G2 f   if(!is_set_password())' F$ A0 e% ^" f1 T2 \5 D5 l, n/ j
      return;! \0 A8 Y, d1 x
9 w* v) n8 y6 G: A5 @4 m9 z: L% E
   wait_input_empty();/ t) H; \" p1 u$ d
   outb(0x64,0xA6);   + e5 Y1 b! C# e" Z
}
$ f- O" y/ m; V) c2 w: {# m4 L7 W: s$ b! f3 J* W+ b
    * AAh
( ^/ i, e/ k- Z
/ ~$ b7 t! R  d& X. O( s自检。诊断结果放置在Output Register中,可以通过60h读取。55h=OK。
) A' ^( I2 h6 C: v1 X  [$ ]  a% I3 i3 k  {5 f# K, i2 e

, `+ n/ T' G( ^8 hbool is_test_ok(void)2 U6 R6 _! z0 W$ ^3 `4 I& [7 y
{# x9 A, P: c' d& s, k1 K
   wait_input_empty();
) y! [- N, I3 d1 o3 F0 |9 L! o. M# h  ?   outb(0x64,0xAA);) H$ s) ~" W( b, N
0 H3 c2 Z+ U$ g; U; V- L" B

* t- \8 N8 I" C* W: ~3 M8 ?   wait_output_full();
/ ~/ F# J/ n/ k' |   return inb(0x60)==0x55?true:false;   ) U9 k4 ]! y: u& H, L/ |
}! O% u3 @9 y+ F. C  o3 n3 w$ ^
" Q' T( A3 @  d) a: a* v
( W+ `1 b" \2 y8 g
    * ADh
- Z/ R) Y6 {# s  U; x7 r% g" a% u' W* Z/ S8 T( F. @9 w
禁止键盘接口。Command Byte的bit-4被设置。当此命令被发布后,Keyboard将被禁止发送数据到Output Register。& q1 ^- w1 @& `. c, c/ X
void disable_keyboard(void)
: ?: D+ U" j/ b  f$ }- d{
. k7 G$ A( H8 u: m/ S9 C   wait_input_empty();
2 F$ h/ H8 I" Y- z3 [; e   outb(0x64,0xAD);& e! F  k& Q* X

) s/ f# Z1 n1 o' c. [}% Q0 m" V/ K6 {
* Z5 q4 Y" x: Z
    * AEh) F! o; w& E0 P' t6 r
8 v. n; q3 G+ }5 Z1 i+ r
打开键盘接口。Command Byte的bit-4被清除。当此命令被发布后,Keyboard将被允许发送数据到Output Register。
! n9 x" t& s( T& m& [void enable_keyboard(void)
6 C) O5 r/ f0 ]+ M  t7 n, C{
" @. y, o) M, @/ ^; o, a   wait_input_empty();7 Y' b9 C/ Z  V& R
   outb(0x64,0xAE);) t9 k9 ?( c4 T& G* O

3 ~- P7 [9 ^- o' Q}# \1 L7 r. j9 U0 n! C$ b* ?
' e) X; W. B2 x7 u% S" r
    * C0h1 ^4 n9 d7 z, t( q- F

9 O7 w- d* `" @准备读取Input Port。Input Port的内容被放置于Output Register中,随后可以通过60h端口读取。
8 H3 A5 V8 G' {& w# {2 a. punsigned char read_input_port(void)) j! V6 Q, C6 u3 q6 y
{# j% C# B" ^+ p5 t
   wait_input_empty();3 p0 N: P! r' C  T1 j, ^  y
   outb(0x64,0xC0);
! F* i! w$ G% E; q; f
+ I* u1 k8 Q, ~/ X* j0 \/ t/ V; b   wait_output_full();
% `1 r- f* y5 d# j) J7 S( Z
% b7 H8 }" j6 d+ e7 ~: d   return inb(0x60);
+ R! a. ?9 t* Z) R) _! M}2 I" w3 H7 r" G8 V! [5 D5 n

& q" V' E5 ]% `% m) e    * D0h
& m' D7 g8 |' j: M  A
, c! t7 T0 i+ t8 {4 `) b; l4 t准备读取Outport端口。结果被放在Output Register中,随后通过60h端口读取出来。4 m" k; x$ A2 m6 G
unsigned char read_output_port(void)
* E8 C' L% J, [1 {. G: A+ j{) d4 W6 m* V4 O9 i/ C0 c
   wait_input_empty();
% m, L6 x2 \' Z; E0 d   outb(0x64,0xD0);& q  Z: S( ]% V8 t- B! u/ X
" {. o& u+ v5 b: b/ a
   wait_output_full();7 L% Y4 y% l9 B9 j  `  t

# ~! N* C0 E7 K  _4 w   return inb(0x60);* f8 n/ J3 F; }3 s  c" Q( U
}0 J! d* j( f2 D5 D
/ \1 B. Z! j$ C( v0 @6 Y
    * D1h& ]  S/ h& G3 J4 E" h) n7 w

3 u0 j3 Y/ m& i; H& U# o1 u8 M3 L准备写Output端口。随后通过60h端口写入的字节,会被放置在Output Port中。
& V# \0 h' i; z* j# \5 ]void write_output_port(unsigned char __c)
& S: z( ~0 M9 Z{
7 Q8 g3 M- v2 Z+ l. A, l$ \# x   wait_input_empty();
4 Z! @* [0 c' K3 V   outb(0x64,0xD1);8 y4 d4 s1 \$ U# K2 w7 ~

' \) U" u& Q% N8 C+ o6 K* j4 F8 O9 r0 ]   wait_input_empty();
  q$ k5 V# u! n   outb(0x60,__c);
; ^0 U/ r+ g: e  u: Z, e6 X5 T7 X; p: s4 R9 w8 y* X" M% z4 t
}
. `4 g! y& y* d0 b
% T$ y- T6 J. ]6 {' O
0 O& J: c3 {' f5 ]% }& L& Q    * D2h0 F' v% E; E$ Y( M4 t8 C1 ^8 f

( V) C; P, y# L3 Y. L准备写数据到Output Register中。随后通过60h写入到Input Register的字节会被放入到Output Register中,此功能被用来模拟来自于Keyboard发送的数据。如果中断被允许,则会触发一个中断。+ q. W) M! a* T1 A7 u
void put_data_to_output_register(unsigned char __data)5 w6 T- n. R4 X4 _; M0 ^
{
' o6 C/ H4 q3 \- Y( E& P   wait_input_empty();1 V3 k( y0 m; I: H; m
   outb(0x64,0xD2);
0 F! i; U& Y( v5 u
3 t' J! T% F3 W# P2 U   wait_input_empty();
: v& u- \2 ?$ z; S   outb(0x60,__c);
% z5 e% u% d9 `* k+ M2 l}
9 G# J6 }4 T* L6 i) N
8 x; `- e8 |8 m. |4.2.7.2 发给8048的命令7 l9 b1 Z1 O) j( W! o+ v# P6 N4 ^

% Z6 P& T2 u) N9 b0 K2 v9 i
: f0 N0 @4 I+ ?4 H/ L    * EDh
; F$ N) T  M9 a: ?$ a
4 n' u+ X" Q1 _- I% f  ?2 |设置LED。Keyboard收到此命令后,一个LED设置会话开始。Keyboard首先回复一个ACK(FAh),然后等待从60h端口写入的LED设置字节,如果等到一个,则再次回复一个ACK,然后根据此字节设置LED。然后接着等待。。。直到等到一个非LED设置字节(高位被设置),此时LED设置会话结束。
8 G- }7 Z; s) k+ @& T$ D: C2 D4 `7 d( L# X  P* u
    * EEh
  k6 K5 e: p. c6 w$ O5 `$ f0 L6 y3 z. B$ R! ?
诊断Echo。此命令纯粹为了检测Keyboard是否正常,如果正常,当Keyboard收到此命令后,将会回复一个EEh字节。
6 S) p% g5 x/ b$ x* J5 u3 L; Q! Y# X+ X
    * F0h
5 x! t  e# z7 C1 v( B. O2 l5 V1 j. {0 M/ F2 m' a4 t* E3 ^# t
选择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代码所要求的。5 ~- }0 z3 T4 ]5 ]. e6 W: I- ~

2 r$ x0 p; _; i    * F2+ l. n+ H$ I+ P. x: z* C0 v! B) f
% l6 U+ b$ S6 M1 |; r) X
读取Keyboard ID。由于8042芯片后不仅仅能够接Keyboard。此命令是为了读取8042后所接的设备ID。设备ID为2个字节,Keyboard ID为83ABh。当键盘收到此命令后,会首先回复一个ACK,然后,将2字节的Keyboard ID一个一个回复回去。
, Q7 @- t% R' |9 z
3 N+ C- ^; a0 i) m4 e5 d- N8 h    * F3h
( F9 q/ K7 Q1 o0 W- L
3 H; P( m/ l8 ^# Z+ j, v# h& X设置Typematic Rate/Delay。当Keyboard收到此命令后,将回复一个ACK。然后等待来自于60h的设置字节。一旦收到,将回复一个ACK,然后将Keyboard Rate/Delay设置为相应的值。. }& A8 U8 H2 V
' E# R+ C1 M8 H3 i
    * F4h
/ u# w  W2 u6 L
; l! I! J8 n% o% @$ K清理键盘的Output Buffer。一旦Keyboard收到此命令,将会将Output buffer清空,然后回复一个ACK。然后继续接受Keyboard的击键。
# Z' R- k7 j5 `) d5 M& D: G& b' O* ?' h/ `. o8 G2 S& |) B
    * F5h3 h; ?8 S; E, d& f7 {8 Y- {; ^
  Q, j, ~) M" X. ~% g6 K2 V5 d
设置默认状态(w/Disable)。一旦Keyboard收到此命令,将会将Keyboard完全初始化成默认状态。之前所有对它的设置都将失效——Output buffer被清空,Typematic Rate/Delay被设置成默认值。然后回复一个ACK,接着等待下一个命令。需要注意的是,这个命令被执行后,键盘的击键接受是禁止的。如果想让键盘接受击键输入,必须Enable Keyboard。
; ~! {0 n, q3 s9 {- t% _- ^
4 ]; r1 x) Y  a6 Q) T( Z& P    * F6h
9 P" M3 _( K$ Z* q3 N7 F5 N. S! G: s: ^: `+ ~5 p& K$ ?- \
设置默认状态。和F5命令唯一不同的是,当此命令被执行之后,键盘的击键接收是允许的。
  E. M2 j% V$ ~, W0 B" j. l& @% g( ?% k0 x& L! p9 X4 m. t
    * FEh
2 a& T+ {1 ?& Y: F
1 f) t% d2 a3 N3 x: tResend。如果Keyboard收到此命令,则必须将刚才发送到8042 Output Register中的数据重新发送一遍。当系统检测到一个来自于Keyboard的错误之后,可以使用自命令让Keyboard重新发送刚才发送的字节。
8 T& C+ g1 y* n1 u" b& ?  t4 J
8 T" ?! h" q1 n    * FFh
! f8 F) b8 m+ E+ C6 z5 I+ D3 X
3 ?# p& x# p0 ]& o0 ^" y9 m$ c* jReset Keyboard。如果Keyboard收到此命令,则首先回复一个ACK,然后启动自身的Reset程序,并进行自身基本正确性检测(BAT-Basic Assurance Test)。等这一切结束之后,将返回给系统一个单字节的结束码(AAh=Success, FCh=Failed),并将键盘的Scan code set设置为2。
回复

使用道具 举报

发表于 2009-1-14 13:49:16 | 显示全部楼层
好贴!3 Q* [6 G. [2 i) C) i
非常详细!9 C% M8 T0 ^& Y9 U" w( z* I
谢谢!
回复

使用道具 举报

发表于 2009-2-25 17:37:28 | 显示全部楼层
2楼好帖!在helppc的Hardware Data and Specifications栏里有相应的寄存器和命令详细描述。3 u; t" P% s; P

% N2 |8 S( \4 ]" d& v4 m/ s我的问题是,上述描述应该是针对老的8042的,在目前的使用EC的系统中,这些status register和command描述在哪个文档中可以找到?比如intel的santarosa,使用renessas的H8s 2104 EC,按道理上述状态寄存器,命令等的描述应该在2104 datasheet里,但是我怎么找都没有。还是有某个spec定义了这些命令格式?新手问题,高手莫笑
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 09:33 , Processed in 0.067421 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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