用于多硬件平台飞腾服务器的i2c总线的实现方法

文档序号:6367545阅读:309来源:国知局
专利名称:用于多硬件平台飞腾服务器的i2c总线的实现方法
技术领域
本发明涉及飞腾服务器的计算机硬件应用平台,特指一种用于多硬件平台飞腾服务器的I2C总线的实现方法。
背景技术
飞腾服务器(FT服务器)是国防科大研制、基于FT1000处理器的服务器计算机平台,其中FT1000处理器是国防科大研制、兼容spare指令集的通用64位处理器。飞腾服务器目前已经有多种不同的硬件平台,这些不同的硬件平台虽然在硬件设计上有多种不同,但是它们都有一个共同的特点,即都会有一个PCIe交换单元来为系统提供PCIe设备的接入点,目前所有的FT服务器平台都使用下面三种PCIe交换单元中的一种,分别是PEX8664、PEX8648以及PEX8632。因此根据所使用PCIe交换单元的不同,可以把FT服务器平台分成3种使用PEX8664作为PCIe交换单元的硬件平台、使用PEX8648作为PCIe交换单元的硬件平台以及使用PEX8632作为PCIe交换单元的硬件平台。现有基于FT1000处理器的飞腾服务器中,通过处理器上集成的PCI-Express Unit (PEU: PCIe单元,它实现了 PCIe总线中的root complex)从而扩展出了 PCIe总线,PCI-Express Unit与PCIe交换单元(PCIeswitch)相连,PCIe switch后面则连有PCIe插槽或者具体的PCIe设备。对于飞腾服务器用GPIO模拟I2C总线的实现而言,目前PCIe交换单元都有片上集成的GP10,且大多未被使用,所以可以选取其中的两个分别作为12C总线的SDA线和SCL线。但是,不同的硬件平台采用的PCIe交换单元不同,因此控制GPIO的端口也不相同。如有些平台的PCIe交换单元采用PEX8664实现,有些平台的PCIe交换单元采用PEX8648实现,有些平台的PCIe交换单元采用PEX8632实现。目前飞腾服务器的基本输入输出系统和加载引导程序在系统启动检测和初始化硬件时把不同平台的PCIe交换单元的PCI内存空间映射到了同一片CPU物理地址空间。但是由于不同的硬件平台之间的采用的PCIe交换单元并不相同,最终导致其I2C总线的实现在软件上也各不相同,具体而言是所述的GPIO驱动程序并不相同,不同的硬件平台之间的I2C总线无法实现通用。飞腾服务器的不同硬件平台的硬件设计上的差异导致了不同平台上I2C总线软件实现上的差异,但是如果不同的飞腾服务器平台使用不同的针对各自硬件平台的实现I2C总线的软件,特别是本发明所要实现的I2C总线功能是要集成到操作系统中的,这将导致在不同的飞腾服务器平台上部署不同的操作系统,这将给飞腾服务器的用户带来不必要的麻烦和使用上的不便,大大降低飞腾服务器的用户体验,不利于飞腾服务器的推广。

