自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

非专业业余程序员

Linux C语言 C++ 数据结构 算法

  • 博客(102)
  • 收藏
  • 关注

原创 PCIe总线-Linux内核PCIe设备枚举流程分析(十三)

当系统启动时或者有新的PCIe设备接入时,PCIe主机会扫描PCIe总线上的PCIe设备,读取设备配置空间信息,建立设备的拓扑关系,然后为设备分配资源(如内存空间、I/O空间、中断、总线编号等),最后根据设备的类型匹配驱动。下面以Linux内核为例,介绍PCIe主机枚举PCIe设备的流程。

2024-09-08 19:39:21 1081

原创 USB分析仪USB3.2日志分析

USB2.0总线采用轮询模式,即总线事务开始时,都要先发送IN或者OUT令牌包,以通知端点或者查询端点是否准备好。而USB3.2采用了异步通知模式,若端点没有准备好,则主机无需轮询,端点准备好后会通知主机,而对于OUT端点,主机会直接发送DP数据包,相当于将USB2.0中的OUT和DATA报文合二为一。USB3.2的报文格式可以参考USB3.2报文格式解析。下面借助USB分析仪,抓取USB主机和U盘之间的日志,分析USB3.2事务。

2024-08-23 22:38:40 649

原创 PCIe Linux MRRS和MPS参数设置策略

MPS(Max Payload Size)和MRRS(Max Read Request Size)共同影响PCIe总线的传输效率。如果MPS和MRRS设置的过小,传输相同长度的数据,需要更多的TLP报文,导致PCIe总线传输效率降低,如果MPS和MRRS设置的过大,超出系统中某些设备的允许值,导致这些设备无法处理TLP报文,然后上报Malformed TLP错误。因此合理的设置MPS和MRRS非常重要,内核提供了5种策略,可以根据不同的场景进行选择。

2024-08-18 21:36:29 790

原创 PCIe板卡辅助信号解析

PCIe Add-in卡借助PCIe插槽上的辅助信号,实现了很多系统级的功能,比如唤醒、复位、调试、热插拔等功能。REFCLK-/REFCLK+: 是一组低压差分信号,PCIe主板提供的REFCLK信号必须满足PCIe规范中的要求。PERST#: 信号用于复位PCIe设备,同时也指示了系统主电源的稳定时间。WAKE#: 信号用于给PCIe主机提供复位信号,由PCIe设备驱动,当PCIe主机接收到该信号后,需要向PCIe设备提供主电源和参考时钟,以激活PCIe链路。

2024-08-15 20:57:31 1648

原创 USB 3.2 报文格式解析

USB3.2定于了4种全新的报文格式,分别为链路管理包(Link Management Packets,LMP)、事务包(Transaction Packets,TP)、数据包(Data Packets,DP)、等时时间戳包(Isochronous Timestamp Packets,ITP)。如下图所示,这4种报文都在协议层生成、发送和接收。链路管理包(LMP)主要用于管理链路,在两个直接连接的link对象之间传输。

2024-08-11 21:33:20 1015

原创 PCIe总线-RK3588 PCIe RC初始化流程分析(十二)

RK3588 PCIe RC的初始化涉及PCIe设备枚举、中断(INTx、MSI、MSI-X)配置、BAR配置、ATU配置、链路训练等,下面一一介绍。

2024-08-04 19:41:47 1303

原创 PCIe总线-Linux内核PCIe软件框架分析(十一)

Linux内核PCIe软件框架如下图所示,按照PCIe的模式,可分为RC和EP软件框架。RC的软件框架分为五层,第一层为RC Controller Driver,和RC Controller硬件直接交互,不同的RC Controller,其驱动实现也不相同;第二层为Core层,该层将Controller进行了抽象,提供了统一的接口和数据结构,将所有的Controller管理起来,同时提供通用PCIe设备驱动注册和匹配接口,完成驱动和设备的绑定,管理所有PCIe设备;

2024-07-27 23:49:23 1034

原创 PCIe总线-RK3588 PCIe平台驱动分析(十)

RK3588 PCIe RC和EP使用同一个平台驱动,其主要的作用是解析设备树中的资源、初始化中断、使能电源、初始化PHY、使能时钟和释放复位,然后根据compatible属性初始化RC或者EP驱动。

2024-07-21 20:01:40 775

原创 PCIe总线-RK3588 PCIe驱动设备树介绍(九)

