驱动测试方法、装置、存储介质及其计算机设备与流程

文档序号:12887095阅读:354来源:国知局
驱动测试方法、装置、存储介质及其计算机设备与流程

本发明涉及计算机技术领域,特别是涉及驱动测试方法、装置、存储介质及其计算机设备。



背景技术:

linux系统操作系统具有自由开放、内核功能强大、对硬件资源要求低且支持多平台、开发人员多等特点,因此linux系统操作系统现在已经在服务器、桌面、嵌入式等领域获得了长足的发展,被业界认为是未来最有前途的操作系统之一。

linux系统下,一般的控制器驱动测试方法,需要在linux系统应用层根据内核中的驱动架构编写相应的应用程序来测试驱动程序,但是,当发现硬件驱动编写有误,特别是硬件控制器的值写错后,在修改完内核驱动后,需要重新编译linux系统内核,再将linux系统内核及应用程序加载到嵌入式设备上,即使,采用动态加载内核模块的方式,还是得重新编译并加载内核驱动程序,这种soc(systemonchip,片上系统)外设控制器的驱动测试方法效率低且复杂。



技术实现要素:

基于此,有必要针对一般soc外设控制器的驱动测试方法效率低的问题,提供一种高效的用于对linux系统应用层操作soc外设控制器进行驱动测试的方法、装置、存储介质及其计算机设备。

一种驱动测试方法,用于对linux系统应用层操作soc外设控制器进行驱动测试,包括步骤:

激活驱动设备节点;

在linux系统内核中申请物理内存空间,记录为缓冲空间;

将缓冲空间映射到用户空间,记录为映射空间;

对映射空间赋soc外设控制器初始化值;

将映射空间中的值刷到soc外设控制器中;

启动soc外设控制器,根据预设测试要求,循环动态修改映射空间中的数据,查看驱动测试结果。

一种驱动测试装置,用于对linux系统应用层操作soc外设控制器进行驱动测试,包括:

启动模块,用于激活驱动设备节点;

空间申请模块,用于在linux系统内核中申请物理内存空间,记录为缓冲空间;

映射模块,用于将缓冲空间映射到用户空间,记录为映射空间;

第一赋值模块,用于对映射空间赋soc外设控制器初始化值;

第二赋值模块,用于将映射空间中的值刷到soc外设控制器中;

驱动测试模块,用于启动soc外设控制器,根据预设测试要求,循环动态修改映射空间中的数据,查看驱动测试结果。

本发明驱动测试方法与装置,用于对linux系统应用层操作soc外设控制器进行驱动测试,激活驱动设备节点,在linux系统内核中申请物理内存空间,记录为缓冲空间,将缓冲空间映射到用户空间,记录为映射空间,赋值soc外设控制器初始化值,将已赋的数值刷到soc外设控制器中,启动soc外设控制器,循环动态修改映射空间中的数据,查看驱动测试结果。整个过程中,直接通过内存映射方式传递数据,数据传递效率较高,特别是周期性的传递大量寄存器数据时,能够高效的用于对linux系统应用层操作soc外设控制器进行驱动测试。

另,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上述方法的步骤。其中,驱动测试方法直接通过内存映射方式传递数据,数据传递效率较高,特别是周期性的传递大量寄存器数据时,能够高效的用于对linux系统应用层操作soc外设控制器进行驱动测试。

另,本发明还提供一种计算机设备,包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,处理器执行程序时实现如上述方法的步骤。其中,驱动测试方法直接通过内存映射方式传递数据,数据传递效率较高,特别是周期性的传递大量寄存器数据时,能够高效的用于对linux系统应用层操作soc外设控制器进行驱动测试。

附图说明

图1为本发明驱动测试方法第一个实施例的流程示意图;

图2为本发明驱动测试方法第二个实施例的流程示意图;

图3为本发明驱动测试方法其中一个应用实例的流程示意图;

图4为本发明驱动测试方法其中一个应用实例的流程示意图;

图5为本发明驱动测试装置第一个实施例的结构示意图;

图6为本发明驱动测试装置第二个实施例的结构示意图。

具体实施方式

如图1所示,一种驱动测试方法,用于对linux系统应用层操作soc外设控制器进行驱动测试,包括步骤:

s100:激活驱动设备节点。

linux系统将所有的设备都归类为字符设备、块设备及网络设备。普通的字符设备驱动算是linux系统内核中最简单的驱动,因此,非必要的,在这里可以选择采用linux系统普通的字符设备驱动架构,即步骤s100具体可以为:激活linux系统中字符设备驱动程序,以激活字符设备。更进一步的,还可以判断驱动设备节点是否已经成功激活,若已经成功激活,则进入步骤s200,若未成功激活,则终止本轮驱动测试。

s200:在linux系统内核中申请物理内存空间,记录为缓冲空间。

