海思芯片pcie启动——pcie_mcc驱动框架的booter程序分析

2023-10-27

1、booter程序介绍

(1)源码目录:pcie_mcc/multi_boot/example/boot_test.c;
(2)调用命令:./booter start_device;
(3)booter程序的作用:在主片将pcie启动相关的驱动加载完成后,调用booter来引导从片pcie启动;

2、主片引导从片启动的过程

(1)调用pcie启动相关驱动,知道当前pcie接口连接了多少个从片;
(2)先传输uboot的前80KB数据到36A的内部RAM中,并启动36A,让36A芯片执行传输过去的uboot前80KB数据,实现内存的初始化;
(3)初始化内存后,将uboot通过pcie的地址转换单元发送到36A从片的内存中;
(4)将kernel通过pcie的地址转换单元发送到36A从片的内存中;
(5)将rootfs通过pcie的地址转换单元发送到36A从片的内存中;
(6)经过第二到第五步,已经将uboot、kernel、rootfs发送到所有36A从片;
(7)启动所有36A从片,36A直接执行内存中的uboot,启动内核,再挂载根文件系统;

3、函数调用顺序

main(int argc, char *argv[])
	ioctl(dev_fd, GET_ALL_DEVICES, &attr);	#获取扫描到的所有36A从片
		start_device(dev_fd, action, attr);
			transfer_uboot_to_devices
				ioctl(fd, PCIE_TRANSFER_DATA, &attr_arg);	# 传输uboot到36A从片
			transfer_kernel_to_devices(dev_fd, &attr);
				ioctl(fd, PCIE_TRANSFER_DATA, &attr_arg);	# 传输kernel到36A从片
			transfer_fs_to_devices(dev_fd, &attr);
				ioctl(fd, PCIE_TRANSFER_DATA, &attr_arg);	# 传输rootfs到36A从片
			unreset_slave_devices(dev_fd, &attr);			
				ioctl(fd, START_TARGET_DEVICE, &attr_arg);	# 启动36A从片
				
		reset_slave_device(dev_fd, action, attr);	# 复位所有从片,如果是通过pcie启动36A,这个一般不调用

4、pcie启动时从片的地址空间布局

在这里插入图片描述

5、补充:什么是芯片内SRAM?

(1)芯片内SRAM:就是36A芯片内部集成了小容量的RAM内存,SRAM是静态RAM,不需要初始化就可以运行;
(2)对应芯片内存内还集成小容量的SROM,用来存放芯片固化的代码,同样不需要初始化上电即可用;
(3)芯片上电,将SROM中的代码搬运到SRAM中运行,这样才可以支持各种启动方式;
(4)在初始化内存前,内存是不可用的,所以只能将uboot前面部分读取到片内SRAM运行,初始化内存后接可以直接将uboot、kernel、rootfs发送到内存;
(5)参考博客:https://blog.csdn.net/weixin_42031299/article/details/123602617;

6、疑问:读取前80KB的uboot已经超过片内SRAM大小?

在这里插入图片描述

(1)从芯片手册的地址空间映射表可知,片内SRAM的大小是64KB,是放不下uboot前80KB的;
(2)但是片内SRAM地址后面紧接的地址空间是保留地址空间,应该是将超过的16KB复制到该地址空间也没事,或者是芯片内固化的代码已经做了截断处理;
(3)读uboot前80KB是海思SDK里提供的pcie_mcc驱动指定的,具体为什么要是80KB只有海思的原厂工程师最清楚,不必深究;
(4)我看到有其他人说,初始化内存的代码只在uboot的前32KB,其实不用读取80KB这么多,如果想了解更清楚,可以去看uboot的链接脚本,看看哪些文件被链接在前面;

7、booter总结

(1)booter功能是主片引导从片通过pcie接口启动,逻辑上并不复杂,就是主片把uboot、kernel、rootfs发送到从片的内存,然后启动从片;
(2)想要彻底了解海思pcie启动,还要继续深挖vendor_dev_host.ko和boot_device.ko,这两个驱动是启动相关的;

推荐

给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转
在这里插入图片描述
在这里插入图片描述

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

海思芯片pcie启动——pcie_mcc驱动框架的booter程序分析 的相关文章

  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • diff 文件仅比较每行的前 n 个字符

    我有2个文件 我们将它们称为 md5s1 txt 和 md5s2 txt 两者都包含a的输出 find type f print0 xargs 0 md5sum sort gt md5s txt 不同目录下的命令 许多文件被重命名 但内容保
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两

随机推荐

  • 管理科学基础知识__后悔值计算

    看一个例题 某企业要投产一种新产品 生产方案有四种 A 新建全自动生产线 B 新建半自动生产线 C 购置旧生产设备 D 外包加工生产 未来该产品的销售前景估计为很好 一般和较差三种 不同情况下该产品的收益值如下表所示 单位 万元 用后悔值
  • 【Python】解决AttributeError: ‘xml.etree.ElementTree.Element‘ object has no attribute ‘getchildren‘问题

    getchildren在python 3 9中已经被移除 如果项目中使用会显示错误 AttributeError xml etree ElementTree Element object has no attribute getchildr
  • python中strptime()和strftime()的区别和用法

    python中strptime 和strftime 的区别和用法 之前每次遇到时间格式转换都要去搜 今天决定自己记录一下这两个方法的区别和用法 也方便自己加深印象 1 strptime中的p代表parse 意为解析 也就是将一个字符串解析成
  • 【点宽专栏】国泰君安——综合期限多样性的趋势选股策略

    前言 此策略报告策略构建部分参考 国泰君安综合期限多样性的趋势选股策略数量化专题之九十 原报告思想 移动平均线由于具有简单直观的特征 是最常用的技术指标之一 除了简单发送多空信号之外 移动平均指标作为历史股价走势信息的载体 能够对未来收益起
  • Python Pandas 列数据筛选方法汇总

    Pandas 列数据筛选方法汇总 数据准备 一 筛选得到指定的列 1 1 根据 label 选择特定的几列 1 2 选择单列的两种方式 1 3 通过正则表达式选择列 二 同时对 行 和 列 进行筛选 2 1 通过切片 df loc 2 2
  • pytorch搭建squeezenet网络的整套工程,及其转tensorrt进行cuda加速

    本来 前辈们用caffe搭建了一个squeezenet的工程 用起来也还行 但考虑到caffe的停更后续转trt应用在工程上时可能会有版本的问题所以搭建了一个pytorch版本的 以下的环境搭建不再细说 主要就是pyorch 其余的需要什么
  • 【Java】Java中的多态

    文章目录 一 什么是多态 二 多态实现的条件 三 重写 3 1 什么是重写 3 2 重写和重载的区别 四 向上转型和向下转型 4 1 向上转型 4 2 向下转型 五 多态的优缺点 六 避免在构造方法中调用重写的方法 一 什么是多态 在Jav
  • MySQL多表关联查询

    文章目录 多表查询 用户表 用户角色表 角色表 权限表 角色权限表 表间关系 MySQL连接 关联查询用户表和用户角色表 关联查询用户表 用户角色表和角色表 多表连接 笛卡尔集 外连接
  • 软件测试报告可以包含哪些测试内容?

    软件测试报告可以包含以下测试内容 功能测试 测试软件的基本功能是否实现 是否符合要求 性能测试 测试软件的响应速度 并发能力 稳定性等性能指标 界面测试 测试软件的用户界面是否友好 易于使用 兼容性测试 测试软件在不同的操作系统 浏览器 设
  • Springboot中 @ConfigurationProperties对象 静态方法调用无效

    1 https blog csdn net weixin 43404791 article details 105430606 2 https blog csdn net qq827245563 article details 106296
  • 三行代码求二叉树的节点个数以及二叉树的深度

    二叉树的节点格式如下 struct BinaryTreeNode int m nValue BinaryTreeNode m pLeft BinaryTreeNode m pRight 1 求二叉树的节点个数 这道题比较简单 使用随便一种遍
  • TI DSP TMS320C66x学习笔记之VLIB测试数据(三)

    VLIB是TI提供的针对C6x优化过的视觉库 下载地址 http software dl ti com libs vlib latest index FDS html 提供40多个核心函数 主要实现以下功能 Background Model
  • SpringBoot+vue旅游项目总结

    Springboot vue旅游项目小总结 此项目为一个springboot vue入门级小项目 视频地址为 https www bilibili com video BV1Nt4y127Jh 业务简单 对提升业务能力没什么大的帮助 更多的
  • 开始→运行→输入的命令集锦

    gpedit msc 组策略 sndrec32 录音机 nslookup ip地址侦测器 explorer 打开资源管理器 logoff
  • 最后一位

    题目名称 最后一位 小明选择了一个正整数X 然后把它写在黑板上 然后每一天他会擦掉当前数字的最后一位 直到他擦掉所有数位 在整个过 程中 小明会把所有在黑板上出现过的数字记录下来 然后求出他们的总和sum 例如X 509 在黑板上出现过的数
  • vue打包放服务器显示代码,解决vue-cli3打包代码后,上线服务器后白屏问题

    前沿 因为最近vue刚刚发版了最新版本的vue cli3 而最近刚刚好有个项目要迁移到vue 所以经过讨论 大家一起入坑VUE 然后我也刚好可以练手刚学一周的vue 结合TypeScript和vuex等全家桶的框架 后期 噗呲噗呲的大家在开
  • C++实现快速排序(源代码)

    快速排序的基本思想是 通过一趟排序将要排序的数据分割成独立的两部分 其中一部分的所有数据都比另外一部分的所有数据都要小 然后再按此方法对这两部分数据分别进行快速排序 整个排序过程可以递归进行 以此达到整个数据变成有序序列 快速排序是一种不稳
  • 一阶滞后环节matlab,一个一阶惯性带有滞后环节的PID仿真程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我照着网上的程序自己改出来的程序是这样的 clc clear ts 0 001 采样时间 sys tf 53 19926 100 ioDelay 540 tf是传递函数 用来实现G s 在自动控
  • 一种基于强化学习的自动变道机动方法

    文章目录 摘要 前言 相关的工作 方法论 动作空间 奖励函数设计 Q学习 仿真结果 结论 摘要 变道是一项至关重要的车辆操作 需要与周围车辆协调 建立在基于规则的模型上的自动换道功能可能在预定义的操作条件下表现良好 但在遇到意外情况时可能容
  • 海思芯片pcie启动——pcie_mcc驱动框架的booter程序分析

    1 booter程序介绍 1 源码目录 pcie mcc multi boot example boot test c 2 调用命令 booter start device 3 booter程序的作用 在主片将pcie启动相关的驱动加载完成