设备驱动¶
- 设备驱动
- 一篇文章汇总嵌入式处理器相关的知识
- 【干货】一文搞懂芯粒(Chiplet)技术
- 【干货】一文掌握ARM基础及架构演变
- Linux内核入门篇之驱动的前世今生
- 当我用几道题考了一遍做Linux驱动的同事......
- 盘一盘各种”xPU”
- 服务器中的BMC是个啥玩意儿
元器件¶
disk¶
时钟芯片¶
时间类型及特性对比汇总:
| 时间类型 | 宏定义 | 时间基准 | 特性 | 使用场景 |
|---|---|---|---|---|
| 真实时间/墙上时间 | CLOCK_REALTIME |
1970年1月1日0时 UTC | 世界标准时间,可调,可能回退或跳跃 | 用户时间、Android log 时间戳、网络协议 |
| 单调时间 | CLOCK_MONOTONIC |
系统启动 | 单调递增,不包括休眠,可能受 NTP 平滑调整影响 | 内核定时器、性能分析、内核日志 |
| 原始单调时间 | CLOCK_MONOTONIC_RAW |
系统启动 | 单调递增,不包括休眠,不受 NTP 影响 | 精密性能测量(较少使用) |
| 启动时间 | CLOCK_BOOTTIME |
系统启动 | 单调递增,包括休眠时间 | ftrace 时间戳、uptime 精确统计 |
| 原子时间 | CLOCK_TAI |
1970年1月1日0时 TAI | 单调递增,基于国际原子时(无闰秒) | 科学计算、特殊协议(较少使用) |
| 节拍计数 | jiffies |
系统启动 | 基于节拍计数(通常10ms/周期),低精度,不包括休眠 | 内核短延时、调度器、老旧接口 |
timekeeping提供了各自接口来获取各种类型和格式的时间,主要从精度和速度上分为:
-
高精度版本:高精度版本会读取硬件计数器值来保证纳秒级精度,访问临界区时加顺序锁,精度最高,速度相对其他版本较慢;
-
低精度版本:低精度版本直接返回上次tick更新的base值,不涉及硬件操作,精度低,速度快;
-
高精度快速版本:相对于高精度版本区别在于访问临界区时加顺序锁类型不同,精度和速度都介于上两者。
下面是提供的内核接口函数,根据函数名和参数类型大致可以顾名思义,函数名以_ts64结尾的表示获取timespec64格式,函数名带_coarse表示低精度版本,带_fast_ns的表示高精度快速版本。

