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

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

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

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

2024-04-12 22:53:53 952

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

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

2024-03-25 00:32:42 719

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

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

2024-03-21 23:08:23 475

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

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

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

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

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

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

Linux GPIO驱动

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

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

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

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

原创 一个简单的CMake实例

CMake实例

2022-09-11 22:48:11 684

原创 Arm64栈回溯

手动回溯Arm64栈帧

2022-06-01 00:32:06 1925

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

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

2022-05-30 00:43:10 1942 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 4476

原创 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 2622 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 7111 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 9538

原创 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 12711 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 3433 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 9498 3

原创 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 6921 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 2447

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

原创 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 7146 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 5038

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

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

2021-07-04 23:32:23 15056 1

原创 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 975 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 1230

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

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

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

2021-04-14 20:53:09 1890 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 3694 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 781

原创 数据打包及校验

/*===================================main.c==============================*/#include <stdio.h>#include <stdlib.h>#include "ring.h"#include "pkt.h"void write_test(struct ring* ring, unsigned int len){ struct pkt* pkt = NULL; pkt =

2021-04-12 23:45:51 198

原创 Linux 解压缩命令

tar -zcvf 压缩名.tar.gz 文件/目录tar -zxvf 压缩名.tar.gztar -jcvf 压缩名.tar.bz2 文件/目录tar -jxvf 压缩名.tar.bz2zip -r 压缩包名.zip 目录/文件名unzip 压缩包名.zip

2021-04-10 10:39:26 72

原创 Android硬件抽象层HAL之简介(一)

1.HAL简介Android的HAL(Hardware Abstraction Layer,硬件抽象层)是建立在Linux内核之上的一套程序。这套程序不属于Linux内核,而是运行在用户空间。HAL层屏蔽了硬件的差异,为上层应用提供了统一的硬件操作接口,这样就可以将硬件和应用软件隔离开,应用软件不必关心底层的具体硬件,而硬件更改,只需要按照HAL接口规范和标准提供HAL程序即可,而不影响应用软件。传统的Linux驱动中包含了访问硬件的寄存器代码和业务逻辑代码。Android HAL将Linux驱动进行了

2021-04-07 22:38:41 3710

原创 Linux V4L2子系统-Video设备框架分析(二)

1.概述在V4L2子系统中,Video设备是一个字符设备,设备节点为/dev/videoX,主设备号为81,次设备号范围为0-63。在用户空间,应用可以通过open/close/ioctl/mmap/read/write系统调用操作Video设备。在内核空间中,Video设备的具体操作方法由驱动中的struct video_device提供。驱动使用video_register_device函数将struct video_device注册到V4L2的核心层,然后V4L2的核心层在向上注册一个字符设备,该字

2021-04-05 20:40:33 4721

原创 Linux V4L2子系统分析(一)

1.概述Linux系统上的Video设备多种多样,如通过Camera Host控制器接口连接的摄像头,通过USB总线连接的摄像头等。为了兼容更多的硬件,Linux内核抽象了V4L2(Video for Linux Two)子系统。V4L2子系统是Linux内核中关于Video(视频)设备的API接口,是V4L(Video for Linux)子系统的升级版本。V4L2子系统向上为虚拟文件系统提供了统一的接口,应用程序可通过虚拟文件系统访问Video设备。V4L2子系统向下给Video设备提供接口,同时管理

2021-04-03 13:18:43 4146 9

原创 Python-列表和元组

1.概述数据结构是以某种方式组合起来的数据元素(如数字、字符乃至其他数据结构)集合。在Python中,最基本的序列(sequence)数据结构为列表(list)和元组(tuple)。列表中的每个元素都有编号,即位置或索引,其中第一个元素的索引为0,第二个元素的索引为1,依次类推,同时列表中也可以嵌套列表,形成更复杂的数据结构。元组是一种特殊的序列,类似于列表,只是不能修改。2.列表2.1.列表数据类型”列表“是一个值,包含多个字构成的序列。”列表值“指的是列表本身(作为一个值,可以保存在变量中,或传

2021-03-24 20:53:30 471

原创 Python正则表达式-强口令检测

1.强口令检测写一个函数,它使用正则表达式,确保传入的口令字符串是强口令。强口令的定义是:长度不少于8个字符,同时包含大写和小写字符,至少有一位数字。 import re def isStrongPassword(password): # 长度不少于8个字符 lenRegex = re.compile(r'.{8,}', re.DOTALL) # 至少有一位数字 numRegex = re.compile(r'\d')

2021-03-24 20:52:17 814

原创 Python-组织文件

1.概述从几百个文件中找到你需要的文件,并进行复制、改名、移动或压缩,若是手动操作,则需要耗费很多的时间,可能还会犯错。对于这种繁琐的工作,可通过python编程实现自动化,既提高了工作效率又减少了错误。2.shutil模块shutil(或称为shell工具)模块中包含一些函数,让你在python程序中复制、移动、改名和删除文件。要使用shutil模块的函数,首先需要import shutil。2.1.复制文件和文件夹调用shutil.copy(source, destination),将路径so

2021-03-23 20:27:44 103

空空如也

空空如也

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

TA关注的人

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