CN112631975B - 基于Linux的SPI传输方法 - Google Patents
基于Linux的SPI传输方法 Download PDFInfo
- Publication number
- CN112631975B CN112631975B CN202011426026.4A CN202011426026A CN112631975B CN 112631975 B CN112631975 B CN 112631975B CN 202011426026 A CN202011426026 A CN 202011426026A CN 112631975 B CN112631975 B CN 112631975B
- Authority
- CN
- China
- Prior art keywords
- spi
- transmission
- linux
- data
- transmitted
- 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.)
- Active
Links
- 230000005540 biological transmission Effects 0.000 title claims abstract description 63
- 238000000034 method Methods 0.000 title claims abstract description 30
- 230000006870 function Effects 0.000 claims abstract description 12
- 230000000977 initiatory effect Effects 0.000 claims abstract description 8
- 230000002093 peripheral effect Effects 0.000 claims abstract description 4
- 230000009286 beneficial effect Effects 0.000 abstract description 2
- 238000010586 diagram Methods 0.000 description 9
- 230000006872 improvement Effects 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000004590 computer program Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Classifications
-
- 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/38—Information transfer, e.g. on bus
- G06F13/42—Bus transfer protocol, e.g. handshake; Synchronisation
- G06F13/4282—Bus transfer protocol, e.g. handshake; Synchronisation on a serial bus, e.g. I2C bus, SPI bus
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Communication Control (AREA)
Abstract
本发明公开了基于Linux的SPI传输方法,该方法包括以下步骤:调用spi_async函数,发起SPI异步传输;获取待传输的数据,并创建spi_transfer结构体;内核直接执行所述SPI异步传输;若所述数据大于预定字节,通过发起DMA中断请求,通过DMA传输方式将所述待传输的数据从内存传输到外设。本发明至少具有以下有益效果:通过调整SPI传输框架,减少系统传输SPI时的等待时间,满足设备对于SPI传输有较高速率的要求。
Description
技术领域
本发明涉及计算机领域,特别涉及一种基于Linux的SPI传输方法。
背景技术
对于嵌入式Linux系统,SPI传输是在Linux工作线程里执行的,设备支持的功能越来越广泛,使得Linux负载变重,工作线程想要完成一次SPI传输,等待的任务执行的时间也就越长。当设备对SPI传输速率有较高要求时,系统传输耗时势必不能达到要求。
其中一个解决方案是从硬件层面增加传输速率,使用了寄存器模块、总线主机接口、系统请求模块、请求仲裁模块、SPI控制模块和至少一个专用请求接口,以提高SPI速率。目前行业内的通常的做法是减轻系统负荷,提高SPI时钟工作频率。但是Linux负载由使用的方案决定,减轻负载势必要对Linux功能进行剪裁,影响用户体验。系统的SPI时钟速率有限,不可能无限提高,而且盲目提高时钟系统对系统稳定性会有灾难性的影响。
发明内容
本发明旨在至少解决现有技术中存在的技术问题之一。为此,本发明提出一种基于Linux的SPI传输方法,能够减少SPI系统等待时间,完成一次数据传输。
根据本发明的第一方面实施例的基于Linux的SPI传输方法,包括:系统发起一次SPI传输,获取待传输的数据,并创建spi_transfer结构体之后,不再将SPI数据包传输放到Linux工作线程里完成,内核直接执行所诉SPI传输。
根据本发明的一些实施例,该方法还包括:若所述数据不大于预定字节,通过CPU控制SPI传输。若所述数据大于预定字节,通过发起DMA中断请求,通过DMA传输方式将所述待传输的数据从内存传输到外设。
根据本发明的一些实施例,该方法还包括:SPI数据传输完成后,不再通过中断下半部机制唤醒SPI传输等待,将SPI唤醒工作在中断上半部完成。
根据本发明的一些实施例,所述获取待传输的数据,并创建spi_transfer结构体的方法中还包括:将从设备的modalias字段设置为spidev,匹配spidev驱动。
根据本发明的一些实施例,所述获取待传输的数据,并创建spi_transfer结构体的方法中还包括:将多个所述spi_transfer添加到message中,作为一个消息包进行传输。
根据本发明的一些实施例,所述内核直接执行所述SPI传输包括:遍历取出所述message中的所述spi_transfer结构体,根据所述spi_transfer结构体进行传输。
根据本发明的一些实施例,所述spi_transfer结构体包括:发送缓冲区地址、接收缓冲区地址以及传输数据的长度。
根据本发明的一些实施例,所述预定字节为64字节。
本发明实施例至少具有如下有益效果:本发明实施例通过调整SPI传输框架,减少系统传输SPI时的等待时间,满足设备对于SPI传输有较高速率的要求。
本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:
图1为本发明实施例的方法的流程示意图。
图2为未使用本发明实施例的方法的SPI传输流程示意图。
图3为本发明另一实施例的方法流程示意图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
在本发明的描述中,若干的含义是一个或者多个,多个的含义是两个及两个以上,大于、小于、超过等理解为不包括本数,以上、以下、以内等理解为包括本数。如果有描述到第一、第二只是用于区分技术特征为目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量或者隐含指明所指示的技术特征的先后关系。
参照图2,本发明实现在如图2所示的SPI传输和完成传输的机制。通常,SPI完成一次传输的流程如图2所示,其中,在发起SPI传输阶段会将SPI任务添加到kworker工作线程中并等待调度执行,通常任务会等待几十微秒才能得到执行,并且系统负载越重,任务等待时间就越长。特别地,对于大于64字节的数据,会将SPI唤醒操作放到中断下半部softirq(软中断)执行,其优先级比较低,需要等待几十微秒才能得到调度执行。
本发明针对上述SPI传输流程提出改进方案。当系统想要发起一次SPI传输时,不必将SPI传输放到Linux工作线程中完成,直接由内核执行,在完成SPI数据传输后,不再通过中断下半部机制唤醒SPI传输等待,将SPI唤醒工作在中断上半部完成,这样使得唤醒工作得到立即执行。
参照图1,本发明实施例的SPI传输方法包括:调用spi_async函数,发起SPI异步传输;获取待传输的数据,并创建spi_transfer结构体;内核直接执行SPI异步传输;若所述数据大于预定字节,通过发起DMA中断请求,通过DMA传输方式将待传输的数据从内存传输到外设。
进一步参照图3,本发明实施例的方法将图2中的将SPI任务添加到kworker工作线程中并等待调度执行以及将SPI唤醒操作放到中断下半部softirq(软中断)执行步骤进行裁剪。如图3所示,当系统想要发起一次SPI传输时,不必添加传输任务到kworker线程,直接便可发起一次SPI传输。传输完成时,不再将SPI唤醒添加到softirq,直接在中断上半部里唤醒,虽然会对Linux的实时性有一定影响,但仅仅执行唤醒这一工作耗时微乎其微,却可以极大的缩减SPI传输时系统等待时间,所以相较于提升的传输效率,性能损耗可以忽略不计。
在一些实施例中,该方法还包括:将从设备的modalias字段设置为spidev,匹配spidev驱动。
在一些实施例中,该方法还包括:将多个所述spi_transfer添加到message中,作为一个消息包进行传输。
在一些实施例中,该方法还包括:遍历取出所述message中的所述spi_transfer结构体,根据所述spi_transfer结构体进行传输。
在一些实施例中,所述spi_transfer结构体包括:发送缓冲区地址、接收缓冲区地址以及传输数据的长度。
尽管本文描述了具体实施方案,但是本领域中的普通技术人员将认识到,许多其它修改或另选的实施方案同样处于本公开的范围内。例如,结合特定设备或组件描述的功能和/或处理能力中的任一项可以由任何其它设备或部件来执行。另外,虽然已根据本公开的实施方案描述了各种例示性具体实施和架构,但是本领域中的普通技术人员将认识到,对本文所述的例示性具体实施和架构的许多其它修改也处于本公开的范围内。
上文参考根据示例性实施方案所述的系统、方法、系统和/或计算机程序产品的框图和流程图描述了本公开的某些方面。应当理解,框图和流程图中的一个或多个块以及框图和流程图中的块的组合可分别通过执行计算机可执行程序指令来实现。同样,根据一些实施方案,框图和流程图中的一些块可能无需按示出的顺序执行,或者可以无需全部执行。另外,超出框图和流程图中的块所示的那些部件和/或操作以外的附加部件和/或操作可存在于某些实施方案中。
因此,框图和流程图中的块支持用于执行指定功能的装置的组合、用于执行指定功能的元件或步骤的组合以及用于执行指定功能的程序指令装置。还应当理解,框图和流程图中的每个块以及框图和流程图中的块的组合可以由执行特定功能、元件或步骤的专用硬件计算机系统或者专用硬件和计算机指令的组合来实现。
本文所述的程序模块、应用程序等可包括一个或多个软件组件,包括例如软件对象、方法、数据结构等。每个此类软件组件可包括计算机可执行指令,所述计算机可执行指令响应于执行而使本文所述的功能的至少一部分(例如,本文所述的例示性方法的一种或多种操作)被执行。
软件组件可以用各种编程语言中的任一种来编码。一种例示性编程语言可以为低级编程语言,诸如与特定硬件体系结构和/或操作系统平台相关联的汇编语言。包括汇编语言指令的软件组件可能需要在由硬件架构和/或平台执行之前由汇编程序转换为可执行的机器代码。另一种示例性编程语言可以为更高级的编程语言,其可以跨多种架构移植。包括更高级编程语言的软件组件在执行之前可能需要由解释器或编译器转换为中间表示。编程语言的其它示例包括但不限于宏语言、外壳或命令语言、作业控制语言、脚本语言、数据库查询或搜索语言、或报告编写语言。在一个或多个示例性实施方案中,包含上述编程语言示例中的一者的指令的软件组件可直接由操作系统或其它软件组件执行,而无需首先转换成另一种形式。
软件组件可存储为文件或其它数据存储构造。具有相似类型或相关功能的软件组件可一起存储在诸如特定的目录、文件夹或库中。软件组件可为静态的(例如,预设的或固定的)或动态的(例如,在执行时创建或修改的)。
上面结合附图对本发明实施例作了详细说明,但是本发明不限于上述实施例,在所属技术领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下作出各种变化。
Claims (7)
1.一种基于Linux的SPI传输方法,其特征在于,包括:
调用spi_async函数,发起SPI异步传输;
获取待传输的数据,并创建spi_transfer结构体;
内核直接执行所述SPI异步传输;
若所述数据大于预定字节,通过发起DMA中断请求,通过DMA传输方式将所述待传输的数据从内存传输到外设;
若所述数据不大于预定字节,通过CPU控制SPI传输。
2.根据权利要求1所述的基于Linux的SPI传输方法,其特征在于,该方法还包括:
传输完成,在中断上半部唤醒SPI。
3.根据权利要求1所述的基于Linux的SPI传输方法,其特征在于,所述获取待传输的数据,并创建spi_transfer结构体的方法中还包括:
将从设备的modalias字段设置为spidev,匹配spidev驱动。
4.根据权利要求1所述的基于Linux的SPI传输方法,其特征在于,所述获取待传输的数据,并创建spi_transfer结构体的方法中还包括:
将多个所述spi_transfer添加到message中,作为一个消息包进行传输。
5.根据权利要求4所述的基于Linux的SPI传输方法,其特征在于,所述内核直接执行所述SPI异步传输包括:
遍历取出所述message中的所述spi_transfer结构体,根据所述spi_transfer结构体进行传输。
6.根据权利要求1所述的基于Linux的SPI传输方法,其特征在于,所述spi_transfer结构体包括:发送缓冲区地址、接收缓冲区地址以及传输数据的长度。
7.根据权利要求1所述的基于Linux的SPI传输方法,其特征在于,所述预定字节为64字节。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011426026.4A CN112631975B (zh) | 2020-12-09 | 2020-12-09 | 基于Linux的SPI传输方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011426026.4A CN112631975B (zh) | 2020-12-09 | 2020-12-09 | 基于Linux的SPI传输方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112631975A CN112631975A (zh) | 2021-04-09 |
CN112631975B true CN112631975B (zh) | 2024-06-04 |
Family
ID=75308640
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011426026.4A Active CN112631975B (zh) | 2020-12-09 | 2020-12-09 | 基于Linux的SPI传输方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112631975B (zh) |
Citations (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1564643A2 (en) * | 2004-02-11 | 2005-08-17 | Intracom S.A. Hellenic Telecommunications & Electronics Industry | Synthesizable vhdl model of a multi-channel dma-engine core for embedded bus systems |
KR20060088929A (ko) * | 2005-02-02 | 2006-08-07 | 삼성전자주식회사 | 리눅스 기반의 시스템에서 하드웨어 인터럽트 처리 장치및 방법 |
CN102156662A (zh) * | 2011-02-14 | 2011-08-17 | 大唐移动通信设备有限公司 | 一种数据处理方法和设备 |
CN102262557A (zh) * | 2010-05-25 | 2011-11-30 | 运软网络科技(上海)有限公司 | 通过总线架构构建虚拟机监控器的方法及性能服务框架 |
CN102467473A (zh) * | 2010-11-03 | 2012-05-23 | Tcl集团股份有限公司 | 一种在用户空间和内核之间传输数据的方法和装置 |
CN103064807A (zh) * | 2012-12-17 | 2013-04-24 | 福建星网锐捷网络有限公司 | 多通道直接存储器存取控制器 |
CN103685578A (zh) * | 2014-01-08 | 2014-03-26 | 珠海全志科技股份有限公司 | 主从设备的数据传输方法 |
CN106874224A (zh) * | 2017-02-17 | 2017-06-20 | 杭州朔天科技有限公司 | 自动搬运且适应器件的多线SPI‑Flash控制器 |
CN106909523A (zh) * | 2017-02-24 | 2017-06-30 | 深圳市恒扬数据股份有限公司 | 大规模数据传输方法及系统 |
CN107066395A (zh) * | 2017-02-04 | 2017-08-18 | 上海市共进通信技术有限公司 | 基于Linux系统实现外设数据高速传输与处理的方法 |
CN107992297A (zh) * | 2017-12-19 | 2018-05-04 | 郑州云海信息技术有限公司 | 一种针对s3c2440的spi控制器驱动实现方法 |
CN108121534A (zh) * | 2017-12-19 | 2018-06-05 | 郑州云海信息技术有限公司 | 一种针对W25Q16DV的SPI Flash驱动实现方法 |
CN109800202A (zh) * | 2019-01-17 | 2019-05-24 | 郑州云海信息技术有限公司 | 一种基于pcie的数据传输系统、方法及装置 |
CN109977037A (zh) * | 2017-12-28 | 2019-07-05 | 龙芯中科技术有限公司 | 一种dma数据传输方法及系统 |
CN109992352A (zh) * | 2017-12-29 | 2019-07-09 | 迈普通信技术股份有限公司 | 数据传输方法、装置、电子设备及可读取存储介质 |
CN110780809A (zh) * | 2018-07-31 | 2020-02-11 | 爱思开海力士有限公司 | 针对多个存储器系统的接合管理元数据的设备和方法 |
CN111522769A (zh) * | 2020-03-26 | 2020-08-11 | 成都天箭科技股份有限公司 | 一种多线程spi通信数据传输方法 |
CN111679923A (zh) * | 2020-06-11 | 2020-09-18 | 北京经纬恒润科技有限公司 | 实时通信方法和系统 |
CN111966300A (zh) * | 2020-08-24 | 2020-11-20 | 深圳三地一芯电子有限责任公司 | 一种节省主控sram的存储器数据写入方法及装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7430624B2 (en) * | 2005-10-04 | 2008-09-30 | International Business Machines Corporation | High speed on-chip serial link apparatus and method |
US10789180B2 (en) * | 2016-09-29 | 2020-09-29 | Huawei Technologies Co., Ltd. | SPI-based data transmission method and device |
-
2020
- 2020-12-09 CN CN202011426026.4A patent/CN112631975B/zh active Active
Patent Citations (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1564643A2 (en) * | 2004-02-11 | 2005-08-17 | Intracom S.A. Hellenic Telecommunications & Electronics Industry | Synthesizable vhdl model of a multi-channel dma-engine core for embedded bus systems |
KR20060088929A (ko) * | 2005-02-02 | 2006-08-07 | 삼성전자주식회사 | 리눅스 기반의 시스템에서 하드웨어 인터럽트 처리 장치및 방법 |
CN102262557A (zh) * | 2010-05-25 | 2011-11-30 | 运软网络科技(上海)有限公司 | 通过总线架构构建虚拟机监控器的方法及性能服务框架 |
CN102467473A (zh) * | 2010-11-03 | 2012-05-23 | Tcl集团股份有限公司 | 一种在用户空间和内核之间传输数据的方法和装置 |
CN102156662A (zh) * | 2011-02-14 | 2011-08-17 | 大唐移动通信设备有限公司 | 一种数据处理方法和设备 |
CN103064807A (zh) * | 2012-12-17 | 2013-04-24 | 福建星网锐捷网络有限公司 | 多通道直接存储器存取控制器 |
CN103685578A (zh) * | 2014-01-08 | 2014-03-26 | 珠海全志科技股份有限公司 | 主从设备的数据传输方法 |
CN107066395A (zh) * | 2017-02-04 | 2017-08-18 | 上海市共进通信技术有限公司 | 基于Linux系统实现外设数据高速传输与处理的方法 |
CN106874224A (zh) * | 2017-02-17 | 2017-06-20 | 杭州朔天科技有限公司 | 自动搬运且适应器件的多线SPI‑Flash控制器 |
CN106909523A (zh) * | 2017-02-24 | 2017-06-30 | 深圳市恒扬数据股份有限公司 | 大规模数据传输方法及系统 |
CN107992297A (zh) * | 2017-12-19 | 2018-05-04 | 郑州云海信息技术有限公司 | 一种针对s3c2440的spi控制器驱动实现方法 |
CN108121534A (zh) * | 2017-12-19 | 2018-06-05 | 郑州云海信息技术有限公司 | 一种针对W25Q16DV的SPI Flash驱动实现方法 |
CN109977037A (zh) * | 2017-12-28 | 2019-07-05 | 龙芯中科技术有限公司 | 一种dma数据传输方法及系统 |
CN109992352A (zh) * | 2017-12-29 | 2019-07-09 | 迈普通信技术股份有限公司 | 数据传输方法、装置、电子设备及可读取存储介质 |
CN110780809A (zh) * | 2018-07-31 | 2020-02-11 | 爱思开海力士有限公司 | 针对多个存储器系统的接合管理元数据的设备和方法 |
CN109800202A (zh) * | 2019-01-17 | 2019-05-24 | 郑州云海信息技术有限公司 | 一种基于pcie的数据传输系统、方法及装置 |
CN111522769A (zh) * | 2020-03-26 | 2020-08-11 | 成都天箭科技股份有限公司 | 一种多线程spi通信数据传输方法 |
CN111679923A (zh) * | 2020-06-11 | 2020-09-18 | 北京经纬恒润科技有限公司 | 实时通信方法和系统 |
CN111966300A (zh) * | 2020-08-24 | 2020-11-20 | 深圳三地一芯电子有限责任公司 | 一种节省主控sram的存储器数据写入方法及装置 |
Non-Patent Citations (1)
Title |
---|
Linux系统下基于SPI总线的外部A/D驱动设计;赵盼;李俊;周海峰;;仪表技术与传感器;20161015(10);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN112631975A (zh) | 2021-04-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6968411B2 (en) | Interrupt processing apparatus, system, and method | |
KR100977662B1 (ko) | 2-레벨 인터럽트 서비스 루틴을 제공하기 위한 방법 및 프로세서 | |
CN113032152B (zh) | 用于深度学习框架的调度方法、调度装置、电子设备、存储介质和程序产品 | |
CN110058926B (zh) | 用于处理gpu任务的方法、设备和计算机可读介质 | |
US20150268985A1 (en) | Low Latency Data Delivery | |
JPH0594317A (ja) | 仮想計算機の入出力割り込み処理方式 | |
CN110955503B (zh) | 任务调度方法及装置 | |
CN111158875A (zh) | 基于多模块的多任务处理方法、装置及系统 | |
CN112631975B (zh) | 基于Linux的SPI传输方法 | |
US20050172287A1 (en) | Bus management techniques | |
US20110022767A1 (en) | Dma controller with interrupt control processor | |
Ogawa et al. | Efficient approach to ensure temporal determinism in automotive control systems | |
CN108345428B (zh) | 控制密集型控制系统及其方法 | |
CN113918272B (zh) | 分离式虚拟机及其虚拟机架构、构建方法和优化方法 | |
CN107992328A (zh) | 一种数据处理的方法、装置和片上系统 | |
US7272680B2 (en) | Method of transferring data between computer peripherals | |
CN118796754A (zh) | 处理器的外置芯片控制方法、架构、设备及存储介质 | |
JP6138482B2 (ja) | 組み込みシステム | |
WO2021056277A1 (zh) | 一种执行程序的方法 | |
JP2003005987A (ja) | エミュレーション装置 | |
CN117745510A (zh) | 一种提高gpu数据交互效率的方法、系统及介质 | |
JPH09218859A (ja) | マルチプロセッサ制御システム | |
CN105589819A (zh) | 一种基于iic接口操作eeprom芯片的方法 | |
JPH10260850A (ja) | 仮想計算機システム | |
CN115686774A (zh) | 一种高效的支持数据优先级的读写策略及实现方法 |
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 |