基于Linux设备模型的单总线接口的设计
王龙奇;樊明辉;陈丽红
【摘 要】1-Wire Bus is a bus protocol which connects some sensors and low-speed devices with the host,such as the smart temperature sensor DS18B20,A/D chip,and so on. With the development of the internet of things,the ap-plication of these sensors will become more widespread,but their interfaces are not closely linked with the kernel, the kernel can not unify the management,so stability and reliability may not be guaranteed. In line with the premise of the Linux kernel device model,a stable 1-Wire interface is given. the controller will be divided into three parts, top-level device interface, the core layer and the underlying hardware interface;menuwhile the driver and the device,the top-level device interface and the specific hardware are seperated in operations.%单总线是一些传感器和低速器件与主机通信常用一种总线协议,如智能温度传感器DS18B20,A/D转换芯片等。随着物联网的发展,这些传感器的应用将越来越广泛,而这些接口没有与内核紧密联系,内核无法进行统一管理,稳定性和可靠性无法得到保证。在符合Linux内核设备模型[2]的前提下,实现一个稳定的单总线接
口,将整个控制器分为顶层设备接口、核心层、底层硬件接口由上到下3个部分;同时对驱动和设备分离、顶层设备接口和具体硬件操作分离。
【期刊名称】《电子器件》
【年(卷),期】2014(000)001
【总页数】5页(P103-107)
【关键词】单总线;Linux;嵌入式系统;分层;分离
【作 者】王龙奇;樊明辉;陈丽红
【作者单位】福州大学物理与信息工程学院,福建 福州350000;福州大学物理与信息工程学院,福建 福州350000;福州大学物理与信息工程学院,福建 福州350000
【正文语种】中 文
【中图分类】TP316.2
Linux系统以其开放、稳定、功能强大著称,在其内核源码中提供众多接口和协议的实现,其中包括PCI、USB、I2C、SPI等等,各种总线的实现都是基于内核的设备模型,具有稳定、功能丰富、扩展性强的优点。而单总线,由于其应用的特殊性——主要应用于EEPROM存储器控制、数字电位器控制、传感器控制、时钟控制等方面,Linux内核尚未提供总线的支持。而这些应用正渐渐成为许多完整系统不可或缺的一部分、如智能系统中传感器的控制,同步系统中同步时钟的获取等等,课题正是基于这种现状,遵循Linux内核的分层、分离思想,实现了一个符合Linux内核设备模型的单总线控制器。
linux内核设计与实现 pdf单总线协议[3],即1-wire protocol,是 Dallas公司提出一种串行总线协议。与其他的串行总线如I2C、SPI类似,1-wire的命令、数据传输也是通过串行方式,但是1-wire具备了最少资源占用的优势,仅使用一根信号线,同时用于传输时钟、数据、命令,并且是双向传输。除此之外,它还具有成本低廉、可扩展性强、维护方便等特点。
单总线协议只适用于单主机场合,易于实现一主多从的网络连接,如常用的多点温度采集系统[4]。节点之间的识别通过一串64bit专用ID进行识别[5-6]。单总线协议还定义了单主单从的简单通信方式,主机不用发送识别码即可与从机进行通信。
单总线协议包含了3种最基本时序,即复位时序、写时序和读时序[7]。在3种基本时序的基础上,总线协议定义了寻址方式、命令传输方式、数据传输方式,这就是课题要实现的物理层部分。
在linux内核中,几乎所有的设计都是基于模块化、分层、分离[8]等思想,在这些思想的指导下,以切合实际应用为出发点,课题实现了一种基于Linux设备模型的分层单总线控制器,它的整体原理框图如图1所示。
在物理层中,本层向上层(核心层)屏蔽了下层通信线路的机械、电气特性等。机械特性主要是指总线连接的接口、外设的拓扑结构、引脚数量及其排列等。而电气特性规定了系统的供电范围、比特与电平的对应关系、比特流的组织方式等。该层最重要的功能是提供了硬件的操作接口,上层通过这些API实现了命令的传送和数据的收发,所以,对上层而言,下层是完全透明的,不需要直接参与底层物理特性的控制。
核心层是本系统最重要的一层,起到了承上启下的作用,包括了设备、设备驱动、通用API接口、适配器4个部分。
在完整的内核驱动中,Linux正是通过设备模型实现设备的统一管理——也就是在kobject、kset等底层内核对象的基础上,将设备device、设备驱动devive_driver和总线bus_type[9]以合适的方式组织在一起,它们的关系如图2所示。
总线是连接设备和设备驱动的媒介,当有新的设备接入时,系统自动匹配总线上挂载的所有驱动,一旦匹配成功就将设备和设备驱动进行绑定。这个过程比较繁琐,首先是总线注册后会在/sys文件系统下生成总线目录,相应地也会在该目录下创建devices、drivers两个目录,以及关于自动匹配和热插拔的一些属性文件。当一个设备驱动注册并匹配成功后,会在总线目录下的驱动目录生成关于这个设备驱动的属性文件和链接文件。设备注册会复杂一些,内核会先判断该设备是否指明父设备,是否指明所属类,也就是说至少存在4种组合,这里,设备都没有指定父设备,但指定了所属类,适配器所属的类是oneWire_adapter_class,单总线设备所属的类是oneWire_dev_class,那么设备注册之后,属性文件并不存在于总线目录,而是存在于类目录下,同时会创建总线到设备、设备到总线、设备到类等链接。总线目录如下所示。
设备目录如下所示:.
除了探测功能,总线和设备驱动还要承担设备删除、热插拔事件、电源控制等处理。设备删除完成的是与探测相反的工作,判断设备是否处于忙状态,如果忙则拒绝删除,只有当设备处于空闲状态才会完成删除操作,包括阻止设备的新请求、等待未执行请求、与绑定的驱动脱离、删除sys文件系统下的目录和节点。电源管理主要是指某些硬件设备支持多种工作模式,设备驱动的suspend和resume方法可以实现工作模式的切换,使设备进入休眠,或者恢复到正常工作状态。
设备层相对简单,主要是将底层的API封装成统一的文件接口提供给应用层。Linux下的设备一般可分为3类——字符设备、网络设备、块设备[10],每一种设备都有各自的应用场合和特点,差别比较大,这里单总线接口也属于字符设备,所以使用的是字符设备接口。字符设备通过一个核心结构体——file_operations封装所有接口函数原型,最新版的内核已经提供了25种操作接口,而事实上常用的只有不到10种,这里用到的包括:
(1)设备打开——oneWire_open,分配一个新的用户句柄,绑定适配器,同时将用户句柄也作为设备注册进内核由内核统一管理。
(2)设备关闭——oneWire_close,从内核中卸载用户句柄,将用户句柄和适配器分离,注
销用户句柄。
(3)设备控制——oneWire_ioctl,用于除读写之外的一些特殊控制,比如复位、设置句柄标志等等。
(4)设备读——oneWire_read,用于从片外设备读取数据到应用层。
(5)设备写——oneWire_write,用于将应用层数据传输到片外设备。
应用层已经涉及到了应用程序的编写,并不是课题要讨论的部分,但考虑到系统的完整性,还是将其作为测试,用来验证系统设计的可行性,在最后一节展开介绍。
课题设计的最终目标是要求能够在多用户态下正常使用,那就不可避免地会遇到这样的问题——不同用户下多应用程序同时打开设备的问题。课题采用了动态分配用户句柄的方式解决这个问题,每次有新的应用程序打开设备都会创建一个用户句柄,而适配器是共用的,新增加的用户句柄作为一个节点添加到适配器关于用户句柄的链表上,在驱动卸载时遍历所有句柄,处理所有请求。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。