自定义博客皮肤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++ 数据结构 算法

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

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

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

2024-07-21 20:01:40 270

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

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

2024-07-21 00:52:35 796

原创 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 864

原创 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 1011

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

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

2024-05-26 18:44:36 1526

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

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

2024-05-05 12:36:51 1258

原创 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 1451

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

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

2024-04-21 00:35:32 1859

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

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

2024-04-12 22:53:53 1615

原创 PCIe总线-简介(一)

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

2024-03-25 00:32:42 2535

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

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

2024-03-21 23:08:23 787

原创 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 1539

原创 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 1247

原创 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 3073 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 1664

原创 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 3287

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

Linux GPIO驱动

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

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

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

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

原创 一个简单的CMake实例

CMake实例

2022-09-11 22:48:11 709

原创 Arm64栈回溯

手动回溯Arm64栈帧

2022-06-01 00:32:06 2082

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

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

2022-05-30 00:43:10 2149 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 4969

原创 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 2817 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 7535 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 10056 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 13870 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 3685 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 10456 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 7597 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 2591

原创 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 5446

原创 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 7641 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 5259

原创 USB总线-USB总线简介(一)

1.简介USB是通用串行总线(Universal Serial Bus)的缩写。在USB总线出现之前,计算机与键盘、鼠标、扫描仪、打印机都使用专用的接口连接,不同设备的接口不能互用,扩展性很差,每次插拔设备都要关闭计算机,不支持热插拔,且通信速率很低。为了解决上述问题,USB总线诞生了。USB总线就好像一条管道,管道里流过的东西只要符合USB协议,至于具体流的是什么东西,USB总线并不关心,可以是自来水,可以是污水,可以是天然气,也可以是石油。对应具体的设备上,只要是支持USB协议的设备,都可以连接计算机

2021-07-04 23:32:23 16282 2

原创 ARMv8-A Architecture Processors

1.ARMv8-AARMv8-A用于描述包含32位指令和64位指令执行状态的架构。ARMv8-A架构可以高效的处理位宽位为64的寄存器,同时保持兼容现存的ARNv7软件。下图是ARMv8架构的发展过程,从最早的v5架构(支持VFPv2),经过v6架构(支持Thumb-2,TrustZone,SIMD)和v7架构(VFPv3/v4,NEON),最终推出了v8架构。v8架构是ARM推出的第一个支持64位指令的架构,兼容早期v7架构的关键特性,拥有AArch32(执行32位指令)和AArch64(执行64位指令

2021-06-05 16:34:25 1079 2

原创 Linux V4L2子系统-视频像素格式介绍(番外篇)

1.视频概述视频用来或记录、或显示、或同时记录显示运动对象,它由一系列在固定时间间隔拍摄的图片组成。每秒钟的帧(图片)数叫作帧率。低于10帧每秒(f/s)的帧率有时候用于甚低比特率(低于64bit/s)视频通信。对于低比特率视频通信,在10-20之间的f/s较为常见。25f/s或30f/s是电视图像的标准;而50f/s或60f/s则能产生相当平滑的运动。视频可被分为模拟和数字类型。模拟视频用模拟信号来表示,由模拟摄像机进行逐行扫描或隔行扫描捕获。模拟视频的例子之一就是在模拟电视制式如PAL和NTSC中所

2021-04-26 23:13:34 1356

原创 1.C++11-可变参数模板(Variadic Templates)

1.概述可变参数模板(variadic template)是一个接收可变数目参数的模板函数或模板类。可变数目的参数被称为参数包(parameter packet)。存在两种参数包:模板参数包(template parameter packet),表示零个或多个模板参数;函数参数包(function parameter packet),表示零个或多个函数参数。2.语法用一个省略号指出一个模板参数或函数参数表示一个包。在一个模板参数列表中,class...或typename...指出接下来的参数表示零个或

2021-04-24 21:36:34 447

原创 Linux V4L2子系统-应用层访问video设备(四)

1.概述V4L2子系统向上提供了很多访问Video设备的接口,应用程序可以通过系统调用访问Video设备。但由于Video设备千差万别,很少有设备驱动程序能支持所有的接口功能,因此在使用之前,需要了解设备驱动程序支持的功能。2.访问流程2.1.打开设备文件视频设备与其他设备一样可以视为一个文件,所以使用open打开文件。可以是阻塞打开,也可以是非阻塞打开,非阻塞打开,若没有数据,则会返回错误。 #include <sys/types.h> #include <sys

2021-04-14 20:53:09 1998 5

原创 Linux V4L2子系统-videobuf2框架分析(三)

1.概述Video设备产生的数据较多,传统的缓冲机制已不能满足需求。为此,Linux内核抽象出了videobuf2机制,用于管理存放视频图像的帧缓冲。videobuf2抽象层像一座桥梁,将用户空间和V4L2 driver连接起来。videobuf2抽象层向用户空间提供了标准POSIX I/O系统调用,包括read、poll及mmap等,同时还提供了大量与流式I/O相关的V4L2 ioctl调用,包括缓冲区分配、缓冲区入队、缓冲区出队及流控制。虽然使用videobuf2会给驱动程序强加一些设计决策,但是使用

2021-04-13 22:31:48 4051 5

原创 Linux平台使用原始Socket发送ARP报文

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/ioctl.h>#include <net/if.h>#include <

2021-04-12 23:51:37 847

空空如也

空空如也

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

TA关注的人

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