【RK3399 -PCIE移植过程记录】

news2024/11/27 21:07:11

一、,pcie开发可通过参考官方开发文档:

具体的硬件外设都有官网的参考文档,pcie的具体可参考:
https://github.com/mfkiwl/rk-open-docs/blob/master/PCIe/Rockchip_RK3399_Developer_Guide_PCIe_CN.md

二、具体设备树文件

vi arch/arm64/boot/dts/rockchip/rk3399.dtsi

pcie_phy: pcie-phy {
                compatible = "rockchip,rk3399-pcie-phy";
                #phy-cells = <0>;
                rockchip,grf = <&grf>;
                clocks = <&cru SCLK_PCIEPHY_REF>;
                clock-names = "refclk";
                resets = <&cru SRST_PCIEPHY>;
                reset-names = "phy";
                status = "disabled";
        };
pcie0: pcie@f8000000 {
                compatible = "rockchip,rk3399-pcie";
                #address-cells = <3>;
                #size-cells = <2>;
                aspm-no-l0s;
                clocks = <&cru ACLK_PCIE>, <&cru ACLK_PERF_PCIE>,
                         <&cru PCLK_PCIE>, <&cru SCLK_PCIE_PM>;
                clock-names = "aclk", "aclk-perf",
                              "hclk", "pm";
                bus-range = <0x0 0x1f>;
                max-link-speed = <1>;
                linux,pci-domain = <0>;
                msi-map = <0x0 &its 0x0 0x1000>;
                interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH 0>,
                             <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH 0>,
                             <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH 0>;
                interrupt-names = "sys", "legacy", "client";
                #interrupt-cells = <1>;
                interrupt-map-mask = <0 0 0 7>;
                interrupt-map = <0 0 0 1 &pcie0_intc 0>,
                                <0 0 0 2 &pcie0_intc 1>,
                                <0 0 0 3 &pcie0_intc 2>,
                                <0 0 0 4 &pcie0_intc 3>;
                power-domains = <&power RK3399_PD_PERIHP>;
                phys = <&pcie_phy>;
                phy-names = "pcie-phy";
                ranges = <0x83000000 0x0 0xfa000000 0x0 0xfa000000 0x0 0x1e00000
                          0x81000000 0x0 0xfbe00000 0x0 0xfbe00000 0x0 0x100000>;
                reg = <0x0 0xf8000000 0x0 0x2000000>,
                      <0x0 0xfd000000 0x0 0x1000000>;
                reg-names = "axi-base", "apb-base";
                resets = <&cru SRST_PCIE_CORE>, <&cru SRST_PCIE_MGMT>,
                         <&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE>,
                         <&cru SRST_PCIE_PM>, <&cru SRST_P_PCIE>,
                         <&cru SRST_A_PCIE>;
                reset-names = "core", "mgmt", "mgmt-sticky", "pipe",
                              "pm", "pclk", "aclk";
                status = "disabled";
                pcie0_intc: interrupt-controller {
                        interrupt-controller;
                        #address-cells = <0>;
                        #interrupt-cells = <1>;
                };
        };

在分析设备树之前,先简单追一下RK3399的设备树编译文件,通过编译脚本make.sh可知,在编译过程中执行./make linux prod 时候用到了这几个deb文件。
在这里插入图片描述
通过这几个文件的dts文件的引用关系可追踪所有相关设备树文件关系:
rk3399pro-toybrick-prod-linux-edp.dts—>rk3399pro-toybrick-prod.dtsi—>rk3399pro-toybrick.dtsi—>rk3399pro.dtsi—>rk3399.dtsi(PCIE RC设备树)

三、移植调试过程

1)、使能RK3399 PCIE,同时设置 PCIe 接口的 PERST#复位信号:
arch/arm64/boot/dts/rockchip/rk3399pro.dtsi,使能pcie,同时设置 PCIe 接口的 PERST#复位信号,ep-gpios = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;status = 。
在这里插入图片描述
2)、通过原理图确认复位引脚为GPIO0_B4(其实就是GPIO0_12,只是每8个分一组A、B……)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2) 、可选配置:用于配置 PCIe 外设的 0.9V、1.8V、3.3V 供电,如果有控制需要开启。
vpcie3v3-supply = <&vdd_pcie3v3>;
vpcie1v8-supply = <&vdd_pcie1v8>;

四、 make menuconfig 配置

确保有以下配置才可使用PCIE功能
CONFIG_PCI=y
CONFIG_PCI_DOMAINS=y
CONFIG_PCI_DOMAINS_GENERIC=y
CONFIG_PCI_SYSCALL=y
CONFIG_PCI_BUS_ADDR_T_64BIT=y
CONFIG_PCI_MSI=y
CONFIG_PCI_MSI_IRQ_DOMAIN=y
CONFIG_PHY_ROCKCHIP_PCIE=y
CONFIG_PCIE_ROCKCHIP=y
CONFIG_PCIEPORTBUS=y
CONFIG_PCIEASPM=y
CONFIG_PCIEASPM_POWERSAVE=y
CONFIG_PCIE_PME=y
CONFIG_GENERIC_MSI_IRQ=y
CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
CONFIG_IRQ_DOMAIN=y
CONFIG_IRQ_DOMAIN_HIERARCHY=y
使能 NVMe 设备(建立在 PCIe 接口的 SSD)
CONFIG_BLK_DEV_NVME=y
使能 AHCI 设备(PCIe 转接成 SATA 的 SSD)
CONFIG_SATA_PMP=y
CONFIG_SATA_AHCI=y
CONFIG_SATA_AHCI_PLATFORM=y
CONFIG_ATA_SFF=y
CONFIG_ATA=y

五、 驱动启动过程中报错分析:

toybrick@debian10:~$ dmesg |grep pcie
[ 0.287785] of_get_named_gpiod_flags: parsed ‘gpio’ property of node ‘/vcc-pcie-regulator[0]’ - status (0)
[ 0.287824] vcc_pcie: no parameters
[ 0.287974] reg-fixed-voltage vcc-pcie-regulator: vcc_pcie supplying 0uV
[ 1.124824] phy phy-pcie-phy.3: Looking up phy-supply from device tree
[ 1.124836] phy phy-pcie-phy.3: Looking up phy-supply property in node /pcie-phy failed
[ 1.126863] rockchip-pcie f8000000.pcie: GPIO lookup for consumer ep
[ 1.126876] rockchip-pcie f8000000.pcie: using device tree for GPIO lookup
[ 1.126905] of_get_named_gpiod_flags: parsed ‘ep-gpios’ property of node ‘/pcie@f8000000[0]’ - status (0)
[ 1.127166] rockchip-pcie f8000000.pcie: Looking up vpcie3v3-supply from device tree
[ 1.127179] rockchip-pcie f8000000.pcie: Looking up vpcie3v3-supply property in node /pcie@f8000000 failed
[ 1.127195] rockchip-pcie f8000000.pcie: no vpcie3v3 regulator found
[ 1.127783] rockchip-pcie f8000000.pcie: Looking up vpcie1v8-supply from device tree
[ 1.127795] rockchip-pcie f8000000.pcie: Looking up vpcie1v8-supply property in node /pcie@f8000000 failed
[ 1.127808] rockchip-pcie f8000000.pcie: no vpcie1v8 regulator found
[ 1.128401] rockchip-pcie f8000000.pcie: Looking up vpcie0v9-supply from device tree
[ 1.128412] rockchip-pcie f8000000.pcie: Looking up vpcie0v9-supply property in node /pcie@f8000000 failed
[ 1.128425] rockchip-pcie f8000000.pcie: no vpcie0v9 regulator found
[ 1.129010] rockchip-pcie f8000000.pcie: missing “memory-region” property
[ 1.129641] PCI host bridge /pcie@f8000000 ranges:
[ 1.672204] rockchip-pcie f8000000.pcie: PCIe link training gen1 timeout!
[ 1.672842] rockchip-pcie f8000000.pcie: deferred probe failed
[ 1.673597] rockchip-pcie: probe of f8000000.pcie failed with error -110
drivers/pci/host/pcie-rockchip.c
rockchip_pcie_parse_dt解析加载设备树的函数,启动过程中报0.9V、1.8V、3.3V未配置的打印信息可忽略。

在这里插入图片描述
未插入外设,PCIE未检测到设备如下link ep 设备超时报-110。
在这里插入图片描述
插入PCIE设备link ep设备成功后:
在这里插入图片描述
sudo echo 1 > /sys/class/pci_bus/0000:01/device/0000:01:00.0/enable

显示PCIE网卡的配置
lspci -s 01:00.3 -x

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

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

相关文章

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时…

数据在内存中的存储(C语言)(难点,需多刷几遍)

目录 整数在内存中的存储 大小端字节序和字节序判断 什么是大小端&#xff1f; 为什么有大小端&#xff1f; 练习1 练习2 练习3 练习4 练习5 练习6&#xff08;较难、重点&#xff09; 代码解读&#xff1a; 浮点数在内存中的存储 练习 浮点数的存储 浮点数存的…

Redis之缓存穿透、缓存雪崩、缓存击穿

Redis之缓存穿透、缓存雪崩、缓存击穿 什么是缓存穿透&#xff1f; 如果有人故意将请求打到未缓存的数据上&#xff0c;会对数据库造成巨大的压力 如何解决&#xff1f; 做好参数校验&#xff0c;比如请求的id不能<0&#xff0c;在访问数据库前就把这些异常访问拦截了 缓…

nginx搭建及部署

目录 一、nginx是什么&#xff1f; 二、安装部署 1.下载 2.配置 3.代理Swagger服务 4.nginx命令 一、nginx是什么&#xff1f; 是用于 Web 服务、反向代理、内容缓存、负载均衡、媒体流传输等场景的开源软件。它最初是一款专为实现最高性能和稳定性而设计的 Web 服务器。…

使用 CSS 实现毛玻璃效果

在现代 Web 设计中,毛玻璃效果越来越受欢迎。它能够让界面元素看起来更加柔和、朦胧,同时又不会完全遮挡背景内容,给人一种透明而又不失质感的视觉体验。虽然过去实现这种效果需要借助图像编辑软件,但现在只需要几行 CSS 代码,就可以在网页上呈现出令人惊艳的毛玻璃效果。 使用…

Data-Free Generalized Zero-Shot Learning 中文版

摘要 深度学习模型具有从大规模数据集中提取丰富知识的能力。然而&#xff0c;由于涉及到数据版权和隐私问题&#xff0c;数据共享变得越来越具有挑战性。因此&#xff0c;这妨碍了从现有数据向新的下游任务和概念有效转移知识。零样本学习&#xff08;ZSL&#xff09;方法旨在…

MNN Session 创建执行器(六)

系列文章目录 MNN createFromBuffer&#xff08;一&#xff09; MNN createRuntime&#xff08;二&#xff09; MNN createSession 之 Schedule&#xff08;三&#xff09; MNN createSession 之创建流水线后端&#xff08;四&#xff09; MNN Session::resize 之流水线编码&am…

element-ui出的treeselect下拉树组件基本使用,以及只能选择叶子节点的功能,给节点添加按钮操作

element-ui出的treeselect下拉树组件基本使用&#xff1a;Vue通用下拉树组件riophae/vue-treeselect的使用-CSDN博客 vue-treeselect 问题合集、好用的树形下拉组件&#xff08;vue-treeselect的使用、相关问题解决方案&#xff09;-CSDN博客 需求1&#xff1a;treeselect下拉…

数据结构和算法模块——队列(多例子+图文)

一文帮你看懂队列 什么是线性表为什么要学习线性表&#xff0c;它有什么用处和好处&#xff1f;基本概念分类存储结构结构特点 队列为什么要学习队列&#xff1f;基本概念数据结构基本操作 待填坑 什么是线性表 为什么要学习线性表&#xff0c;它有什么用处和好处&#xff1f;…

【测试开发学习流程】MySQL函数运算(中)(下)

前言&#xff1a; 这些天还要搞毕业论文&#xff0c;东西少了点&#xff0c;大家将就看看QWQ 目录 1 MySQL的数据处理函数 1.1 文本处理函数 1.2 日期与时间函数 1.3 数值处理函数 1.4 系统函数 2 聚集运算 2.1 聚集函数 2.2 流程函数 1 MySQL的数据处理函数 MySQL支…

云手机在海外电商中的应用优势

随着海外市场的不断拓展&#xff0c;电商行业对于高效、安全的工具需求日益增长。在这一背景下&#xff0c;云手机作为一种新型服务&#xff0c;为海外电商提供了强大的支持和便利。云手机对传统物理手机起到了非常好的延展和补充作用&#xff0c;拓展了更广泛的应用场景&#…

windows管理github代码

资料 windows SSH下载github

【数字IC/FPGA】书籍推荐(0)----《Verilog 传奇--从电路出发的HDL代码设计》

在下这几年关于数字电路、Verilog、FPGA和IC方面的书前前后后都读了不少&#xff0c;发现了不少好书&#xff0c;也在一些废话书上浪费过时间。接下来会写一系列文章&#xff0c;把一部分读过的书做个测评&#xff0c;根据个人标准按十分制满分来打分并分享给大家。 定位 书名…

游戏反云手机检测方案

游戏风险环境&#xff0c;是指独立于原有设备或破坏设备原有系统的环境。常见的游戏风险环境有&#xff1a;云手机、虚拟机、虚拟框架、iOS越狱、安卓设备root等。 这类风险环境可以为游戏外挂、破解提供所需的高级别设备权限&#xff0c;当游戏处于这些风险环境下&#xff0c…

<深度学习初识>——《深度学习笔记》

深度学习笔记 一、人工智能简介 1.人工智能发展的重要时间节点 1.1人工智能孕育期 1.2人工智能诞生期 1.3人工智能第一次浪潮的发展 1.4人工智能的第一次寒冬 第一次寒冬主要面临的几个问题&#xff1a; 1.5人工智能第二次浪潮的发展 1.6人工智能的第二次寒冬 1.7人工智能第…

FREERTOS队列集和事件标志组

队列集 一个队列只允许任务间传递的消息为同一种数据类型&#xff0c;如果需要在任务间传递不同数据类型的消息时&#xff0c;那么就可以使用队列集&#xff01; 作用&#xff1a;用于对多个队列或信号量&#xff08;信号量本质上也是个队列&#xff09;进行“监听”&#xff…

python(Django)之登录功能实现

1、创建登陆函数 def login(request):if request.POST:username password username request.POST.get(username)password request.POST.get(password)user auth.authenticate(usernameusername, passwordpassword)if user is not None and user.is_active:auth.login(req…

医药工厂5G智能制造数字孪生可视化平台,推进医药企业数字化转型

医药工厂5G智能制造数字孪生可视化平台&#xff0c;推进医药企业数字化转型。随着科技的不断发展&#xff0c;数字化转型已成为医药企业不可或缺的一部分。5G智能制造医药工厂数字孪生可视化平台作为数字化转型的重要工具&#xff0c;正在逐步改变医药企业的生产方式和管理模式…

MATLAB:函数与数值积分

一、数学函数图像的绘制 clc,clear fh (x)2*exp(-x).*sin(x); Xrange [0,8]; gx (x)3*exp(-x)*0.8.*sin(x); fplot(fh,Xrange,r-*,LineWidth,1.5) hold on grid on fplot(gx,Xrange,b-o,LineWidth,1.5) axis([-0.5,8.5,-0.1,0.85]) legend(fh (x)2*exp(-x).*sin(x),gx (x…

QB PHP 多语言配置

1&#xff1a; 下载QBfast .exe 的文件 2&#xff1a; 安装的时候 &#xff0c;一定点击 仅为我 安装 而不是 所有人 3&#xff1a; 如果提示 更新就 更新 &#xff0c; 安装如2 4&#xff1a; 如果遇到 新增 或者编辑已经 配置的项目时 不起作用 &#xff1a; 右…