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种 ...
基于QEMU搭建RISC-V的Linux环境
基于QEMU搭建RISC-V的Linux环境背景和之前搭建x86的类似(基于QEMU的内核调试环境搭建),只是需要交叉编译即可,重点其实是在交叉编译工具链。
前提:QEMU已安装好!
准备工具链RISC-V支持GNU工具链和LLVM工具链,目前主流Linux发行版好像都没有预编译的二进制包可以下载安装,只能自己通过源码编译安装。
获取工具链源码$ git clone https://gitee.com/mirrors/riscv-gnu-toolchain
$ cd riscv-gnu-toolchain
注意上面 clone 的主仓库并不包含子仓库的内容,所以需要继续更新子仓库。注意这里首先排除了 qemu 这个子仓库,一来因为 qemu 完整下载太大;二来 qemu 对 toolchain 的编译本身来说其实并不需要。
$ git rm qemu
$ git submodule update --init --recursive
上面的过程可能要点时间,需要耐心等待。。。
编译安装工具链riscv-gnu-toolchain工具链分 elf-gcc、linux-gnu-gcc ...
让Windows成为更好用的Linux发行版之WSL2折腾NFS
让Windows成为更好用的Linux发行版之WSL2折腾NFS背景生命不息,折腾不止。前段时间,为了让WSL更好地来开发Linux和OH,折腾出了一系列文章:
WSL2相关
wsl2上折腾docker
解决WSL2网络和存储问题
上次把WSL2的网络弄好了,最近就准备将开发环境更进一步,开始折腾NFS。以为和Ubuntu主机上搭建NFS一样(嵌入式Linux基础开发环境搭建),简单的一条命令加配置就搞定了,但后面发现根本不是那么一回事。而且网上也很少有完整实用的借鉴参考,只能自己摸索,实战出真知。
启用systemdWSL2默认是没有启用systemd,但很多程序是依赖它的,特别是需要开机启动的。在发行版中添加配置文件/etc/wsl.conf,并加入如下内容:
[boot]
systemd=true
安装配置NFSsudo apt install nfs-common nfs-kernel-server rpcbind
新建一个目录(如这里的/home/xxx/nfs),作为NFS的目录,修改/etc/export,在最后添加如下一行:
/home/xxx/nfs * ...
使用GDB和VSCode调试内核
使用GDB和VSCode调试内核背景上一篇,已经搭建好QEMU的内核调试环境:https://notes.z-dd.online/2024/03/06/%E5%9F%BA%E4%BA%8EQEMU%E7%9A%84%E5%86%85%E6%A0%B8%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/
这篇主要在前面的基础上尝试用gdb来调试内核,躺了不少坑。
安装GDB这里安装支持多种硬件体系架构的GDB版本,也可直接使用系统自带的默认gdb。如架构不同,需使用交叉编译工具链中的gdb,后面有时间会更新不同架构下的调试。
sudo apt-get install -y gdb-multiarch # 支持多种硬件体系架构的GDB版本
准备调试内核在以前的基础上需修改一些内核配置才能调试:
打开CONFIG_GDB_SCRIPTS:在内核主目录下生成gdb脚本文件vmlinux-gdb.py,该脚本实现了一些便于内核调试的命令,它们都以lx-开头,这个暂时先没用,后面再研究看看
打开CONFIG_DEBUG_INFO:该选项用 ...
基于QEMU的内核调试环境搭建
基于QEMU的内核调试环境搭建背景在没有相应的实体硬件,只有自己的一台开发机器,在学习内核或是调试破坏性大的内核功能时,又不想用庞大麻烦的Virtualbox或VMware,只是简单单纯地调试下内核,QEMU是个不错的选择。
关于QEMU
QEMU is a generic and open source machine emulator and virtualizer.
When used as a machine emulator, QEMU can run OSes and programs made for one machine (e.g. an ARM board) on a different machine (e.g. your own PC). By using dynamic translation, it achieves very good performance.
When used as a virtualizer, QEMU achieves near native performance by executing the guest code direc ...
解决WSL2网络和存储问题
解决WSL2网络和存储问题背景之前在电脑上折腾了WSL2(https://notes.z-dd.online/2023/11/07/WSL2%E7%9B%B8%E5%85%B3/),还存在2个不严重但很重要的问题:
网络配置问题,主要是不能从外部局域网访问wsl网络,这使得用板子没法挂载wsl里的nfs和使用tftp,网上有些间接的办法解决了这个问题,但很麻烦,懒得去折腾
内存占用和硬盘存储不能自动回收,就像VirtualBox和VMWare的虚拟硬盘文件一样,会不断扩大,只能手动回收。
新的 23H2 系统版本已经直接解决了上面的问题,但我的系统一直未收到相应的正式版的更新推送。也懒得去折腾预览版,所以就一直将就地在用,最近刚好收到了更新,于是就弄了弄。
步骤
更新系统版本到 23H2,这是最重要的步骤和前提
更新wsl版本
wsl --update --pre-release
修改配置在 %userprofile%.wslconfig 中写入以下内容然后保存:
[experimental]
# 可以在 gradual 、dropcache 、disabled 之间选择
au ...
MMC和SD与SDIO
MMC和SD与SDIO以前一直不太清楚SDIO、SD卡、MMC等之间的区别和联系,偶然间在 蜗窝 上看到下面这幅图,才算稍微有点清晰明了:
MMCMMC(Multimedia Card)是一种协议或者规范,规范了卡的形状尺寸,通讯协议等内容,符合MMC协议的卡叫做MMC卡,即多媒体卡
两种操作模式,分别为MMC模式与SPI模式
eMMCeMMC (Embedded Multi Media Card) 为MMC协会所订立的、主要是针对手机或平板电脑等产品的内嵌式存储器标准规格eMMC = NAND flash + 控制器 + 标准封装接口eMMC是一种支持MMC协议的芯片
SDSD (Secure Digital Memory Card)它在MMC的基础上发展而来,增加了两个主要特色:SD卡强调数据的安全,可以设定所储存的使用权限,防止数据被他人复制;另外一个特色就是传输速度比2.11版的MMC卡快,microSD/TF、SDHC、SDXC等这些都是SD卡的进化版
两个可选的通信协议:SD模式和SPI模式
SDIOSDIO(Secure Digital I/O):安全数字输入输出,就是 ...
端侧AI系列之瑞芯微RV1126及RKNN
【端侧AI系列】入坑篇–瑞芯微RV1126及RKNNRV1126一直想业余学习学习端侧AI,刚好前段时间从朋友那弄了一套RV1126的硬件。开始这一切的前提条件是软硬件都已调通OK,可以正常使用的板子,这里主要涉及RKNN及其应用,不涉及硬件驱动调试及系统调试
RV1126简介RV1126基于四核arm Cortex A7 32位内核,集成NEON和FPU。每个核心都有一个32KB I-cache和32KB D-cache以及 512KB 的共用 二级缓存。内置2.0Tops神经网络处理器NPU支持 INT8/INT16 混合操作,算力强大,实现AI运算的功耗不及所需GPU的10%。配套AI算法工具完善,支持Tensorflow、Pytorch、Caffe、MxNet、DarkNet、ONNX等主流AI框架直接转换和部署
rknpu驱动顾名思义,即NPU的驱动,它包含了NPU驱动、API接口及示例等。
Rockchip的NPU有几套,适用于RK1808/RK1806系列和RV1109/RV1126系列的是:https://github.com/rockchip-linux/rknpu ...