首页> 中国专利> 一种基于信号的Linux系统I2C驱动程序方法

一种基于信号的Linux系统I2C驱动程序方法

摘要

本发明属于属于嵌入式驱动技术领域,涉及一种基于信号的linux系统I2C驱动程序方法,包括准备启用文件的异步通知机制,设计驱动的异步通知接口单元,设计信号安装单元,设计驱动程序的功能测试单元;将信号机制运用到驱动程序,通知用户程序读数据,本发明解决了查询模式定时查询,效率低,实时性差的缺陷。

著录项

  • 公开/公告号CN112286858A

    专利类型发明专利

  • 公开/公告日2021-01-29

    原文格式PDF

  • 申请/专利权人 山东众海智能科技有限公司;

    申请/专利号CN202011195845.2

  • 发明设计人 刘新;郭宝鑫;韩松;

    申请日2020-10-30

  • 分类号G06F13/42(20060101);

  • 代理机构37205 济南舜源专利事务所有限公司;

  • 代理人李舜江

  • 地址 250000 山东省济南市历下区金达路1888号

  • 入库时间 2023-06-19 09:43:16

说明书

技术领域

本发明属于嵌入式驱动技术领域,具体涉及一种基于信号的Linux系统I2C驱动程序方法。

背景技术

随着电子技术迅速发展,以微处理器为基础的嵌入式系统迅速普及。嵌入式系统有两种工作方式,第一种是以单片机为基础,这种系统硬件资源有限,软件简单,且不含操作系统;第二种可以运行操作系统,极大的利用PC机的丰富资源,嵌入式操作系统中,Linux是开源代码,发展最为迅速,应用最为广泛。I2C总线通过串行数据线(SDA)和串行时钟线(SCL)连接到总线上的器件之间传递信息,根据地址识别每个器件,I2C有两种工作模式,主发主收和从发从收两种模式,从收从发模式是从设备主发,由于设备的返回时间不确定,因此采用中断模式。Linux驱动程序只实现了主发主收,仅实现I2C一半的功能。

I2C总线驱动过程中,Linux需要用户主动操作设备文件,用户程序不能预测设备数据到达的时间,造成软件运行效率降低,实时性差,同时未能很好的利用硬件中断机制处理紧急事件,只利用函数定时查询设备是否可读,效率不高。此为现有技术中存在的缺陷。

有鉴于此,本发明提供一种基于信号的Linux系统I2C驱动程序方法,以解决现有技术中存在的缺陷,是非常有必要的。

发明内容

本发明的目的在于,针对现有技术中存在Linux系统I2C驱动程序中设备数据基于查询模式定时查询,效率低,实时性差的缺陷,提供设计一种基于信号的Linux系统I2C驱动程序方法,将信号机制运用到驱动程序,通知用户程序读数据,解决上述技术问题。

为实现上述目的,本发明给出以下技术方案:一种基于信号的linux系统I2C驱动程序方法,包括以下步骤:

S1:准备启用文件的异步通知机制;

S2:设计驱动的异步通知接口单元;

S3:设计信号安装单元;

S4:设计驱动程序的功能测试单元。

作为优选,所述步骤S1中:所述的准备启用文件的异步通知机制对Linux系统下的标准I2C驱动程序修改,包括在i2c.h文件中i2c_adapter数据结构中增加宏定义USE_ASYNC,实现变量i2c_event和queue的定义;在i2c_dev.c文件中i2c_dev_fops数据结构中增加宏定义USE_ASYNC实现fasync:i2cdev_fasync,新增静态函数i2cdev_fasync;

i2c_xxx模块发送SIGIO信号包括,i2c_algo_xxx模块下的i2c_xxx_add_bus函数增加i2c_xxx_ap=adap;i2c_xxx模块的中断函数iic_xxx_handler中,在数据处理完准备返回前添加如下语句,

#ifdef USE_ASYNC

if(i2c_xxx_ap->i2c_event)

kill_fasync(&(i2c_xxx_ap->i2c_event),SIGIO,POLL_IN)。

作为优选,所述步骤S2中:所述的设计使用驱动的异步通知接口单元,设置与用户程序fcntl系统调用对应的接口方法,当进程使用fcntl系统调用执行F_SETOWN命令时,属主进程的进程ID号就保存在file->f_owner中;通过fcntl命令F_SETFL完成,设备中置FASYNC标志,此时设备可在新数据到达时请求发送一个SIGIO信号,SIGIO信号存放在file->f_owner中的进程;

在用户程序中设置信号量宿主、取文件描述符、加异步读取标志;使用户程序具备使用异步通知接口的条件。

作为优选,所述步骤S3中:所述的信号安装单元,包括信号量的初始化,使用sigaction()安装信号函数,支持信号传递信息,可以传递文件句柄。

作为优选,所述的sigaction()函数设置三个参数,第一个参数为信号的值,第二个参数为指向sigainfo_t结构的指针,包含对指定信号的处理、信号传递的信息、信号处理函数执行过程中应屏蔽掉哪些函数;第三个参数oldact指向的对象用来保存原来对相应信号的处理;设定结构sigaction中SA_SIGINFO标志位,表示信号附带的参数可以被传递到信号处理函数中,标志位SA_SIGINFO看成信号是否传递参数的开关;由sigaction结构中的sa_sigaction指定处理函数,结构sigaction的sa_mask指定在信号处理程序执行过程中,哪些信号应当被阻塞。

作为优选,所述的步骤S4中,所述的所述的驱动程序的功能测试单元设置两个I2C设备fd、fd1来测试信号在驱动程序中的应用;功能测试单元包括,主i2c文件初始化单元;i2c-bit文件初始化单元;信号的初始化单元;设置信号函数单元;主函数编写单元,确保基于信号的Linux系统I2C驱动程序正常运行;

所述的主i2c文件初始化单元包括设置I2C总线控制器时钟频率;设置主发主收、从发从收,设置七位地址;所述的i2c-bit文件初始化单元设置七位地址;

所述的信号的初始化单元包括设置信号函数,设置传输附加信息,设置信号量以及信号量宿主,取文件描述符,加异步读取标志,设置异步读取信号量以及键盘复位;

所述的设置信号函数单元包括,获取SIGIO信号,传递主i2c文件句柄以及传递i2c-bit文件句柄;

所述的主函数编写单元,判断fd、fd1状态,执行对应操作。

作为优选,在i2c_init()定义一个结构sigaction变量,设定信号处理函数名myread:

action.sa_sigaction=myread;

传输附加信息:

action.sa_flags=SA_SIGINFO;

sigaction()函数安装信号:

sigaction(SIGIO,&action,NULL);

myread代码如下:

首先通过signo判断信号类型是否是SIGIO,然后通过siginfo_t结构的si_fd成员来传递文件描述符,用open方法打开设备时,系统自动分配的,最后进入处理模块,i2c_readevent()、i2c_readkb()分别处理,代码如下:

这样用信号处理I2C总线驱动程序基本达到了实时中断的要求。

本发明的有益效果在于,基于异步通知的I2C驱动程序,很好的利用硬件中断机制处理紧急事件,设置i2c总线主发主收不用中断,只要简单返回,i2c总线从发从收完全在中断中进行,实现了对中断的实时处理,同时多个驱动程序以异步通知方式工作而不互相干扰,提高了数据处理的效率,数据量大时更加具有优势;基于信号的Linux系统I2C驱动程序,思路新颖,使Linux系统中的用户程序调用方法较传统方法简单实用,提高编程效率;可以推广到其他驱动程序的编写上,优化Linux代码,提高效率。此外,本发明设计原理可靠,结构简单,具有非常广泛的应用前景。

由此可见,本发明与现有技术相比,具有实质性特点和显著的进步,其实施的有益效果也是显而易见的。

附图说明

图1为基于信号的Linux系统I2C驱动程序方法流程图。

图2为Linux系统I2C驱动层次关系示意图。

具体实施方式

下面结合附图并通过具体实施例对本发明进行详细阐述,以下实施例是对本发明的解释,而本发明并不局限于以下实施方式。

如图1所示,本发明提供了一种基于信号的Linux系统I2C驱动程序方法,包括以下步骤:

一种基于信号的linux系统I2C驱动程序方法,包括以下步骤:

S1:准备启用文件的异步通知机制;

S2:设计驱动的异步通知接口单元;

S3:设计信号安装单元;