发明内容
本发明要解决的技术问题是提供一种能够利用闲置GPIO端口、实施成本低、实现简单、使用方便、兼容性好的用于多硬件平台飞腾服务器的I2C总线的实现方法。为了解决上述技术问题,本发明采用的技术方案为一种用于多 硬件平台飞腾服务器的I2C总线的实现方法,其实施步骤如下
1)在飞腾服务器上PCIe交换单元的片上GPIO端口中指定闲置的两个GPIO端口分别外接上拉电阻并作为I2C总线接口的数据线接口和时钟线接口 ;
2)在初始化硬件时将PCIe交换单元的PCI内存空间映射为CPU虚拟地址空间;
3)获取PCIe交换单元的类型信息,根据所述PCIe交换单元的类型信息获取所述两个GPIO端口在CPU虚拟地址空间中的映射端口地址;
4)在操作系统中建立并注册用于操作所述两个GPIO端口对应映射端口地址的GPIO驱动程序模块;
5)在使用I2C设备前将设备连接到所述两个GPIO端口;在使用I2C设备时,操作系统中的I2C总线控制器驱动程序产生I2C总线时序的指令,且所述I2C总线时序的指令通过所述GPIO驱动程序模块与连接于所述两个GPIO端口上的I2C设备进行通信。作为本发明上述技术方案的进一步改进
所述步骤2)的详细步骤包括在飞腾服务器启动时首先PCIe交换单元的PCI内存空间映射为CPU物理地址空间,然后将所述CPU物理地址空间映射为CPU虚拟地址空间。所述GPIO驱动程序模块包括如下子模块
A)电平输入子模块,用于为读取指定GPIO端口的电平状态,如果所述电平状态为高电平则返回1,如果所述电平状态为低电平则返回0 ;所述电平输入子模块的实现方法为读取指定GPIO端口在CPU虚拟地址空间中映射端口地址中数据输入寄存器的值,并根据所述数据输入寄存器的值返回数值I或0 ;
B)电平输出子模块,用于为配置指定GPIO端口的电平状态,如果配置值为I则输出高电平,如果配置值为0则输出低电平;所述电平输出子模块的实现方法为读取指定GPIO端口在CPU虚拟地址空间中映射端口地址中数据输出寄存器的值,并根据所述配置值配置指定GPIO端口的电平状态;
C)配置输入方向子模块,用于配置指定GPIO端口的传输方向为输入;所述配置输入方向子模块的实现方法为读取指定GPIO端口在CPU虚拟地址空间中映射端口地址中方向寄存器的值,并根据所述配置值配置指定GPIO端口的方向为输入;
D)配置输出方向子模块,用于配置指定GPIO端口的传输方向为输出并在配置方向后在指定GPIO端口上根据配置参数输出高电平或者低电平;配置输出方向子模块的实现方法为读取指定GPIO端口在CPU虚拟地址空间中映射端口地址中方向寄存器的值,并根据配置值配置指定GPIO端口的方向为输出,然后根据配置参数调用所述电平输出子模块输出闻电平或者低电平。本发明具有下述优点
I、本发明利用PCIe交换单元上闲置的GPIO资源来模拟I2C总线的数据线(SDA)和时钟线(SCL),从而能够为多硬件平台飞腾服务器扩展出一条或多条I2C总线,使飞腾服务器在不增加额外设备的前提具有外接I2C设备的能力,大大丰富了飞腾服务器所能实现的功能,扩展了飞腾服务器的应用范围,具有实施成本低、使用方便、实现简单的优点。2、本发明在初始化硬件时将PCIe交换单元的PCI内存空间映射为CPU虚拟地址空间,然后通过获取PCIe交换单元的类型信息、根据PCIe交换单元的类型信息获取GPIO端口在CPU虚拟地址空间中的映射端口地址,因此能够针对不同的PCIe交换单元的类型建立对应的GPIO驱动程序模块,根据不同的PCIe交换单元类型使用不同的虚拟地址访问PCIe交换单元的GPIO端口的寄存器,同时把GPIO驱动程序模块注册进操作系统,实现了对多种硬件平台飞腾服务器的I2C总线的一种支持,可以使在不同硬件平台上的飞腾服务器上部署同一套系统,具有兼容性好、使用方便、操作简单的优点,提高了飞腾服务器的用户体验,有利于飞腾服务器的推广。


