GPIO介绍及编程

研华主板上大多使用的super I/O芯片为WinBond的W83627,针对主板上的GPIO功能,参考芯片手册,可

以大致总结如下,并按芯片手册说明,进行寄存器的配置,配置完成后,即可针对设定的GPIO进行输出与输出的设置。以下针对寄存器的相关介绍及配置顺序,均参考芯片手册,具体请参考芯片手册p78-p80以及p97-p98。
(一).w83627相关寄存器介绍
W83627配置寄存器
   W83627HF/F 使用兼容PNP协议访问配置寄存器以进行不同类型的配置。在W83627HF/F内,共有11个逻辑设备(从逻辑设备0到逻辑设备B),相应的代表11个 独自的设备功能:FDC(逻辑设备0),PRT(逻辑设备1),UART1(逻辑设备2),UART2(逻辑设备3),KBC(逻辑设备5),CIR(逻 辑设备6),GPIO1(逻辑设备7),GPIO2(逻辑设备8),GPIO3(逻辑设备9),ACPI(逻辑设备A),和硬件监控(逻辑设备B)。每一 个逻辑设备都有它自已的配置寄存器(CR30以上)。通过把相应的逻辑设备号写入逻辑设备选择寄存器CR7,主机可以访问这些寄存器。如果要使用GPIO 功能,需要芯片进入到扩展功能模式。即首先应对扩展功能进行使能。

扩展功能寄存器
  在兼容PNP上,有两种方式可以进入扩展功能,并针对配置寄存器进行读或写。HEFRAS(CR26 bit 6)被用来选择进入扩展功能模式的两种方法之一,如下:
HEFRAS ADDRESS and VALUE
0 Write 87h to the location 2Eh twice
1 Write 87h to the location 4Eh twice

  上电复位之后, (pin 51)的值通过CR26的HEFRAS被锁存。在兼容PNP上,一个指定的值(87h)必须写入扩展功能使能寄存器两次(I/O端口地址为2e或4e)。 其次,索引值(02h,07h~ffh)必须被写入扩展功能索引寄存器(I/O端口地址为2e或4e,地址与扩展功能使能寄存器相同),以指明哪一个配置 寄存器将被访问。之后通过扩展功能数据寄存器(I/O端口地址为2F或4F),可以访问所需的配置寄存器。
  针对配置寄存器的编程结束之后,一个额外的值(AAh)应该被写入EFERs,以退出扩展功能模式,目的是防止无目的的访问到这些配置寄存器。也可以通过设置CR26的bit 5(LOCKREG 锁定寄存器)为高,以避免配置寄存器被非正常(偶然)访问到。
  配置寄存器可以通过冷复位(pin MR=1)被复位到缺省值或硬件设置值。热复位不会影响到配置寄存器。
扩展功能使能寄存器(EFERs)
   上电复位后,W83627HF/F进入到缺省操作模式。在W83627HF/F进入到扩展功能模式之前,一个指定的值必须被编程到扩展功能使能寄存器 (EFER),这样扩展功能寄存器才可以被访问。扩展功能使能寄存器为只写寄存器。在PC/AT系统中,端口地址为2e或4e。
扩展功能索引寄存器(EFIRs),扩展功能数据寄存器(EFDRs)
   进入扩展功能模式后,扩展功能索引寄存器(EFIR)必须被植入一个索引值(01,07-FE)以访问配置寄存器0(CR0),配置寄存器 7(CR07)到配置寄存器FE(CRFE),等等通过扩展功能数据寄存器(EFDR)。EFIRs为只写寄存器,在PC/AT 系统上端口地址2e或4e;EFDRs为可读/写寄存器,端口地址为2f或4f。
(二).配置顺序
  编程W83627HF/F配置寄存器,必须遵循以下配置顺序:
  1.进入扩展功能模式
  2.对配置寄存器进行配置
  3.退出扩展功能模式
进入扩展功能模式
  将芯片配置成扩展功能模式,连续写两个0x87到扩展功能使能寄存器(EFERs,2e 或 4e)
对配置寄存器进行配置
  芯片选择逻辑设备,并通过扩展功能索引寄存器(EFIR)和扩展功能数据寄存器(EFDR),将需要的逻辑设备激活。 EFIR和EFER的地址相同,EFDR地址为EFIR的地址+1。
  首先,将逻辑设备号(以0x07 GPIO port1为例)写入EFIR,之后再将逻辑设备号写入EFDR。 如果访问芯片(全局)控制寄存器,这一步是不需要的。
  其次,将所需要的逻辑设备的配置寄存器地址写入EFIR,之后就可以通过EFDR读或写所需要的配置寄存器。