定时器¶
CPU¶
cpu调频¶
NUMA¶
设备I/O¶
iommu¶
io端口与io内存¶
ARM I/O内存(Memory-Mapped I/O):
- 定义: ARM I/O内存是将外设寄存器映射到CPU的地址空间中的特殊内存区域。通过读写这些内存区域的值,可以实现对外设的控制和通信。
- 用途: 用于与外设进行直接的内存读写交互,例如访问显示控制器、网络接口等。
I/O端口:
- 定义: 在一些架构中,I/O端口是一种通过专用指令(in和out指令)而非内存地址进行访问的I/O设备寄存器。与内存映射I/O不同,I/O端口提供了一种专门的寄存器访问机制。
- 用途: 用于与特定I/O设备进行通信,这些设备被分配到I/O地址空间的端口。
IOMMU(I/O Memory Management Unit):
- 定义: IOMMU 是一种硬件设备,用于管理主内存和外设之间的内存映射,以提供更灵活的I/O设备访问。它可以防止I/O设备越界访问主内存,并提供内存隔离。
- 用途: 用于支持虚拟地址空间的设备,提供更好的内存管理和安全性,特别是在虚拟化环境中。
在 ARM 架构中,ARM I/O内存通常是指使用内存映射I/O的方式,而I/O端口的概念在ARM中较为不常见。至于IOMMU,它在ARM平台上也有应用,用于提供更高级别的内存管理和隔离,以满足复杂的I/O设备需求。
dma¶
Cache¶
- 【干货】CPU如何与内存交互(上):高速缓存
- 【干货】CPU如何与内存交互(下):虚拟内存
- 【干货】一文吃透CPU的缓存一致性
- 【干货】一文吃透CPU的三级缓存
- 深入理解CPU cache:组织、一致性(同步)、编程
- [A-03] ARMv8/ARMv9-多级Cache架构
在计算机体系结构中,缓存一致性指的是如何确保多个处理器或核心在访问共享内存时看到相同的数据。不同的处理器架构采用不同的一致性模型。以下是 x86 和 ARM 在缓存一致性方面的区别:
x86 架构的缓存一致性¶
x86 架构实现了强一致性(Strong Consistency),这也被称为“总存储顺序”(Total Store Order,TSO)。在这种模型中,x86 处理器保证:
- 写入顺序一致性:所有处理器对单个内存地址的写操作将按照它们的顺序被看到。
- 读-写顺序一致性:一个处理器的读操作不能越过之前的写操作。
- 缓存一致性协议:x86 处理器使用缓存一致性协议(如 MESI 协议),确保所有处理器的缓存内容是一致的。
这些特性使得编写多线程程序时,程序员可以假设所有处理器看到的内存操作顺序是一致的,从而减少了编程复杂性。
ARM 架构的缓存一致性¶
ARM 架构则实现了弱一致性(Weak Consistency),具体表现为:
- 松散的内存顺序:ARM 允许处理器在某些条件下重新排序读写操作,这可以提高性能和效率。例如,ARM 的“弱顺序内存模型”(Weakly Ordered Memory Model)允许写操作在某些情况下被缓冲,且多个写操作可以被合并或延迟。
- 缓存一致性协议:ARM 处理器也使用缓存一致性协议(如 MOESI 协议),但它们的实现方式允许更多的灵活性。
由于 ARM 允许更松散的内存顺序,程序员需要使用内存屏障(Memory Barrier)指令来确保某些内存操作的顺序。例如,ARM 提供 dmb(数据内存屏障)指令,用于强制执行内存操作的顺序。
为什么会有这种差异?¶
-
性能和功耗:ARM 处理器广泛应用于移动设备和嵌入式系统,这些系统对性能和功耗有严格要求。通过允许更松散的内存顺序,ARM 可以在某些情况下提高性能和减少功耗。
-
设计哲学:x86 处理器主要应用于服务器、桌面和高性能计算领域,强一致性简化了多线程程序的编写,减少了程序员的负担,提高了系统的可靠性。
-
应用场景:x86 处理器常用于需要高一致性和可靠性的应用,而 ARM 处理器更多地用于对一致性要求较低但对功耗和性能要求较高的场景。
总之,x86 和 ARM 处理器在缓存一致性上的差异主要源于它们的应用场景、设计目标和技术取舍。x86 选择强一致性以简化编程和确保高可靠性,而 ARM 选择弱一致性以提高性能和减少功耗。
FPGA¶
JTAG¶
总线¶
pci¶
- Find your device & driver from a massive database of PCI and USB devices.
- 【原创】Linux PCI驱动框架分析(一)
- Linux内核PCIE
- PCIE总线初始化
- PCI总线驱动代码梳理(一)--整体框架
- PCI总线驱动代码梳理(三)--PCI设备的枚举
- PCIE设备的x1,x4,x8,x16有什么区别?
- 深入PCI与PCIe之一:硬件篇
-
显示PCI设备的层次结构树:
显示详细信息的PCI设备层次结构树:
显示PCI设备的详细信息:
显示更详细的PCI设备信息:
显示最详细的PCI设备信息:
以数字形式显示PCI设备信息:
显示PCI设备的数字和名称信息:
显示PCI设备的数字、名称和设备编号信息:
PCI配置寄存器¶
所有的PCI设备都有至少256字节的地址空间,其中前64字节是标准化的,被称为PCI配置寄存器,剩下的字节是设备相关的 (取决于具体的厂商,需要查看datasheet得知)。
PCI配置寄存器如下图所示。

