|
我所知道的EC====>SMBUS # T- B* ~$ O- g0 r/ b
& w% y% ~( n9 R3 M
1. Introduction
4 l8 u" `* G5 F# x% u5 e# ^0 I0 k9 L/ }% i$ X- ?
Smubs 全称为System management bus即系统管理总线,由Intel于1995年制定,是基于Philips I2C发展而来。它通过两线式接口将各种芯片连接在一起并能够互相通信,传递各种信息。Smbus不仅节省了设备的pin脚,而且更重要的是它为系统提供了更大的扩展性和更加详细的芯片知识,为系统实现更加精细的控制提供了可能。它的时钟频率在10k~100kHz。
' U J g! J* F e/ m) _" ~2 v. d! n- H
2. Where to use? }$ ^4 v3 G: d# {1 R d1 l" {
8 t* @) q! a6 W) h" j$ TSmbus的初衷主要是应用于PC系统中的低速率信息通讯,当然现在在embed system中也有使用。PC系统中memory 的spd信息,clockgen的配置等等都需要使用smbus完成。在MB中它主要用于采集电源管理相关的信息,不过相对于MB,它更加适合NB,因为NB上面有非常多的chip都是基于smbus的,而且NB的电源管理较MB也更为复杂,特别是在引入了ACPI以后,定制Battery、Thermal等的policy都需要用到smbus。在EC端,smbus主要用于这样几个地方:1.battery info 2.cpu/vga thermal info3.使用smbus debug card调试BIOS、EC 4.touch sensor触控按键等。
. O: L. {! {) d0 o c
2 b3 x. O; v( z8 R3. How to use?
9 G$ L% I" ]& [
* f3 I H: E& i7 I, O9 f3 f# EØslave address2 ?) u0 p& B: Q8 ] q0 T
smbus device作为一个slave device挂在smubs总线上,为了能够识别该device,它必须有一个唯一的标识7 bit slave address。设备生产商必须向SMBus Working Group申请专用的地址。下表1中的地址是保留的地址不能分配给设备。2 b/ ^/ x0 V- c6 {! |! J, z# ?
; S) r4 A; J+ E4 W. I
& f: | l5 ]" }) G K2 H- D
# y0 d( A b3 @+ n! g! b- T7 }表 1 ! c" C# C! @0 Q k6 m& i7 ]+ n2 m
. W: n( p7 y" v5 a( A: u* Q7 W B1 B5 a: }
为防止系统中多个设备使用同一个地址造成地址冲突,smbus device必须提供某种机制解决地址冲突(如使用片选等)。目前我们家EC使用到的设备地址有battery:0x98,thermal:0x16,debug Card:0x80,touch sensor:0x58(上述地址bit0填0补成8bits)。 l2 ~* ^: _' a8 Y+ G8 N6 o7 _
9 z3 x" W' c7 n% ~: D0 z$ R
Øusing smbus device
# w4 q; a' @( M我们使用从slave device获取信息的方法是通过按照protocol发命令给slave device。一个slave device通常会有一堆命令,这些命令都是一个字节,对应slave device register,命令的参数和返回值长度并不固定,然后slave device收到命令后会将信息通过smbus回出来。Smbus是两线式的总线,clock&dataclock是同步信号。一切行动都要听从clock的指挥否则就天下大乱了。开始通信和结束通信的时序如下图1所示:
1 K7 F7 A( G7 [7 I ) I/ k) u2 W: G& W1 b& G
2 k& t! z( i9 T
图 1
' ~) C- d+ I, k/ D0 B" b( F( {+ g2 s* z
Clock 保持high data从high到low的跳变表示开始,clock保持High data从low到high的跳变表示结束。一旦通信开始Data只有在clock保持high时才会有效,如果data想要变化也必须在clock low的时候进行,一招一式都得按规矩来。如下图2所示:4 G% I2 I7 u+ I: D' i
$ A ~ | `% Y4 v% u
图 2
2 }9 l X0 l' Z' B3 y+ h6 A; v' H2 G1 R1 x* ?: r& z9 j
Øbus protocols
3 e" e6 p3 @. F6 } s9 f要想使用slave device 要按照protocol发command,smbus spec制定了11条protocol,slave device可以使用其中的任意的一条或多条。这11条分别为Quick Command, Send Byte, Receive Byte,Write Byte, Write Word, Read Byte, Read Word, Process Call,Block Read, Block Write and Block Write-Block Read Process Call。Smbus spec给出了全部protocol的详细时序,我将结合用示波器抓到的波形讲述其中的几条protocol。) O9 U5 m' g( a# ?
·Read Byte
U, M( p3 Q# h' g$ y k下图3描述的是smbus spec中关于Read Byte Protocol说明,我用示波器抓了cpu thermal sensor一次读取过程读到的温度为0x64,如图4所示:0 U6 |/ d! ` F/ [* B
2 W* i) \$ s; b. c0 h1 j 5 ^6 i" ]- u7 N7 F( ?- S
图 3
6 | Z. z9 J! g( ]* y6 h6 I6 F9 s* J$ L
7 s; F- L& m5 L) ~. Y1 d9 f0 _
图 4
' {% B: |5 H( z' K我们对着protocol数数看,图4先是一个start信号然后发了一个0x98的slave address,然后回了一个slave device 回了0,接着master发了个0x01的command,slave回了0,然后又是一个start信号然后master送了一个0x99(bit0为Rd),接着就是cpu的温度0x64,最后master回了个1,通信结束。注意看上图红色圈圈部分,那里data是high可是clock为low,所以是一个无效数据。
3 T* H# A: K# t: A" [·Write Byte6 j% j2 t+ p9 ]; t, w
下图5描述的是smbus spec中关于Write Byte Protocol说明,下图6是我用示波器抓的向smbus debug card写一个0x02的过程,slave device address:0x80,command:0x55,data:0x02。试着分析结果是不是这样?J4 {9 L1 M3 o# o2 J1 B: r' @; l
0 L; N" r% m5 t. E j. y$ Y' B
2 P, H4 J. F8 F' e图 5 % c2 X* z* O! {. l3 G7 y
" z# d; {2 m( \' f$ A9 j7 I1 }
6 a g3 ] f2 P/ i( K5 m
图 6
# v! Y6 w$ y) f7 Q6 Q+ j·Write Word
1 d. s0 I2 L8 W2 ~) t下图7描述的是smbus spec中关于Write Word Protocol明,下图8是我用示波器抓的读取battery temp的过程。slave device address:0x16,command:0x08,data=0xc90b。试着分析结果是不是这样?J* M2 G7 _' [" S4 O6 ^
3 p) c$ a7 \9 g+ f1 L
5 @& W) v2 Q& Z2 {7 S
图 7
' Y0 }$ p" K+ _8 p
1 Z* }* g9 u2 D$ _7 w7 K3 p. S: j3 V9 b. j# e7 y U
图8
1 t) T0 J# O7 H4 q
9 M) x. `- W+ {. d. a
5 A- d& m0 G2 ~- ~* d6 oThat’s all!
/ x% o5 z2 {6 u1 {
2 X5 S% J! Z( p" m( ]$ tPeter |