在Linux内核中设备树中,定义了一系列属性,用来描述PCIe总线。比如"bus-range"属性,描述PCIe某个domain的总线编号范围,比如"ranges"属性,描述PCIe地址转换。下面将分别介绍这些属性。

2024-07-21 00:52:35 1513

原创 PCIe总线-RK3588 PCIe子系统简介(八)

ITS port 1连接PCIe30X4(4L)和PCIe30X2(2L)控制器,PCIe30X4(4L)和PCIe30X2(2L)控制器使用PCIe3.0 PIPE PHY。ITS port 0连接PCIe30X1_0(1L0)、PCIe30X1_1(1L1)和PCIe30X1_2(1L2)控制器,PCIe30X1_0(1L0)和PCIe30X1_1(1L1)控制器可复用PCIe3.0 PIPE PHY和Combo PIPE PHY,PCIe30X1_2(1L2)只能使用Combo PIPE PHY。

2024-06-15 23:21:13 1654

原创 PCIe总线-事物层之TLP路由介绍(七)

下图是一个PCIe总线系统示意图。此时RC发出一个TLP,经过Switch访问EP,TLP的路径为红色箭头所示。首先TLP从RC的下行OUT端口发出,Switch的上行IN端口接收到该TLP后,根据其路由信息,将其转发到Switch的下行OUT端口,随后TLP达到EP的IN端口,最后TLP到达EP设备。TLP从RC到EP的转发过程被称为TLP的路由过程。PCIe总线总共定义了三种路由方式,分别是基于地址(Address)路由、基于ID(BDF)路由和隐式(Implicit)路由。

2024-06-02 22:16:31 1293

原创 PCIe总线-事物层之TLP请求和完成报文格式介绍(六)

TLP报文按照类型,可以大致分为4中类型,分别是IO请求报文、存储器请求报文、配置请求报文、完成报文和消息请求报文。IO请求报文可分为IO读请求(不携带数据)和IO写请求(携带数据)。存储器请求报文可分为存储器读请求(不携带数据)、带锁的存储器读请求(不携带数据)和存储器写请求(携带数据)。配置请求报文可分为配置0读请求(不携带数据)、配置0写请求(携带数据)、配置1读请求(不携带数据)和配置1写请求(携带数据)。完成报文可分为携带数据(带锁和不带锁)、不携带数据(带锁和不带锁)。

2024-05-26 18:44:36 2163

原创 PCIe总线-事物层之TLP通用格式介绍(五)

PCIe总线事务层位于应用层和数据链路层之间。发送时将应用层的数据请求转换成PCIe总线事务,然后发送到数据链路层。接收时,从来自数据链路层报文中提取PCIe总线事务,并将数据提交到应用层。事务层使用TLP表示PCIe总线事务,其由头、数据(若有)和尾(可选)组成。下图展示了TLP的发送过程和接收过程。

2024-05-05 12:36:51 2042

原创 PCIe总线-MPS MRRS RCB参数介绍(四)

PCIe总线的存储器写请求、存储器读完成等TLP中含有数据负载,即Data Payload。Data Payload的长度和MPS(Max Payload Size)、MRRS(Max Read Request Size)和RCB(Read Completion Boundary)相关。

2024-04-27 20:45:34 1953

原创 PCIe总线-配置空间介绍(三)

配置空间是PCIe设备/桥的标识符,其保存了设备/桥的信息。主机在枚举设备/桥的时候需要先访问配置空间,获取设备厂家、型号、类型、所需资源等信息,然后再分配资源,最后才能访问PCIe设备的存储或IO地址空间。PCIe总线规定了三种类型的配置空间,分别是PCIe Agent设备使用的配置空间、PCIe桥使用的配置空间和Cardbus桥片使用的配置空间,本节只介绍前两种。

2024-04-21 00:35:32 3432

原创 PCIe总线-存储器域和PCIe总线域访问流程分析(二)

PCIe总线的最大特点是像CPU访问DDR一样,可以直接使用地址访问PCIe设备(桥),但不同的是DDR和CPU同属于存储器域,而CPU和PCIe设备属于两个不同的域,PCIe设备(桥)的地址空间属于PCIe总线域。存储器域访问PCIe总线域或者PCIe总线域访问存储器域,需要经过一系列的转换才可以完成。

2024-04-12 22:53:53 2193

原创 PCIe总线-简介(一)

