修复nanopi2的SPI无法使用50MHZ传输的问题(S5P4418)

2023-11-01

一.问题背景

在使用nanopi2进行连接一个SPI接口的2.8寸TFT彩屏,在使用过程中发现了两个问题,第一个问题是友善提供的linux3.4内核SPI默认没使用DMA传输。第二个问题是 DMA传输会出现超时 ,超时还会导致linux内核发生崩溃。
在这里插入图片描述
在这里插入图片描述

通过debugfs可以看到SPI的DMA传输发生了堵塞:
在这里插入图片描述

 本人使用的TFT屏是2.8寸的分别率是 240x320 ,色彩深度是RGB565,每 个像素点2个字节,一帧图像是153600字节,大约153KB,如果不使用DMA传输,发现即使使用50MHZ,4418传输一帧图像仍然需要160毫秒左右,如果使用DMA一帧大概25毫秒,因此需要做到40HZ刷新率,必须要使用DMA!!!

附上nanopi2的内核源码的github:

https://github.com/friendlyarm/linux-3.4.y.git

在这里插入图片描述
编译内核的方法:

make nanopi2_linux_defconfig
make uImage
详情请参考维基: https://wiki.friendlyelec.com/wiki/index.php/NanoPi_M2/zh

点击此处进入维基: https://wiki.friendlyelec.com/wiki/index.php/NanoPi_M2/zh

 经过反复阅读代码,发现代码并无逻辑问题,编码测试发现核心的BUG出现在SPI上,在高速DMA传输过程中,会导致SPI的接收FIFO出现数据丢失,比如通过SPI传输5000字节,SPI的MOSI发送完毕这5000字节,MISO收到的数据理论也是5000字节,但是DMA把MISO数据搬到内存过程有概率不及时,从而导致RX FIFO堆满出现了溢出,最后导致DMA无法从RX FIFO搬出指定长度的数据,接收DMA中断就无法产生,进而SPI主机驱动的回调函数也无法被调用,从底层到顶层一步步阻塞,最后挤压的DMA请求导致linux内核崩溃。
原因大概率是ARM处理器的DMA和SPI控制器相性问题所致,属于硬件问题吧,因此仅能通过软件弥补,保护内核不崩溃,对于显示屏确保MOSI数据流正常,就算得上可靠了!!

二.启用SPI的DMA传输

 默认从git中克隆下来的内核,友善官方是禁用了SPI主机驱动中DMA功能,需要自己来打开。
打开DMA方式如下:

2.1 修改cfg_main.h 文件

arch/arm/plat-s5p4418/nanopi2/include/cfg_main.h

在这里插入图片描述
把cfg_main.h 文件中传输方式改成2,默认内核支持轮询,中断,DMA,传输,其中DMA传输最快对CPU负荷最低,时钟源频率改成100MHZ,最低2分频,即SPI传输最高可以得到50MHZ。

具体可以参考SPI的章节,时钟源最大100MHZ,主机模式下SPI最大50MHZ。
在这里插入图片描述

2.2 make menuconfig 配置SPI

Device Drivers —>
 [*] SPI support —>
在这里插入图片描述
修改上面的菜单,以SPI2总线为例子勾选中port 2,和使用DMA模式传输。

2.3 修改SPI主机驱动代码

主机驱动

drivers/spi/spi-pl022.c

在这里插入图片描述
把上图的触发条件改成下图所示:

在这里插入图片描述
注意:由于S5P4418的SPI外设固定是以4字节为突发传输长度,这个是不能修改的,因此SPI必须以4字节为一次DMA突发传输,比如用户希望用DMA传输3个字节将会导致DMA控制器和SPI不协调出错。

由于DMA支持分散形式的链表传输,因此DMA单次传输长度理论上是不限的,因为我们一帧图像大概也是接近200KB,所以我们需要删除少于4096的条件。

2.4 增加设备驱动的代码

上面步骤过后主机驱动已经修改完成了,对于设备驱动(如显示屏)就不展示了,比如我用的一个st7789的显示屏。

