CN111857839A - 一种基于Linux的PXI/PXIe总线设备驱动系统 - Google Patents
一种基于Linux的PXI/PXIe总线设备驱动系统 Download PDFInfo
- Publication number
- CN111857839A CN111857839A CN202010504652.4A CN202010504652A CN111857839A CN 111857839 A CN111857839 A CN 111857839A CN 202010504652 A CN202010504652 A CN 202010504652A CN 111857839 A CN111857839 A CN 111857839A
- Authority
- CN
- China
- Prior art keywords
- pxi
- subunit
- register
- pxie bus
- block
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/4401—Bootstrapping
- G06F9/4411—Configuring for operating with peripheral devices; Loading of device drivers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/10—Program control for peripheral devices
- G06F13/102—Program control for peripheral devices where the programme performs an interfacing function, e.g. device driver
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02P—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN THE PRODUCTION OR PROCESSING OF GOODS
- Y02P90/00—Enabling technologies with a potential contribution to greenhouse gas [GHG] emissions mitigation
- Y02P90/02—Total factory control, e.g. smart factories, flexible manufacturing systems [FMS] or integrated manufacturing systems [IMS]
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Exchange Systems With Centralized Control (AREA)
- Bus Control (AREA)
Abstract
本发明提供一种基于Linux的PXI/PXIe总线设备驱动系统,事先搭建好资源管理服务模块和内核驱动模块,在驱动新的PXI/PXIe总线设备时,只需要为不同PXI/PXIe总线设备写一个配置文件,再将新的配置文件加入资源管理服务模块,该新的PXI/PXIe总线设备接入Linux系统时,资源管理服务模块即可自动加载相应的内核驱动模块,也即成功加载PXI/PXIe总线设备的底层驱动,实现PXI/PXIe总线设备各种功能的通用接口,使开发人员只需要关注PXI/PXIe总线设备应用程序本身的逻辑关系,专注于用户空间驱动程序的开发,无需再关注硬件的具体操作,从而减少开发虚拟仪器驱动的工作量,简化PXI/PXIe总线设备的开发流程。
Description
技术领域
本发明属于测试设备技术领域,尤其涉及一种基于Linux的PXI/PXIe总线设备驱动系统。
背景技术
PXI/PXIe总线设备大部分都是作为虚拟仪器使用,每种不同的仪器设备都需要相应的设备驱动。在Linux系统中基于PCI总线的做法是根据总线设备的具体情况开发内核模块以及用户空间的应用程序。内核驱动模块运行于内核空间,用于初始化、操作寄存器、处理中断等一些直接操作硬件的工作。为了把PXI/PXIe总线设备作为虚拟仪器使用还需要开发用户空间的应用程序来实现相应的功能。在做仪器应用程序开发时也要关注内核,对于不同的PXI/PXIe总线设备都要修改编译内核模块,需要进行很多重复性工作。
发明内容
为解决上述问题,本发明提供一种基于Linux的PXI/PXIe总线设备驱动系统,能够减少开发虚拟仪器驱动的工作量,简化PXI/PXIe总线设备的开发流程。
一种基于Linux的PXI/PXIe总线设备驱动系统,包括资源管理服务模块与内核驱动模块,其中,所述内核驱动模块包括初始化子单元、探测子单元、输入输出子单元、块读子单元、块写子单元以及中断服务子单元;
所述资源管理服务模块用于存储待驱动的PXI/PXIe总线设备的配置文件,其中,所述配置文件包括厂家代码、仪器代码、中断标志寄存器、偏移地址、掩码以及回读数值;资源管理服务模块还用于根据Linux系统的system()函数来调用insmod命令加载所述初始化子单元;
所述初始化子单元用于被加载后,通过Linux系统内核中传递参数的宏module_param_array来获取资源管理服务模块中存储的配置文件,然后将其中的厂家代码和仪器代码存储于Linux系统中;
Linux系统探测当前接入的PXI/PXIe总线设备的配置文件与其自身存储的厂家代码和仪器代码是否匹配,若匹配成功,所述探测子单元用于将匹配成功的PXI/PXIe总线设备存储空间中所有bar寄存器的物理基地址分别映射为Linux系统内存的虚拟地址;同时,若匹配成功的PXI/PXIe总线设备的配置文件中包含有效的中断标志寄存器,则探测子单元还用于根据该PXI/PXIe总线设备存储空间中的中断号向Linux系统注册中断,使得发生该中断号的中断时,Linux系统可自动调用所述中断服务子单元;
用户空间程序调用匹配成功的PXI/PXIe总线设备时,使用Linux系统的ioctl函数将设定的CMD命令码传给输入输出子单元,其中,CMD命令码包括普通读写指令、块读指令以及块写指令;当CMD命令码为普通读写指令时,所述输入输出子单元从CMD命令码中解析出bar寄存器的物理基地址和寄存器地址偏移量,Linux系统获取该bar寄存器的物理基地址对应的虚拟地址与寄存器地址偏移量的和值,再确定该和值所在的虚拟地址对应的bar寄存器地址,然后用户空间程序从所述bar寄存器地址中读取或写入指定位数的数据;当CMD命令码为块读指令时,所述输入输出子单元用于从CMD命令码中解析并存储块读bar寄存器的物理基地址、寄存器地址偏移量以及读取方法,其中,所述读取方法包括读取一段寄存器或者循环读取同一个寄存器的同一位置;当CMD命令码为块写指令时,所述输入输出子单元用于从CMD命令码中解析并存储块写bar寄存器的物理基地址、寄存器地址偏移量以及写入方法,其中,所述写入方法包括写入一段寄存器或者循环写入同一个寄存器的同一位置;
当CMD命令码为块读指令时,用户空间程序使用Linux系统的read函数调用所述块读子单元,并将待读取的设定长度和设定内容传给所述块读子单元;所述块读子单元用于根据输入输出子单元中存储的块读bar寄存器的物理基地址与寄存器地址偏移量的和值确定块读地址,然后按照读取方法在匹配成功的PXI/PXIe总线设备的块读地址中读取设定长度的设定内容;
当CMD命令码为块写指令时,用户空间程序使用Linux系统的write函数调用所述块写子单元,并将待写入的设定长度传给所述块写子单元;所述块写子单元用于根据输入输出子单元中存储的块写bar寄存器的物理基地址与寄存器地址偏移量的和值确定块写地址,然后按照写入方法在匹配成功的PXI/PXIe总线设备的块写地址中写入设定长度的数据;
当发生已注册的中断号的中断时,Linux系统自动调用所述中断服务子单元;所述中断服务子单元用于判断当前中断号对应的中断标志寄存器、偏移地址、掩码以及回读数值与当前匹配成功的PXI/PXIe总线设备的配置文件是否匹配,若匹配,则Linux系统向用户空间程序发送SIGIO信号,通知用户空间程序发生中断。
进一步地,当CMD命令码为普通读指令PXIIn8时,用户空间程序从所述bar寄存器地址中读取8位数据。
进一步地,当CMD命令码为普通写指令PXIOut8时,用户空间程序从所述bar寄存器地址中写入8位数据。
进一步地,所述初始化子单元还用于为待驱动的PXI/PXIe总线设备向Linux系统申请主设备号和次设备号,其中,不同种类的PXI/PXIe总线设备的主设备号不同,同一种类的多个PXI/PXIe总线设备的次设备号不同。
有益效果:
本发明提供一种基于Linux的PXI/PXIe总线设备驱动系统,事先搭建好资源管理服务模块和内核驱动模块,在驱动新的PXI/PXIe总线设备时,只需要为不同PXI/PXIe总线设备写一个配置文件,再将新的配置文件加入资源管理服务模块,该新的PXI/PXIe总线设备接入Linux系统时,资源管理服务模块即可自动加载相应的内核驱动模块,也即成功加载PXI/PXIe总线设备的底层驱动,实现PXI/PXIe总线设备各种功能的通用接口,使开发人员只需要关注PXI/PXIe总线设备应用程序本身的逻辑关系,专注于用户空间驱动程序的开发,无需再关注硬件的具体操作,从而减少开发虚拟仪器驱动的工作量,简化PXI/PXIe总线设备的开发流程。
附图说明
图1为本发明提供的一种基于Linux的PXI/PXIe总线设备驱动系统的框图;
图2为本发明提供的资源管理服务模块加载内核驱动模块的流程图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。
如图1所示,一种基于Linux的PXI/PXIe总线设备驱动系统,用户空间程序可以通过PXI/PXIe总线设备驱动系统调用所述PXI/PXIe总线设备,所述PXI/PXIe总线设备驱动系统包括资源管理服务模块与内核驱动模块,其中,所述内核驱动模块包括初始化子单元、探测子单元、输入输出子单元、块读子单元、块写子单元以及中断服务子单元。需要说明的是,资源管理服务模块与内核驱动模块都基于Linux系统,用C语言编写,其中,资源管理服务模块为用户空间可执行文件,内核驱动模块为.ko内核模块。
所述资源管理服务模块用于存储待驱动的PXI/PXIe总线设备的配置文件,其中,所述配置文件包括厂家代码、仪器代码、中断标志寄存器、偏移地址、掩码以及回读数值;资源管理服务模块还用于根据Linux系统的system()函数来调用insmod命令加载所述初始化子单元。
需要说明的是,配置文件为按固定格式存储厂家代码、仪器代码、中断标志寄存器、偏移地址、掩码以及回读数值的文本文档。为了方便读取,一行对应一种PXI/PXIe总线设备,以逗号分隔仪器配置信息,例如“0xfead,0x1234,Interrupt Detect0=BAR00x00000010 0x00000001 0x00000001,Interrupt Quiesce=BAR0 0x000000100x00000000”,从中可以依次解析出厂家代码为0xfead,仪器代码为0x1234,中断标志寄存器、偏移地址、掩码、回读数值依次为BAR0、0x00000010、0x00000001、0x00000001,中断清除寄存器、偏移地址、写入值依次为BAR0、0x00000010、0x00000000。
资源管理服务模块用system()函数调用insmod命令加载内核驱动模块并向内核驱动模块输入配置文件;从配置文件中读取的内容可作为内核驱动模块的参数,并在加载内核驱动模块时输入,交互过程具体如下:
所述初始化子单元用于通过Linux系统内核中传递参数的宏module_param_array来获取资源管理服务模块中存储的配置文件,然后将其中的厂家代码和仪器代码存储于Linux系统中。
进一步地,所述初始化子单元还用于为待驱动的PXI/PXIe总线设备向Linux系统创建一个设备类,并申请主设备号和次设备号,其中,不同种类的PXI/PXIe总线设备的主设备号不同,同一种类的多个PXI/PXIe总线设备的次设备号不同;有了设备类和设备号,便于Linux系统对待驱动的PXI/PXIe总线设备进行管理;此外,初始化子单元利用Linux系统加载该内核驱动模块时传入的厂家代码(vid)、仪器代码(pid)向Linux系统注册该内核驱动模块,使Linux系统在探测到与厂家代码和仪器代码匹配的PXI/PXIe总线设备时可以调用此内核驱动模块。
Linux系统探测当前接入的PXI/PXIe总线设备的配置文件与其自身存储的厂家代码和仪器代码是否匹配,若匹配成功,所述探测子单元用于将匹配成功的PXI/PXIe总线设备存储空间中所有bar寄存器的物理基地址分别映射为Linux系统内存的虚拟地址;同时,若匹配成功的PXI/PXIe总线设备的配置文件中包含有效的中断标志寄存器,则探测子单元还用于根据该PXI/PXIe总线设备存储空间中的中断号向Linux系统注册中断,使得发生该中断号的中断时,Linux系统可自动调用所述中断服务子单元。
也就是说,在Linux系统探测到与该内核驱动模块相匹配(厂家代码、仪器代码与当前接入的PXI/PXIe总线设备的配置文件相同)的PXI/PXIe总线设备时,Linux系统会自动调用探测子单元。探测子单元将启用探测到的PXI/PXIe总线设备,在PXI总线设备的配置空间中读取6个bar寄存器bar0~5的物理基地址,并将寄存器的物理基地址映射为Linux系统内存的虚拟地址,并将该虚拟地址保存,在后续的对bar寄存器操作中使用;如果用配置文件传入的PXI/PXIe总线设备参数中有中断相关的参数则为设备注册中断,从PXI/PXIe总线设备的配置空间中读取设备的硬件中断号,用中断号向Linux系统注册中断,使发生该硬件中断号的中断时,Linux系统可自动调用内核驱动模块的中断服务子单元。
可选的,探测子单元还为该PXI/PXIe总线设备向Linux系统内核注册设备节点,设备节点中包含的主设备号即为在初始化子单元中申请的主设备号,次设备号从0开始,每增加一个同类的PXI/PXIe总线设备,次设备号加1;同时,在Linux系统的/dev文件夹下为该匹配成的PXI/PXIe总线设备创建一个设备文件,其中,设备文件对应设备节点本身,表征的是该PXI/PXIe总线设备的属性信息,属性信息包括主设备号、次设备号等,在为该PXI/PXIe总线设备开发用户空间程序时,可直接通过此设备文件与内核驱动模块交互。
用户空间程序调用匹配成功的PXI/PXIe总线设备时,使用Linux系统的ioctl函数将设定的CMD命令码传给输入输出子单元,其中,CMD命令码包括普通读写指令、块读指令以及块写指令;当CMD命令码为普通读写指令时,所述输入输出子单元从CMD命令码中解析出bar寄存器的物理基地址和寄存器地址偏移量,Linux系统获取该bar寄存器的物理基地址对应的虚拟地址与寄存器地址偏移量的和值,再确定该和值所在的虚拟地址对应的bar寄存器地址,然后用户空间程序从所述bar寄存器地址中读取或写入指定位数的数据;当CMD命令码为块读指令时,所述输入输出子单元用于从CMD命令码中解析并存储块读bar寄存器的物理基地址、寄存器地址偏移量以及读取方法,其中,所述读取方法包括读取一段寄存器或者循环读取同一个寄存器的同一位置;当CMD命令码为块写指令时,所述输入输出子单元用于从CMD命令码中解析并存储块写bar寄存器的物理基地址、寄存器地址偏移量以及写入方法,其中,所述写入方法包括写入一段寄存器或者循环写入同一个寄存器的同一位置。
需要说明的是,不同类别的CMD命令码的功能如表1所示:
表1
PXIIn8 | 从bar寄存器读取8位数据 |
PXIIn16 | 从bar寄存器读取16位数据 |
PXIIn32 | 从bar寄存器读取32位数据 |
PXIOut8 | 向bar寄存器写入8位数据 |
PXIOut16 | 向bar寄存器写入16位数据 |
PXIOut32 | 向bar寄存器写入32位数据 |
PXImoveIn | 配置块读寄存器地址 |
PXImoveOut | 配置块写寄存器地址 |
其中,PXIIn8、PXIIn16以及PXIIn32为普通读指令;PXIIn8的功能为:传入要读取的bar基地址(bar0~5)和寄存器地址偏移量,直接在探测子单元中为bar基地址映射的虚拟地址与该寄存器地址偏移量相加得到的Linux系统内存位置对应的bar寄存器读取8位数据,就可以获得要读取的PXI/PXIe总线设备bar寄存器值,读取完成后将该值传给用户空间程序;PXIIn16、PXIIn32与PXIIn8流程相同,只需改为读取16位数据和32位数据。
其中,PXIOut8、PXIOut16以及PXIOut32为普通写指令;PXIOut8的功能为:传入要写入的bar基地址(bar0~5)和寄存器地址偏移量以及要写入的数据,直接在探测子单元中为bar基地址映射的虚拟地址与该寄存器地址偏移量相加得到的Linux系统内存位置对应的bar寄存器写入传入的8位数据,就可以将该数据写入到的PXI/PXIe总线设备bar寄存器值;PXIOut16、PXIOut32与PXIOut8流程相同,只需改为写入16位数据和32位数据。
PXImoveIn为块读指令,功能为传入要进行被块读的bar基地址(bar0~5)和寄存器偏移量以及读取方法(读取一大段寄存器或者循环读同一个寄存器同一位置),将该信息保存以便在块读子单元中使用。
PXImoveOut为块写指令,功能为传入要进行被块写的bar基地址(bar0~5)和寄存器偏移量以及读取方法(读取一大段寄存器或者循环读同一个寄存器同一位置),将该信息保存以便在块写子单元中使用。
当CMD命令码为块读指令时,用户空间程序使用Linux系统的read函数调用所述块读子单元,并将待读取的设定长度传给所述块读子单元;所述块读子单元用于根据输入输出子单元中存储的块读bar寄存器的物理基地址与寄存器地址偏移量的和值确定块读地址,然后按照读取方法在匹配成功的PXI/PXIe总线设备的块读地址中读取设定长度的数据。
也就是说,块读子单元用于实现块读功能,用户空间程序调用Linux系统的read函数对PXI/PXIe总线设备进行块读时Linux系统会调用块读子单元,该函数会给块读子单元发送要读取数据的长度;具体的,块读子单元根据传入的读取长度开辟一片内存用来存放数据,然后根据输入输出子单元传入的块读bar寄存器的物理基地址(bar0~5)、寄存器偏移地址以及读取方法对PXI/PXIe总线设备的寄存器进行读取,最后将读取到的数据传给用户空间程序。
当CMD命令码为块写指令时,用户空间程序使用Linux系统的write函数调用所述块写子单元,并将待写入的设定长度和设定内容传给所述块写子单元;所述块写子单元用于根据输入输出子单元中存储的块写bar寄存器的物理基地址与寄存器地址偏移量的和值确定块写地址,然后按照写入方法在匹配成功的PXI/PXIe总线设备的块写地址中写入设定长度的设定内容。
也就是说,块写子单元用于实现块写功能,用户空间程序调用Linux系统的write函数对PXI/PXIe模块进行块写时Linux系统会调用块写子单元,该函数会向块写子单元发送要写入数据的长度和要写入的数据;具体的,块写子单元根据传入的写入长度开辟一片内存用来存放要写入的数据,然后根据输入输出子单元传入的块写bar寄存器的物理基地址(bar0~5)和寄存器偏移地址以及写入方法对PXI/PXIe总线设备的寄存器进行写入。
当发生已注册的中断号的中断时,Linux系统自动调用所述中断服务子单元;所述中断服务子单元用于判断当前中断号对应的中断标志寄存器、偏移地址、掩码以及回读数值与当前匹配成功的PXI/PXIe总线设备的配置文件是否匹配,若匹配,则Linux系统向用户空间程序发送SIGIO信号,通知用户空间程序发生中断。
也就是说,在Linux系统收到注册的PXI总线设备发生的中断后会自动调用中断服务子单元;首先根据配置文件传入的中断标志寄存器(bar0~5)、偏移地址、掩码、回读数值来判断是否为该PXI/PXIe总线设备发出的中断,正确则继续,否则返回;然后向用户空间程序发送Linux系统的SIGIO信号,通知用户空间程序发生中断;最后使用配置文件传入的中断清除寄存器(bar0~5)、偏移地址、写入值清除PXI/PXIe总线设备的中断标志,使PXI/PXIe总线设备硬件可以继续下一次中断。
此外,编写的用户空间应用程序的基本流程如下:
1.使用Linux系统打开函数open打开/dev目录下PXI/PXIe总线设备文件节点,并获得控制句柄;
2.通过控制句柄对PXI/PXIe总线设备进行操作,如调用ioctl函数向内核驱动模块传入命令码PXIIn8和相关参数从寄存器读取数据;先调用ioctl函数向内核驱动模块传入命令码PXImoveOut和相关参数配置将要进行的块写任务参数,然后调用write向PXI/PXIe总线设备写入一段数据;
3.调用Linux关闭函数close释放资源。
由此可见,在Linux系统中设置本发明相关文件资源管理服务模块(pxiserver)、内核驱动模块(PXI.ko)。用某种PXI/PXIe总线设备的配置文件启动资源管理服务模块,就会自动为PXI/PXIe总线设备在Linux系统注册,并在/dev目录下创建设备节点;通过调用用户空间接口库中的函数就可以对设备进行操作;也就是说,如图2所示,先在PXI/PXIe总设备的配置文件中按照指定格式定义好厂家代码、仪器代码、中断寄存器地址等信息,然后启动资源管理服务模块,资源管理服务模块会自动加载内核驱动模块并传入参数,用户空间程序只需调用Linux系统函数使用不同参数,如CMD指令码就可以操作PXI/PXIe设备,无需再关注具体的硬件操作。
需要说明的是,由于对PXI/PXIe总线设备进行操作就要开发相应的内核模块以及用户空间应用程序,而大部分基于PXI/PXIe总线虚拟仪器设备在内核空间的操作都是相似的,只是根据不同设备有不同的参数,如各种资源的初始化、寄存器读写、中断处理等。本发明可以使减少开发虚拟仪器驱动的工作量,只需要为不同PXI/PXIe总线设备写一个配置文件(如厂家代码、仪器代码、中断标志寄存器地址等)就可以自动加载相应的内核驱动模块,实现PXI/PXIe总线设备各种功能的通用接口,使开发人员只需要关注仪器应用程序本身的逻辑关系,无需再关注硬件的具体操作;同时,如果要对硬件驱动更改,不用修改所有PXI/PXIe总线设备的相关代码,只需升级通用的内核驱动模块。
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当然可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
Claims (4)
1.一种基于Linux的PXI/PXIe总线设备驱动系统,其特征在于,包括资源管理服务模块与内核驱动模块,其中,所述内核驱动模块包括初始化子单元、探测子单元、输入输出子单元、块读子单元、块写子单元以及中断服务子单元;
所述资源管理服务模块用于存储待驱动的PXI/PXIe总线设备的配置文件,其中,所述配置文件包括厂家代码、仪器代码、中断标志寄存器、偏移地址、掩码以及回读数值;资源管理服务模块还用于根据Linux系统的system()函数来调用insmod命令加载所述初始化子单元;
所述初始化子单元用于被加载后,通过Linux系统内核中传递参数的宏module_param_array来获取资源管理服务模块中存储的配置文件,然后将其中的厂家代码和仪器代码存储于Linux系统中;
Linux系统探测当前接入的PXI/PXIe总线设备的配置文件与其自身存储的厂家代码和仪器代码是否匹配,若匹配成功,所述探测子单元用于将匹配成功的PXI/PXIe总线设备存储空间中所有bar寄存器的物理基地址分别映射为Linux系统内存的虚拟地址;同时,若匹配成功的PXI/PXIe总线设备的配置文件中包含有效的中断标志寄存器,则探测子单元还用于根据该PXI/PXIe总线设备存储空间中的中断号向Linux系统注册中断,使得发生该中断号的中断时,Linux系统可自动调用所述中断服务子单元;
用户空间程序调用匹配成功的PXI/PXIe总线设备时,使用Linux系统的ioctl函数将设定的CMD命令码传给输入输出子单元,其中,CMD命令码包括普通读写指令、块读指令以及块写指令;当CMD命令码为普通读写指令时,所述输入输出子单元从CMD命令码中解析出bar寄存器的物理基地址和寄存器地址偏移量,Linux系统获取该bar寄存器的物理基地址对应的虚拟地址与寄存器地址偏移量的和值,再确定该和值所在的虚拟地址对应的bar寄存器地址,然后用户空间程序从所述bar寄存器地址中读取或写入指定位数的数据;当CMD命令码为块读指令时,所述输入输出子单元用于从CMD命令码中解析并存储块读bar寄存器的物理基地址、寄存器地址偏移量以及读取方法,其中,所述读取方法包括读取一段寄存器或者循环读取同一个寄存器的同一位置;当CMD命令码为块写指令时,所述输入输出子单元用于从CMD命令码中解析并存储块写bar寄存器的物理基地址、寄存器地址偏移量以及写入方法,其中,所述写入方法包括写入一段寄存器或者循环写入同一个寄存器的同一位置;
当CMD命令码为块读指令时,用户空间程序使用Linux系统的read函数调用所述块读子单元,并将待读取的设定长度和设定内容传给所述块读子单元;所述块读子单元用于根据输入输出子单元中存储的块读bar寄存器的物理基地址与寄存器地址偏移量的和值确定块读地址,然后按照读取方法在匹配成功的PXI/PXIe总线设备的块读地址中读取设定长度的设定内容;
当CMD命令码为块写指令时,用户空间程序使用Linux系统的write函数调用所述块写子单元,并将待写入的设定长度传给所述块写子单元;所述块写子单元用于根据输入输出子单元中存储的块写bar寄存器的物理基地址与寄存器地址偏移量的和值确定块写地址,然后按照写入方法在匹配成功的PXI/PXIe总线设备的块写地址中写入设定长度的数据;
当发生已注册的中断号的中断时,Linux系统自动调用所述中断服务子单元;所述中断服务子单元用于判断当前中断号对应的中断标志寄存器、偏移地址、掩码以及回读数值与当前匹配成功的PXI/PXIe总线设备的配置文件是否匹配,若匹配,则Linux系统向用户空间程序发送SIGIO信号,通知用户空间程序发生中断。
2.如权利要求1所述的一种基于Linux的PXI/PXIe总线设备驱动系统,其特征在于,当CMD命令码为普通读指令PXIIn8时,用户空间程序从所述bar寄存器地址中读取8位数据。
3.如权利要求1所述的一种基于Linux的PXI/PXIe总线设备驱动系统,其特征在于,当CMD命令码为普通写指令PXIOut8时,用户空间程序从所述bar寄存器地址中写入8位数据。
4.如权利要求1所述的一种基于Linux的PXI/PXIe总线设备驱动系统,其特征在于,所述初始化子单元还用于为待驱动的PXI/PXIe总线设备向Linux系统申请主设备号和次设备号,其中,不同种类的PXI/PXIe总线设备的主设备号不同,同一种类的多个PXI/PXIe总线设备的次设备号不同。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010504652.4A CN111857839B (zh) | 2020-06-05 | 2020-06-05 | 一种基于Linux的PXI/PXIe总线设备驱动系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010504652.4A CN111857839B (zh) | 2020-06-05 | 2020-06-05 | 一种基于Linux的PXI/PXIe总线设备驱动系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111857839A true CN111857839A (zh) | 2020-10-30 |
CN111857839B CN111857839B (zh) | 2023-06-27 |
Family
ID=72985010
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010504652.4A Active CN111857839B (zh) | 2020-06-05 | 2020-06-05 | 一种基于Linux的PXI/PXIe总线设备驱动系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111857839B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112463662A (zh) * | 2020-12-16 | 2021-03-09 | 福州创实讯联信息技术有限公司 | 一种用户态控制i2c设备的方法与终端 |
CN113360431A (zh) * | 2021-06-21 | 2021-09-07 | 南京中消安全技术有限公司 | 一种在Linux操作系统用户空间下控制GPIO端口的方法和设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103678238A (zh) * | 2013-12-30 | 2014-03-26 | 北京航天测控技术有限公司 | 一种LXI-PXI\PXIe适配系统 |
US20140372741A1 (en) * | 2013-06-14 | 2014-12-18 | National Instruments Corporation | Opaque Bridge for Peripheral Component Interconnect Express Bus Systems |
CN104316091A (zh) * | 2014-10-27 | 2015-01-28 | 国家电网公司 | 一种模块化的分布式光纤传感装置 |
CN109084835A (zh) * | 2018-07-13 | 2018-12-25 | 中国科学院合肥物质科学研究院 | 一种基于PXIe测试平台的电机检测与远程监控系统 |
CN110362512A (zh) * | 2019-07-18 | 2019-10-22 | 成都谐盈科技有限公司 | 一种面向sca和sdr的快速系统重构方法 |
-
2020
- 2020-06-05 CN CN202010504652.4A patent/CN111857839B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140372741A1 (en) * | 2013-06-14 | 2014-12-18 | National Instruments Corporation | Opaque Bridge for Peripheral Component Interconnect Express Bus Systems |
CN103678238A (zh) * | 2013-12-30 | 2014-03-26 | 北京航天测控技术有限公司 | 一种LXI-PXI\PXIe适配系统 |
CN104316091A (zh) * | 2014-10-27 | 2015-01-28 | 国家电网公司 | 一种模块化的分布式光纤传感装置 |
CN109084835A (zh) * | 2018-07-13 | 2018-12-25 | 中国科学院合肥物质科学研究院 | 一种基于PXIe测试平台的电机检测与远程监控系统 |
CN110362512A (zh) * | 2019-07-18 | 2019-10-22 | 成都谐盈科技有限公司 | 一种面向sca和sdr的快速系统重构方法 |
Non-Patent Citations (1)
Title |
---|
杜影 等: "基于龙芯平台的PXI设备驱动设计" * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112463662A (zh) * | 2020-12-16 | 2021-03-09 | 福州创实讯联信息技术有限公司 | 一种用户态控制i2c设备的方法与终端 |
CN112463662B (zh) * | 2020-12-16 | 2024-04-05 | 福州创实讯联信息技术有限公司 | 一种用户态控制i2c设备的方法与终端 |
CN113360431A (zh) * | 2021-06-21 | 2021-09-07 | 南京中消安全技术有限公司 | 一种在Linux操作系统用户空间下控制GPIO端口的方法和设备 |
Also Published As
Publication number | Publication date |
---|---|
CN111857839B (zh) | 2023-06-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20190278717A1 (en) | Graphics processing microprocessor system having master and slave devices | |
US5394544A (en) | Software system debugger with distinct interrupt vector maps for debugging and application programs | |
EP0752646B1 (en) | Data access implementation of device driver interface | |
US7707341B1 (en) | Virtualizing an interrupt controller | |
US5630049A (en) | Method and apparatus for testing software on a computer network | |
US6185677B1 (en) | Automatic generation of ACPI source language for peripheral resource configuration | |
US7904878B2 (en) | Simplifying generation of device drivers for different user systems to facilitate communication with a hardware device | |
KR100341180B1 (ko) | 가상어드레싱버퍼회로,및어드레스번역방법,시스템bios의셰도잉방법,실제메모리최적화방법,실제메모리이용방법,cpu제어시스템에서의에뮬레이팅방법및cpu요청리디렉트방법 | |
US6272618B1 (en) | System and method for handling interrupts in a multi-processor computer | |
US7558724B2 (en) | Operation region describing a virtual device | |
US20030126587A1 (en) | Controlling compatibility levels of binary translations between instruction set architectures | |
US20230124004A1 (en) | Method for handling exception or interrupt in heterogeneous instruction set architecture and apparatus | |
KR100285956B1 (ko) | 고속직렬버스에연결된동기식및비동기식장치의제어시스템과제어방법 | |
CN111857839A (zh) | 一种基于Linux的PXI/PXIe总线设备驱动系统 | |
US20040167996A1 (en) | Computer system having a virtualized I/O device | |
CN112015522B (zh) | 系统功能扩展方法、装置及计算机可读存储介质 | |
US6871173B1 (en) | Method and apparatus for handling masked exceptions in an instruction interpreter | |
JP4157771B2 (ja) | 組込み制御環境におけるリモート入出力機能への効率的なアクセスのための方法およびシステム | |
EP1347373A2 (en) | Apparatus for processing instructions of different instruction set architectures | |
JPH1078889A (ja) | マイクロコンピュータ | |
KR900004291B1 (ko) | 데이터 프로세서 | |
CN111615691A (zh) | 直接存储器访问适配器 | |
US8078853B1 (en) | Explicit control of speculation | |
US6907521B2 (en) | Enabling video BIOS and display drivers to leverage system BIOS platform abstract | |
EP0290942A2 (en) | Guest machine execution control system for virtual machine system |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |