UART在Linux内核启动时突然不打印的问题

news2024/10/11 6:48:59

国庆前一天收到的任务,在一颗比较成熟的芯片的SDK基础上,移植一个新内核,让它能够在bitfile下跑在FPGA上。
看了芯片设计那边给的文档,对比过去的那颗,感觉也就改改寄存器,中断号,时钟,内存布局,这活儿也就搞完了,两天解决。
谁曾想一搞就是十天[em]e105[/em]

最气人的是第二天就已经进内核了,串口打印停在busybox,init进程被唤起之前的位置,一度以为是文件系统打包的问题,学了一波buildroot打包方式,追内核解包代码。。。途中,还替换了原先rootfs的打包方法,效果是一致的,串口停在同一个位置。无奈,就开始在最后一行log附近,加打印,最后发现内核start_kernel都跑完了,init也被do_exec了,返回值还是正确的,真邪乎!

串口不打印了,有可能是串口本身有问题,或是init进程运行失败了,也有可能二者叠加。设计给的bitfile也只引出一个串口,这怎么调试?

我开始对我新拉的分支上的代码不信任了,找出过去能在evb上正常跑的代码,在此基础上做最小修改让它在FPGA上能跑起来,结果是这两套内核对齐到最后只有串口时钟源不一致(FPGA固定20M),其他配置都一致,在FPGA上依然卡主。

这么一对比,感觉FPGA上串口有问题啊,可我没有证据!无非就是基地址,中断号,时钟这仨有一个出错了。

基地址不用看,因为内核早期启动打印正常,但是它不用中断,所以感觉中断号有问题,去看手册吧,核实了我设备树配置得一样。时钟如果有问题,也只是乱码而已,不会停住不输出。

到这里怀疑范围可以进一步缩小了,最有可能的依然是中断,遂换个思路,改evb代码,故意改错他注册的中断号,跑起来后发现效果和FPGA一致,停在了同一个地方!!!

这时我就开始想怼设计,拉着他看现象了,后来静下来一想,我证据还是不足啊:busybox里还会进一步对串口进行配置,做重定向,是不是我busybox得问题呢?我在看了一眼busybox代码,头疼。。。一想到又要在它里边儿加打印,追执行路径,重新编译。。。
算了,换个方法,能否直接沿用早期的bootconsole?不在启动时把它关闭?似乎只要在设备树里不去加串口的设备节点就好了(听说),后来证明不行,我也是后来才知道除了删掉节点还要改一个flag,否则依然会用启动后期新注册的串口。

怀疑中断问题,但不好调试证明,此时我已经开始请救兵了,大佬推荐我在串口的中断处理函数里加gloabl cnt,在System.map找到这个全局变量地址,Attach仿真器上去看这个地址上的值(仿真器加符号表加调用堆栈,无敌的调试方式)

结果证明串口的中断就是没有进,但此时我依然坚信串口中断号配置是对的,因为我的同事已经做过裸区验证,串口的中断收发是pass的,同一个bitfile,同一个中断号,没理由是效果不同。(很矛盾)

为了证明串口是错误的,我开始修改串口驱动,中断模式改为poll模式,再启动,发现FPGA上也可以跑的更远了,这次跑到了inittab里(排除了init进程调用失败),停在了配置getty与console绑定的这一行(也是通过在rcS里加打印)来确认了。还是停住了,依然没进login,很苦恼,临门一脚了。我已经没有路数了。

后来还是一个同事提醒我,你都能在rcS加打印了,你为什么不多加点,cat 一下内核中断计数啊?
好吧,追了这么多天,脑子糊涂了。如下图,加入了getty权限显示,tty绑定关系显示,中断号显示。可以看到ttyS0也就是我的UART0上是没有计数的,与此同时arch timer居然也没有计数,6啊这玩意都没有计数那指定是有问题了,还是它们老大的问题,GIC控制器。

先看下evb和fpga的差异,我先dump了EVB板子上的GIC控制器所有寄存器,然后用仿真器dump我卡死的FPGA Linux的GIC控制器,然后dump裸驱工程执行时GIC的寄存器。(dump这仨用的是同一个基地址,因为设计给的手册上市同一个值)
我发现evb上gic配置正确,但是后两者dump出来都是0!!。fpga linux的gic没配置我能理解,它中断没计数嘛。裸驱工程怎么也没配置,它串口的中断模式不是验证了吗?保持怀疑,自己找个工程跑一次case,结果确实市通的。说实在的,我还没看过裸驱里怎么配置的GIC,那就跟一下它的代码,我发现它是通过汇编配置的,虽然代码里用宏定义配置了它的基地址,但是没人引用这个宏,且它的基地址是从CP15协处理器读出来的!!!我用仿真器读图二的r0寄存器,好家伙,地址是一个陌生的值 0xf0611000。
我囿于串口,init进程,rootfs近十天,在他们仨之间打转,这个陌生的值鬼使神差得推着我将它填入Linux的设备树(图三),编译过程中就想着了这次绝对能过。
效果如图四。爽了。
最后还留了一个问题,为啥poll模式进不到login位置,中断模式可以?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聚焦AI|智享AI直播三代模型的出现,打破传统直播束缚!

聚焦AI|智享AI直播三代模型的出现,打破传统直播束缚! 在数字化浪潮的推动下,直播行业正经历着前所未有的变革与升级。其中,智享AI直播三代模型的出现,无疑成为了业界关注的焦点。这一创新技术不仅引发了关于无人直播未来发展方向的…

18709 魔法

### 思路 为了将所有白色奶牛排在前面,黑色奶牛排在后面,我们可以考虑两种策略: 1. 将所有的奶牛都变成白色。 2. 将所有的奶牛都变成黑色。 我们需要计算这两种策略所需的最少次数,并选择其中较小的一个。 具体步骤如下&#x…

从加载到对话:使用 Llama-cpp-python 本地运行量化 LLM 大模型(GGUF)

(无需显卡)使用 Llama-cpp-python 在本地加载具有 70 亿参数的 LLM 大语言模型,通过这篇文章你将学会用代码创建属于自己的 GPT。 建议阅读完 19a 的「前言」和「模型下载」部分后再进行本文的阅读。 代码文件下载 - Llama-cpp-python 文章目…

AI智能体:共塑企业变革新纪元,引领未来无限潜能

当我们被《银翼杀手2049》或《机械公敌》等科幻大片中那些远超人类能力、能够自主判断并行动的人工智能所震撼时,AI时代的“智能体”已经悄然渗透进我们的工作生活中,成为引领企业变革的先锋力量,将我们带入一个全新的纪元。 ​从辅助到共生&…

【Unity】背景图片随着背景里面内容大小而变化

今天制作项目里面的设置界面和暂停界面时,发现两个界面有很多重复部分,所以直接做一个界面就行了,但是两个界面的背景大小会有变化,图片在下面 这个是游戏暂停界面的,设置界面和这个界面有很多重复地方,仅仅…

学习博客写作

欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…

安卓手机平板远程访问内网服务器中安装的code-server编程开发实战

文章目录 前言1.Ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 前言 本文主要介绍如何在Linux Ubuntu系统安装code-server,并结合cpolar内网穿透工具配置公网地址,轻松实现使用安…

SQL 干货 | 使用 Having 子句筛选聚合字段

如果你编写 SQL 查询已有一段时间,那么你可能对 WHERE 子句非常熟悉。虽然它对聚合字段没有影响,但有一种方法可以根据聚合值过滤记录,那就是使用 HAVING 子句。本博客将介绍它的工作原理,并提供几个在 SELECT 查询中使用它的示例…

计次卡魔都千丝冥缘应用———未来之窗行业应用跨平台架构

一、魔都千丝冥缘作用 在本次卡购买种,涉及卡包表单、次卡表单,商品表单,提成表单,支付方式表单,职员表单 并且在商品表和次卡表单字段一样,元素name名称一样。 未来之窗魔都千丝冥缘,将功能…

字节跳动青训营开始报名了!

关于青训营: 青训营是字节跳动技术团队发起的技术系列培训 &人才选拔项目;面向高校在校生,旨在培养优秀且具有职业竞争力的开发工程师。 本次技术训练营由掘金联合豆包MarsCode 团队主办课程包含前端、后端和 A 方向,在这个飞速发…

高频股票期货ETF历史高频数据源

【数据源】 银河金融数据库(yinhedata.com) 提供金融数据股票、美股、期货以及ETF等高频tick数据,分钟级别数据。 MACD背离是指MACD指标与价格走势之间发生的方向性差异,这通常被视为市场可能发生趋势反转的信号。以下是一个具体…

GS-SLAM论文阅读笔记-CG-SLAM

前言 这是一篇不是最新的工作,我之前没有阅读,但是我前几天阅读GLC-SLAM的时候,发现它的一部分内容参考了CG-SLAM,并且CG-SLAM最近被ECCV2024接收,说明这是一片值得参考的好文章,接下来就阅读一下吧&#…

数据库——表格之间的关系(表格之间的连接和处理)

数据库表格之间经常存在各种关系: 一对一、一对多、多对多 1.一对一 —— 丈夫表,妻子表为例 连接方式一:合并为一张表 这种方式对于一对一来说最优 连接方式二:在其中一张表内加入一个外键,连接另一张表 连…

Windows搭建Java开发环境(Building a Java development environment on Windows)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

开发日志:IIS安全配置

为了解决IIS文件路径泄漏问题,可以采取以下措施: 一. 详细操作 1. CMD关闭NTFS 8.3文件格式的支持 命令行:fsutil 8dot3name set 1 2. 修改注册表禁用短文件名功能 CMD输入regedit回车,在注册表中找到HKEY_LOCAL_MACHINE\SYSTEM\C…

003 Springboot操作RabbitMQ

Springboot整合RabbitMQ 文章目录 Springboot整合RabbitMQ1.pom依赖2.yml配置3.配置队列、交换机方式一:直接通过配置类配置bean方式二:消息监听通过注解配置 4.编写消息监听发送测试5.其他类型交换机配置1.FanoutExchange2.TopicExchange3.HeadersExcha…

6. 继承、重写、super、final

文章目录 一、重新定义需求二、继承1. 继续分析2. 概念3. 代码① 父类② 子类③ 测试结果 4. 饿狼传说之多层继承① 概念② 代码 5. 多继承 三、方法的重写1. 情境2. 代码① 吃什么② 怎么叫(Override重写) 3. 小结 四、super1. 啃老2. 啃老啃到底 五、final1. 用途及特征2. 举…

【Python爬虫系列】_025.关于互斥锁(Lock)

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈

Vue使用@别名替换后端ip地址

1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API,并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后,就可以导入nodejs的 path模块,在下面代码 import path…

【SEO】什么是SEO?

什么是SEO(搜索引擎优化)?为什么SEO对于⼀个⽹站⾄关重要? SEO 全称是搜索引擎优化(Search Engine Optimization) 因为我们目前开发的网址,需要人看到,除了通过宣传营销的方式展现…