基于Linux系统的一种多种串行总线统一接口的实现方法

2018-02-14 22:32:45编辑:什么鱼 关键字:Linux系统  串行总线  统一接口

    引言

    在Linux内核中单独实现TTY、I2C、SPI、ISA、USB等多种总线驱动时,每一种总线的实现都有各自的特点,如参数设置不同,实现的结构不同等。以TTY、I2C为例,TTY采用的是基于线路规程的三层结构,而I2C则是基于用户句柄和适配器的三层结构。当然,这些驱动都是功能齐全而强大的,但对于并不复杂的应用而言,这样的控制是比较繁琐的,而且,对于移植也是不利的。例如,某个应用系统原先使用一款I2C接口的时钟芯片,但后来系统升级换成了一款SPI接口的时钟芯片,这时就不得不对程序做较大的改动了。本文给出了一种多种串行总线统一接口的实现方法,并以ARM9为平台,以I2C、1-Wire、SPI为例验证了方法的可行性。

    1 总线协议及其工作过程

    多数的串行总线都基于主从结构,如果总线中包含了时钟信号线,那么,该时钟信号就由主机提供,而如果还包含了片选信号,通常也由主机来控制。也就是说,主机发起通信,从机处于被动状态,所以,对于总线时序的分析,只需讨论主控制器端的时序,而从设备的时序就是它的逆向过程。

    1.1 SPI协议及其工作过程

    SPI总线是摩托罗拉公司提出的一种串行总线协议,该总线由4根基本的信号线组成,分别是CS、SI、SO、SCK。其中SCK是串行总线时钟,由主设备提供;而SI、SO分别对应于数据输入和数据输出信号。在一主多从的系统中,片选信号决定当前有效的从设备。

    SPI总线的工作过程是:首先,主机发起通信,通过片选信号激活从设备;然后,主机在串行时钟SCK信号的同步下,将地址、命令、数据信息从串行数据输出信号(相对主机而言)SI送出;而从设备则在SCK信号的同步下接收主机发送来的数据,并作出相应反应,最后将结果从数据输入信号(相对主机而言)SO送出。

    S3C2440中对SPI总线的控制,就是集中于对rSPCONn、rSPSTAn、rSPPINn、rSPPREn、rSPTDATn和rSPRDATn的控制。其中rSPCONn用于DMA设置、工作模式选择、时钟相位选择,rSPSTAn用于控制器状态查询,rSPPINn用于多主机下出错检测和片选释放,rSPPREn用于控制预分频状态寄存器,rSPTDATn是数据发送寄存器,rSPRDATn是数据接收寄存器。

    1.2 I2C协议及其工作过程

    I2C总线是由飞利浦公司提出的一种接口标准,该总线由SDA、SCL两根信号线组成。其中SCL为时钟信号,由主机提供,最大传输速率为400kb/s;而SDA为数据信号。连接到总线上的每一个设备都有一个唯一的地址,通过这个地址使得主机能够找到目标从机并与之进行通信。

    以主机发送为例,I2C总线的工作过程是:首先,主机控制时钟信号SCL为高电平时,数据信号SDA产生一个下降沿,作为起始条件。然后,主机发出7位的从设备地址和1位R/W标志,并激活将要与之通信的从设备,而从设备则会产生一个应答信号。对于写数据,主机紧接着就将一个字符或一串数据写入到从设备;而对于读数据,则紧接着读取从设备输出的数据。

    I2C总线中的S3C2440对I2C的控制主要集中于对rIICCON、rIICSTAT、rIICADD和rIICDS的控制。其中rIICCON用于时钟源选择、中断控制和I2C控制器使能,rIICSTAT用于工作模式选择、控制器状态查询,rIICADD是从设备地址(当S3C2440设置为从设备模式时使用),rIICDS是发送接收移位寄存器。

    1.3 1-Wire协议及其工作过程

    1-Wire总线是Maxim全资子公司Dallas提出的一种总线接口。1-Wire总线与其他的串行总线有比较大的区别:普通的串行总线通常由两根或两根以上的信号线组成;而1-Wire总线仅有一根信号线,同时用于时钟、数据、命令的传输,具有资源利用率高、结构简单、成本低廉、易于总线扩展等优点。

    1-Wire总线工作过程:1-Wire总线包含复位、读、写三种基本时序。在复位状态下,主机将总线拉低480~960 μs后释放总线,由于上拉电阻的作用,此时的电平为高,等待15~60 μs之后,从设备将总线拉低表示复位成功。写操作时,若写入数据位为0,则主机将总线拉低60μs后释放;若写入数据位为1,则主机将总线拉低1~15 μs后释放。由于很少有控制器集成了1-Wire总线控制器,所以,一般使用GPIO模拟的方式,这时,对于时序的控制就要求得比较精确。

    2 Linux下的统一驱动

    这些总线有一些共性,也就是驱动要实现的内容,主要包括单字节数据收发、数据流收发以及工作模式控制等。在这些共性的基础上,一般都需要向上层提供一个统一的接口,以使得对使用这些API的应用程序而言(下层总线无论是RS-232、SPI、I2C,还是1-Wire)都不需要做任何改变。同时,还要对下层也提供一个通用接口,使得不同的总线都能与上层统一接口协调通信。该驱动的结构框架如图1所示。


    本文主要讨论的是总线驱动部分,而应用层和物理层在测试的时候,也可用两个简单的例子来验证设计结果。

    2.1 注册一个新设备号

    首先可为统一接口的总线定义一个新的设备号240,而且以后注册的总线子设备都以此为主设备号。假如现在注册了一个1-Wire和一个I2C总线接口,那么,它们两者的主设备号都为240,而次设备号不同。如果1-Wire的次设备号为0,而I2C的次设备号为1,那么就可将两条总线区分开来了。此时的程序如程序片段一所示。

    程序片段一:


2.2 设备接口层
    为了实现统一的接口,有必要定义一个统一的字符设备接口buses_ops,应用程序访问总线都通过这个接口,这样,所讨论的统一接口问题也就实现了。该接口的主要函数成员如程序片段二所示。
    程序片段二:
    
    
    应用程序打开设备的时候,利用子设备号可以找到总线对应的底层适配器,也就是说,子设备号兼具了适配器索引的功能,其具体实现如程序片段三所示。
    程序片段三:

    事实上,buses_dev是设备层和适配器层的桥梁,在open操作里被赋值给文件指针的私有数据域。那么,在读与写函数中,就可以反其道而行,通过文件指针的私有数据域就可获得buses_dev数据结构体。
2.3 适配器接口层
    适配器负责对底层数据的操作,由于不同的总线之间存在共性,所以,一般来说,它们都包含了单字节读、单字节写、多字节读、多字节写以及一些特殊控制。综上所述,该数据结构如程序片段四所示。
    程序片段四:


    所谓适配器注册,就是将适配器添加到全局链表buses_list_head中,只有这样,才能在字符设备接口的open操作中通过子设备号索引找到适配器,具体如程序片段五所示。
    程序片段五:


3 实验测试
    这里分别以1-Wire、SPI、I2C总线为例来初始化三条总线适配器,同时实现适配器的单字节写、单字节读、特殊控制等三种基本操作。具体操作如下面的程序所示:
    程序片段六:
    


    完成设备驱动加载之后,就会在/dev目录下生成如图2所示的文件节点。通过打开节点,就可以打开总线的统一接口,从而实现对总线的读、写和控制操作。


    同时,还会在/sys目录下生成关于注册的总线属性目录和文件,主要包含有设备号的属性文件、电源管理属性目录、到类目录的链接、特殊事件属性文件等,具体如图3所示。


    这里分别对I2C接口的E2PROM芯片AT24C02、1-Wire接口的EEPROM芯片DS2433和SPI接口的EEPROM芯片25AA010进行测试。其测试结果如图4所示。

    其测试过程是:通过打开/dev/bus-0、/dev/bus-1、/dev/bus-2节点,调用写操作写一段数据到EEPROM,然后,再调用读操作读出刚才写入的数据,并验证两者是否一致,从而判断本文的接口函数的正确性。

    4 结语

    实践证明,使用设备接口层与适配器接口层的这种分层方式,能够让应用程序进一步忽略底层的接口操作,实现接口的统一。而且,该方法具有适应性强,易于系统升级,占用资源少等特点,能有效提高应用程序的开发效率。


关键字:Linux系统  串行总线  统一接口

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/article_2018021437811.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:系统上电后 bootloader的执行流程及 ARM Linux的启动过程分析
下一篇:基于Liunx的嵌入式系统的底层软件的结构、设计和应用

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

微软首次推出自主版本Linux系统

