【我所認知的BIOS】—>Super IO

来源:互联网 发布:网络歌手初音真人照片 编辑:程序博客网 时间:2024/05/21 17:08

【我所認知的BIOS】—>Super IO
By LightSeed

2009-9-2  

1、Superio概述
Super I/O芯片也叫I/O芯片。在486以上档次的主板上都有I/O控制电路。因为在南桥这样的高速设备和串行、并行接口、软盘驱动器及键盘鼠标等大量低速设备之间必定存在资源的不匹配,而需要经过转换和管理。而Super I/O芯片则完成了该功能。

通常在硬件监控芯片硬件监控芯片中会整合超级I/O功能,可用于监控受监控对象的电压、温度、转速等。主板在附件中会提供某种软件,它和主板上的硬件配合使用就能实现对电压、温度、风扇转速等的监控,一旦检测到这些参数超出设定的指标时,它会自动作出调整,以保护元件的安全。常见的温度控制芯片有ADT7463等等;通用的通用硬件监控芯片有Winbond的W83697HF和W83627HF,SMSC的LPC47M172,ITE的IT8705F、IT8703F,ASUS的AS99172F等等,这些芯片通常还整合了对于温度的监控需与温度传感元件配合;对风扇电机转速的监控,则需与CPU的散热风扇配合使用。

(以上是从互联网上copy的,^^,我太懒了呵呵,本可以翻译一下datasheet里的文字的。不过上面的文字到是把大概的东西都说到了。)

2、SuperIO的样子
文字说了那么多,感到晦涩又不爽。还是先一睹他们的风采哈,(笔者:这篇文章主要还是介绍Winbond的83627HG这块芯片,(笔者:这里有下载芯片的datasheet 网址:

http://pdf1.alldatasheet.com/datasheet-pdf/view/203869/WINBOND/W83627HG-AW.html)其他芯片其实也是触类旁通了。)图1是Winbond的83627HG在实际主板上的样子。图2是ITE的superio在主板上的图片。

 

 


图1 Winbond的83627HG在实际主板上的样子

 

 


图2 ITE的superio图片

3、83627传输IRQ的方式
83627HG是采用SERIAL IRQ的方式来传输IRQ,至于SERIAL IRQ的介绍在之前的文章中我有详细的探讨,如果您对这个有兴趣再返回去看看。连接是这个。

http://blog.csdn.net/lightseed/archive/2009/06/16/4274206.aspx

4、Winbond 83627上的设备
4.1设备列表
让我们来罗列一下Winbond 83627上的设备,共13个设备,他们分别是:FDC(logical device 0), PRT(logical device 1),UART1 (logical device 2), UART2(logical device 3), KBC(logical device 5), CIR(ConsumerIR, logical device 6), GPIO1(logical device 7), GPIO2(logical device 8), GPIO3(logical device9), ACPI (logical device A), and hardware monitor (logical device B). 图3是他们的抽象示意图。

 

 


图3 逻辑设备示意图

4.2各个设备的寄存器
如果您以前没有玩过X86的东东可能有点一下子反应不过来我后面要说的。(因为以前一开始我学习的时候就是死活转不过脑筋来。不过再回头看两次就应该OK了。)

每一个逻辑设备它们都有自己的配置寄存器,不过要记住哦,这些寄存器都是offset在30h以上的哦。为什么呢?因为offset 0h~30h都是叫做global的寄存器。从C语言的风格上讲就叫做全局变量,而30h以后的寄存器则是局部变量。

那么您第一个会问,这么多个设备在同一个芯片中,我在配置的时候怎么才能选中它们呢?(当时看datasheet我是迷惑了半天),原来在datasheet第九章第一段的最后一句有详细的说明:

logical device number into logical device select register at CR7.真想大白于天下,那么我们去操作offset 7h这个寄存器就可以直接选中我们需要配置的寄存器了。

5、配置空间
配置空间在Winbond 83627里,大致被分成了两类。一类是global的,一类是属于各个设备的。对于每个设备而言,当我们访问到的0~255个寄存器中,0~30h都是属于global的。图4是它们的示意图

 


图4配置空间的架构示意图

6、配置实例
介绍了function,背景这么多,其实我最关心的还是怎么去配置各个设备。Winbond 83627要配置它的话比较特殊,必须要先输入entry key。大致分为三个步骤:

(1) Enter the extended function mode

(2) Configure the configuration registers

(3) Exit the extended function mode

外孙打灯笼,我们来看看详细的配置代码吧,加上详细的注释。

;----------------------------------------------------------------------

; Enter the extended function mode ,interruptible double-write |

;----------------------------------------------------------------------

MOV DX,2EH     ;选择index端口,这个2E也是有原因的,详细看看datasheet page78

MOV AL,87H      ;entry key

OUT DX,AL

OUT DX,AL        ;连续两次输出到index端口,这个是芯片的规定

;----------------------------------------------------------------------

; Configurate logical device 1, configuration register CRF0 |

;----------------------------------------------------------------------

MOV DX,2EH

MOV AL,07H      ;选择global寄存器中的offset 07h,准备选择device

OUT DX,AL       ; point to Logical Device Number Reg.

MOV DX,2FH      ;选择data端口

MOV AL,01H      ;准备选择01h设备

OUT DX,AL       ; select logical device 1,到这里已经选中了device 1了

;

MOV DX,2EH

MOV AL,F0H      ;准备修改寄存器F0H

OUT DX,AL       ; select CRF0

MOV DX,2FH

MOV AL,3CH      ;准备把control register F0H的值改为3CH

OUT DX,AL       ; update CRF0 with value 3CH

;------------------------------------------

; Exit extended function mode |

;------------------------------------------

MOV DX,2EH

MOV AL,AAH      ;退出配置模式的key

OUT DX,AL        ;退出

当然有些device是需要从superio里面读取寄存器的值出来,而且频率还挺高的。方法与写入的过程类似,我们BIOS在initial superior的过程中均是用的datasheet里提供的方法。(就是上面的方法)

7、结束
Superio这部分的东西其实还是比较简单的,但是。。。但是。。。很多时候出问题就在superio上面,比如说串口呀,KBC(keyboard controller)呀什么的,经常会有这样那样的bug。所以也要引起足够的重视呢。至于找bug的技巧嘛,呵呵。。。我也还在学习中。希望大家相互探讨哦,实践方面晚辈掌握的实在是太少了。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lightseed/archive/2009/09/02/4512464.aspx

原创粉丝点击