基于嵌入式Linux的IPMI驱动程序设计_linux驱动程序设计
基于嵌入式Linux的IPMI驱动程序设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“linux驱动程序设计”。
基于嵌入式Linux的IPMI驱动程序设计
2012-04-28
丁四华,张志政,东南大学
摘 要:针对Linux内核下通用IPMI协议实现部分过于复杂、繁琐、占用过多内存资源,不利于某些简单嵌入式应用场合的不足,提出了通过在FPGA逻辑模拟I2C通道的HOST单板与IPMC子卡的硬件环境上,采用经过简化的IPMI请求/应答消息格式,借助专业Linux的I2C核心框架,实现了相应的IPMI驱动程序功能,方便了管理员监测、管理、诊断系统状态,并根据系统崩溃时的状态,来及时恢复系统。本文详细描述了简化的IPMI协议原理,以及基于Linux内核I2C核心框架的IPMI驱动的各功能模块的设计原理,并详细描述了IPMI驱动功能模块的数据收发流程。研究结果表明,改进的简化IPMI驱动功能模块有效的降低了系统的复杂度、节省了内存资源,达到了精简嵌入式应用系统的目的。关键词:Linux;IPMI协议;FPGA;IPMC子卡;I2C总线 1.引言
IPMI(Intelligent Platform Management Interface)是一种无代理的智能平台管理接口,是由Intel 等公司推出的一个重要的开放标准。IPMI定义了管理员如何监测系统硬件状态,控制系统组件和检索重要系统事件的日志以进行远程管理和恢复。
近年来,广泛采用IPMI协议来监测硬件系统的状况,例如温度、风扇、电压和硬件错误(存储、网络等)和机箱防盗,刀片支持等。由于IPMI可以独立于操作系统之外,即使操作系统已经暂停或服务器已经关闭,管理员照样可以监测、管理、诊断和恢复系统。
针对Linux 内核自带的IPMI驱动过于复杂、繁琐、占用过多内存资源的不足,本文根据ATCA(Advanced Telecom Computing Architecture)方案设计,采用简化的IPMI协议来管理ATCA机框内各硬件单板的物理地址与状态。ATCA平台的HOST单板通过I2C总线接口同IPMC(Intelligent Platform Management Controller)子卡通信,从而获得启动所需的单板物理地址等消息, HOST 单板和IPMC子卡之间采用IPMI协议进行通信。本文讨论了该方案在Linux 下IPMI 驱动程序功能的设计。2.IPMI 协议原理
HOST单板和IPMC子卡之间的硬件接口通过I2C总线来通信,软件上采用IPMI协议。HOST单板不能直接获取单板的相关物理信息,必须要通过IPMI 协议从IPMC子卡上获取。
下面描述IPMI 协议设计要点。
(1)IPMI协议采用Request/Response 的模式,我们通常把IPMI的请求消息称为命令,通过采用Request/Response 模式可使IPMI消息在不同的传输通道上传送,在我们的系统中,采用了I2C总线作为物理上面的传输通道进行消息的传送,上面传输的消息的格式按照IPMI协议规定的消息格式。
(2)IPMI命令是一个功能命令的集合,通过IPMI消息中的Network Function字段来表示,这些命令集合中包括了与事件相关的一些命令集合。通过在命令集合里面不同的字段的不同含义来代表该条消息的具体请求。
(3)IPMI中所有的请求消息中都包括一个网络功能(Network Function),命令(command),以及可选的数据(data)字段。IPMI的响应消息和IPMI的请求消息采用同样的消息格式。IPMI消息分为请求和应答两种消息,具体的消息格式如下所示:
图1 IPMI请求消息格式
图2 IPMI应答消息格式
在IPMI消息中,一次请求消息的最大长度不能超过32Bytes,如图1中所示,在这最长的32个BYTES的消息结构中,包括了接收该消息的地址(Responser Addre),自身的地址(Requester Addre),消息中的NetFn/LUN字段总共是一个BYTE,前面6个bits表示的是NetFn,后面的2个bits表示的请求方的LUN,Seq/Lun字段与NetFn/LUN字段相似,只不过前面的6个bits表示的是序列号,command字段用来表示具体的命令,data字段中存放的是具体的数据,最大长度不能超过25bytes,除了上面的三个字段外,还有两个校验和字段,分别用来对消息头和消息体来进行校验。
应答消息(参见图2)和请求消息在结构上面相同,在回应请求的应答消息中用该将请求的地址和响应的地址字段相互调换,序列号保持不变,NetFn字段加1,LUN填写的是将请求消息中的字段互换。例如在HOST通过IPMC获取32bits的物理信息,HOST按照请求的消息格式发送一条请求到IPMC,IPMC收到后,按照响应的消息的格式发送应答到HOST,并将物理信息放到应答消息的DATA字段中,HOST接收到回应后就可以从DATA字段中直接获取到相关的数据信息。3.Linux下的IPMI驱动设计
Linux下IPMI模块驱动采用分层设计,详细设计说明见各以下各小节。3.1 Linux下的IPMI驱动架构
Linux下IPMI模块驱动分为两部分,一部分为I2C驱动模块,位于Linux内核态,为IPMI驱动提供底层Linux 硬件驱动;另一部分为BSP子系统PMI接口封装层,位于Linux用户态,为上层应用提供IPMI模块初始化、消息发送、消息接收接口。模块位置参见图3。
图3 Linux下的IPMI驱动架构
3.2 硬件环境描述
I2C总线是PHILIPS(飞利浦)公司推出的两线式串行总线,用于连接微控制器及其外围设备,具有简单、高效等特点。由于其接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片引脚的数量,降低了互联成本,特别适用于嵌入式产品。
HOST单板通过FPGA(Field Programable Gate Array)逻辑模拟的I2C模块与IPMC子卡通过FPGA逻辑模拟的I2C模块通信,该I2C模块目前只支持主发,从收功能。参见图4。另外,在该条I2C总线上,可以同时挂接其它的I2C设备,例如,温度监控器等。
图4 HOST单板与IPMC子卡通信图示
3.3 Linux I2C驱动模块设计
Linux下IPMI软件模块代码在整个Linux系统中属于字符设备驱动,按照模块主要功能来划分,整个驱动大体可以分为以下五个模块:
(1)I2C核心框架功能实现子模块;(2)FPGA逻辑模拟I2C设备驱动子模块;
(3)FPGA逻辑模拟I2C适配器驱动子模块;
(4)I2C设备方法子模块;
(5)IPMI用户态接口封装子模块。3.3.1 I2C核心框架功能实现子模块
该模块提供了核心数据结构的定义、I2C适配器驱动和设备驱动的注册、注销管理,I2C通信方法上层的、与具体适配器无关的代码、检测设备地址的上层代码等。
内核中I2C 相关代码可以分为三个层次(参见图5):
(1)I2C core框架:提供了核心数据结构的定义和相关接口函数,用来实现I2C适配器驱动和设备驱动的注册、注销管理,以及I2C通信方法上层的、与具体适配器无关的代码,为系统中每个I2C总线增加相应的读写方法。
(2)I2C总线适配器驱动:定义描述具体I2C总线适配器的i2c_adapter数据结构、实现在具体I2C适配器上的I2C总线通信方法,并由i2c_algorithm数据结构进行描述。
(3)I2C设备驱动:定义描述具体设备的i2c_client和可能的私有数据结构、借助I2C core提供的函数接口完成设备在内核的注册,并实现具体的功能,包括read, write以及ioctl等对用户层操作的接口。
总体而言,Linux中I2C总线的驱动分为两个部分:总线驱动(BUS)和设备驱动(DEVICE)。I2C core与I2C总线适配器驱动完成了硬件上的主机总线驱动(BUS),而I2C driver则实现了从机设备驱动。在设计中,I2C core提供的接口是统一的,不需要修改,我们只需要实现特定I2C总线适配器驱动和I2C设备驱动,这样大大提高了系统的可移植性。
图5 Linux内核I2C框架模块关系图示
3.3.2 FPGA 逻辑模拟I2C 设备驱动子模块
该模块描述具体设备的i2c_client和可能的私有数据结构、借助I2C框架的i2c_probe函数实现注册设备的attach_adapter方法、提供设备可能使用的地址范围、以及设备地址检测成功后创建i2c_client数据结构的回调函数。这部分功能主要由bsp_ipmi_drv.c文件来描述。3.3.3 FPGA逻辑模拟I2C适配器驱动子模块
FPGA模拟I2C适配器驱动子模块,定义描述具体I2C总线适配器的i2c_adapter数据结构、实现在具体I2C 适配器上的I2C总线通信方法,并由i2c_algorithm 数据结构进行描述。这部分功能主要由bsp_ipmi_adap.c文件来描述。
3.3.4 I2C设备方法子模块
该模块提供创建I2C适配器的/dev/ipmi/%d 设备节点,提供IPMI设备访问方法(read & write, open & release, ioctl)等,这部分功能主要由bsp_ipmi_devintf.c文件来描述。3.3.5 IPMI用户态接口封装子模块 该模块主要实现I2C通信从设备的选取、I2C设备方法系统调用的封装,和IPMI消息封装、数据收发的格式化等操作。这部分功能主要由bsp_ipmi_api.c文件来描述。
3.3.6 采用I2C框架的IPMI驱动的数据收发流程
IPMI模块驱动采用内核I2C核心框架,HOST单板IPMI模块驱动的数据收发流程分为四个层次(参见图6)
数据发送流程:
(1)上层用户调用Linux用户态IPMI消息发送函数BSP_IpmiSend()函数向IPMC子卡发送消息;
(2)BSP_IpmiSend()函数通过write系统调用切换到Linux内核态,调用I2C设备接口驱动层的write方法实现ipmcdev_write()函数;
(3)ipmcdev_write()函数通过调用I2C核心层i2c_master_send()函数来发送消息;
(4)i2c_master_send()函数最后调用具体I2C适配器驱动层的i2c_ipmc_xfer()函数来操作I2C总线,该函数受到I2C框架总线锁的保护,任何时刻只能由一个进程访问,符合硬件I2C总线的实际情况。
(5)i2c_ipmc_xfer()函数根据入参调用ipmc_write()函数来向I2C 硬件设备发送数据。
数据接收流程:
(1)上层用户调用Linux用户态IPMI消息接收函数BSP_IpmiRecv()函数接收来自IPMC子卡的消息;
(2)BSP_ IpmiRecv()函数通过read系统调用切换到Linux内核态,调用I2C设备接口驱动层的read方法实现ipmcdev_read()函数;
(3)ipmcdev_read()函数通过调用I2C核心层i2c_master_recv()函数来接收消息;
(4)i2c_master_read()函数最后调用具体I2C适配器驱动层的i2c_ipmc_xfer()函数来操作I2C总线,该函数受到I2C框架总线锁的保护,任何时刻只能由一个进程访问,符合硬件I2C总线的实际情况。
(5)i2c_ipmc_xfer()函数根据入参调用ipmc_read()函数来阻塞接收来自I2C硬件设备的数据。
图6 IPMI模块采用I2C核心框架的数据收发流程
4.总结
本文主要介绍了简化的嵌入式Linux的IPMI驱动程序设计。通过全文可以看出,基于FPGA逻辑模拟I2C通道的HOST 单板与IPMC 子卡的硬件环境,借助Linux内核稳定而又专业的I2C核心框架,使得设计和实现基于I2C核心框架的简化IPMI驱动变得非常容易。同时本文详细描述了IPMI协议的原理和简化后的消息格式。通过该驱动,管理员可以方便的监测、管理、诊断系统状态,并恢复系统。总之,改进的简化IPMI驱动功能模块有效的降低了系统的复杂度、节省了内存资源,达到了精简嵌入式应用系统的目的。
基于嵌入式Linux的设备驱动程序设计Linux为是一个成熟而稳定的操作系统。将Linux植入嵌入式设备具有众多的优点,包括可剪裁和容易移植等,所以Linux操作系统在嵌入式领域获得了......
课程设计课 程 名嵌入式软件开发技术题 目 基于嵌入式Linux的温度监测系统的设计与实现专 业 计算机科学与技术(嵌入式系统方向) 班 级 13计算机嵌入式系统班 学 号 学生姓名2......
嵌入式Linux驱动1 简介设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样使硬件对应用程序来说是透明的,在应用程序看来,硬件设......
嵌入式课程设计设计题目:触摸屏驱动程序设计 班级: 学号: 姓名: 指导老师:设计时间:2010年12月25日--12月28日目录第一部分 要求 ....................................................
项目驱动程序设计教学研究论文1程序设计教学中存在的问题计算机专业的学生在初开始接触专业课时就要学习程序设计,程序设计的学习比较困难,就算对一些理论知识有所理解,但是在......
