第一篇:音视频编解码器AT2042的linux设备驱动程序设计讲解
科 技 论 坛
中国科技信息2006年第1期
CHINA SCIENCE AND TECHNOLOGY INFORMATION Jan.2006
音视频编解码器AT2042的linux设备驱动程序设计 张菁1 周德新1 郝福珍2
(1,桂林电子工业学院通信与信息工程系 541004; 2,华北计算技术研究所通信工程室 100083)
摘 要:论文在分析各种多媒体压缩标准的基础上,详细介绍了Pentamicro公司的2通道A/V编解码器AT2042的功能结构和主要特点,提出了一种基于AT2042芯片的网络视频服务器的硬件设计方案,给出了Linux系统下AT2042设备驱动程序的详细设计。关键词:视频压缩;MPEG-4;网络视频服务器;设备驱动程序
引言
在数字多媒体压缩领域,ITU,ISO等组织制定了许多成功的编码标准,如以JPEG和JPEG2000为代表的静止图像压缩标准,以MPEG-1和MPEG-2为代表的中高码率多媒体数据编码标准,以H.261,H.263,H.263+,H.263++等为代表的低码率、甚低码率运动图像压缩标准,以及覆盖范围更宽面向对象应用的MPEG-4。这些标准之间在码率、图像质量、实现复杂度、差错控制能力及可编辑性上有着很大差别,满足了各种数字图像应用的不同需要。
与传统的基于像素的视频压缩标准不同,MPEG-4采用基于对象的视频编码方法,它不仅可以实现对视频图像数据的高效压缩,还可以提供基于内容的交互功能。此外,为了使压缩后的码流具有对于信道传输的鲁棒性,MPEG-4还提供了用于误码检测和恢复的一系列工具,这样采用MPEG-4标准压缩的视频数据可应用于带宽受限、易发生误码的网络环境中。
韩国Pentamicro公司的2通道MPEG-4 A/V编解码器AT2042,以其多种音视频压缩标准、专用运动侦测算法、代码转换和速率转换功
能、实时数字水印等技术优势,广泛应用于各种高可靠性和高性价比的嵌入式网络视频监控系统中。
(4)视频采用ITU-R 656 / ITU-R 601接口标准,音频采用PCM,I2S商用接口标准;(5)内置ARM946E核,在系统上电/复位时,AT2042的固件程序可由外部主机载入AT2042外挂的SDRAM;
(6)外部主CPU通过AT2042的两个寄存器和四个FIFO与AT2042通信,编解码数据的输入输出可用中断方式。
2.基于AT2042的网络视频服务器的 硬件设计
网络视频服务器是一种内置Web服务器的嵌入式数字远程监控系统,集视频采集、实时压缩和网络传输功能为一体,广泛应用于分布式的安全监控、视频会议和可视电话等领域。网络视频服务器有自己的IP地址和网络接口,可直接接入网络,用户用普通的Web浏览器作为客户端可以实时观看视频服务器发送的图像。图2是基于AT2042的网络视频服务器的硬件原理图。
1.AT2042的功能结构及主要特点
AT2042是一个内置微控制器ARM946E的2通道A/V CODEC芯片,主要完成对视频和语音数据的编码和解码,支持多种音视频编解码标准,可直接与IBM、Motorola、ARM、Xscale和Axis等多种CPU接口,无需其它附加电路。AT2042的内部结构如图1所示。
图1 AT2042的内部结构
AT2042内部主要有以下四个部分:
(1)接口部分,主要包括音视频数据I/O接口、控制接口和内存接口;
(2)视频编解码部分,包括MotionEstimation/Prediction、DCT/QIQ/IDCT和VLC/VLD;
(3)音频编解码部分Audio Codec;(4)内置微控制器ARM946E。AT2042有以下主要特点:
(1)支持MPEG-1、MPEG-2、MPEG-4、H.263和Motion-JPEG等多种视频压缩标准,以及ADPCM、MPEG-1 Layer-Ⅱ和Layer-Ⅲ等音频压缩标准;
(2)支持多种图像分辨率和帧速率,支持CBR和VBR两种码率控制方式;
(3)运动侦测功能,侦测区域和灵敏度可选; 图2 基于AT2042的网络视频服务器的 硬件原理图
图中,视频编解码电路是模拟视频信号和AT2042之间的接口电路,负责视频数据的模/数和数/模转换以及数字视频信号格式转换,输入的模拟视频信号先经过视频编解码电路进行前端处理,产生符合AT2042视频接口标准的8比特ITU-R BT.656数字视频信号。输入的模拟音频信号经过模拟音频ADC电路产生符合AT2042音频接口标准的I2S数字音频信号。之后,在外部主CPU的控制下,该数字音视频数据经过压缩/解压芯片AT2042进行硬件压缩编码,产生的压缩编码数据流通过芯片内部集成的MuxFIFO接口输出。
网络视频服务器的解压缩编码是压缩编码的逆过程,需要解压的数据流经过AT2042内部集成的Demux FIFO接口输入,解压缩编码的基本原理类似于压缩编码,不再赘述。
3.Linux系统下AT2042设备
驱动程序设计
系统调用是操作系统内核和应用程序之间的接口,设备驱动程序则是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动程序主要完成以下的功能:
(1)对设备初始化和释放;
(2)把数据从内核传送到设备和从设备读取数据;
(3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据;(4)检测和处理设备出现的错误。
基于AT2042的网络视频服务器系统的主控操作系统为Linux实时操作系统,将AT2042定义为Linux系统中一个标准字符设备,对AT2042的驱动是编写Linux系统下的芯片级设备驱动程序。设备驱动程序可以包含在Linux内核中,但为了升级和修改方便,我们将其作为一个独立的模块,待系统启动后再动态加载到内核中。
AT2042设备驱动程序工作于内核模式,完成对AT2042的初始化、编解码数据的读写以及编解码功能参数的设置。它提供了AT2042和上层应用程序之间的接口,向下通过芯片接口实现对AT2042芯片的直接控制,向上则为应用程序提供驱动程序接口。AT2042设备驱动程序包含的功能函数主要有模块入口函数、设备操作函数集合和中断服务程序。
3.1模块入口函数
模块入口函数即模块加载/卸载的入口点,它向内核注册和取消注册AT2042设备的驱动程序,提供两个函数:模块加载函数init_module()和模块卸载函数cleanup_module()。加载函数init_module()向内核注册了AT2042设备驱动程序模块所能提供的所有功能,它
调用内核函数register_chrdev()获得AT2042设备的驱动号,将设备登记到相应的设备数组,并返回设备的主驱动号;卸载函数cleanup_module()仅当模块被卸载时才调用,它通过调用内核函数unregister_chrdev(),取消了在init_module()中所完成的注册。
3.2设备操作函数集合
用户进程通过设备文件同硬件打交道,对设备文件的操作就是系统调用,把系统调用和设备驱动程序关联起来的是一个非常关键的数据结构file_operations,定义如下:
struct file_operations {
int(*seek)(struct inode *,struct file *,off_t,int);
int(*read)(struct inode *,struct file *,char,int);
int(*write)(struct inode *,struct file *,off_t,int);
int(*readdir)(struct inode *,struct file*,struct dirent *,int);
int(*select)(struct inode *,struct file *,int,select_table *);
int(*ioctl)(struct inode *,struct file *,unsined int,unsigned long);
int(*mmap)(struct inode *,struct file *,struct vm_area_struct *);
(下转第44页)-33- 科 技 论 坛
中国科技信息2006年第1期
CHINA SCIENCE AND TECHNOLOGY INFORMATION Jan.2006
向上收费的可能性就会大大增加。
另外中国市场,是海外频道一直想进入的,只是苦于落地上受到相关限制,如果有这么好的一个工具和既定的用户群,可以实现目的,他们也必然非常乐意。而这也是可以作为收费频道的来源。2、赢利模式的探索之道
作者认为在短期内P2P流媒体的发展还是属于投入期,绝不能拿短期效益来衡量其投入产出比。在短期内的重点是发展用户,把市场做起来,而不是片面强调盈利。用户数就是他的最大回报和增值基础。
P2P流媒体的可能赢利点在于广告收入、收费频道和向上收费。其中,广告收入随时可以做,但其收入不足以构成赢利的主要来源。而且收入多少是和用户规模成正比。
收费频道和向上收费是P2P流媒体运营的主要收入。以免费频道来吸引用户,以收费频道来获取利润;通过规模用户来向上和内容提供商实施分成,这一切的可行之道的前提就在于用户的规模化,但这需要时间来酝酿。
盈利模式的形成绝非一朝一夕的事,还需要积累、探索和不断总结,而在这过程中,政策的监管又将是一大难题。3、监管的应对之法
监管是必然的,也是产业发展的有序保证。只是在产业还未完全明晰之前,监管对于企业的影响还是很大的,甚至会导致困局。
从目前来看,监管主要体现在以下二个方面:运营商的监管、国家政策部门的监管。
1)运营商的监管
运营商的监管主要分手段和本质两方面,从本质角度,相关产业政策的引导是必需的,这是产业发展秩序的必然,而目前业界讨论最多的则是监管的手段问题。
P2P流媒体的诞生其实是最大化的利用了网络的分发特性,而分发和网络的通达性正是互联网络的特性,只是由于国内的网络运用一直是维持着过剩的态势,突然出现的喷涌,使运营商一下子无法适应,在调整期不得不采用了一些封、限等手段,但这些方法并不是根本解决之道,只是现阶段的应变之法。
应该说,P2P流媒体技术融入下一代互联网是必然的,而运营商只是鉴于对网络现状的担忧,所采取的行动更多的是为了保证在现有条件下网络的正常化。先
稳定再发展。所以,目前运营商所采用的监管手段是暂时的、保护性的。又爱又恨是运营商对于P2P流媒体的写照。
2)国家政策部门的监管(1)海外影响力:P2P流媒体的用户群里有不少来源于海外,其广泛应用有助于推动国内节目文化的海外影响力,而2008“科技奥运”的口号则正好为P2P流媒体展示魅力搭建了大好舞台,以P2P流媒体的方式为全球各地更多的用户提供国内的奥运比赛,这对扩大奥运的海外推广是有重大作用的。从这个角度出发,P2P流媒体赶上了一个好机会,为奥运提供服务的技术优势及海外影响力有可能使他获得一个相对宽松的政策环境。
(2)规模的力量:以P2P流媒体为代表的网络新媒体的趋势是不可逆转的,但网络的自由不代表彻底的放开,产业的前行需要新的秩序引导,P2P流媒体作为新事物,必然有其两面性,如何引导是关键,这其中网民的力量又会对发展起着推动
作用。所以现在,需要的是形成这股力量,使
其成为监管者不可忽视的部分,从而使民众为自己在政策上争取有利的地位。
四、结语
但万事开头难,P2P流媒体目前还处于发展前期,还有很多问题需要解决。产业利益是属于大家的,而群体的力量更甚于个人,P2P流媒体能否继续风生水起更在于业界的共同努力,而作为一个正在运行中的新事物,生存和发展是它不断努力向前的目标。而无论如何P2P流媒体的广泛应用,使得IPTV在实现技术的突破而走出困境,IPTV离我们正越来越近。
参考文献:
1、齐德昱.IPTV发展展望.《计算机世界》.2005.10 2、网络电视发展现状.《每周电脑》.2005.11.07,第41期
3、P2P流媒体技术应用.《通信世界》.2005.09 作者简介:
1、郭长庚 男,汉族,1962年生,本科学历,副教授,中国计算机学会高级会员,中国电子学会高级会员,任许昌职业技术学院信息工程系主任。
2、连智锋 男,汉族,1966年生,本科学历,讲师,中国计算机学会会员,任许昌职业技术学院信息工程系教研室主任。
-44-
第二篇:网络音视频编解码器讲解
TVSENSE YZX-400EN/DE 网络音视频编解码器 用 户 手 册
南京易之讯科技有限公司 二○○六年四月
TVSENSE 视频编解码器使用手册 目录
一、产品简介..........................................................................................3 技术特点..................................................................................................................................3
二、产品结构..........................................................................................4 2.1内部布置:......................................................................................................................4 2.2外形尺寸:..........................................................................................................................4
三、技术指标..........................................................................................5
四、接口说明..........................................................................................6 4.1前面板...............................................................................................................................6 4.2后面板...............................................................................................................................6 4.3接口指示说明:.............................................................................................................6
五、接线说明..........................................................................................7 5.1网络接线...........................................................................................................................7 5.2音频接线...........................................................................................................................7 5.3视频接线...........................................................................................................................7 5.4控制接线...........................................................................................................................8
六、串口定义..........................................................................................9 6.1 串口定义:.........................................................................................................................9 6.2 内部跳线:.......................................................................................................................10
七、调试软件.........................................................................................11 7.1硬件准备:....................................................................................................................11 7.2硬件连接:....................................................................................................................11 7.3软件准备:....................................................................................................................11 7.4设备IP 配置DevNetSet.............................................................................................12 7.5设备管理DevManager................................................................................................13 7.5.1设备配对.....................................................................................................................13 7.5.2串口配置.....................................................................................................................15 7.6网络浏览
DevVideoBrowser.....................................................................................16
八.典型应用........................................................................................17
九、产品装箱清单................................................................................18 序 言 ● 简介
本音视频编解码器是为适应基于TCP/IP协议和10M/100M以太网传输通道而设计的,采用MPEG2压缩方式,具有强大的即时图像捕捉和图像压缩功能。它利用以太网通道实现实时视频音频传输,并同时提供RS232/485串行数据通信端口,满足远程视频监控、视频会议等系统需要。
注意事项
本说明书提供给用户安装调试、参数设置及操作使用的有关注意事项,务请妥善保管,并为了您的正确、高效地使用本产品,请仔细阅读本说明书。
一、产品简介 技术特点
● 基于MPC860T+OSE(RTOS)的嵌入式设计;
● 采用最新MPEG-2优化技术,最小带宽支持1024Kbps ; ● 以太网传输端到端延时小于180ms ;
● 提供10M/100M以太网接口,带宽适应范围宽,支持多点对多点同时访问; ● 具备同时发送单播包及组播包功能,可支持临时用户加入访问,同时在某些不支持组播功
能的特殊网段中通过单播方式访问;
● 双向语音对讲,支持回音抵消功能,独特的以太网方式下双向语音对话设计,适合监控中
心与前端对讲;
● 提供两路RS-485/232双向透明串口,可用于远端设备控制及监控数据采集; ● 可选集中式机箱,提高集成度;
● 与多家同类设备实现互联互通,适应大规模联网监控; ● 在各种高温、高尘等恶劣环境下,产品能够正常工作; ● 提供相关系统软件,实现网络浏览、虚拟矩阵等功能;
● 提供应用程序开发接口(包括WINAPI 和ActiveX),方便进行二次开发; ● 产品设计生产符合ISO9001标准。
TVSENSE 视频编解码器使用手册
二、产品结构 2.1内部布置:
2.2外形尺寸:
(外观仅供参考)
三、技术指标
TVSENSE 视频编解码器使用手册
四、接口说明 4.1前面板
4.2后面板
4.3接口指示说明:
(后面板正面放置,顺序依次自左向右)1.RS232/485 透明串口 2.LAN 以太网口
3.Vin、Vout 视频输入、输出(BNC 座)
4.Lin、Lout 音频左声道输入、输出(RCA 座)5.Rin、Rout 音频右声道输入、输出(RCA 座)6.AC220V 电源插座 电源开关
状态指示 电源开关 状态指示
立体声输入 视频输入 型号标签 电源插座
立体声输出 视频输出 型号标签 电源插座
五、接线说明 5.1网络接线
备注:
● 传输介质为5类或更高类双绞线; ● 与编解码器的接口为RJ45接口; ● 若编、解码器背对背连接或PC 与之连接,注意需采用交叉双绞线。5.2音频接线
备注:可单向立体声音频传输 或 双向对讲传输。5.3视频接线
备注:双向视频设备可选。TVSENSE 视频编解码器使用手册 5.4控制接线
编解码器可提供两路RS232/485接口,两台设备串口号相互对应,详见
六、串口定义。示例1:
以一台主控键盘控制若干PTZ 摄像机为例:
◆ 控制键盘的485接口与解码器的485接口连接,在编码器端接入云台解码器即可。示例2:
以两台计算机利用串口远程透明传输数据为例:
◆ 利用串口工具程序,分别打开两台PC 的对应串口,便可以透明传输数据。计算机RS232 DB9 计算机RS232 DB9
六、串口定义
音视频编、解码器提供两路RS232/485(com1、com2 串口,从后面板正视DB9公头(编码器和解码器的串口定义相同)。在作透明串口通道传输数据时串口1与串口1对应,串口2与串口2对应,使用如下:
6.1 串口定义:
● RS232工作方式(非标准引脚):
串口1: 1(发)、2(收)、5(地)串口2: 3(发)、4(收)、5(地)● RS485工作方式:
串口1: 6(B、7(A 串口2: 8(B)、9(A)编码器和解码器的串口定义相同
注意事项:
◆ 传输波特率≤19200bps,串口的相关设置详见二 串口配置;
◆ 当编码器和解码器两端串口工作方式不一致时,只能以单工方式传输数据: 例如:编码器串口1设置成RS485,解码器串口1设置成RS232,此时两端只能以单工方式传输数据。反之亦然。
RS485-1 RS485-2 编、解码器串口定义
TVSENSE 视频编解码器使用手册 6.2 内部跳线:
◆ RS232与RS485工作方式通过内部电路板上的跳线选择, 见下图:
◆ 视频编码器、解码器出厂缺省设置为RS485接口。RS2322 RS4852 RS2321 RS4851
七、调试软件 7.1硬件准备:
1. 一台PIII 配置以上的电脑,win98/win2k/winxp操作系统; 2. 一台网络交换机或HUB(集线器); 3. 一台或数台视频编、解码器; 4. 一台或数台摄像机、监视器; 5. 相应线缆(电源线、网线、视频线)。
7.2硬件连接:
1. 将电脑、编解码器分别通过网线接入交换机;
2. 若无交换机可用一根交叉网线将电脑与编解码器直接连接;
3. 摄像机视频信号接入编码器Vin,解码器视频输出信号V out 接入监视器; 4. 各设备上电。
7.3软件准备:
1. 将随机光盘软件“编解码器管理”压缩包安装至硬盘任意盘符下; 2. 缺省为路径:C:Program Files编解码器管理;
3. 安装完毕后,安装路径C:Program Files编解码器管理下DevVideoBrowser文件夹内应包含以下
应用程序: 1 设备IP 地址配置软件 DevNetSet.exe 2 设备管理软件 DevManager.exe 3 PC 网络浏览软件
DevVideoBrowser.exe 4 浏览软件应用设置工具 DevVideoSet.exe 5 设备加载升级工具
DevUpdate.exe 6 设备调试信息接收工具 DevDebugInfo.exe 7 设备串口调试工具 DevComDebug.exe 其中1)、2)项是本设备调试中必须所用,3-7项作为辅助调试用,本说明书中不作详述。
TVSENSE 视频编解码器使用手册 7.4设备IP 配置DevNetSet
运行DevNetSet.exe,如下图界面:
本编、解码器开机后会通过网口不间端地发送广播包,DevNetSet 程序自动解析出编、解码器的信息。
修改设备IP 地址须在列表中选你要修改的视频编、解码器:
1.物理地址:唯一且必需的硬件识别码,出厂时已设置好,不可修改; 2.设备ID :硬件识别码,出厂时已设置好,不可修改; 3.版本:设备Flash 板载程序,可升级;
4.IP 地址:若网络管理员无指定IP 地址,用户只需将编、解码器设置成同一网段内的任
意地址即可;如通常与当前PC 同网段,192.168.0.11。
5.子网掩码:设置为自身网段相同的子网掩码。如:255.255.255.0。6.网关:若网络管理员无指定网关,用户可设为自身IP 地址,不能为空....,如:192.168.0.11。以上配置按要求修改好以后,先点击“配置IP 地址”,再点击“复位”使之生效,然后点击“退出”即退出网络配置程序。
调试过程中可能会碰到的问题:配置IP 地址不成功
◆ 重新启动该程序DevNetSet.exe; ◆ 关闭防火墙或“解除阻止”; ◆ 能否正常Ping 通,检查网线;
◆ 注意操作时间勿过长,否则程序会自动刷新界面,导致配置不成功。7.5设备管理DevManager 该程序是将编、解码器进行配对,运行DevManager.exe,如下图界面:
本产品仅需对解码器进行相关设置即可,便于网络中心集中管理!7.5.1设备配对
1. 选中“设备列表”中的“视频解码器”,点击右上角“连接”按钮,出现如下界面:
2. 在“编码设备IP ”右边空档中填写本解码器对应编码器的IP 地址; 3. 用户级别:设置此解码器的用户级别,常用为数值“31”;
4. 传输方式:设置解码器以单播或多播方式接受编码器的视频流,通常选用“单播”;声音选
中表示编、解码器之间有双向音频传输,“声音”通常不选;
5. 图像格式:根据网络通道负载情况适当选择传输的码率大小,在1——8M 线性调节;通常
选用“3072kbps “;
6. 单击“应用”按钮,稍候单击“复位”按钮,待设备自动重新启动后即可!TVSENSE 视频编解码器使用手册 调试过程中可能遇到的现象:
1. 选中设备后单击“连接”按钮,提示:
◆ 确定本台PC 与视频编、解码器为同一网段; ◆ 检查网络。2. 配置不成功:
◆ 能否正常Ping 通,检查网线; ◆
重新连接再配置,注意操作时间勿过长,否则程序会自动刷新界面,导致配置不成功。
编码器连接:
本产品编码器出厂已经设置好,除IP 地址修改外,无需再对其配置。
7.5.2串口配置
本产品只需通过解码器即可完成所有串口配置!
编、解码器的串口作透明数据传输通道使用时,须注意两端的串口工作方式,主要包括:波特
选中“设备列表”中的“视频解码器”,“连接”成功后,点击右边“串口”按钮,如下图:
串口缺省配置如下:
串口配置属性修改:
注意:编、解码设备对应串口的波特率应当一致!(两设备的串口1相对应、串口2相对应)
TVSENSE 视频编解码器使用手册 7.6 网络浏览 DevVideoBrowser 网络浏览属于软件解码器,运行浏览软件 DevVideoBrowser.exe,界面如下: 输入“编号” :100001、“口令” :123,点击“确定”后进入视频浏览窗口,如下图: 确定” 确定 步骤一: 选中某编码器 步骤二: 点击连接 从“设备地址列表”栏选中接有摄像机的编码器,点击“ 接成功的视频图像图像。浏览程序退出: ”连接,即可看到连 输入“编号” :100001、“口令” :123,退出浏览程序。TEL: 025-52419198 81792088 www.xiexiebang.com
南京易之讯科技有限公司 网络视频编解码器使用手册 八.典型应用 本产品适合于通信带宽大于 2M 的所有以太网络,支持跨路由(网段)使用。一. 高速公路 某分中心编码器 4×E1 或 LAN 省中心解码器 高速 公路 通信 系统 4×E1 或 LAN 某分中心编码器 省中心解码器 省中心 视频矩阵 利用高速公路通信系统 SDH 中的多个 E1 通道捆绑(如 4×E1)组成 LAN,在分中心将图像 接入编码器,省中心解码还原视频进入矩阵系统。二. 路口编码器 城市监控 中心解码器 监控中心 视频
矩阵 城 域 网 中心解码器 路口编码器 中心软件解码器(图像业务台)向城域网运营商租用通道,如电信、网通、联通、移动等,实现城市道路、安全防范等监控 指挥系统。TEL: 025-52419198 81792088 www.xiexiebang.com
TVSENSE 视频编解码器使用手册
九、产品装箱清单 设备 随机光盘 说明书 电源线 设备配件 一台 一张 一本 一根 一套 TEL: 025-52419198 81792088 www.xiexiebang.com
第三篇:基于嵌入式Linux的设备驱动程序设计
基于嵌入式Linux的设备驱动程序设计
Linux为是一个成熟而稳定的操作系统。将Linux植入嵌入式设备具有众多的优点,包括可剪裁和容易移植等,所以Linux操作系统在嵌入式领域获得了广泛的应用。嵌入式Linux一直是嵌入式领域的研究热点,与PC架构不同,嵌入式系统的硬件具有多样性和差异性,嵌入式系统的开发需要对特定系统进行硬件设计,同时还要针对这些硬件来编写驱动程序。Linux内核就是通过驱动程序来同外围设备打交道的,系统设计人员必须为每个设备编写驱动程序,否则设备无法在操作系统下正常工作。设备驱动程序设计的基本概念与模型
设备驱动程序是操作系统内核与机器硬件之间的接口,它为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,设计驱动程序是内核的一部分,可以实现以下功能:
对设备初始化和释放;
把数据从内核传送到硬件,以及从硬件读取数据;
读取应用程序传送给设备文件的数据,以及回送应用程序请求的数据;
检测和处理设备出现的错误。
前面已经提到驱动程序的作用,而编写驱动程序就是构造一系列可供应用程序调动的函数(包括open、release、read、write、llseek、ioctl等)。在用户自己的驱动程序中,首先要根据驱动程序的功能,实现file_operations结构中的函数,不需要的函数接口可以直接在file_operations结构中初始化为NULL;file_operations变量会在驱动程序初始化时注册到系统内部。当操作系统对设备操作时,会调用驱动程序注册的file_operations结构中的函数指针。
以下是嵌入式linux2.4设备驱动程序的最简模型。
具体实现前面定义的函数时,需注意下面几点:
1)在test_init函数中要通过调用register_chrdev()函数来向内核注册字符设备驱动程序。如果是块设备,则还需调用mmmap()进行地址空间的映射,再调用register_blkdev()函数来向内核注册块设备驱动程序,在Linux系统中,对中断的处理是属于系统核心部分,因而如果设备与系统之间以中断方式进行数据交换,则必须把该设备的驱动程序作为系统核心的一部分,也就是说设备驱动程序要通过调用request_irq()函数来申请中断,通过free_irq()函数来释放中断(在test_cleanup中实现)。
2)open()函数和release()函数的具体实现有着一定的对应性,在open()函数中主要是执行打开设备时的一些初始化代码,如果该驱动程序需要管理多个设备,那么还要获取从设备号,根据从设备号来判断需要操作的设备,其中,从设备号可通过调用函数MINOR(inode->i_rdev)来获得,然后再调用宏MOD_INC_USE_COUNT来使得驱动程序使用计数器加1,而在release()函数中则要进行相反的处理。即调用宏MOD_DEC_USE_COUNT来减小驱动程序使用计数器。
3)归根到底,驱动函数的实现就是调用内核所支持的函数(包括内核提供的API和用户自己定义的寄存器操作函数)来完成对设备的操作,虽然嵌入式系统设备的种类众多,不同设备操作的具体实现方法不可能相同,但是Linux操作系统提供了一系列特殊API,为开发内核驱动程序带来了很大的方便,调用这些API时需要注意的是:通常情况下,应用程序是通过内核接口访问驱动程序的(这是驱动程序的主要使用方式),因此驱动程序需要与应用程序交换数据,但是操作系统内核和驱动程序在内核空间中运行,而用户程序在用户空间中运行,用户程序不能访问内核空间,操作系统内核和驱动程序也不能使用指针或memcpy()等常规的C库函与用户空间传输数据,造成这种状况的主要原因是linux操作系统使用了虚拟内存机制,使用了虚拟内存机制后,用户空间的内存可能被换出,当内核使用用户空间指针时,对应的页面可能已经不在内存中了,因此在使用调用函数时要注意:设备驱动程序在申请和释放内存时不是调用malloc()和free(),而调用kmalloc()和kfree();用于内核空间与用户空间进行数据拷贝的函数主要有access_ok()(检查某内存空间是否有权访问),copy_to_user()和put_usr()(内核函数向用户空间传输数据),copy_from_user()和get_user()(用户空间向内核空间传输数据);关于内核空间与I/O空间的数据交换,不同体系结构的处理器对I/O的处理方式也不同,x86系列处理器中,I/O与内存完成不同,它是分开编址的,访问它要使用专用的指令;而对ARM体系结构的处理器来说,则是不区分I/O和内存,统一编址的,可以使用同样的指令访问,在驱动程序中可以使用一系列函数来访问I/O口,如outb()、outw()、outl()inb()、inw()、inl()、outsb()、outsw()、outsl()、insb()、insw()和insl()等。
Linux2.6与2.4内核驱动程序的区别
为了彻底防止对正在被使用的内核模块进行错误操作,linux2.6内核在加载和导出内核模块方面都较2.4内核有所改进,避免了用户执行将导致系统崩溃的操作(例如强制删除模块等)。同时,当驱动程序需要在多个文件中包含 头文件时,不必定义宏来检查内核的版本。与2.4内核相比,2.6内核在可扩展性、吞吐率等方面有较大提升,其新特性主要包括:使用了新的调度器算法;内核抢占功能显著地降低了用户交互式应用程序;多媒体应用程序等类似应用程序的延迟;改进了线程模型以及对NPTL的支持,显著改善了虚拟内存在一定成程度负载下的性能;能够支持更多的文件系统;引进了内存池技术;支持更多的系统设备,在2.4内核中有约束大型系统的限制,其支持的每一类设备的最大数量为256,而2.6内核则彻底打破了这些限制,可以支持4095种主要的设备类型,且每个单独的类型又可以支持超过一百万个的子设备;支持反向映射机制(reverse mapping),内存管理器为每一个物理页建立一个链表,包含指向当前映射页中每个进程的页表条目的指针。该链表叫PTE链,它极大的提高了找到那些映射某个页的进程的速度。
Linux操作系统的设备驱动程序是在内核空间运行的程序,其中涉及很多内核的操作,随着Linux内核版本的升级,驱动程序的开发必然也要作出相应的修改,总之,在linux2.6内核上编写设备驱动程序时具体要注意以下几个方面:
1)Linux2.6内核驱动程序必须由MODULE_LICENSE(“Dual BSD/GPL”)语句来定义许可证,而不能再用2.4内核的MODULE_LICENSE(“GPL”)。否则,在编译时会出现警告提示。
2)Linux2.6内核驱动程序可以用int try_module_get(&module)来加载模块,用module_put()函数来卸载模块,而以前2.4内核使用的宏MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT则可不用。
3)前面给出的字符型设备驱动程序模型中结构体file_operations的定义要采用下面的形式。这是因为在Linux内核中对结构体的定义形式发生了变化,不再支持原来的定义形式。
4)就字符型设备而言,test_open()函数中向内核注册设备的调用函数register_chrdev()可以升级为int register_chrdev_region(dev_t from,unsigned count,char * name),如果要动态申请主设备号可调用函数int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,char * name)来完成;原来的注册函数还可以用,只是不能注册设备号大于256的设备,同理,对于块设备和网络设备的注册函数也有着相对应的代替函数。
5)在声明驱动程序是否要导出符号表方面有着很大的变化。当驱动程序模块装入内核后,它所导出的任何符号都会变成公共符合表的一部分,在/proc/ksyms中可以看到这些新增加的符号。通常情况之下,模块只需实现自己的功能,不必导出任何符号,然而,如果有其他模块需要使用模块导出的符号时,就必须导出符号,只有显示的导出符号才能被其他模块使用,Linux2.6内核中默认不导出所有的符号,不必使用EXPORT_NO_SYMBOLS宏来定义;而在2.4内核中恰恰相反,它默认导出所有的符号,除非使用EXPORT_NO_SYMBOLS,因此在上面给出的范例中可以省略去该定义语句。
6)Linx内核统一了很多设备类型,同时也支持更大的系统和更多的设备,原来Linux2.4内核中的变量kdev_t已经被废除不可用,取而代之的是dev_t。它拓展到了32位,其中包括12位主设备号和20位次设备号。调用函数为unsigned int iminor(struct inode * inode)和unsigned int imajor(struct inode * inode),而不再用Linux2.4版本中的int MAJOR(kdev_t dev)和int MINOR(kdev_t dev)。
所有的内存分配函数不再包含在头文件 中,而是包含在 中,而原来的 已经不存在。所以当在驱动程序中要用到函数kmalloc()或kfree()等内存分配函数时,就必须要定义头文件 而不是。同时,前面提到的申请内存和释放内存函数的具体参数也有了一定的改变,包括:分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO和GFP_NOFS;新增了_GFP_REPEAT、_GFP_NOFAIL和_GFP_NORETRY分配标志等,使得内存操作更加方便。
8)因为内核中有些地方的内存分配是不允许失败的,所以为了确保这种情况下得成功分配,linux2.6版本内核中开发了一种称为“内存池”的抽象。内存池其实相当于后备的高速缓存,以便在紧急状态下使用。要使用内存池的处理函数时,必须包含头文件。内存池处理函数主要有以下几个:mempool_t *mempool_create()、void*mempool_alloc()、void mempool_free()、int mempool_resize();
另外值得一提的是:2.6内核为了区别以.o为扩展名的常规对象文件,将内核模块的扩展名改为.ko,所以驱动程序最后是被编译为ko后缀的可加载模块,在应用程序中加载驱动程序模块时要注意。结语
驱动程序的开发作为嵌入式linux系统开发过程当中最重要的环节之一,与硬件特性和操作系统的内核有着紧密的联系。随着linux内核版本的升级,内核驱动程序必然要作出相应的改进,相信随着嵌入式Linux系统在各个领域中的广泛应用,具有可抢占实时性的Linux2.6内核必定会在嵌入式领域大显身手。本文会对广大的驱动程序开发人员有一定的帮助。
第四篇:IT设备管理制度讲解(定稿)
上海四联飞扬化工新材料有限公司 第一章 总则
第一条 为加强公司电子设备管理,控制营业成本,提高设备利 用率,延长设备使用寿命, 合理配置各类资源,根据公司固定资产管 理办法有关规定,特制定本办法。
第二条 统计信息部是公司电子设备管理监督部门,统一负责公 司电子类固定资产的计划、审批和监督管理, 统一负责公司电子设备 的购置、验收、登记、报废等管理审批工作。
第三条 统计信息部负责电子设备的实物管理,财务部负责电子 设备的帐务管理。
第四条 IT助理负责各个部门电子设备的购置、验收、登记、维 修、保养和报废等管理工作。
第二章 设备购置
第五条 各部门及分支机构不得超预算计划购置,若因实际需要 确需超额购置的,必须申请追加预算,报批同意后方可实施。
第六条 电子设备分为关键设备、非关键设备和低值易耗品,关 键设备包括:服务器、网络设备、电源设备等核心设备;非关键设备 包括:微机工作站、普通打印机等其他设备;低值易耗品包括:色带、墨盒、打印头、打印纸、各种通信电缆、CD-ROM、CD-R 盘片、普通 MODEM(卡、微机内存条、硬盘、网卡、HUB、软驱、软盘、普通显 示卡、键盘、鼠标、网线、电工及网线工具等。
第七条 电子设备购置流程包括: 1.关键设备由统计信息部集中统一采购;2.非关键设备由拟购置设备部门按照信息技术部规定的品牌、在 规定的价格内可自行采购;
3.设备采购完成后, 将执行结果向统计信息部报备;4.购置部门负责新购电子设备的验收, 对不合格设备可以拒收或 退货。合格设备标准为:设备完好、型号规格及数量无误、未使用过、功能完好、配件齐全、保修单证及服务承诺书齐备;5.设备验收合格后, 收货部门凭发票、申购批复及验收意见向计 划财务部申请付款。
第三章 设备登记
第八条 所有电子设备必须经统计信息部门履行到货登记、领 用登记等手续后方能投入使用。
第九条 设备到货时须履行到货登记手续,根据《电子设备编 码规则》(见附件 1填写统一印制的设备标签,将标签贴在对应设 备不可拆卸部分的显著部位,同时在《电子设备明细表》上登记(由 IT 助理登记 ,即时更新《电子设备汇总表》(由 IT 助理更新。第十条 设备领用时须履行领用登记手续,在设备标签上注明 领用部门及使用人员或责任人,并要求领用人在《电子设备明细表》 上签字。
第十一条 因人员调动、内部调配等其它原因引起设备使用情况 发生变动时,设备管理部门应做好设备变动记录,具体反映在《电子
设备变动记录表》(见附件 2及《电子设备明细表》中相应设备的 变更登记栏。
第十二条 关键设备由电脑管理部门统一管理, 并建立关键设备 台帐(见附件 3。
第十三条 各部门电子设备实物登记应配合财务管理部帐务登 记同期进行,以保障账实相符,并按要求配合财务管理部每年进行 1至 2次设备盘点(由 IT 助理盘点。
第四章 设备维修、保养
第十四条 所有对外的设备维修、保养协议必须经统计信息部审 核后方可实施。
第十五条 电子设备发生故障, 统计信息部门应立即与设备供应 商或指定维修厂商联系,及时解决。
第十六条 电子设备的维修情况应及时在 《设备维修、保养登记 表》(见附件 4中做好记录,维修费用需由管理部审批。
第十七条 公司成员都要有主人翁意识, 做到人走机关, 特别是 上下午下班后及时关闭电视机总电源。要爱护电视机, 每日值日生要 做好机器的保养工作,注意防尘、防水、防静电、防磁场、防暴晒。第五章 设备报废
第十八条 严重老化、自然损坏、遭自然力严重破坏已没有实 际使用价值的电子设备可进行报废处理, 报废的设备如仍有残值, 由 财务部进行一次性折旧。
第十九条 各部门电子设备报废必须报公司经统计信息部、财 务部、管理部审批。报批时必须提供下述材料:报废原因、设备清单、使用年限、设备残值、处理办法,并由公司负责人、财务经理及电脑 管理人员签字。
第二十条 经批准报废的电子设备应在 《报废设备登记表》(见 附件 5 中详细登记,并修改其它登记表的相关内容。
第六章 附则
第二十一条 公司给每个员工配置的电脑(包含主机、显示器、键盘、鼠标请相关同事尽心爱护,如出现损坏并已超出保修时间维 修费用由本人的所在部门承担。各部门人员电脑的领用情况请在 《电 脑领用明细表》中。(见附 6
第二十二条 各个部门所使用的电视机、打印机、针式打印机、一体机均属于公司财产, 任何人不得以任何理由损坏和侵占, 否则照 价赔偿。每间办公室由指定人员负责管理。(见附 7《各部门电子产 品负责人对照表》
第二十三条 负责人将电视机遥控器保存好, 若人为遗失或损坏 照价赔偿。电视机播放时间,现暂定为中午 12:00--13:00,将播 放集团会议光盘。其余时间不得擅自使用电视机。需要使用电视机播 放,需提前向管理部进行申请。
第二十四条 公司给相关员工购买的笔记本或其他电子书设备 均属于公司财产, 出现个人原因离职等情况在离职前务必将相关设备 交还给统计信息部并进行登记, 如出现特殊情况须有书面说明并请领
导签字。
第二十五条 特殊员工和经理级别以上可配发笔记本, 满两年后 归个人所有, 不足两年离职时需归还公司, 如遗失按照原价百分之六 十赔偿。使用两年至四年如有丢失个人解决。四年后,如有丢失由公 司重新购置一台。笔记本购置在使用期两年以后,如需提前更换,个 人负担部分费用三年以内个人承担 60%,第四以内年个人承担 40%。期间维修费用由公司承担(见附 8《笔记本领用明细表》。
第二十六条 本办法由公司统计信息部负责解释及修订。第二十七条 本办法自发布之日起执行。
附件 1:上海四联飞扬化工新材料有限公司电子设备编码规则 1.设备分类编码
网络设备 计算机软件 摄影与摄像器材 IT 电器 2.设备编码说明 单位代码 05 06 09 10 显示器 一体机 服务器 网络交换机 其它网络设备 数码照相机 数码摄像机 其它辅助摄像摄影器材 电视机 13 15 01 03 05 01 03 05 01 发票机 针式打印机 路由器 机柜 14 16 02 04 普通照相机 普通摄像机 其它 IT 电器 02 04 11 办公用品代码=资产类别代码+大类代码+小类代码 例如:电脑打印纸代码=O+01+01=O02010 固定资产代码=资产类别代码+大类代码+小类代码+单位代码+流水码(流水 码为三位数,由各公司自己编写,从 001~999)例如:上海公台式计算机代码=F+04+01+09+001=F040109001 附件 2: 上海四联飞扬化工新材料有限公司电子设备变动记录表 附件 3:上海四联飞扬化工新材料有限公司关键电子设备台帐 设备名称 购买日期 序 列 号 供 应 商 所属员工或部门 序号 1 2 3 附件 4: 维修保养记录 设备编号 设备名称 规格型号 品 牌 型号 保修年限 设备编号 联系电话 设备原值 变动内容 变更日期 所属员工或部门 设备去向 上海四联飞扬化工新材料有限公司设备维修、保养登记表---------------------
-----------------------上海四联电子设备管理办法-6统计信息部
日期 设备编号 设备名称 设备故障情况 保养情况 维修费用 所属部门 经手人签名 附件 5: 设备编号 上海四联飞扬化工新材料有限公司电子设备报废登记表 所属员工或部门 设备残值 购置日期 报废日期 报废原因 设备名称 电脑: 财务:-------------上海四联电子设备管理办法-7统计信息部
第五篇:基于嵌入式Linux的IPMI驱动程序设计
基于嵌入式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 Address),自身的地址(Requester Address),消息中的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驱动功能模块有效的降低了系统的复杂度、节省了内存资源,达到了精简嵌入式应用系统的目的。