早期的计算机使用PCI(Peripheral Component Interconnect)总线与外围设备相连,PCI总线使用单端并行信号进行数据传输,由于单端信号很容易被外部系统干扰,其总线频率很难进一步提高。目前,为了提高总线频率以获得更高的总线带宽,高速串行总线逐步替代了并行总线,PCI Express总线已逐渐替代了PCI总线。PCI Express总线使用高速差分总线和端到端的连接方式,每个PCIe设备都有一个或多个独立的传输通道(称为"lanes"),这些通道直接连接到主板的芯片组或CPU。

2024-03-25 00:32:42 4611

原创 USB总线-Linux内核USB设备信息解析(十六)

Linux内核中USB设备信息及拓扑结构可以从/sys/kernel/debug/usb/devices和/sys/bus/usb/devices中获取,下面介绍这些信息如何解读。

2024-03-21 23:08:23 1011

原创 USB2.0设备检测过程信号分析

这里写自定义目录标题1.简介2.硬件2.1.Low-speed2.2.Full-/High-speed3.信号电平3.1.Low-/Full-speed3.2.High-speed4.检测过程参考资料1.简介USB设备接入的Hub端口负责检测USB2.0设备是否存在和确定USB2.0设备的速度。检测设备是否存在和确定设备速度涉及一系列的信号交互,下面将分析该过程。2.硬件USB低速设备和全速/高速设备的连接器在硬件结构上有所不同,而主机或者Hub接收端连接器的D+、D-接有15K的下拉电阻。2.1

2024-03-08 22:24:21 2164

原创 USB总线-Linux内核USB3.0 Hub驱动分析(十四)

USB Hub提供了连接USB主机和USB设备的电气接口。USB Hub拥有一个上行口,至少一个下行口,上行口连接上一级的Hub的下行口或者USB主机,连接主机的为Root Hub,下行口连接下一级Hub的上行口或者USB设备。经过Hub的扩展,一个USB主机可以和多个USB设备通信。良好的扩展性电源管理探测设备连接和断开连接总线错误探测和修复支持USB1.0、USB1.1、USB2.0、USB3.2设备。

2023-11-26 23:12:57 1585

原创 USB总线-Linux内核USB3.0主机控制器驱动初始化流程分析(十三)

RK3588有2个USB3.0 DRD控制器,2个USB2.0 Host控制器。USB3.0 DRD控制器既可以做Host,也可以做Device,向下兼容USB2.0和USB1.0。USB3.0 DRD控制器的内部结构如下图所示;总线接口为AXI或AHB;USB3.0和USB2.0及USB1.0硬件上独立;USB3.0控制器数字逻辑部分对应SS MAC,PHY接口为PIPE,PHY为USBDP PHY,和DP使用同一个PHY;

2023-10-13 00:14:34 3593 1

原创 USB总线-Linux内核USB3.0主机控制器驱动框架分析(十二)

如下图所示,Linux内核中USB主机体系结构由五部分组成,分别为Application Software、USB Class Driver、USB Core(USB Driver)、USB Host Controller Driver、USB Host Controller。应用程序处于用户空间,通过系统调用访问Class Driver,从而间接的访问USB设备,如主机端的应用程序aplay、arecord可以访问USB音频设备。

2023-09-24 23:05:37 1853

原创 USB3.2链路训练及状态机解析

LTSSM(Link Training and Status State Machine)定义了USB3.2总线链路层连接性及链路层电源管理。LTSSM由12种不同的链路状态组成,可以根据它们的功能对其进行表征。LTSSM有4个可操作的link状态,分别为U0、U1、U2及U3。U0是使能Enhanced SuperSpeed链路的状态,此使总线上可以传输数据包,也可以处于空闲状态。U1是低功耗的link状态,此时总线上没有数据传输,且Enhanced SuperSpeed总线链路层连接性被关闭。

2023-08-18 23:31:10 4121

原创 Linux GPIO模块-RK3588 GPIO驱动分析

Linux GPIO驱动

2023-02-12 20:55:39 5220 1

原创 USB总线-Linux内核USB设备驱动ftrace分析(十一)

ftrace追踪USB设备驱动工作过程

2022-10-04 14:52:39 2029 1

原创 一个简单的CMake实例

CMake实例

2022-09-11 22:48:11 741

原创 Arm64栈回溯

手动回溯Arm64栈帧

2022-06-01 00:32:06 2216

原创 使用GDB调试Linux内核空指针问题