- Vendor ID: 标识硬件厂商,需要向特定组织进行注册。
- Device ID: 由硬件厂商来分配的设备ID,无需对ID进行注册。
- Subsystem ID、Subsystem Vendor ID: 用来进一步标识设备。
usb¶
USB子系统¶
I2C¶
SPI¶
gpio¶
- https://www.kernel.org/doc/html/latest/firmware-guide/acpi/gpio-properties.html
- 硬件工程师必看:GPIO用法大汇总
- 详细介绍GPIO、I2C、SPI通讯原理以及物理层原理
acpi¶
-
dsst表导出:
acpi debug¶
- ACPI AML debug and override ACPI tables using initrd
-
通过initrd,可以直接修改acpi tables,方便调试,本次以修改dsdt表做demo展示:
内核编译选项
ACPI_TABLE_UPGRADE默认是开启的,故无需重新编译内核。安装
acpica-tools、iasl导出dtst表:sudo apt install acpica-tools iasl mkdir acpidump cd acpidump sudo acpidump -b iasl -d *.dat # 生成dsdt.dsl本次修改电池_HID值,将
FTEC0002替换为FTEC0005:修改前:
// vim dsdt.dsl +307 307 Device (BAT1) 308 { 309 Name (_HID, "FTEC0002") // _HID: Hardware ID 310 Name (_UID, Zero) // _UID: Unique ID 311 Name (_CRS, Buffer (0x02) // _CRS: Current Resource Settings 312 { 313 0x79, 0x00 // y. 314 }) 315 }修改后:
// vim dsdt.dsl +307 307 Device (BAT1) 308 { 309 Name (_HID, "FTEC0005") // _HID: Hardware ID 310 Name (_UID, Zero) // _UID: Unique ID 311 Name (_CRS, Buffer (0x02) // _CRS: Current Resource Settings 312 { 313 0x79, 0x00 // y. 314 }) 315 }增加dsdt.dsl中的OEM version从而达到覆盖原有的dsdt表:
修改前:
修改后:
编译修改后的dsdt.dsl,生成新的dsdt.aml:
制作调试用的initrd,将新生成的dsdt.aml拷贝到initrd顶部:
mkdir -p kernel/firmware/acpi cp dsdt.aml kernel/firmware/acpi find kernel | cpio -H newc --create > /boot/initrd_dsdt cat /boot/initrd.img-4.19.0-arm64-desktop >> /boot/initrd_dsdt在grub中增加以下acpi.debug参数,从而启用与ACPI硬件相关的所有日志:
更新grub配置并重启系统:
在grub引导界面修改initrd:
将
initrd /initrd.img-4.19.0-arm64-desktop这一行修改为initrd /boot/initrd_dsdt即可。按下
Ctrl +x或者F10引导系统启动,进入系统后可以再次导出dsdt表,可以看到FTEC0002已经替换成了FTEC0005。 - Linux acpi off关于Suspend to Disk 问题分析
-
基于linux源码调试DSDT表
acpi表定位¶
ACPI电源管理¶
- 16. Waking and Sleeping » 16.1. Sleeping States
- ACPI简介之全局状态:G0/G1/G2/G3/S0/S1/S2/S3/S4/S5
- BIOS ACPI基础(总览)
- 「科普」电脑,待机/睡眠/休眠有啥区别?(ACPI SPM S0-S5)
- 【UEFI基础】ACPI基础
- ACPI
- ACPI规范概览
- 调试Linux系统挂起和休眠问题的最佳实践
initcall_debug no_console_suspend ignore_loglevel initcall_blacklist=phytium_spi_driver_init module_blacklist=spi_phytium_plat dyndbg='module phytium_dc_drm +p; module snd_soc_phytium_i2s +p; module snd_soc_pmdk_es8388 +p; module snd_soc_pmdk_es8336 +p; module snd_soc_pmdk_dp +p'
pm-debug¶
pm-graph¶
电源按钮¶
- ACPI_Hardware_Specification
-
ACPI_Hardware_Specification.html#control-method-power-button
- ACPI相关(9)- Generic Button Device
acpi事件¶
acpid¶
logind¶
设备树¶
- 手把手教linux驱动11-linux设备驱动统一模型
- 重新理解一波设备驱动 | Linux 驱动
- 整理了一份Linux设备树基础知识,建议收藏!
- 万字长文教你设备树语法 | 设备树实例解析
- linux设备模型之kset/kobj/ktype分析
- Linux设备树的传递以及kernel中对设备树的解析
- Linux设备模型之class
- Linux 设备树的加载与匹配
- Linux驱动——设备树
- Linux设备驱动和设备匹配过程
设备树导出¶
安装DTC工具:
在运行的linux系统中获取设备树:
udev¶
通过udev monitor捕获uevent包含的信息:
也可采用简写命令:
也可直接采用udev mointor -p命令查看信息,推荐使用上方两个命令:
借助udev中的udevadm info工具查找规则文件能利用的内核信息和sysfs属性信息:
如果/dev/下面的节点已被创建,但是不知道它对应的/sys具体路径,可以使用udevadm info -a -p $(udevadm info -q path -n /dev/<节点名>)命令反向分析:
input¶
evtest¶
中断¶
- Linux中断子系统(一)-中断控制器及驱动分析
- Linux中断子系统(二)-通用框架处理
- Linux中断子系统(三)-softirq和tasklet
- AArch64 TrustZone
- Arm通用中断控制器GICv3和GICv4
- 一文讲透计算机的“中断”
- 嵌入式基础知识-中断处理过程
- 从软硬件交互的角度去看中断的一生
-
MSI(Message Signaled Interrupts)和MSI-X(Message Signaled Interrupts eXtended)是用于替代传统的PCI中断线机制的中断分配和传递机制。它们具有一些优势,如减少中断冲突、提高系统性能和可扩展性。 以下是MSI和MSI-X中断机制的主要特点: MSI(Message Signaled Interrupts): MSI允许设备发送消息来请求中断,而不是使用共享的中断线。 每个设备都有自己的MSI寄存器,可以用来发送中断消息给CPU。 中断消息通常包括中断向量和标识特定设备的信息。 MSI机制减少了中断冲突,因为每个设备都有自己的中断向量,不再需要共享中断线。 MSI支持的中断数量通常受硬件的限制。 MSI-X(Message Signaled Interrupts eXtended): MSI-X是MSI的扩展,它提供更多的中断向量,更灵活的配置和更好的性能。 MSI-X支持的中断向量数目通常比MSI多,这意味着更多的设备可以同时拥有自己的中断。 MSI-X还提供了更灵活的配置选项,允许设备在多个中断向量之间进行映射,从而更好地支持虚拟化和多处理器系统。 使用场景: MSI和MSI-X通常用于高性能计算和服务器领域,以减少中断冲突并提高系统性能。 它们也对虚拟化技术非常有帮助,因为它们可以更好地支持虚拟机之间的中断隔离和映射。 总之,MSI和MSI-X是一种现代化的中断机制,它们提供了更好的性能、可扩展性和虚拟化支持,特别适用于高性能计算和服务器环境。它们有助于减少中断冲突,提高系统效率。
open release¶
- Linux字符设备驱动程序是否可以共享同一个主设备号?
- Linux设备驱动程序 之 open和release
- Linux驱动:应用程序open如何调用到驱动程序的open函数
- linux设备驱动模型一字符设备open系统调用流程
- 2. 关于文件(第三部分)
RK3588S¶
sudo apt install -y repo git python
mkdir rk3588_sdk
cd rk3588_sdk
repo init --no-clone-bundle --repo-url https://gitlab.com/firefly-linux/git-repo.git -u https://gitlab.com/firefly-linux/manifests.git -b master -m rk3588_linux_release.xml
.repo/repo/repo sync -c --no-tags
.repo/repo/repo start firefly --all
readlink -f .repo/manifest.xml
/home/wujing/code/rk3588_sdk/.repo/manifests/rk3588/rk3588_linux_release_20230301_v1.0.6e.xml
注释掉kernel/arch/arm64/configs/firefly-linux.config 194行CONFIG_SPI_WK2XXX=y
pcb¶
- Altium Designer 18
- https://www.altium.com/documentation/other_installers#libraries
- Altium Designer封装库:常用元件封装下载与使用 Altium Designer 10 Libraries AD官网上 ad10 版本的冷冻库
- Altium Designer 10 Libraries
切分:将 Libraries.zip 切割成每个 45MB 的分块,生成 Libraries.zip_00、Libraries.zip_01……
合并:将所有分块按顺序拼接,还原为原始的 Libraries.zip:
Altium Designer 18电路设计从入门到精通¶
《Altium Designer 18电路设计从入门到精通》随书附赠的资源包为PDF,内含全书所有实例的源文件和操作过程录屏讲解动画,总时长长达300分钟,还额外赠送了200分钟的Protel和Altium Designer 18设计实例教程以及对应的实例源文件。
- 主链接:
https://pan.baidu.com/s/1A6r17hnKQPdopciNG_b3Zg - 提取码:
x2a3 - 备用链接:
https://pan.baidu.com/s/1eMJSo1lB80xlVRrs9aMJgw - 提取码:
m4hs