S4:设计驱动程序的功能测试单元。

本实施例以三星ARM9处理器2410为例:

所述步骤S1中:所述的准备启用文件的异步通知机制对Linux系统下的标准I2C驱动程序修改,包括在i2c.h文件中i2c_adapter数据结构中增加宏定义USE_ASYNC,实现变量i2c_event和queue的定义;在i2c_dev.c文件中i2c_dev_fops数据结构中增加宏定义USE_ASYNC实现fasync:i2cdev_fasync,新增静态函数i2cdev_fasync;

i2c_s3c2410模块发送SIGIO信号包括,i2c_algo_s3c2410模块下的i2c_s3c2410_add_bus函数增加i2c_s3c2410_ap=adap;i2c_s3c2410模块的中断函数iic_s3c2410_handler中,在数据处理完准备返回前添加如下语句,

#ifdef USE_ASYNC

if(i2c_s3c2410_ap->i2c_event)

kill_fasync(&(i2c_s3c2410_ap->i2c_event),SIGIO,POLL_IN)。

所述步骤S2中:所述的设计使用驱动的异步通知接口单元,设置与用户程序fcntl系统调用对应的接口方法,当进程使用fcntl系统调用执行F_SETOWN命令时,属主进程的进程ID号就保存在file->f_owner中;通过fcntl命令F_SETFL完成,设备中置FASYNC标志,此时设备可在新数据到达时请求发送一个SIGIO信号,SIGIO信号存放在file->f_owner中的进程;在用户程序中设置信号量宿主、取文件描述符、加异步读取标志;使用户程序具备使用异步通知接口的条件。

所述步骤S3中:所述的信号安装单元,包括信号量的初始化,使用sigaction()安装信号函数,支持信号传递信息,可以传递文件句柄。所述的sigaction()函数设置三个参数,第一个参数为信号的值,第二个参数为指向sigainfo_t结构的指针,包含对指定信号的处理、信号传递的信息信号处理函数执行过程中应屏蔽掉哪些函数;第三个参数oldact指向的对象用来保存原来对相应信号的处理;设定结构sigaction中SA_SIGINFO标志位,表示信号附带的参数可以被传递到信号处理函数中,标志位SA_SIGINFO看成信号是否传递参数的开关;由sigaction结构中的sa_sigaction指定处理函数,结构sigaction的sa_mask指定在信号处理程序执行过程中,哪些信号应当被阻塞。

所述的步骤S4中,所述的所述的驱动程序的功能测试单元设置两个I2C设备fd、fd1来测试信号在驱动程序中的应用;功能测试单元包括,主i2c文件初始化单元;i2c-bit文件初始化单元;信号的初始化单元;设置信号函数单元;主函数编写单元,确保基于信号的Linux系统I2C驱动程序正常运行;

所述的主i2c文件初始化单元包括设置I2C总线控制器时钟频率;设置主发主收、从发从收,设置七位地址;所述的i2c-bit文件初始化单元设置七位地址;所述的信号的初始化单元包括设置信号函数,设置传输附加信息,设置信号量以及信号量宿主,取文件描述符,加异步读取标志,设置异步读取信号量以及键盘复位;所述的设置信号函数单元包括,获取SIGIO信号,传递主i2c文件句柄以及传递i2c-bit文件句柄;所述的主函数编写单元,判断fd、fd1状态,执行对应操作。

在i2c_init()定义一个结构sigaction变量,设定信号处理函数名myread:

action.sa_sigaction=myread;

传输附加信息:

action.sa_flags=SA_SIGINFO;

sigaction()函数安装信号:

sigaction(SIGIO,&action,NULL);

myread代码如下:

首先通过signo判断信号类型是否是SIGIO,然后通过siginfo_t结构的si_fd成员来传递文件描述符,用open方法打开设备时,系统自动分配的,最后进入处理模块,i2c_readevent()、i2c_readkb()分别处理,代码如下:

这样用信号处理I2C总线驱动程序基本达到了实时中断的要求。

以上公开的仅为发明的优选实施方式,但本发明并非局限于此,任何本领域的技术人员能思之的没有创造性的变化,以及在不脱离本发明原理前提下所作的若干改进和润饰,都应落在本发明的保护范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号