1.概述在Linux内核开发中,我们会经常遇到访问空指针导致内核Oops或panic。遇到这种问题,需要先定位出是哪一个函数、哪一个变量导致的异常。通常情况下,Linux内核会打印出异常时的栈、模块、CPU寄存器等信息,但某些情况下,栈被破环,只能输出寄存器信息(U-Boot发生异常时只会输出寄存器信息),那我们只能根据寄存器信息还原出发生异常时的现场。2,实例如下图所示,内核明确的出了异常原因-访问空指针,空指针解引用地址为0x00000003(若异常地址不为0,应该是访问了某个结构体中的变量,加上

2022-05-30 00:43:10 2317 2

原创 USB总线-Linux内核USB3.0设备控制器中断处理程序分析(九)

1.概述USB设备枚举、请求处理、数据交互都涉及USB设备控制器中断。当有事件发生时,USB设备控制器首先将事件信息通过DMA写入到事件缓冲区中,然后向CPU发出中断,随后CPU调用中断处理函数开始处理中断事件。2.事件dwc3 USB设备控制器事件使用dwc3_event数据结构描述,由4个字节组成。按位域区区分,可分为3类事件,分别为设备端点事件、设备事件及其他核心事件。dwc3_event_type用来描述事件的类型,is_devspec == 1表示事件为设备事件,否则表示设备端点事件。dwc

2022-05-06 23:41:30 5308 1

原创 USB总线-Linux内核USB3.0设备控制器复合设备之legacy方式分析(八)

1.概述在usb gadget configfs引入到内核之前,内核都使用硬编码的方式实现复合设备,无法在用户空间动态修改和绑定不同的function驱动,若要修改,则需要修改内核代码,重新编码,非常不方便。目前这部分代码在被放到drivers/usb/gadget/legacy/目录下。被编译成内核模块时,名称以g开头,如音频设备g_audio.ko、串口设备g_serial.ko、CDC设备及大容量存储设备g_multi.ko。USB gadget configfs和legacy相比只是实现复合设备的

2022-03-31 23:11:53 2934 1

原创 USB总线-Linux内核USB3.0设备控制器复合设备之USB gadget configfs分析(七)

1.简介configfs是基于ram的文件系统,与sysfs的功能有所不同。sysfs是基于文件系统的kernel对象视图,虽然某些属性允许用户读写,但对象是在kernel中创建、注册、销毁,由kernel控制其生命周期。而configfs是一个基于文件系统的内核对象管理器(或称为config_items),config_items在用户空间通过mkdir显式的创建,使用rmdir销毁,在mkdir之后会出现对应的属性,可以在用户空间对这些属性进行读写,与sysfs不同的是,这些对象的生命周期完全由用户空

2022-03-23 22:26:56 7807 3

原创 USB总线-Linux内核USB3.0设备控制器之UDC驱动分析(六)

1.概述UDC驱动的接口都定义在drivers/usb/gadget/udc/core.c文件中。USB Function驱动通过调用这些接口匹配及访问USB设备控制器,而底层USB控制器驱动要实现这些接口定义的功能。下面分析一下主要的UDC驱动接口调用流程。2. 接口分析2.1.驱动绑定Composite层通过调用UDC core层的usb_udc_attach_driver和usb_gadget_probe_driver接口将Function驱动和UDC驱动绑定。前者通过UDC设备的名称匹配,通

2022-03-13 22:02:29 10460 2

原创 USB总线-Linux内核USB3.0设备控制器之dwc3 gadget驱动初始化过程分析(五)

1.概述USB设备控制器(UDC)驱动的框图如下图所示,由三部分组成。第一部分是UDC驱动核心层,在drivers/usb/gadget/udc/core.c文件中实现,该层是一个兼容层,将USB Function驱动和具体的USB gadget驱动隔离开,抽象了统一的接口和数据结构,向USB Function驱动提供了统一且稳定的接口,同时完成USB Function驱动和USB gadget驱动的匹配。第二部分是gadget driver层,负责驱动硬件工作,和具体的USB设备控制器硬件相关,dwc3

2022-02-17 21:44:47 14821 5

原创 ARMv8-A寄存器介绍

4.ARMv8寄存器AArch64执行状态提供了31个64位通用寄存器,可以在所有异常级别中随时使用。每个寄存器的位宽都为64 bits,当使用全部64 bits时,称为X0-X30,当使用低32 bits时,称为W0-W30。AArch64过程(函数)调用使用X30寄存器保存返回地址,而异常的返回地址由ELR寄存器保存,而在AArch32中,过程调用和异常的返回地址都由LR寄存器保存。32位W寄存器使用对应64位X寄存器的低32位,即W0对应X0的低32位,W1对应X1的低32位,以此类推。读取W寄

2021-12-12 20:04:43 3870 2

原创 ARMv8汇编指令-adrp、adr、adr_l

1.概述在阅读Linux内核代码时,经常能碰到汇编代码,网上能查的资料千篇一律,大多都描述的很模糊。俗话说,实践是检验真理的唯一标准,我们就参考官方文档,自己写汇编代码并反汇编,探寻其中的奥妙。2.adrp在Linux内核启动代码primary_entry中,使用adrp指令获取Linux内核在内存中的起始页地址,页大小为4KB,由于内核启动的时候MMU还未打开,此时获取的Linux内核在内存中的起始页地址为物理地址。adrp通过当前PC地址的偏移地址计算目标地址,和实际的物理无关,因此属于位置无关码

2021-12-11 18:34:23 11128 5

原创 USB总线-Linux内核USB设备驱动之UAC2驱动分析(十)

1.概述UVC(USB Audio Class)定义了使用USB协议播放或采集音频数据的设备应当遵循的规范。目前,UAC协议有UAC1.0和UAC2.0。UAC2.0协议相比UAC1.0协议,提供了更多的功能,支持更高的带宽,拥有更低的延迟。Linux内核中包含了UAC1.0和UAC2.0驱动,分别在f_uac1.c和f_uac2.c文件中实现。下面将以UAC2驱动为例,具体分析USB设备驱动的初始化、描述符配置、数据传输过程等。2.UAC2.0 Gadget Function驱动下面是UAC2.0的

2021-11-21 19:39:37 8912 14

原创 Linux内核错误码和错误指针

1.IS_ERR_VALUELinux内核中,最大错误码的值为MAX_ERRNO,错误码为负数,负数以补码的形式存储。Arm32位系统错误码的补码范围为0xFFFFF000 - 0xFFFFFFFF。Arm64系统错误码的补码范围为0xFFFFFFFFFFFFF000- 0xFFFFFFFFFFFFFFFF。Arm32位系统Linux内核的虚拟地址范围:0xC0000000 - 0xFFFFFFFF,最后一页(页大小为4KB)为预留地址,即0xFFFFF000 - 0xFFFFFFFF地址范围为预留地址

2021-11-13 19:24:56 2734

原创 USB总线-Linux内核USB3.0设备控制器驱动框架分析(四)

1.概述如下图所示,USB控制器可以呈现出两种不同的状态。USB控制器作为Host时,称为USB主机控制器,使用USB主机控制器驱动。USB控制器作为Device时,称为USB设备控制器,使用UDC(usb device controller)驱动。本节只分析USB控制器作为Device时的驱动框架。USB控制器作为Device时,驱动框架可分为5层。最上层的是Gadget Function驱动,代表了具体设备的驱动,如大容量存储设备驱动(U盘、移动硬盘等)、通讯类设备驱动(USB串口、USB虚拟网卡等

2021-09-16 22:26:11 5712

原创 USB总线-Linux内核USB3.0控制器初始化代码分析(三)

1.概述RK33999使用synopsys dwc3的USB3.0控制器IP。早期的初始化需要在两个模块中进行,一个在rockchip官方提供的驱动中初始化,位于drivers/usb/dwc3/dwc3-rockchip.c文件中,主要初始化和CPU紧密相关的内容,如时钟、复位、电源、extcon(用于USB模式切换),另一个在synopsys提供的驱动中初始化,位于drivers/usb/dwc3/core.c文件中,这部分和USB3.0控制器密切相关,如USB3.0控制器内部寄存器地址、USB3.0

2021-07-25 23:50:43 8013 5

原创 USB总线-RK3399 USB3.0控制器特性介绍(二)

1.RK3399 USB下图是RK3399 SOC的框图。RK3399包含了2个USB2.0 Host控制器;两个USB3.0 OTG控制器,同时兼容USB2.0。USB3.0使用的是Synopsys公司的IP,驱动也使用Synopsys的dwc3 USB驱动。2.USB3.0 OTG Controller简介USB3.0 OTG控制器可以作为主机(Host)、设备(Device),或者根据从USB2.0 PHY和DFP/UFP/Data Role Swap输入的ID状态确定是USB2.0/3.0

2021-07-04 23:38:09 5422

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除