三.修改DMA控制器驱动程序

 经过反复的裸机程序测试,定位到主要是DMA驱动的中断出现异常,因此修改了S5P4418内核中的DMA驱动程序。

四.效果

使用DMA传输图像SPI总线上是很紧凑的,字节和字节的间隙大概40ns如下图:
在这里插入图片描述

使用中断或轮询的方式的SPI总线是很疏松,字节和字节的间隙大概25us,甚至50us不等,而且消耗CPU:
在这里插入图片描述
因为在50MHZ主频下传输4个字节仅大概需要760ns,如下图所示,又因SPI中断模式是每发送4个字节中断一次,每760ns让CPU响应并处理一次中断,这样是不可能的,所以响应不及时往往导致数据不能及时填入发送FIFO,导致发送数据疏松。
在这里插入图片描述
在50MHZ的SPI下中断模式发送最终必然导致发送效果不尽人意,因此DMA模式下可以大大降低CPU中断的触发,提高传输效率。

 修改前,使用DMA传输,每5帧左右就会导致内核崩溃或者卡死,修改后,本人经过2天晚上测试,一晚上跑20万帧,一点问题都没有,S5P4418 SOC还是挺强了,但是对于低速的SPI外设需要用到全双工,尽量控制主频在20MHZ下使用DMA收发都能正常,超过40M通常无法保证接收正常,但可以保证发送是正常的!!!

五.补丁包和补丁包的使用

 由于修改的过程比较复杂,很多老哥可能看不懂,或者跟不上,下面给出最简单的修复步骤,附件中会提供补丁包

克隆内核源码:

git clone https://github.com/friendlyarm/linux-3.4.y.git
cp 0001-Fixed-__spi_sync-timeout-when-using-50MHZ-and-DMA.patch linux-3.4.y

将补丁包0001-Fixed-__spi_sync-timeout-when-using-50MHZ-and-DMA.patch下载到内核源码目录下:

补丁包下载链接: https://download.csdn.net/download/weixin_43536180/87364903

在这里插入图片描述
使用补丁包:

git am < 0001-Fixed-__spi_sync-timeout-when-using-50MHZ-and-DMA.patch

查看是否生成新的提交:

git log

在这里插入图片描述
重新编译内核

make nanopi2_linux_defconfig
make uImage

编译后会生成新的uImage 镜像文件!!

更新内核到nanopim2开发板:

mount mount /dev/mmcblk0p1 /mnt/
拷贝新镜像到开发,有些时候更新的是uImage.hdmi,因为默认不接LCD屏幕是启动这个HDMI显示的内核!!
cp uImage /mnt/uImage

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修复nanopi2的SPI无法使用50MHZ传输的问题(S5P4418) 的相关文章

  • Linux:通过网络进行屏幕桌面视频捕获和 VNC 帧速率

    抱歉 文字墙很长 TL DR VNC 连接的帧速率是多少 以帧 秒为单位 或者更确切地说 由谁决定 客户端还是服务器 对于桌面屏幕捕获的任何其他建议 但 正确的时间编码 具有不抖动的帧速率 具有稳定的周期 并有可能将其作为未压缩 或无损 图
  • 在 C 中使用 sqrtf():“未定义对‘sqrtf’的引用”

    我正在使用Linux Ubuntu 12 04 https en wikipedia org wiki Ubuntu version history Ubuntu 12 04 LTS 28Precise Pangolin 29 Precis
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • 在Linux伪终端中执行从一个终端发送到另一个终端的字符串

    假设我有一个终端 其中 tty 的输出是 dev pts 2 我想从另一个终端向第一个终端发送命令并执行它 使用 echo ls gt dev pts 2 仅在第一个终端中打印 ls 有没有办法执行字符串 不 终端不执行命令 它们只是数据的
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 在键盘热插拔上加载模块

    我正在尝试学习如何为 Linux 系统编写模块和驱动程序 类似于this https unix stackexchange com questions 120839 usb kernel module does not load on de
  • 从 Linux 命令行发送 SNMP 陷阱消息

    Folks 我需要从 Linux 命令行使用此命令 snmptrap 将自定义消息发送到陷阱侦听器 我需要根据用户设置在 v1 和 v2c 中发送相同的消息 这是我发现的 For v1 snmptrap v 1 c Tas hostname
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • 为什么使用Python的os模块方法而不是直接执行shell命令?

    我试图了解使用Python的库函数执行特定于操作系统的任务 例如创建文件 目录 更改文件属性等 背后的动机是什么 而不是仅仅通过执行这些命令os system or subprocess call 例如 我为什么要使用os chmod而不是
  • 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

    我是一个 C 初学者 我想创建与操作系统交互的小程序 使用 Kubuntu Linux 到目前为止 我还没有找到任何教程或手册来让 C 与操作系统交互 在 PHP 中 我可以使用命令 exec 或反引号运算符来启动通常在控制台中执行的命令
  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • 如何使用 bash 脚本关闭所有终端,在每个终端中有效地按 Ctrl+Shift+Q

    我经常打开许多终端 其中一些正在运行重要的进程 例如服务器 而另一些则没有运行任何东西并且可以关闭 如果您按 重要 则会弹出确认提示Cntrl Shift Q在其中 如下所示 我想要一个 bash 脚本 它可以关闭所有终端 但将 重要 终端
  • 编写多个mysql脚本

    是否可以在复合脚本中包含其他 mysql 脚本 理想情况下 我不想为包含的脚本创建存储过程 对于较大的项目 我想分层维护几个较小的脚本 然后根据需要组合它们 但现在 我很乐意学习如何包含其他脚本 source是一个内置命令 您可以在 MyS
  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik
  • R 未获取用户库

    我有一个带 R 3 6 0 的 Fedora 30 系统 用户库设置在Renviron就像这个 R LIBS USER R LIBS USER R x86 64 redhat linux gnu library 3 6 事实上 它出现在交互
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理