linux系统内核设置有一定大小的物理内存空间,在这里,在linux系统内核中申请物理内存空间,将该申请的物理内存空间记录为缓冲(buffer)空间。非必要的,可以通过linux系统提供的ioctl函数(ioctl函数是设备驱动程序中对设备的i/o通道进行管理的函数)控制字符设备驱动申请确定大小的物理内存空间——buffer。更进一步,在步骤s200之后还可以判断本次物理内存空间是否申请成功,若申请成功,则进入步骤s300,若申请失败,则选择重新申请,或,终止本轮驱动测试。

s300:将缓冲空间映射到用户空间,记录为映射空间。

将步骤s200申请的缓冲空间映射到用户空间,为便于说明将这部分空间记录为映射空间,需要理解的是,映射空间实质任属于用户空间,其仅是为了便于行文描述所采用的一个名词。下面将采用实例,详细说明在linux系统中内核空间与用户空间的区别以及关系。linux系统驱动程序一般工作在内核空间,但也可以工作在用户空间。下面将详细解析,什么是内核空间,什么是用户空间,以及如何判断。linux系统简化了分段机制,使得虚拟地址与线性地址总是一致,因此,linux系统的虚拟地址空间也为0~4g。linux系统内核将这4g字节的空间分为两部分。将最高的1g字节(从虚拟地址0xc0000000到0xffffffff),供内核使用,称为“内核空间”。而将较低的3g字节(从虚拟地址0x00000000到0xbfffffff),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,linux系统内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4g字节的虚拟空间。linux系统使用两级保护机制:0级供内核使用,3级供用户程序使用。每个进程有各自的私有用户空间(0~3g),这个空间对系统中的其他进程是不可见的。最高的1gb字节虚拟内核空间则为所有进程以及内核所共享。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。虽然内核空间占据了每个虚拟空间中的最高1gb字节,但映射到物理内存却总是从最低地址(0x00000000)开始。对内核空间来说,其地址映射是很简单的线性映射,0xc0000000就是物理地址与线性地址之间的位移量。非必要的,可以通过mmap系统调用映射内核申请的缓冲空间到用户空间。

s400:对映射空间赋soc外设控制器初始化值。

soc外设控制器初始化值是soc预先设定的数值,在步骤s300映射的缓冲空间中赋上该soc外设控制器初始化值。具体来说,在应用层,按照soc外设控制器与映射空间的对应关系,给缓冲空间填写相应寄存器的初始化值。soc外设控制器必须被正确初始化后才能开始正常工作,soc外设控制器的初始化工作就是赋初始值。

s500:将映射空间中的值刷到soc外设控制器中。

再将映射空间中的值刷到soc外设控制器中。需要指出的是,初始的时候映射空间中的值为soc外设控制器初始化值,在后续驱动测试过程中,映射空间中的值是会改变的,因此,步骤s500应当理解为个伴随驱动测试持续进行的动作。非必要的,可以通过ioctl系统调用控制内核驱动程序将缓冲空间中的值刷到外设控制器中。

s600:启动soc外设控制器,根据预设测试要求,循环动态修改映射空间中的数据,查看驱动测试结果。

启动soc外设控制器,循环动态修改改映射空间中的数据,即最终修改soc外设控制器数据,查看驱动测试结果。具体来说,可以通过ioctl系统调用控制内核驱动程序启动外设控制器,循环动态修改映射空间的中的值,查看驱动测试结果。

本发明驱动测试方法,用于对linux系统应用层操作soc外设控制器进行驱动测试,激活驱动设备节点,在linux系统内核中申请物理内存空间,记录为缓冲空间,将缓冲空间映射到用户空间,记录为映射空间,赋值soc外设控制器初始化值,将已赋的数值刷到soc外设控制器中,启动soc外设控制器,循环动态修改映射空间中的数据,查看驱动测试结果。整个过程中,直接通过内存映射方式传递数据,数据传递效率较高,特别是周期性的传递大量寄存器数据时,能够高效的用于对linux系统应用层操作soc外设控制器进行驱动测试。

在其中一个实施例中,将映射空间中的值刷到soc外设控制器中的步骤包括:

在soc外设控制器的中断服务程序中,或者通过linux系统内核自带的timer机制,将映射空间中的值刷到soc外设控制器中。

在本实施例中,可以采用两种不同的方式将将映射空间中的值刷到soc外设控制器中,一种是,内核驱动程序中,在soc的外设控制器的中断服务程序中,将在应用层动态修改过后的缓冲空间中值重新刷到soc外设控制器的寄存器中,从而达到动态控制外设控制器的目的;另一种是,内核驱动程序中,利用linux系统内核自带的timer机制,将在应用层动态修改过后的缓冲空间中值重新刷到soc外设控制器的寄存器中,从而达到动态控制外设控制器的目的。

如图2所示,在其中一个实施例中,步骤s600之后还包括:

s700:当接收到停止测试信号时,解除缓冲空间与用户空间的映射关系。

在应用层测试程序中,查看是否收到测试停止信号或其他中断测试的信号如果收到相关的停止信号,则跳出测试循环,并且调用munmap函数解除缓冲空间与用户空间的映射关系,将驱动测试过程构建的关系解除,以便数据还原,避免影响linux系统正常工作。

在其中一个实施例中,将缓冲空间映射到用户空间,记录为映射空间的步骤之前还包括:

构建缓冲空间与soc外设控制器一一对应关系;

将缓冲空间映射到用户空间,记录为映射空间的步骤包括:

通过linux系统中内置mmap函数将缓冲空间映射到linux系统的用户空间,并根据缓冲空间与soc外设控制器一一对应关系,构建soc外设控制器与映射空间的对应关系;

对映射空间赋soc外设控制器初始化值的步骤包括:

根据soc外设控制器与映射空间的对应关系,在用户空间中填写相应soc外设控制器的初始化值。

将内核申请的缓冲空间与soc的控制器一一对应起来,这样确保应用层程序知道缓冲空间与soc控制器的各对应关系。通过linux系统提供的mmap系统调用函数将内核驱动申请的物理缓冲空间映射到linux系统用户空间。在linux系统中,一般应用层不能直接操作linux系统的内核空间,因此,linux系统通过mmap函数提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。在应用层,按照soc外设控制器与映射空间的对应关系,给缓冲空间填写相应寄存器的初始化值。

为更进一步,详细解释本发明驱动测试方法的技术方案及其效果,下面将以两个应用实例,并结合图3以及图4进行说明。

应用实例一

如图3所示,在其中一个应用实例中,本发明驱动测试方法包括步骤:

s301:在应用层测试程序中,首先通过open系统调用打开驱动设备节点。

s302:判断字符设备是否成功打开。

s303:通过ioctl系统调用控制内核驱动程序在内核中申请特定大小的物理内存缓冲空间。

s304:判断缓冲空间是否申请成功。

s305:通过mmap系统调用映射内核申请的缓冲空间到用户空间。

s306:判断映射是否成功。

s307:给映射空间赋外设控制器的初始化值。

s308:通过ioctl系统调用控制内核驱动程序将buffer空间中的值刷到soc外设控制器中。

s309:通过ioctl系统调用控制内核驱动程序启动soc外设控制器。

s310:循环动态修改映射到用户空间buffer中的值。

s311:查看测试效果。

s312:判断是否接收到停止测试信号。

s313:调用munmap函数解除缓冲空间与用户空间的映射关系。

s314:释放内核中物理内存缓冲空间。

s315:关闭字符设备。

应用实例二

如图4所示,在其中一个应用实例中,本发明驱动测试方法包括步骤:

s401:激活字符设备驱动程序,linux系统将所有的设备都归类为字符设备、块设备及网络设备,普通的字符设备驱动算是linux内核中最简单的驱动,所以采用linux普通的字符设备驱动架构。

s402:判断字符设备是否成功激活,如果未激活,终止本测试程序,如果字符设备成功激活,则继续执行本测试程序。

s403:通过linux系统提供的ioctl函数控制字符设备驱动申请确定大小的物理内存空间——缓冲空间。

s404:判断物理内存空间——缓冲空间申请是否成功,如果申请内存失败,则重新申请或终止本测试程序,如果申请内存成功,则继续执行本测试程序。

s405:将内核申请的缓冲空间与soc的控制器一一对应起来,这样确保应用层程序知道缓冲空间与soc控制器的各对应关系。

s406:通过linux系统提供的mmap系统调用函数将内核驱动申请的物理缓冲空间映射到linux用户空间。在linux中,一般应用层不能直接操作linux的内核空间,因此,linux通过mmap函数提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。

s407:判断mmap映射是否成功,如果不成功,则关闭字符设备程序并结束,如果成功则继续执行本测试程序。

s408:在应用层,按照soc外设控制器与映射空间的对应关系,给缓冲空间填写相应寄存器的初始化值。soc外设控制器必须被正确初始化后才能开始正常工作。

s409:在应用层的测试程序中通过ioctl系统调用,控制内核驱动将申请的buffer中的数据刷到soc外设控制器的寄存器中,此时,soc的外设控制器初始化完成。

s410:在应用层的测试程序中再通过ioctl系统调用,控制内核驱动启动soc外设控制器。

s411:在应用层测试程序中,根据具体的测试要求,动态修改映射空间中的值。

s412:内核驱动程序中,在soc外设控制器的中断服务程序中或者利用linux内核自带的timer机制,将在应用层动态修改过后的映射空间中的值重新刷到soc外设控制器的寄存器中,从而达到动态控制soc外设控制器的目的。

