Linux 访问superio 寄存器,ITE Super IO 学习 - GPIO

简述

Super IO中的GPIO逻辑设备功能还是挺丰富的,除了通用GPIO功能,还支持看门狗(Watch Dog Timer)、SMI输出路由(SMI Ouput Routing)、外部中断路由(External Interrupt Routing)、LED闪烁(LED Blinking)等功能。这里就主要记录下LED Blinking这个功能,其它的有需要再研究。

LED Blinking主要用在Power LED上,如进入S3后要呼吸或闪烁,S0常亮,S5则是关闭状态。

寄存器说明

GPIO功能主要由几个寄存器控制:

1.Polarity Register:极性控制寄存器,操作它可使相应GPIO的电平翻转,即:高->低,低->高

2.Internal Pull-Up Register:内部上拉控制寄存器,用于提高上拉的驱动能力

3.Simple Enable Register:用于控制相应的PIN是GPIO功能还是复用功能

4.Input/Output Select Register:输入输出选择寄存器,用于选择GPIO是输入功能还是输出功能

5.Input/Ouput Control Register:输入输出控制寄存器,用于控制GPIO的电平,当GPIO为输入时,读它可得到输入电平;当GPIO为输出时,可设置GPIO输出的高低电平

LED Blinking相关寄存器:

IT8625提供了两组控制LED Blinking的寄存器,即可以使用两个LED作为Blinking

Linux 访问superio 寄存器,ITE Super IO 学习 - GPIO_第1张图片

1.GP LED Blinking 1 Pin Mapping Register:需要在此寄存器bit0-5填入用于Blinking GPIO的编号,GPIO与编号的对应表可按照说明参考表8-13

Linux 访问superio 寄存器,ITE Super IO 学习 - GPIO_第2张图片

2.GP LED Blinking 1 Control Register:

bit0:置1的话这个PIN会一直输出低,可用于控制非S3 LED的状态,如S0的时候,输出低,LED常亮(前提是LED硬件设置的是低电平导通)。

bit3-1:用于设置LED闪烁的频率

其它bit可以不用管

Super IO还提供了一组用于控制LED呼吸效果的寄存器,不过只能设置一个LED有呼吸效果。

Linux 访问superio 寄存器,ITE Super IO 学习 - GPIO_第3张图片

1.Breath LED Control Register1:

bit5-4: 呼吸的最大占空比设置

bit3-2: 呼吸递减级别设置

bit1-0:呼吸递增级别设置

要求不高的话这个寄存器可以不用设置,使用默认的即可,不影响工作

Linux 访问superio 寄存器,ITE Super IO 学习 - GPIO_第4张图片

2.Breath LED Control Register1:

bit7: 呼吸效果启用寄存器,需置一

bit6-4: 最大占空比延时周期设置,可以不设置

bit2-0: 零占空比延时周期设置,可以不设置

配置步骤

假设GPIO35为Power LED,该LED在不同电源状态的定义为:

S0常亮,S3呼吸,S4、S5常灭,配置步骤如下:

1.设置为GPIO功能。GPIO35属于第三组GPIO,可在Global Configuration Registers,Index=27h处bit5设为1

2.设置GPIO为Output。将Input/Output Select Register Index=CAh处bit5设为1

3.设置GPIO35为Blinking LED。从表8-13可知,GPIO35的编号为011101,即0x1D,填入GP LED Blinking 1 Pin Mapping Register中(注意bit7)

4.启用呼吸功能。Breath LED Control Register1 bit7置一即可

执行完这4步便可以看到呼吸效果了,不过这是S3的状态。在不更改这四个步骤的情况下要让它常亮/灭该怎么设置呢?可以巧用GP LED Blinking 1 Pin Mapping Register的bit0的Output low功能,将它置一便可使GPIO35一直拉低,拉高的话可以在此基础上将GPIO的极性反转(Polarity Register),即可拉高,这样Power LED的三个状态便都实现了。

Input/Ouput Control Register

前文提到配置Power LED最后一步要去控制GPIO的高低电平,巧用Polarity Register去控制,但是要通过Input/Ouput Control Register去控制该怎么做呢?

这个寄存器不在LDN定义的寄存器中,而是在IO Space。

Linux 访问superio 寄存器,ITE Super IO 学习 - GPIO_第5张图片

IO SPACE的地址可通过Simple I/O Base address MSB/LSB Register得到,这个地址是需要BIOS配置的,这里假如配置为0x900(需要经过南桥DECODE,不然无法访问),可用RW直接访问此处。地址没问题的话能看到前面几个字节是有数据的,如下图:

Linux 访问superio 寄存器,ITE Super IO 学习 - GPIO_第6张图片

Linux 访问superio 寄存器,ITE Super IO 学习 - GPIO_第7张图片

前面8个字节代表8组GPIO,将0x02的bit5置一即可将GPIO35拉高,反之则拉低。如果GPIO设置的为input,此处读出来的就是外部的电平。

你可能感兴趣的:(Linux,访问superio,寄存器)