- 博客(60)
- 收藏
- 关注
原创 lspci/setpci用法小结
本文介绍了Linux系统中用于管理PCI设备的三个实用工具:lspci、setpci及其常见用法。lspci用于显示系统PCI设备信息,支持多种输出模式(-v详细模式、-t树状显示、-x十六进制配置空间等)和筛选选项(-s按设备地址筛选、-d按厂商/设备ID筛选)。setpci可读写PCI配置寄存器,支持-s指定设备地址、-d过滤设备ID等操作,常用于硬件调试和配置修改。文章通过具体示例展示了如何查询设备信息、分析拓扑结构、读取/修改寄存器值等操作,为系统管理员和开发者提供了实用的PCI设备管理参考。
2025-07-22 09:36:38
1025
原创 LINUX系统下的PCIe常见问题定位总结
该故障的原因也有很多,比如真正的热插拔,或者插槽松动引起的Linkdown,误码过多引起的Linkdown,还有软件配置了Link Control Register中的Link Disable导致的Linkdown等等都有可能。上图是EP的配置空间,如果这里红框中的speed和蓝框中speed需要对应的话,那这会儿的建链是有问题的,需要确认为什么speed明明支持到8G/s(GEN3)但是当前只建链到2.5Gb/s(GEN1)。没有列出的,笔者暂时没有遇到过,还不太清楚问题出现原因,就不单独描述了。
2025-07-22 09:17:45
1323
原创 PCIe枚举知识
摘要:本文详细介绍了PCIe设备的枚举流程及相关概念。主要内容包括:1.枚举先验知识,如设备在位判断、配置空间数据来源、BDF号与硬件关系等;2.设备扫描过程,采用深度优先算法,从根总线开始逐级扫描下游设备;3.BDF号组成及编号规则;4.Linux内核中的枚举流程入口;5.交换配置注意事项;6.故障定位手段,包括BIOS、lspci、dmesg等工具的使用。重点解析了PCIe点对点结构与总线模型的区别,以及桥设备在枚举过程中的关键作用。
2025-07-22 09:10:03
762
原创 PCIe之P2P应用
也就是说,该访问请求绕过了IOMMU的隔离,进行了P2P(peer to peer)传输。GPUDirect RDMA 通过绕过主机内存和 CPU,直接在 GPU 和 RDMA 网络设备之间进行数据传输,显著降低传输延迟,加快数据交换速度,并可以减轻 CPU 负载,释放 CPU 的计算能力。GPU Direct是NVIDIA开发的一项技术,利用PCIE交换实现GPU与其他设备(比如网络接口卡(NIC)和存储设备)之间的直接通信和数据传输,而不涉及CPU,从而减少不必要的内存和CPU开销,从而显著提升性能。
2025-07-22 09:02:22
1108
原创 PCIe的DPC
DPC(Downstream Port Containment)是一种用于处理PCIe链路中错误情况的机制。当PCIe链路上的一个设备发送错误信号的时候,。DPCDPC是Downstream Port的一个可选的规范特性。当在端口或端口以下检测到时,DPC会停止Downstream Port下方的PCI Express流量,避免任何数据损坏的潜在传播。Downstream Port通过实现一个DPC Extended Capability Struct对DPC的支持,该结构包含所有DPC控制和状态位。
2025-07-22 08:49:05
1115
原创 PCIe中的AER
PCIe AER(高级错误报告)机制详解 PCIe AER机制是一种用于检测和报告设备错误的系统,分为不可纠正(Uncorrectable)和可纠正(Correctable)两类错误。不可纠正错误包括数据链路协议错误、意外关闭错误等严重故障,可能导致链路不可用;可纠正错误如接收错误、重放超时等可通过协议机制恢复。AER通过专用寄存器记录错误信息,并支持通过中断通知系统。在Linux中,AER驱动负责初始化中断、配置寄存器并处理错误事件,针对不同严重程度的错误采取相应的恢复措施,从简单的状态清除到完整的链路重
2025-07-22 08:46:39
1343
原创 KEIL5使用CubeMX配置的FreeRtos编译报错:error: unknown type name ‘__forceinline’ note: expanded from macro‘port
将 项目文件夹\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F中的所有文件用CUBEMX固件库所在文件夹\Repository\STM32Cube_FW_F4_V1.27.0\Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM4F中的所有文件替换。按照AI的提示,是需要更换compiler6为compiler5,但是我的5是不可用的,因此需要寻求其他的办法。
2025-07-19 19:49:08
262
原创 PCIe基础知识之Linux内核中PCIe子系统的架构
摘要:Linux PCIe驱动框架采用总线-设备-驱动模型,通过总线进行设备与驱动的匹配。PCIe控制器使用platform总线模型,设备和驱动分别为platform_device和platform_driver。驱动初始化过程包括解析设备树、分配pci_host_bridge结构、硬件配置和中断处理设置。PCIe支持两种中断方式(Legacy和MSI),通过irq_domain映射中断号。驱动核心流程涉及设备枚举、资源分配和中断处理,最终使CPU能够访问PCI设备的I/O、存储和配置空间。该框架实现了硬件
2025-07-09 17:57:31
641
原创 PCIe基础知识之中断机制(INTx/MSI/MSI-X)
本文介绍了PCIe总线中的两种中断机制:MSI(Message Signaled Interrupts)和MSI-X(Message Signaled Interrupts-Extended)。相比传统INTx中断,MSI/MSI-X采用基于消息的中断方式,通过内存写操作触发中断,提高了效率。文章详细对比了二者的差异:MSI最多支持32个连续中断向量,而MSI-X支持最多2048个非连续向量,且采用表结构存储中断信息。文中还解析了Linux内核的实现机制,包括驱动接口和中断处理流程。重点阐述了MSI和MSI
2025-07-09 17:54:16
1139
原创 PCIe基础知识之BAR(基地址寄存器)
1.Endpoint Configuration(Type 0),Endpoint是PCIe总线上的终端设备,直接与其他设备或者处理器进行通信,比如显卡,网卡,硬盘控制器等。它是数据传输的源或者目的,不可以像Switch那样转发数据到其他分支PCIe为Endpoint设备提供最多6个BAR。BAR用于映射设备的内存空间或者I/O空间,到主机的地址空间,使得主机处理器能够通过这些地址来访问设备的寄存器,缓存和数据缓冲区等。
2025-07-09 17:50:10
1266
原创 PCIe基础知识之配置空间布局
本文介绍了PCIe设备的配置空间结构。PCIe配置空间从256字节扩展到4KB,包含PCI兼容空间和扩展空间,通过BDF号唯一标识设备。配置空间分为Type0(端点设备)和Type1(根复合体/交换机)两种类型,包含设备ID、厂商ID、状态寄存器等关键信息。重点阐述了BAR寄存器的配置过程:通过写入全1并读取返回值来确定设备所需内存空间大小,系统软件据此分配地址空间并写入BAR寄存器。这种机制实现了PCIe设备内存空间的动态映射,使CPU通过访问内存即可操作设备。
2025-07-09 17:46:42
872
原创 PCIe基础知识之总线拓扑结构
PCIe总线技术采用串行点对点架构,通过差分信号实现高速传输。系统由根桥设备(RC)、终端设备(EP)、桥接设备和交换机(Switch)组成层级拓扑。PCIe采用三层协议结构:事务层处理TLP包封装和流控,数据链路层确保传输可靠性,物理层负责数据分发和编码。数据传输时,各层添加校验字段和控制信息,通过多通道并行传输实现高带宽。这种分层设计提供了灵活的扩展能力和高效的数据传输机制。
2025-07-09 17:42:58
580
原创 Linux驱动学习之平台总线&设备树驱动模型
在总线上驱动和设备的名字匹配的时候,就会调用驱动的probe函数,其主要目的就是初始化驱动程序并且注册设备,使得能够与内核和其他驱动程序进行交互int err;/* 设备树中定义有: sr501-gpios=<...>;*//*该行代码的作用:从设备树中获取与 pdev 关联的设备上的 "sr501" GPIO 线。&pdev->dev: 指向 struct device 结构体的指针,这个结构体描述了一个设备。
2025-03-09 21:30:00
1752
原创 嵌入式LINUX驱动开发(三)-设备树驱动led
配置电气属性配置设备编写makefilemake编译得到ko文件和可执行文件移植到开发板insmod操作,将.ko文件注册进入设备可以通过lsmod查看是否注册成功,同时也可以切换到 cd /dev 设备是否注册然后就可以开始运行,示例:./ledtest /dev/gpioled 1led_test。
2025-02-22 18:21:47
1016
原创 嵌入式LINUX驱动开发(一)之hello驱动(基于IMX6ULL-MINI开发板)
比如驱动程序中这样包含头文件: #include <asm/io.h>, 其中的asm是一个链接文件,指向asm-arm或asm-mips,这需要先配置、编译内核才会生成asm这个链接文件。开发板上运行到内核是出厂时烧录的,你编译驱动时用的内核是你自己编译的,这两个内核不一致时会导致- -些问题。库可以和系统内核相连接,我们写了一个驱动程序,就需要告诉内核,这个过程叫做注册。其实应用程序到库是比较容易理解的,比如我们刚学习C语言的时候,使用了printf,scanf等等这些函数。而这些函数就在库中。
2025-02-10 16:36:45
1334
原创 IIC通信及设备驱动
AP3216C 是红外、光强、距离三合一的传感器。以读出光强、距离值为例。⚫ 复位:往寄存器 0 写入 0x4 ⚫ 使能:往寄存器 0 写入 0x3 ⚫ 读光强:读寄存器 0xC、 0xD 得到 2 字节的光强 ⚫ 读距离:读寄存器 0xE、 0xF 得到 2 字节的距离值 注意,AP3216C 的设备地址是 0x1E,假设节在 I2C BUS0 上,操作命令如下: 这里我们使用的是i2c-tools在开发板上进行测试,不知道这个工具的可以自行百度。
2025-02-09 16:00:04
1270
原创 SPI通信及设备驱动
SPI 主机驱动就是 SOC (System on Chip,系统级芯片或片上系统)的 SPI 控制器驱动,类似 I2C 驱动里面的适配器驱动。..............................第 41 行:transfer 函数,和 i2c_algorithm 中的 master_xfer 函数一样,控制器数据传输函数。
2025-02-09 15:56:41
1756
原创 串口通信必须要了解的基础知识概念
使用DMA方式,外部设备在数据准备好之后只需向DMA控制器发送一个命令,把数据的地址和大小传送过去,由DMA控制器负责把数据从外部设备直接存放到内存。外部设备准备好之后,向CPU发送中断信号,CPU收到中断信号后停止当前的工作,会根据中断信号指定的设备号处理相应的设备。全双工通信允许数据同时在两个方向上传输,即有两个信道,因此允许同时进行双向传输。数据位在导线中同时传输,下图显示了二进制(01000011)中字母“C”的并行传输: 当时钟线为高电平时,8个数据位同时接受数据,高电平为1,低电平为0。
2025-02-09 15:48:15
1143
原创 select、poll、epoll三者的优缺点
用户可以注册多个socket,然后调用select函数读取被激活的socket,从而实现在同一个线程内同时处理多个IO请求,在这点上select函数与同步阻塞模型不同,因为在同步阻塞模型中需要通过多线程才能达到这个目的。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。epoll使用一个文件描述符管理多个描述符,它将文件描述符的事件放入内核的一个事件表中,从而在用户空间和内核空间的复制操作只用实行一次即可。
2025-01-19 23:01:41
735
原创 基于select实现并发处理
待检测集合(第2、3、4个参数)需要频繁的在用户区和内核区之间进行数据的拷贝,效率低内核对于select传递进来的待检测集合的检测方式是线性的如果集合内待检测的文件描述符很多,检测效率会比较低如果集合内待检测的文件描述符相对较少,检测效率会比较高使用select能够检测的最大文件描述符个数有上限,默认是1024,这是在内核中被写死了的。5.循环调用select(),周期性的对所有的文件描述符进行检测6.select()解除阻塞返回,得到内核传出的满足条件的就绪的文件描述符集合。
2025-01-19 22:57:26
763
原创 IO多路复用详解-select&poll&epoll
epoll全称eventpoll,是linux内核实现IO多路转接/复用(IOmultiplexing)的一个实现。IO多路转接的意思是在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。epoll是select和poll的升级版,相较于这两个前辈,epoll改进了工作方式,因此它更加高效。对于待检测集合select和poll是基于线性方式处理的,epoll是基于红黑树来管理待检测集合的。
2025-01-19 22:53:02
1543
原创 Keil下载芯片包时找不到根目录的办法
2.重新安装的时候,一定要记住默认路径的格式(Keil_v5,,,,千万不要写为Keil5,不然识别不出来)经过三次的安装发现,在安装选择路径的时候,一定要按照默认的格式,不要瞎改,不然根本识别不出来!问题得以解决,最后附上网盘下载链接(Keil 5.39版本)
2024-12-02 19:27:34
2099
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人