s413:查看相关的测试效果。

s414:在应用层测试程序中,查看是否收到测试停止信号或其他中断测试的信号,如果收到相关的停止信号,则跳出测试循环,否则,跳转到s411处循环继续执行。

s415:在应用层测试程序中,当收到相关停止信号并跳出测试循环后,调用munmap函数解除缓冲空间的映射关系。

s416:在应用层测试程序中,通过ioctl系统调用控制器内核驱动程序释放申请的内存空间。

s417:在应用层测试程序中,关闭打开的字符设备节点。

s418:测试结束。

在上述实施例中,为更进一步提高驱动测试的效率,还有以下内容需要注意。

1)为了让测试方案尽量简单,内核驱动只需要做成最简单的普通字符驱动即可。

2)在驱动程序的init函数中注册字符设备节点,方便应用程序打开该设备节点来调用驱动中的相关操作。在驱动程序的init函数中还需要注册外设控制器的中断服务程序或注册一个timer。

3)在驱动程序的init函数中还必须注册文件操作函数集(fops)。

4)在文件操作函数集中,需要完成open、ioctl、mmap、munmap、release系统调用对应的内核驱动实现函数。

5)在ioctl系统调用的内核驱动实现函数中处理应用层用到的几个不同的操作:申请物理内存缓冲空间、释放物理内存缓冲空间、初始化外设控制器、启动外设控制器。

6)在mmap系统调用的内核驱动实现函数中映射申请的缓冲空间,在munmap系统调用的内核驱动实现函数中解除映射。

7)在驱动中可在外设控制器的中断服务程序中将申请的缓冲空间中的值刷到外设控制器中,也可利用linux内核的timer机制定时循环将申请的缓冲空间中的值刷到外设控制器中。具体用哪种方法,需根据具体的外设控制器特点来选择。

如图5所示,一种驱动测试装置,用于对linux系统应用层操作soc外设控制器进行驱动测试,包括:

启动模块100,用于激活驱动设备节点;

空间申请模块200,用于在linux系统内核中申请物理内存空间,记录为缓冲空间;

映射模块300,用于将缓冲空间映射到用户空间,记录为映射空间;

第一赋值模块400,用于对映射空间赋soc外设控制器初始化值;

第二赋值模块500,用于将映射空间中的值刷到soc外设控制器中;

驱动测试模块600,用于启动soc外设控制器,根据预设测试要求,循环动态修改映射空间中的数据,查看驱动测试结果。

本发明驱动测试装置,用于对linux系统应用层操作soc外设控制器进行驱动测试,启动模块100激活驱动设备节点,空间申请模块200在linux系统内核中申请物理内存空间,记录为缓冲空间,映射模块300将缓冲空间映射到用户空间,记录为映射空间,第一赋值模块400赋值soc外设控制器初始化值,第二赋值模块500将已赋的数值刷到soc外设控制器中,驱动测试模块600启动soc外设控制器,循环动态修改映射空间中的数据,查看驱动测试结果。整个过程中,直接通过内存映射方式传递数据,数据传递效率较高,特别是周期性的传递大量寄存器数据时,能够高效的用于对linux系统应用层操作soc外设控制器进行驱动测试

在其中一个实施例中,启动模块100用于激活linux系统中字符设备驱动程序,以激活字符设备。

在其中一个实施例中,第二赋值模块500用于在soc外设控制器的中断服务程序中,或者通过linux系统内核自带的timer机制,将映射空间中的值刷到soc外设控制器中。

如图6所示,在其中一个实施例中,本发明驱动测试装置还包括:

解除模块700,用于当接收到停止测试信号时,解除缓冲空间与用户空间的映射关系。

在其中一个实施例中,本发明驱动测试装置还包括:

对应关系构建模块,用于构建缓冲空间与soc外设控制器一一对应关系;

映射模块300具体用于通过linux系统中内置mmap函数将缓冲空间映射到linux系统的用户空间,并根据缓冲空间与soc外设控制器一一对应关系,构建soc外设控制器与映射空间的对应关系;

第一赋值模块400具体用于根据soc外设控制器与映射空间的对应关系,在用户空间中填写相应soc外设控制器的初始化值。

另,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上述方法的步骤。其中,驱动测试方法直接通过内存映射方式传递数据,数据传递效率较高,特别是周期性的传递大量寄存器数据时,能够高效的用于对linux系统应用层操作soc外设控制器进行驱动测试。

另,本发明还提供一种计算机设备,包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,处理器执行程序时实现如上述方法的步骤。其中,驱动测试方法直接通过内存映射方式传递数据,数据传递效率较高,特别是周期性的传递大量寄存器数据时,能够高效的用于对linux系统应用层操作soc外设控制器进行驱动测试。

以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1