随机推荐

  • Windows域认证(Kerberos认证)图解

    图文经过梳理与绘制已较为详细 希望能帮助大家更清晰 直观地了解Kerberos的认证过程 相关名词 DC 域控制器 KDC 密钥分发中心 AD 账户数据库 AS 身份验证服务 TGS 票据发放服务 TGT 认证票据 Ticket 票据 Ma
  • VOS论文阅读:Fast Video Object Segmentation using the Global Context Module(2020 ECCV)

    Fast Video Object Segmentation using the Global Context Module 2020 ECCV Contribution Method Global Context Module Conte
  • redis 数据类型之字符串(string) 详细介绍

    字符串 string 键是Redis最基本的键值对类型 这种类型的键值对会在数据库中把单独的一个键和单独的一个值关联起来 被关联的键和值既可以是普通的文字数据 也可以是图片 视频 音频 压缩文件等更为复杂的二进制数据 图2 1展示了数据库视
  • openwrt 完美安装 tcpdump

    直接使用 opk install tcpdump 报下面的错 Collected errors check data file clashes Package libpcap1 wants to install file usr lib l
  • Makeflow用户手册 一

    Makeflow用户手册 概述 Makeflow是用于大规模分布式计算的工作流引擎 它接受要执行的大量工作的规范 并尽可能在远程计算机上并行运行 此外 Makeflow是容错的 因此您可以使用它来协调非常大的任务 这些任务可能在出现故障时运
  • (4)各个属性角色分析显示-4

    将折线图 数据集 散点图集合在一个html文件中 1 将折线图 数据集 散点图设置为函数a b c 2 再调用page add 函数 将三个图片组合在一起 3 运行page render x html 函数 将该页面命名 打开html文件
  • Java线程中处理运行时异常(UncaughtExceptionHandler)

    线程在执行单元中不允许抛出checked异常 而且线程运行在自己的上下文中 派生它的线程无法直接获得它运行中出现的异常信息 对此 Java为我们提供了UncaughtExceptionHandler接口 当线程在运行过程中出现异常时 会回调
  • ElasticSearch多字段查询best_fields、most_fields和cross_fields理解

    基于elasticsearch7 6 1 和 kibana7 6 1 本文通过案例进行讲解 希望读者耐心阅读 一 介绍 字段中心查询式 就是以字段为中心 代表就是 best fields和most fields 把所有的字段全都散列 然后从
  • 详解曼哈顿距离&欧式距离&切比雪夫距离

    详解曼哈顿 欧式距离 切比雪夫距离 曼哈顿距离 基本概念 出租车几何或曼哈顿距离 Manhattan Distance 是由十九世纪的赫尔曼 闵可夫斯基所创词汇 是种使用在几何度量空间的几何学用语 用以标明两个点在标准坐标系上的绝对轴距总和
  • 基于32单片机的16通道ADC的数据采集

    基于32单片机的16通道ADC的数据采集 这个部分的内容 是作为外部模拟量部分的采集工作 按照任务要求 所设计的方案 需要完成以下指标 ADC必须能采集16通道的模拟量 ADC的分辨率是16bit 采样率不小于20khz 由此分析可以得出
  • 请使用正确的入口登录面板—解决方案

    错误信息提示 解决方案 一 找回安全登录地址 宝塔登录地址 http 你的服务器ip 8888 但是这种格式是不安全的 目前新安装的宝塔面板默认都开启了安全目录登录 所以如果使用这种不带有8位字符随机码的登录地址就会提示 请使用正确的入口登
  • 【AI】《动手学-深度学习-PyTorch版》笔记(二十一):目标检测

    AI学习目录汇总 1 简述 通过前面的学习 已经了解了图像分类模型的原理及实现 图像分类是假定图像中只有一个目标 算法上是对整个图像做的分类 下面我们来学习 目标检测 即从一张图像中找出需要的目标 并标记出位置 2 边界框 边界框 boun
  • xctf攻防世界—Web新手练习区robots单题思路

    xctf攻防世界 Web新手练习区robots单题思路 邱邱邱自强 前言 随着互联网的发展 互联网界的行为也越来越被重视 那么国际互联网界通行的道德规范是什么呢 它就是Robots协议 一 Robots协议是什么 robots协议也叫rob
  • 点击Path环境变量编辑不展开的问题

    分析 将 MYSQL HOME bin移动到 JAVA HOME bin的上面 点击确定 再次点击Path环境变量就会出现编辑不展开的问题 如图所示 分析原因 因为我把两个 MYSQL HOME bin和 JAVA HOME bin一起放在
  • zip、unzip命令使用

    1 zip压缩命令 1 压缩文件 zip test test txt 将text txt文件压缩到test zip文件中 2 压缩文件夹 r zip r attack zip attack 将当前路径下attack文件夹中的文件进行压缩 压
  • assert在debug 和 release版本中的区别

    转自 https blog csdn net panfengsoftware article details 8910468 debug版本与release的不同点 debug版本中含有调试信息 不会对程序进行优化 assert相应的宏会被
  • python-一些坑点

    一些python使用中遇到的坑点 记录一下 同样的问题也可能只是对当前我的环境下有作用 AttributeError module urllib has no attribute splittype 使用urllib中的一些工具时 提示这个
  • FPGA中task语法基本使用

    1 task定义为任务 完成的是某个具体功能 可以在initial语句和always语句中使用 不过initial语句使用较多 2 task如何使用 1 定义任务 task 任务名 端口及数据类型声明语句 语句1 语句2 语句n endta
  • Qt 3D的研究(三):显示3D模型

    Qt 3D的研究 三 显示3D模型 上一篇文章介绍了如何使用最少的代码创建一个Qt 3D的应用 和大家最初接触的glut一样 对于3D应用来说 需要做的准备工作还真不少 不过呢 Qt 3D把一些窗口相关的琐碎事情解决了 剩下的 该由我们完成
  • 修复nanopi2的SPI无法使用50MHZ传输的问题(S5P4418)

    关于S5P4418使用SPI DMA传输时出现的超时问题 一 问题背景 二 启用SPI的DMA传输 2 1 修改cfg main h 文件 2 2 make menuconfig 配置SPI 2 3 修改SPI主机驱动代码 2 4 增加设备