图I为本发明实施例一的基本实施流程示意图。图2为本发明实施例一的硬件框架结构示意图。图3为本发明实施例二的硬件框架结构示意图。图4为本发明实施例三的硬件框架结构示意图。
具体实施例方式实施例一
如图I所示,本实施例用于多硬件平台飞腾服务器的I2C总线的实现方法的实施步骤如下
1)在飞腾服务器上PCIe交换单元的片上GPIO端口中指定闲置的两个GPIO端口分别外接上拉电阻并作为I2C总线接口的数据线接口和时钟线接口 ;
2)在初始化硬件时将PCIe交换单元的PCI内存空间映射为CPU虚拟地址空间;
3)获取PCIe交换单元的类型信息,根据PCIe交换单元的类型信息获取前述的两个GPIO端口在CPU虚拟地址空间中的映射端口地址;
4)在操作系统中建立并注册用于操作前述的两个GPIO端口对应映射端口地址的GPIO驱动程序模块;
5)在使用I2C设备前将设备连接到前述的两个GPIO端口;在使用I2C设备时,操作系统中的I2C总线控制器驱动程序产生I2C总线时序的指令,且I2C总线时序的指令通过GPIO驱动程序模块与连接于前述两个GPIO端口上的I2C设备进行通信。I2C器件的高电平电压一般是3. 3V左右,而PCIe交换单元的GPIO端口的高电平状态电压则是2. 5V,因此为了实现GPIO端口电平的兼容,本实施例在步骤I)中对指定的闲置的两个GPIO端口分别外接上拉电阻,从而使得I2C总线空闲时SDA线和SCL线处于高电平状态时输出电压达到3. 3V。此外也可以采用其他的电路来使得I2C总线空闲时SDA线和SCL线处于高电平状态,上述措施均为电路设计的常规技术,因此本实施例不再赘述。本实施例步骤2)的详细步骤包括在飞腾服务器启动时首先PCIe交换单元的PCI内存空间映射为CPU物理地址空间,然后将CPU物理地址空间映射为CPU虚拟地址空间。由于PCIe交换单元的PCI内存空间经过两次映射后,位于PCI内存空间内的GPIO端口同样也被映射为CPU虚拟地址空间内,因此能够直接通过CPU虚拟地址空间内的映射端口地址读写GPIO端口对应的寄存器。由于PCIe交换单元上的GPIO端口并不常用,目前操作系统中并没有专门针对GPIO端口的驱动程序,一般都是针对某一个GPIO读写其控制寄存器来操作它,因此为了实现I2C总线接口的兼容,本实施例针对PCIe交换单元上的所有GPIO端口建立GPIO驱动程序模块来实现对指定的两个闲置GPIO端口的操作。本实施例的GPIO驱动程序模块包括如下子模块
A)电平输入子模块,用于为读取指定GPIO端口的电平状态,如果电平状态为高电平则返回1,如果电平状态为低电平则返回0 ;电平输入子模块的实现方法为读取指定GPIO端口在CPU虚拟地址空间中映射端口地址中数据输入寄存器的值,并根据数据输入寄存器的值返回数值I或0;
B)电平输出子模块,用于为配置指定GPIO端口的电平状态,如果配置值为I则输出高电平,如果配置值为0则输出低电平;电平输出子模块的实现方法为读取指定GPIO端口在CPU虚拟地址空间中映射端口地址中数据输出寄存器的值,并根据配置值配置指定GPIO端口的电平状态,使所选GPIO端口上产生相应的高低电平;
C)配置输入方向子模块,用于配置指定GPIO端口的传输方向为输入;配置输入方向子模块的实现方法为读取指定GPIO端口在CPU虚拟地址空间中映射端口地址中方向寄存器 的值,并根据配置值配置指定GPIO端口的方向为输入;
D)配置输出方向子模块,用于配置指定GPIO端口的传输方向为输出并在配置方向后在指定GPIO端口上根据配置参数输出高电平或者低电平;配置输出方向子模块的实现方法为读取指定GPIO端口在CPU虚拟地址空间中映射端口地址中方向寄存器的值,并根据配置值配置指定GPIO端口的方向为输出,然后根据配置参数调用上文的电平输出子模块输出高电平或者低电平。本实施例中,电平输入子模块、电平输出子模块、配置输入方向子模块和配置输出方向子模块均基于封装的函数实现,此外也可以采用硬件实现。步骤3)中获取PCIe交换单元的类型信息的方法目前有多种,本实施例中是通过读取系统ROM中存储有硬件平台的类型码,由于硬件平台的类型码与平台所使用的PCIe交换单元是一一对应的,因此根据平台类型码可以识别所使用的PCIe交换单元的类型信息。对于飞腾服务器实现I2C总线及所接I2C设备功能的软件实现而言,在应用层面有对应不同种类I2C设备的应用程序,如对应于《83975等用于监控系统状态的I2C设备的应用程序sensors等。应用程序通过文件系统中/dev目录下的设备节点与对应于具体I2C设备的设备驱动程序交互,如W83975设备驱动程序。设备驱动程序通过I2C核心与用软件实现的I2C控制器交互,I2C控制器通过GPIO驱动程序操作PCIe交换单元上的GPIO端口产生GPIO时序从而与I2C总线上连接的I2C设备通信,在这条整个路径中,最终实现了应用程序与I2C设备之间的交互,从而应用程序能够控制I2C设备从而实现具体功能。在这条整个路径中,应用程序和I2C设备驱动程序是对应于具体I2C设备的,这不是本实施例关心的部分,本实施例旨在实现一条I2C总线,因此只关心其中的I2C控制器和GPIO驱动程序。在操作系统I2C子系统中已经有了用软件实现的I2C控制器,即是位于drivers/I2C/buses/目录下的文件I2C-gpio. c中所实现的I2C控制器驱动程序,该I2C控制器驱动程序即为本实施例所依赖的已有的软件基础,从而能够在没有I2C相关硬件的前提下利用PCIe交换单元的GPIO端口实现I2C总线。本实施例能够实现不用区分不同平台的不同PCIe交换单元而用同一软件访问的配置空间寄存器而不产生兼容性问题的原因如下飞腾服务器初始化硬件时(基本输入输出系统和加载引导程序在检测和初始化系统中的硬件时)把不同平台的不同PCIe交换单元的PCI内存空间映射到了同一片CPU物理地址空间,再将CPU物理地址空间映射为CPU虚拟地址空间,然后使用虚拟地址访问PCIe交换单元的PCI内存空间,根据硬件平台信息获取PCIe交换单元的GPIO模块在CPU虚拟地址空间内的映射端口地址,通过GPIO的映射端口地址,实现不同PCIe交换单元的GPIO驱动程序,如果接收到操作系统上层的用软件实现的I2C控制器在SDA和SCL线上产生时序的命令,则由GPIO驱动程序控制GPIO端口在SDA线和SCL线上产生I2C总线相关时序,该时序会与I2C总线上连接的I2C设备通信从而实现I2C总线功能。而且PCIe交换单元的配置空间中的寄存器同样位于PCI内存空间中,因此可以使用访问PCI内存空间的方法 来访问PCI配置空间中的寄存器。如图2所示,本实施例中,飞腾服务器的PCIe交换单元采用PEX8664芯片实现,通过将本实施例的I2C总线实现方法应用于安装有银河麒麟飞腾版操作系统的飞腾服务器,两个GPIO端口模拟的I2C总线接口连接有用于控制飞腾服务器关机的关机控制器,经验证两个GPIO端口模拟的I2C总线接口能够输出正确的关机控制脉冲时序,成功地实现了飞腾服务器的关机断电。实施例二
如图3所示,本实施例与实施例一基本相同,其不同点为飞腾服务器的PCIe交换单元采用PEX8648芯片实现,通过将本实施例的I2C总线实现方法应用于安装有银河麒麟飞腾版操作系统的飞腾服务器,在两个GPIO端口模拟的I2C总线接口连接有用于控制飞腾服务器关机的关机控制器,经验证两个GPIO端口模拟的I2C总线接口能够输出正确的关机控制脉冲时序,成功地实现了飞腾服务器的关机断电。实施例三
如图4所示,本实施例与实施例一基本相同,其不同点为飞腾服务器的PCIe交换单元采用PEX8632芯片实现,通过将本实施例的I2C总线实现方法应用于安装有银河麒麟飞腾版操作系统的飞腾服务器,在两个GPIO端口模拟的I2C总线接口连接有用于控制飞腾服务器关机的关机控制器,经验证两个GPIO端口模拟的I2C总线接口能够输出正确的关机控制脉冲时序,成功地实现了飞腾服务器的关机断电。以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
权利要求
1.一种用于多硬件平台飞腾服务器的I2C总线的实现方法,其特征在于其实施步骤如下 1)在飞腾服务器上PCIe交换单元的片上GPIO端ロ中指定闲置的两个GPIO端ロ分别外接上拉电阻并作为I2C总线接ロ的数据线接口和时钟线接ロ ; 2)在初始化硬件时将PCIe交换单元的PCI内存空间映射为CPU虚拟地址空间; 3)获取PCIe交换单元的类型信息,根据所述PCIe交换单元的类型信息获取所述两个GPIO端ロ在CPU虚拟地址空间中的映射端ロ地址; 4)在操作系统中建立并注册用于操作所述两个GPIO端ロ对应映射端ロ地址的GPIO驱动程序模块; 5)在使用I2C设备前将设备连接到所述两个GPIO端ロ;在使用I2C设备时,操作系统中的I2C总线控制器驱动程序产生I2C总线时序的指令,且所述I2C总线时序的指令通过所述GPIO驱动程序模块与连接于所述两个GPIO端口上的I2C设备进行通信。
2.根据权利要求I所述的用于多硬件平台飞腾服务器的I2C总线的实现方法,其特征在于,所述步骤2)的详细步骤包括在飞腾服务器启动时首先PCIe交换单元的PCI内存空间映射为CPU物理地址空间,然后将所述CPU物理地址空间映射为CPU虚拟地址空间。
3.根据权利要求I或2所述的用于多硬件平台飞腾服务器的I2C总线的实现方法,其特征在于,所述GPIO驱动程序模块包括如下子模块 A)电平输入子模块,用于为读取指定GPIO端ロ的电平状态,如果所述电平状态为高电平则返回1,如果所述电平状态为低电平则返回0 ;所述电平输入子模块的实现方法为读取指定GPIO端ロ在CPU虚拟地址空间中映射端ロ地址中数据输入寄存器的值,井根据所述数据输入寄存器的值返回数值I或0 ; B)电平输出子模块,用于为配置指定GPIO端ロ的电平状态,如果配置值为I则输出高电平,如果配置值为0则输出低电平;所述电平输出子模块的实现方法为读取指定GPIO端ロ在CPU虚拟地址空间中映射端ロ地址中数据输出寄存器的值,井根据所述配置值配置指定GPIO端ロ的电平状态; C)配置输入方向子模块,用于配置指定GPIO端ロ的传输方向为输入;所述配置输入方向子模块的实现方法为读取指定GPIO端ロ在CPU虚拟地址空间中映射端ロ地址中方向寄存器的值,井根据所述配置值配置指定GPIO端ロ的方向为输入; D)配置输出方向子模块,用于配置指定GPIO端ロ的传输方向为输出并在配置方向后在指定GPIO端口上根据配置參数输出高电平或者低电平;配置输出方向子模块的实现方法为读取指定GPIO端ロ在CPU虚拟地址空间中映射端ロ地址中方向寄存器的值,并根据配置值配置指定GPIO端ロ的方向为输出,然后根据配置參数调用所述电平输出子模块输出闻电平或者低电平。
全文摘要
本发明公开了一种用于多硬件平台飞腾服务器的I2C总线的实现方法,实施步骤如下1)在PCIe交换单元指定闲置的两个GPIO端口分别外接上拉电阻并作为I2C总线接口;2)初始化硬件时将PCIe交换单元的PCI内存空间映射为CPU虚拟地址空间;3)根据PCIe交换单元的类型信息获取前述两个GPIO端口在CPU虚拟地址空间中的映射端口地址;4)建立前述两个GPIO端口的GPIO驱动程序;5)使用I2C设备时I2C总线控制器驱动程序产生的I2C总线时序的指令通过GPIO驱动程序与I2C设备进行通信。本发明具有能够利用闲置GPIO端口、实施成本低、实现简单、使用方便、兼容性好的优点。
文档编号G06F13/20GK102650975SQ20121009502
公开日2012年8月29日 申请日期2012年3月31日 优先权日2012年3月31日
发明者孙立明, 张卫华, 戴华东, 李振钊, 李真能, 董攀, 邵立松, 魏彦斌 申请人:中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1