- 博客(128)
- 收藏
- 关注
原创 MIPI CSI 详细分析
----------------------------[共享的I2C总线]--------------------------------------------------> [Host Controller]它将采集到的图像数据打包成 MIPI CSI-2 协议的数据包,通过物理层(D-PHY 或 C-PHY)串行输出。• 传感器与 MAX9295:标准的 MIPI CSI-2 接口,包括 MIPI_CLK+/CLK-, MIPI_D0+/D0-, MIPI_D1+/D1- 等。
2025-09-16 17:19:46
879
原创 Linux内核中那些子系统
好的,这是一个非常棒的问题,也是Linux内核开发者或高级系统工程师面试时的经典问题。• 对于核心子系统(进程、内存、VFS、驱动模型):不仅要理解其基本概念和工作原理,还要能阅读相关代码,并使用工具(如ftrace, perf)进行分析和调试。◦ 功能:提供一种统一的模型来表示设备、驱动和总线,以及它们之间的关系。◦ 功能:限制、记录和隔离进程组的资源使用(CPU、内存、磁盘I/O、网络等)。◦ 功能:负责进程和线程的创建、销毁、调度、执行以及它们之间的通信(IPC)。
2025-09-16 17:19:27
703
原创 PCIE分析和实践应用调试
发送端通过8b/10b(Gen1/2)或128b/130b(Gen3+)编码方案,确保数据流中有足够的电平跳变(Transition),接收端可以从数据流中利用锁相环 (PLL) 恢复出时钟信号(Clock Recovery)。这是最强大的工具,可以非侵入式地拦截、解码、分析链路上流动的所有TLP、DLLP和有序集,是定位物理层、链路层和事务层问题的终极手段。• 数据链路层包 (DLLP):用于链路管理,如确认(ACK)、非确认(NAK,请求重传)、电源管理、流量控制信用更新。
2025-09-16 15:10:24
1184
原创 CPU占用高的排查和调试
好的,CPU 占用率过高是一个复杂的系统性问题,需要一套系统化的方法来排查和调试。这不仅仅是一个命令,而是一个完整的调查过程。以下是一份从浅入深、极其详细的排查和调试指南。第一阶段:宏观定位 - 找到“罪魁祸首”进程首先,你需要快速识别是哪个或哪些进程导致了全局CPU使用率飙升。• F5:以树状视图显示进程和线程,清晰展示父子关系。• F6:可以选择按各种指标排序(如PERCENT_CPU)。• 鼠标点击:可以直接点击列名进行排序,非常直观。
2025-09-16 14:57:52
920
原创 内核的启动流程
通常,为了灵活性,第一阶段会直接加载位于活动分区上、磁盘系统内的一个更大的、功能完整的引导加载程序(如 GRUB 的 core.img)。◦ 如果用户选择文本登录,init 会启动一个 getty 进程(管理终端),该进程会启动 login 程序验证用户,验证成功后最终启动用户的默认 Shell(如 Bash 或 Zsh)。首先运行的是一个解压程序,它将内核主体解压到合适的内存位置。◦ 限制:由于只有 446 字节,代码功能非常有限,它的主要任务是加载下一阶段的、更复杂的引导加载程序。
2025-09-16 14:05:27
1068
原创 initramfs调试
是的,内核初始化阶段(start_kernel)的执行先于 initramfs 的处理。这是 Linux 启动流程中一个关键的顺序关系。Linux 内核启动流程可分为几个明确的阶段,按顺序如下:Bootloader 阶段(GRUB/U-Boot):加载内核映像(vmlinuz)和 initramfs 到内存。内核初始化阶段(start_kernel):初始化核心子系统(内存管理、调度器、中断等)。initramfs 处理阶段:解压并挂载临时根文件系统,加载必要驱动(如磁盘、文件系统模块)。
2025-09-16 13:52:58
859
原创 系统调用libc详解
好的,这是一个非常深入的话题。我将从原理、本质到实现细节,为您全面解析系统调用、libc以及如何实现自定义系统调用。第一部分:系统调用的调用方式(Beyond libc)系统调用是用户程序请求内核服务的唯一正式途径。虽然最常用的方式是通过标准库(如glibc),但还存在其他方式。• 角色:libc作为系统调用的封装器(Wrapper),提供了符合POSIX标准的友好API。• 原理:绕过libc,直接使用汇编指令触发软中断或执行syscall指令。
2025-09-16 11:02:30
497
原创 Platform与Bus总线详解与区别
在 Linux 内核驱动模型中,总线(Bus)、设备(Device)、驱动(Driver) 是核心概念,而 Platform 设备/驱动 是一种特殊的虚拟总线机制,用于管理那些不直接挂载在标准硬件总线(如 PCI、USB、I2C 等)上的设备。• 总线核心层(如 pci_bus_type、usb_bus_type)提供 match() 方法,通常基于 硬件 ID(如 PCI 设备的 vendor_id 和 device_id,USB 设备的 interface_class)。// 注册 PCI 驱动。
2025-09-16 10:26:41
816
原创 USB-4G模块为何同时存在控制和中断模型?
结论: 所谓的“同时存在”,并不是指物理信号同时在线上传输(那是做不到的),而是指在极短的时间尺度(毫秒/微秒级)内,由主机控制器进行快速轮询和调度,让不同目的的通信分时共享同一条物理链路。虽然USB只有一对差分数据线(D+和D-),但在逻辑上,它通过端点(Endpoint) 和管道(Pipe) 的概念,为不同的数据传输目的创建了多条完全独立的逻辑通道。◦ 项目经理识别到这是一个高优先级的控制请求,他可能会中断当前的批量传输,或者在下一个帧的开始,优先处理这个控制传输的建立、数据和状态阶段。
2025-09-16 09:34:26
405
原创 initramfs启动必要么?
◦ 然后,内核在这个临时的根文件系统中查找并执行一个名为 /init 的脚本或程序(这个文件可能是脚本,也可能是编译的二进制文件)。◦ 系统切换后,它会执行真实根文件系统中的 /sbin/init 程序(通常是 Systemd 或 SysVinit),从而继续后续的系统启动过程(如挂载其他文件系统、启动服务等)。◦ 最后,它执行一个名为 pivot_root 的系统调用,将刚刚挂载的真实根文件系统(/root)切换为新的根文件系统(/),并清理 initramfs 占用的内存。
2025-09-16 09:25:55
739
原创 usb 四种传输类型
领导(主机)问一个问题(Setup),下属(设备)提供答案(Data),最后领导确认“收到,正确”(Status)。下属(设备)每隔一段时间就向领导(主机)报告一下情况(有数据就报告,没数据就说“无事”)。他们专门在网络不拥堵的时候(空闲带宽)搬运大量货物(数据),并且会仔细清点,确保一件不差,但不在乎送货是上午还是下午。简单比喻: 像是现场直播。可靠性 高(有校验和重传) 高(有校验和重传) 高(有校验和重传) 低(无重传,可能丢失)数据域 数据、状态、确认 数据、确认 数据、确认 只有数据(无确认)
2025-09-16 09:23:48
518
原创 USB-4G模块全面分析
USB 4G 模块本质上是一个通过 USB 接口与主机(如电脑、嵌入式设备)连接的调制解调器(Modem)。它的核心功能是将主机的网络数据包(如 IP 包)通过移动网络(4G LTE)发送出去,并将接收到的移动网络数据包通过 USB 接口传回主机。数据吞吐时序: USB 主机控制器会定期向模块的端点(Endpoint)发起 IN(读)或 OUT(写)事务请求。对于 4G 模块而言,更重要的“时序”概念是其内部状态机和与基站的交互时序,但这部分对 USB 主机是透明的。好的,这是一个非常专业和深入的问题。
2025-09-16 09:22:27
1648
原创 uboot与 kernel的驱动模型与DTS
理解这种“阶段化”的设计是理解嵌入式 Linux 启动过程的关键。内容范围 最小集:通常只包含引导相关的关键设备 完整集:包含SoC上所有设备,无论U-Boot是否使用 范围由阶段决定:U-Boot 是阶段性工具,内核是最终运行时。设备树(DTS):U-Boot 和 Kernel 共享同一份设备树源码(.dts文件),但根据各自的需求,处理和使用它的方式和范围不同。运行时作用 一次性使用,完成后可丢弃 持续使用,是驱动匹配和设备管理的基石 生命周期决定重要性:对内核而言,DTS是长期运行的基础。
2025-09-15 17:22:15
1038
原创 /proc&/sys&/dev实操
深入分析 /proc、/sys 和 /dev 的异同与实现Linux 内核通过 /proc、/sys 和 /dev 三种接口向用户空间暴露不同的功能,它们在设计目标、使用方式和实现机制上有显著区别。下面我们将详细分析它们的特性、关系,并给出一个完整的 demo_test 实现。特性 /proc (procfs) /sys (sysfs) /dev & ioctl设计目的 内核状态查询与动态调参 设备管理、电源控制、热插拔 硬件设备操作(数据+控制)
2025-09-15 17:02:32
657
原创 /proc&/sys&/dev
下面详细分析它们的设计原理、使用方法和典型应用场景。驱动参数调整 /sys/module/rcutree/parameters/rcu_expedited 动态修改内核模块参数。电源管理 /sys/power/state 控制系统休眠状态(如 echo mem > /sys/power/state)。内核参数调整 /proc/sys/net/ipv4/ip_forward 动态修改内核参数(如启用 IP 转发)。设备配置 /sys/class/net/eth0/mtu 修改网卡 MTU 大小。
2025-09-15 16:49:14
705
原创 MIPI LVDS&DSI
它不仅包括了卡车(物理层),还规定了集装箱的标准尺寸和颜色编码(数据包结构)、物流单据的格式(命令集)、仓库的装卸流程(上下电序列)以及全球GPS跟踪系统(双向通信)。数据内容 打包的像素和命令包 原始的像素和时序信号 DSI传输的是有结构的报文(信封),收件人(屏IC)需要拆开信封并根据指示做事。需要与外部源严格同步的显示。• 分析: 解码波形后,发现一条设置像素格式的命令(MIPI_DCS_SET_PIXEL_FORMAT)参数与屏规格书要求不符(驱动写的是0x77,但屏要求0x66)。
2025-09-15 16:26:09
904
原创 内核驱动initcall顺序初始化
Linux 内核驱动模块初始化级别(initcall 机制)详解Linux 内核的 initcall 机制 决定了驱动模块在内核启动或加载时的初始化顺序。不同的驱动模块可能依赖其他模块或内核子系统,因此需要按照一定的顺序初始化,以确保系统正确运行。本文将详细分析 initcall 机制 的原理、实现方式,以及如何利用它控制驱动加载顺序。在内核启动或模块加载时,不同的驱动或子系统需要按照依赖关系和功能优先级进行初始化。例如:• 硬件探测驱动(如 PCI、USB)需要先于设备驱动(如网卡、显卡)初始化。
2025-09-15 16:03:26
971
原创 内核驱动模块的声明类
/ 可通过 /sys/module/module_name/parameters/ 修改。设备支持 MODULE_DEVICE_TABLE 声明支持的设备ID MODULE_DEVICE_TABLE(pci, my_table)MODULE_SOFTDEP(“pre: module_A”);参数控制 module_param 定义运行时参数 module_param(debug, int, 0644)初始化 module_init 定义模块初始化函数 module_init(my_init)
2025-09-15 15:47:11
668
原创 4G模块详解
它通常不是直接来自USB的5V,而是由主板上的电源管理集成电路(PMIC) 将系统电源(可能是5V或电池电压)转换而来的一个3.3V ~ 3.8V的高电流、低噪声、高稳定度的直流电源。◦ 网络建立:使用 pppd 或 ModemManager 等工具,在 /dev/ttyUSB2 或 /dev/ttyUSB3 上拨号,建立PPP连接,从而创建一个 ppp0 网络接口。电源开关键 (PWRKEY) PWRKEY# 模块启动/关闭的控制引脚(详见电源管理) 1.8V/3.0V CMOS,低电平有效 必需。
2025-09-15 14:49:01
1821
原创 4G模块的供电
模块的主电源(VCC)是通过模块连接器上独立的引脚,直接从主板的PMIC电源网络引过来的。• 需要在模块的 VCC 引脚附近放置多个大容值的去耦电容(例如100μF)和小容值的滤波电容(0.1μF),以应对发射信号时的瞬时大电流(峰值可达2A+),防止电压被拉低导致模块重启。VBUS (Pin 41, 43) USB_VBUS (5.0V) SoC的USB Host接口的VBUS 来自USB口的5V电源,电流能力有限(通常500mA-900mA)。您需要将4G模块想象成主板上的一个独立子系统。
2025-09-15 14:48:14
1141
原创 kernel中驱动加载顺序详解
Linux 内核驱动加载顺序调整方法详解在 Linux 内核中,驱动加载顺序的调整涉及多个层面的机制,包括内核初始化阶段的优先级控制、模块依赖管理、设备驱动模型等。以下是 6 种核心方法的详细解析,涵盖原理、实现方法及完整示例。原理• 作用:声明模块间的软依赖关系,引导 modprobe 按顺序加载模块。• 底层机制:依赖信息存储在模块的 .modinfo 段,由 depmod 生成 /lib/modules//modules.dep 文件。• 特点:非强制性,若依赖模块不存在,当前模块仍可加载。
2025-09-15 14:02:29
983
原创 在kernel中,用户层与内核层 如何通信,有那些手段
内核层运行在权限最高的“内核态”,管理硬件、内存、进程等核心资源。• Sysctl (/proc/sys/):通过修改 /proc/sys/ 下的文件或使用 sysctl 命令,可以动态调整内核运行时参数(如网络栈参数、虚拟内存参数)。用户层(User Space)和内核层(Kernel Space)的通信是操作系统设计的基石,通常称为用户态与内核态的交互。• 工作原理:用户进程可以直接通过指针访问映射的内存区域,而对这片区域的读写操作会由内核自动回写到文件或相应的内核缓冲区中。
2025-09-15 13:39:51
867
原创 基于地平线J5的时间同步方案
简介在高级驾驶辅助系统(ADAS)场景中,时间同步是一个至关重要的需求,因为它确保了系统中所有传感器和处理单元的数据在时间上是一致的。准确的时间同步允许系统准确地重建和理解车辆周围的环境,这对于决策制定和执行动作至关重要。具体比如,各个传感器的时钟有偏差,各种传感器的采样频率也不一致,当前激光典型采样频率为10HZ,相机为30fps,高精度组合导航为100HZ。没有准确的时钟同步,各传感器在哪一帧进行融合,在哪里进行插值都没法进行判断。两个传感器即使采样频率一致,其每帧数据的采样点也一般不一致。
2024-12-12 16:26:54
1471
原创 初识U-Boot和Linux内核的设备驱动模型
总的来说,U-Boot的设备驱动模型更侧重于bootloader阶段的硬件初始化和操作,而Linux内核的设备驱动模型则提供了一个全面、动态和模块化的设备管理框架。Linux内核的设备驱动模型则更加复杂和全面,它支持动态加载和卸载驱动,以及设备的热插拔。U-Boot的驱动模型通常不涉及复杂的设备发现和匹配机制,设备的初始化和配置更多是通过静态方式在U-Boot中完成的。Linux内核的设备驱动模型通过总线机制来发现和匹配设备,驱动可以根据设备的ID和其他属性来自动匹配和初始化设备。
2024-11-20 16:09:01
432
原创 systemd最大的误解
自从我们首次提议将systemd 纳入发行版以来,它就经常出现在许多论坛、邮件列表和会议上。在这些讨论中,人们经常会听到一些关于 systemd 的谣言,这些谣言被一遍又一遍地重复,但不断重复肯定不会带来任何真相。让我们花点时间来揭穿其中的一些谣言:误解:systemd 是整体式的。如果您在启用所有配置选项的情况下构建 systemd,您将构建 69 个单独的二进制文件。这些二进制文件都用于不同的任务,并且由于多种原因而被整齐地分开。例如,我们在设计 systemd 时考虑到了安全性,因此大多数守护进程
2024-11-05 16:08:50
584
原创 linux的errno返回值含义
4)errno是线程安全的,在一个线程中设置它,不会影响别的线程对它的使用。这一点很重要,不知道有没有像我之前有过这样的问题:看起来errno像是一个全局的变量,应该不是线程安全的吧?看了这个之后,就有答案了,errno是thread-local的,也就是每个线程都有一个。2)errno的有效值都是非零的。(这个manpage有个悖论,第二段中说,errno从来不能被设为0,而在第三段又说有些接口会将其设置为0)3)errno在ISO C标准中定义的,它可能是一个宏并且不能被显示声明(也就是重新定义)。
2024-10-14 11:06:38
1203
原创 Linux设备树
如果节点没有“reg”属性值,可以直接省略“@unit-address”, 不过要注意这时要求同级别的设备树下(相同级别的子节点)节点名唯一,从这个侧面也可以了解到, 同级别的子节点的节点名可以相同,但是要求“单元地址”不同,node-name@unit-address 的整体要求同级唯一。例如本地总线为树的“主干”在设备树里面称为“根节点”, 挂载到本地总线的IIC总线、SPI总线、UART总线为树的“枝干”在设备树里称为“根节点的子节点”, IIC 总线下的IIC设备不止一个,这些“枝干”又可以再分。
2024-09-29 15:59:43
1498
1
原创 Linux DTS(Device Tree Source)设备树详解之三(高通MSM8953实例分析篇)
iqs263节点中的pinctrl-0 属性指向了表明其io口属性的节点为iqs263_irq_config,相关代码也在2.3.1指示的msm8953-pinctrl.dtsi文件中。i2c_8节点中的pinctrl-0指向了定义其io口的节点i2c_8_active和i2c_8_sleep,代码如下可见该i2c的IO口为Gpio98和Gpio99。在前两篇中我们了解了DTS的背景基础知识以及发挥作用的流程,这篇文章我们以高通的MSM8953平台为例来添加一个基础的i2c设备(包含一个gpio中断)。
2024-09-29 15:02:07
828
原创 Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)
目录Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)Dts中相关符号的含义DTS中几个难理解的属性的解释地址中断其他DTS设备树描述文件中什么代表总线,什么代表设备由DTS到device_register的过程查看挂载上的所有设备请尊重原创版权,转载注明出处。Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)
2024-09-29 15:00:49
1203
原创 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)
目录什么是DTS?为什么要引入DTS?二.DTS基本知识DTS的加载过程DTS的描述信息DTS的组成结构dts引起BSP和driver的变更常见的DTS 函数DTC (device tree compiler)请尊重原创版权,转载注明出处。什么是DTS?为什么要引入DTS? DTS即Device Tree Source 设备树源码, Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。 在Linux 2.6中,ARM架构的板极硬件细节过多
2024-09-29 15:00:04
1624
原创 uboot编译之编译过程二
Makefile核心是依赖和命令;对于每个目标,会先检查依赖,如果依赖存在则执行命令更新目标;如果依赖不存在,则会以依赖为目标,先生成依赖,依赖生成后,则执行命令。
2024-05-17 17:57:04
369
1
原创 U-boot编译make配置过程
u-boot从v2014.10版本后引入kBuild系统,使得其Makefile变的更加复杂;整个Makefile中,嵌套其他不同用途的Makefile,本文将进行简单的分析.
2024-05-17 17:55:05
410
原创 U-boot管脚复用
While the GPIO direction is set to input (GPIO_GDIR = 0), a read access to GPIO_DR does not return GPIO_DR data. Instead, it returns the GPIO_PSR data, which is the corresponding input signal value.实际上PSR才是读到的值。GPIO1_IO02代表GPIO1组寄存器的第02个寄存器,也就是第3位。
2024-05-17 17:49:43
894
原创 U-boot启动内核之二bootm启动内核
整理自[uboot] uboot启动kernel篇(二)——bootm跳转到kernel的流程](bootm根据参数指向的镜像填充此结构体,然后使用结构体的内容填充kernel的启动信息,进行跳转。do_bootm_states根据states来判断要执行的操作。
2024-05-17 17:21:19
1163
原创 U-boot启动内核
因此u-boot提供mkimage工具,用以生成u-boot可以识别的格式,称为uImage。c) **mkimage:**负责dtc的角色,通过解析its生成itb d) **image data file:**实际使用到的镜像文件。a) **its(image source file)文件:**类似于dts,负责描述image的信息,需要自行构造。b) **itb文件: **最终得到的image文件,类似于dtb文件,u-boot直接对其识别和解析。长度较大,需要额外信息较长。实现简单,长度较小;
2024-05-17 17:19:44
1622
原创 第4章-U-boot驱动模型之四实例
id = UCLASS_SERIAL, // 这里的uclass_id和 uclass_driver中的一致.of_match = s5p_serial_ids, // 设备树种的compatible属性{ .compatible = "samsung,exynos4210-uart" }, //注意这里的compatible要和设备树中的一致{ }
2024-05-16 15:53:09
867
原创 第4章-U-boot驱动模型之二数据结构
有对应uclass driver并且下面挂有udevice的uclass才会被uboot自动生成。所有生成的都会挂接到gd->uclass_root链表上。不应该是dtb解析获得的吗?的确是通过dtb解析获得。uboot解析dtb以后动态生成。
2024-05-16 11:45:56
703
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