将公布更多细节。  这里值得注意的是,微软正在开发自己的Linux系统。这听起来很奇怪。不过,微软的策略转向已有一段时间。  在2014年萨蒂亚·纳德拉(Satya Nadella)成为微软CEO时,他所做的第一件事就是宣布“微软热爱Linux”。自那时以来,微软在Azure平台上为Linux提供了有力的支持,并且允许开发者将Linux集成至Windows 10拷贝。2015年,微软开发了一种基于Linux的技术,作为一个开源软件包的一部分。  不过,这是微软首次开发自己的Linux版本,并将其作为某个产品的基础。这也表明,一切皆有可能。   以上是关于嵌入式中-微软首次推出自主版本Linux系统的相关介绍,如果
发表于 2018-04-17 13:46:11

ARM-Linux:设备-mixer-linux系统声音效果调节

系统:arm板/Linux系统 内核:2.6.7 设备:/dev/mixer 功能:linux系统声音效果调节 文件名:xxx.c 编译:gcc xxx.c -o mixerSet 终端执行:./mixerSet [leftvalue] [rightvalue] 测试:无问题#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <sys/ioctl.h>#include <fcntl.h>#include <linux
发表于 2018-04-13 21:27:55

嵌入式Linux系统的键盘驱动实现

1引言Linux由于其具有内核强大且稳定,易于扩展和裁减,丰富的硬件支持等诸多优点,在嵌入式系统中得到了广泛的应用。很多嵌入式Linux系统,特别是一些具有与用户强交互的嵌入式系统,往往需要配备一个特殊键盘,此时开发者需要根据实际情况,为自己的特殊键盘编写驱动程序。2Linux键盘驱动简介Linux中的大多数驱动程序都采用了层次型的体系结构,键盘驱动程序也不例外。在Linux中,键盘驱动被划分成两层来实现。其中,上层是一个通用的键盘抽象层,完成键盘驱动中不依赖于底层具体硬件的一些功能,并且负责为底层提供服务;下层则是硬件处理层,与具体硬件密切相关,主要负责对硬件进行直接操作。键盘驱动程序的上层公共部分都在driver
发表于 2018-02-19 22:23:44

基于ARM920T的嵌入式Linux系统的构建

(SAM SUNG公司使用ARM920T处理器内核开发的一款嵌入式处理器)。ARM920T核由ARM9TDMI,存储管理单元(MMU)和高速缓存三部分组成。    S3C2410的资源还包括外围存储设备(SDRAM和NandFlash),外围显示设备(触摸屏和LCD)与外围接口设备(串口、网口与并口)。    软件平台    嵌入式Linux系统从软件系统的角度通常可以分为以下4个部分。  ·引导加载程序。包括固化在固件中的启动代码(可选)和Bootloader。  ·内核。特定于嵌入式板子的定制内核以及控制内核引导系统的参数。  ·文件系统。包括根文件系统和建立
发表于 2018-02-18 22:18:03
基于ARM920T的嵌入式Linux系统的构建

基于嵌入式Linux系统的键盘驱动实现

    1前 言    Linux由于其具有内核强大且稳定,易于扩展和裁减,丰富的硬件支持等诸多优点,在嵌入式系统中得到了广泛的应用。很多嵌入式Linux系统,特别是一些具有与用户强交互的嵌入式系统,往往需要配备一个特殊键盘,此时开发者需要根据实际情况,为自己的特殊键盘编写驱动程序。    2Linux键盘驱动简介 <iframe id="iframeu2163852_0" src="http://pos.baidu.com/ncom?conwid=250&conhei=250&rdid=2163852&dc=3&di=u2163852&dri=0&dis
发表于 2018-02-18 22:10:10

如何构造嵌入式Linux系统

进行设备驱动程序的清除工作。在成功的向系统注册了设备驱动程序后(调用register_chrdev成功后),就可以用mknod命令来把设备映射成一个特别文件,其它程序社用这个设备的时候,只要对此特别文件进行操作就可以了。    结语    本文主要论述了如何构造嵌入式Linux系统,设计和实现一个完整并且小巧使用的嵌入式Linux系统是一个非常复杂的过程。由于嵌入式Linux是由标准 Linux裁减而来的,所以需要对Linux的内核有深入的了解。本文所构建的一个小型嵌入式Linux系统,已成功运用于S3C2410 。所欠缺的是构建的内核还不够小,原因可能是存在一些不必要的硬件驱动程序以及库的裁减
发表于 2018-02-18 21:51:08

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved