Linux内核之MMC框架
Linux内核之MMC框架背景之前简单说了说SDIO、SD、MMC之间的区别与联系,具体可见以下链接:
https://notes.z-dd.online/2024/01/19/MMC%E5%92%8CSD%E4%B8%8ESDIO/
最近刚好看到这块,今天来看看Linux内核中关于它们的MMC框架。
软件架构Linux内核中,SDIO、SD、MMC相关的驱动都由MMC框架来管理。其主要的软件架构如下图所示:
和一般的框架类似,可以分为横向的“从左到右”和纵向的“从上到下”两个种层次结构。
横向的“从左到右”MMC属于一种总线驱动,所以主要包括Host、Bus、Card三类实体(从左到右),软件上也是一一对应:
host,负责驱动Host controller,提供诸如访问card的寄存器、检测card的插拔、读写card等操作方法。从设备模型的角度看,host会检测卡的插入,并向bus注册MMC card设备;
bus,是MMC bus的虚拟抽象,以标准设备模型的方式,收纳MMC card(device)以及对应的MMC driver(driver);
card,抽象具体的MMC ...
Linux之Gstreamer实现视频OSD
Linux之Gstreamer实现视频OSD背景何为OSD?
OSD(on-screen display)即屏幕菜单式调节方式。一般是按Menu键后屏幕弹出的显示器各项调节项目信息的矩形菜单,可通过该菜单对显示器各项工作指标包括色彩、模式、几何形状等进行调整,从而达到最佳的使用状态。—— 百度百科
简单点说就是在视频上叠加一个自定义的图层显示,主要包括字符,图片,图形等。
Gstreamer是啥?
GStreamer is a library for constructing graphs of media-handling components. The applications it supports range from simple Ogg/Vorbis playback, audio/video streaming to complex audio (mixing) and video (non-linear editing) processing.
Applications can take advantage of advances in codec and filte ...
红外热成像下篇--叠加字符OSD
红外热成像下篇–叠加字符OSD背景前段时间不是玩了下红外热成像,视频可见我的公众号和视频号:
还有个瑕疵:视频上没有实时显示相应的温度(叠加在视频上),这段时间就把它给实现了,视频可见我的公众号和视频号。
在视频上实现温度信息叠加,里面一个主要技术点就是字符OSD,这里使用了一种IPC芯片通用的字符OSD方案(RK、海思等方案都适用):freetype + sdl + Soc的图层处理硬件模块。
首先介绍下前面这3个东东:
freetype:
FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。
sdl:
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。现SDL多 ...
Linux内核之设备树插件DTO
Linux内核之设备树插件DTO什么是DTO(Device Tree Overlay)Linux4.4以后引入了动态设备树(Dynamic DeviceTree),我们这里翻译为“设备树插件”,或者称“设备树叠加层”。设备树插件(Device Tree Overlay,叠加层)是一种用于设备树(Device Tree)的扩展机制,可以理解为主设备树的“补丁”它动态的加载到系统中,无需重新编译整个设备树。它允许在运行时动态修改设备树的内容,以便添加、修改或删除设备节点和属性,这样就提供了一种灵活的方式来配置和管理硬件设备,而无需重新编译整个设备树。
几个概念
FDT: Flattened Device Tree
DTS: Devicetree Sources,是用于描述 FDT(设备树) 的源文件
DTO: Devcie Tree Overlay,设备树插件(或者说叠加层)
DTC: Device Tree Compiler,顾名思义,是FDT(设备树) 的编译器
DTB: Device Tree Blob,DTS经过DTC编译后而生成
DTBO: Device Tree Bl ...
Linux内核之Kselftests
Linux内核之Kselftests简介Linux内核包含了一套开发者可用的单元测试和回归测试(Kselftests),这些测试位于内核源代码的tools/testing/selftest目录下。这些测试旨在针对内核中的各个代码路径进行小规模的测试。测试应该在构建、安装和启动内核之后运行。
它每天都会在不同的Linux内核树(即代码库)的内核集成测试环境上运行,主要是为了确保内核代码在合并到主干之前,在各种场景和配置下都能正常工作,从而提高内核的整体稳定性和可靠性。
kselftest的一些特性:
快速执行测试的能力(目前的目标是不到20分钟)
一些开发人员希望在几秒钟内运行测试
运行不同测试组的能力
测试源代码保存在内核源代码树中,任何使用内核源代码的人都可以很容易地访问它
可以在 Kselftest-wiki 上找到关于Kselftest框架的其他信息,以及如何使用该框架编写新的测试。
编译运行及安装相关的命令如下:
#编译
$ make headers
$ make -C tools/testing/selftests
#运行tests
$ make -C tools/t ...
重新梳理OpenHarmony的HDF
概述重新梳理下OpenHarmony下HDF的有关概念及从应用到驱动自上而下的整个流程。主要包括:
HDF架构
HDI接口
内核KHDF移植
以Light设备为例,看看整个调用流
注:这里讨论的只针对L2标准系统。
HDF架构图HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路,让驱动开发和部署更加规范,旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的驱动管理的开发环境,力求做到一次开发,多系统部署。
驱动加载HDF驱动框架提供把和配置的设备列表匹配成功的驱动程序加载起来的功能
驱动服务管理HDF框架可以集中管理驱动服务,开发者可直接通过HDF框架对外提供的能力接口获取驱动相关的服务
驱动消息机制HDF框架提供统一的驱动消息机制,支持用户态应用向内核态驱动发送消息,也支持内核态驱动向用户态应用发送消息
配置管理HCS是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置 ...
Linux调试中的各种trace
Linux调试中的各种traceLinux中有很多调试手段,很多trace,很让人迷糊,弄得云里雾里。今天简单介绍下其中的几种trace:ptrace, strace, ltrace, ftrace 。只是简单介绍它们的基本概念,对其有基本的了解,后面有机会的话,再逐个深入。
ptrace官方手册说明:https://man7.org/linux/man-pages/man2/ptrace.2.html
The ptrace() system call provides a means by which one process (the “tracer”) may observe and control the execution of another process (the “tracee”), and examine and change the tracee’s memory and registers. It is primarily used to implement breakpoint debugging and system call tracing.进程跟踪器,类 ...
PulseAudio与蓝牙音频
PulseAudio与蓝牙音频背景Linux下面是怎么使用蓝牙音频的呢? 今天我们一起来看看,通过命令行使用 PulseAudio 来联动蓝牙音频。
PulseAudio与Bluetooth音频PulseAudio的所有蓝牙功能都依赖于BlueZ,此外,HFP支持还需要oFono。PulseAudio 支持3个主要的和音频相关的蓝牙profiles:
A2DP (Advanced Audio Distribution Profile)
HSP (Headset Profile)
HFP (Hands-Free Profile)
PulseAudio蓝牙后端
Bluetooth backend listens to BlueZ and oFono events on D-Bus and automatically creates PulseAudio cards, sources, and sinks for all discovered Bluetooth devices.PulseAudio的蓝牙后端会监听D-Bus上的BlueZ和oFono事件,然后对于多有发现的蓝牙设备自动地 ...
内核中的格式化打印
背景最近在调试个异常卡死的问题时,需要打印某个pcie link的,故学习了下内核里的打印,特此记录。
printk(“acpi_pci_link_set–>%pfwf, irq: %d\n”, &link->device->fwnode, irq);
内核中的格式化打印主要分为整型和指针。
整型signed char %d or %hhx
unsigned char %u or %x
char %u or %x
short int %d or %hx
unsigned short int %u or %x
int %d or %x
unsigned int %u or %x
long %ld or %lx
unsigned long %lu or %lx
long long %lld or %llx
unsigned long long %llu or %llx
size_t %zu or %zx
ssize_t %zd or %zx
s8 %d or %hhx
u8 %u or %x
s16 %d or %h ...
Linux内核调试工具之Kprobes简单使用
Linux内核调试工具之Kprobes简单使用上次看了下Kprobes的相关概念:Linux内核调试工具之Kprobes相关概念,这里看看它的简单使用
配置Kprobes内核需要打开以下配置:
CONFIG_KPROBES = y
#保证能加载和卸载基于Kprobes的模块
CONFIG_MODULES = y
CONFIG_MODULE_UNLOAD = y
#kprobe地址解析使用了kallsyms_lookup_name()
CONFIG_KALLSYMS_ALL = y
CONFIG_DEBUG_INFO = y
API请参考官方文档,这里不赘述了。
使用使用 kprobes主要有以下两种方式:
通过编写内核模块
kprobes on ftrace
通过编写内核模块通过编写内核模块,向内核注册探测点。探测函数可根据需要自行定制,使用灵活方便,官方例子就是这种方式。
官方例子内核源码中有2个关于kprobes的2个例子:
kprobes例子:内核源码/samples/kprobes/kprobe_example.c
...
Linux内核几个重要文件之System.map
Linux内核几个重要文件之System.mapWhat什么是System.map文件?
System.map是编译内核时生成,它记录了文件内核中的符号列表,以及符号在内存中的虚拟地址,这里的符号可以理解成函数名和变量。System.map文件不是一成不变的,每次编译内核都会重新生成System.map文件。
下面我们简单看看System.map文件里面的内容
System.map文件内容下面列出了我最近编译的6.8内核的System.map(前20行):
00000000009f5a00 A __pecoff_data_raw_size
0000000000a78000 A __pecoff_data_virt_size
ffffffff80000000 T _start
ffffffff80000040 t pe_head_start
ffffffff80000044 t coff_header
ffffffff80000058 t optional_header
ffffffff80000070 t extra_header_fields
ffffffff800000f8 t ...
Linux内核调试工具之Kprobes相关概念
Linux内核调试工具之Kprobes相关概念背景及概念Kprobes: Kernel Probes
背景
开发人员在内核或者模块的调试过程中,往往会需要要知道其中的一些函数有无被调用、何时被调用、执行是否正确以及函数的入参和返回值是什么等等。
比较简单的做法是在内核代码对应的函数中添加日志打印信息,但这种方式往往需要重新编译内核或模块,重新启动设备之类的,操作较为复杂甚至可能会破坏原有的代码执行过程。
而利用kprobes技术,用户可以定义自己的回调函数,然后在内核或者模块中几乎所有的函数中动态的插入探测点,当内核执行流程执行到指定的探测函数时,会调用该回调函数,用户即可收集所需的信息了,同时内核最后还会回到原本的正常执行流程。
如果用户已经收集足够的信息,不再需要继续探测,则同样可以动态的移除探测点。因此kprobes技术具有对内核执行流程影响小和操作方便的优点。
概念目前有两种类型的探针:kprobes和 kretprobes(也称为return probes)。
kprobe是最基本的探测方式,几乎可以插入到内核中的任何指令上。它提供了探测点的调用前、调用后和内存访问出错3种 ...