公开/公告号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总线驱动程序基本达到了实时中断的要求。
以上公开的仅为发明的优选实施方式,但本发明并非局限于此,任何本领域的技术人员能思之的没有创造性的变化,以及在不脱离本发明原理前提下所作的若干改进和润饰,都应落在本发明的保护范围内。
机译: 一种电流检测器,其包括货运驱动器,该货运驱动器产生磁场检测器,绕组和补偿,以基于由线圈产生的信号之间的差来产生指示输出电流的信号;电表包括功率检测器。
机译: UEFI和操作系统驱动程序方法,用于在基于LAN的NIC中更新MAC地址
机译: 在基于LAN的NIC中更新MAC地址的UEFI和操作系统驱动程序方法