退出扩展功能模式
  退出扩展功能模式,需要向EFER写入0xAA。一旦芯片退出扩展功能模式,它就将会在普通模式下运行,又可以准备进入配置模式了。


研华主板PCM-9387主板使用的为逻辑设备7 GPIO port1, GP10-GP17,它的寄存器如下:
GPIO registers

GRF0(GP10-GP17 I/O selection register。 Default 0xff)
when set to a ’1’,respective GPIO port is programmed as an input port
when set to a ’0’,respective GPIO port is programmed as an output port
CRF1(GP10-GP17 data register。Default 0x00)
if a port is programmed to be an output port,then its respective bit can be read/write
if a port is programmed to be an input port,then its respective bit can only be read
CRF2(GP10-GP17 inversion register。Default 0x00)
when set to a ’1’,the incoming/outgoing port value is inverted
when set to a ’0’,the incoming/outgoing port value is the same as in data register
Extended Function Index Registers(EFIRs)
the EFIRs are write-only registers with port addres 2Eh or 4Eh on PC/AT system
Extended Function Data Registers(EFDRs)
the EFDRs are read/write registers with port address 2Fh or 4Fh on PC/AT system

主板上定义GPIO connector(CN7),可以使用的为以下四个IO:
Pin Signal
2 GPIO4
3 GPIO0
4 GPIO5
5 GPIO1


PCM-9387主板所给汇编示例如下
;-----------------------------------------------------------------------------------------------
;Enter the extended function mode, interruptible double-write
;-----------------------------------------------------------------------------------------------
MOV DX,2EH
MOV AL,87H
OUT DX,AL
OUT DX,AL
;-----------------------------------------------------------------------------------------------
Configure logical device7(GP10-GP17),configuration register CRF0,CRF1,CRF2
;-----------------------------------------------------------------------------------------------
MOV DX,2EH
MOV AL,07H ;point to Logical Device Number reg
OUT DX,AL
MOV DX,2FH
MOV AL,07H ;select logical device 7
OUT DX,AL
MOV DX,2EH
MOV AL,F0H
OUT DX,AL
MOV DX,2FH
MOV AL,00H ;01:INPUT   00:OUTPUT FOR GP10-GP17
OUT DX,AL
MOV DX,2EH
MOV AL,F2H
OUT DX,AL
MOV DX,2FH
MOV AL,00H ;set GPIO is normal not inverter
OUT DX,AL
MOV DX,2EH
MOV AL,F1H
OUT DX,AL
MOV DX,2FH
MOV AL,??H ;Put the output value into AL
OUT DX,AL

;------------------------------------------------------
exit extended function mode
;------------------------------------------------------
MOV DX,2EH
MOV AL,AAH
OUT DX,AL

改为C语言,并附注释
//w83627hf_aw.pdf page 78-80
#include
#include

void main()
{
  //83627hg-aw chip
//enter the extended function mode,two successive writes of 0x87 must be applied to
//Extended Function Enable Registers(EFERs,i.e. 2Eh or 4Eh)
  outportb(0x2e,0x87); 
  outportb(0x2e,0x87);
  
  //Configurate the configuration registers
  //configure logical device 7(gp10-gp17),configuration register CRF0,CRF1,CRF2
  //select logical device 7
  outportb(0x2e,0x07); //EFIR  write logical device index to EFIR
  outportb(0x2f,0x07); //EFDR  write logical device index to EFIR
  
  //CRF0(GP10-GP17 I/O selection register   Default 0xff)
  //when set to a ’1’, respective GPIO port is programmed as an input port
  //when set to a ’0’, respective GPIO port is programmed as an output port
  outportb(0x2e,0xf0); //select CRF0
  outportb(0x2f,0x00); //01:input  00:output for gp10-gp17 
  
  //CRF2(GP10-GP17 inversion register Default 0x00)
  //when set to a ’1’,the imcoming/outgoing port value is inverted
  //when set to a ’0’,the imcoming/outgoing port value is the same as in data register
  outportb(0x2e,0xf2); //select CRF2
  outportb(0x2f,0x00); //set gpio is normal not inverter
  
  //CRF1(GP10-GP17 data register Default 0x00)
  //if a port is programmed to be an output port,then its respective bit can be read/write
  //if a port is programmed to be an input port,then its respective bit can only be read
  outportb(0x2e,0xf1); //select CRF1
  outportb(0x2f,value); //output the value you want to set

  //exit extended function mode
  outportb(0x2e,0xaa);
  //sleep(10);

}

你可能感兴趣的:(编程,function,input,扩展,Signal,output)