自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(424)
  • 收藏
  • 关注

原创 音频——性能测试中的基本概念

理想情况下,输入幅度相同的不同频率信号,过音频设备后输出幅度也是相同的,就是趋于一条直线。如果信噪比过低,那么噪声可能对音频信号产生干扰,实际体验就会感觉音质模糊、音乐或通话人声的清晰度降低。总谐波失真(THD_Total Harmonic Distortion)是指信号在测量频率范围内的所有谐波的能量占主频信号能量的百分比,用于描述信号谐波强弱。THD+N就是在THD的基础上增加了底噪,可以通过一个参数来评估谐波和底噪信号的强弱。音频系统输出的背景噪声强度,是音频系统中除有用信号以外的总噪声。

2024-06-20 20:57:55 206

原创 USB 端点停止

握手包中有一个 STALL 包,由 USB 设备方发出,用来表示某个端点不能发送或者接收数据,或者表示不支持控制传输的某种请求。端点一旦发出 STALL 包,表示其处于停止状态,在停止状态被清除前,该端点不能行使其功能。同时,只有 USB 设备可以返回 STALL 包,USB 主机在任何情况下都不能发送 STALL 包。针对 USB 设备的不同端点,STALL 包在两种不同的情况下使用:功能停止(function stall),和协议停止(protocol stall)。

2024-06-18 21:14:41 120

原创 PDM 测试

AP 的 output 选择 PDM,MCU 提供 Bit clock,AP 生成 PDM 数据,AP 配置如下。这里只抓取 DMIC 的 Clock 信号,如下图。AP 的输入选择差分输入,并配置频率范围为。如果使用 AP 需要注意公地。

2024-06-18 21:01:30 218

原创 I2C ——驱动

sys/bus/i2c/devices 目录下存放着所有的 I2C 设备,如果设备树正确编译的话可以看到。文件中描述了 I2C 总线的相关信息,以及 I2C 总线下的设备节点信息。器件地址,进入该目录,并打印设备名字如下。可以看到 i2c 设备驱动已经成功匹配。就是 i2c1,下面有一个节点。

2024-06-12 20:20:37 401

原创 【MMU】——MMU 权限控制

在 ARMv7 架构中 domain 被废弃,通常情况下将所有的 domain ID 设置为 0,并且 DACR(Domain Access Control Register) 所有的域设置为 client。不可执行区域,例如设备地址空间通常标记为不可执行区域,如果有指令预取访问了该空间,就会触发指令预取异常。TEX C B bit 控制信息。

2024-06-08 02:15:00 85

原创 【MMU】——页表映射示例

页表映射示例

2024-06-08 00:00:00 75

原创 【MMU】——ARM 二级页表

二级页表项即 entry 的格式如下。二级页表项有三种类型。

2024-06-08 00:00:00 257

原创 【MMU】——ARM 一级页表

bit[31:20] 共 12 位,index = 2^12 = 4096 个所以一级页表共有 4096 个,即 0-4095,每个 index 放 4 bytes 数据,每个一级页表项控制 1MB section 空间,共 4GB 空间。一级页表占用空间 4096 * 4bytes = 16KB。从上图可以看出 L1 页表项有四种可能类型。一级页表项即 entry 的格式如下。

2024-06-07 02:00:00 86

原创 【MMU】——MMU 相关的 CP15 寄存器

此时的 c1 就是 SCTLR 寄存器,也就是系统控制寄存器,这个是 c1 的基本作用。SCTLR 寄存器主要是完成控制功能的,比如使能或者禁止 MMU ,c1 作为 SCTLR 寄存器的时候其含义如下图。当 MRC/MCR 指令中的 CRn=c1,opc1=0,CRm=c0,opc2=0 的时候就表示。

2024-06-07 01:30:00 161

原创 【MMU】——MMU 页命中/缺页

MMU 页命中与缺页

2024-06-07 00:00:00 47

原创 【MMU】——MMU 常用术语

MMU 常用术语。

2024-06-06 02:15:00 43

原创 【MMU】——简介

Memory Manage Unit 存储器管理单元是一种硬件模块,用于在 CPU 和内存之间实现虚拟内存管理。其主要功能是将虚拟地址转换为物理地址,同时提供访问权限的控制和缓存管理等功能。MMU是现代计算机操作系统中重要的组成部分,可以提高系统的稳定性和安全性。

2024-06-06 02:00:00 156

原创 【GIC400】—— SPI(EPIT1 Timer)

SPI(Shared Peripheral Interrupt),共享中断,顾名思义,所有 Core 共享的中断,这个是最常见的,那些外部中断都属于 SPI 中断(注意!不是 SPI 总线那个中断)。比如按键中断、串口中断等等,这些中断所有的 Core 都可以处理,不限定特定 Core。ID32~ID1019:这 988 个 ID 分配给 SPI,像 GPIO 中断、串口中断等这些外部中断,本节主要介绍 EPIT1 Timer 中断。GPIO,UART 等中断的均属于。IRQn_Type 中中断号为。

2024-06-05 02:15:00 49

原创 【GIC400】——SGI 软件中断

SGI(Software-generated Interrupt),软件中断,由软件触发引起的中断,通过向寄存器 GICD_SGIR 写入数据来触发。ID0~ID15:这 16 个 ID 分配给 SGI。这里只介绍用到的部分。

2024-06-05 02:00:00 462

原创 【GIC400】——驱动代码实现

IRQ 中断处理

2024-06-04 20:05:12 57

原创 【GIC400】——中断使能

中断使能

2024-06-04 19:50:51 114

原创 【GIC400】——GIC 相关的 CP15 寄存器

当 MRC/MCR 指令中的 CRn=c12,opc1=0,CRm=c0,opc2=0 的时候就表示此时 c12 为 VBAR 寄存器,也就是向量表基地址寄存器。设置中断向量表偏移的时候就需要将新的中断向量表基地址写入 VBAR 中,比如在前面的例程中,代码链接的起始地址为0x80000000,而中断向量表肯定要放到最前面,也就是0x80000000这个地址处。当 MRC/MCR 指令中的 CRn=c1,opc1=0,CRm=c0,opc2=0 的时候就表示。本文主要介绍和中断相关的 CP15 寄存器。

2024-06-04 18:17:27 67

原创 【GIC400】——GIC 简介

Cortex-M 的中断控制器叫做 NVIC,Cortex-A 的中断控制器叫做 GIC。GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器,类似 Cortex-M 内核中的NVIC。目前 GIC 有 4 个版本:V1-V4,V1 是最老的版本,已经被废弃了。V2~V4 目前正在大量的使用。

2024-06-04 18:17:14 207

原创 【GIC400】——PLIC,NVIC 和 GIC 中断对比

是中断向量表,当指定的中断发生以后就会调用对应的中断复位函数,比如复位中断发生以后就会执行第 1 行代码,也就是调用函数 Reset_Handler,函数 Reset_Handler 就是复位中断的中断复位函数,其它的中断同理。就是第一条中断向量,存放的是栈顶指针,接下来是第 2 行复位中断复位函数 Reset_Handler 的入口地址,依次类推,最后一个中断服务函数的入口地址,这样 STM32F407 的中断向量表就建好了。跟 NVIC 一样,GIC 也有中断向量表,中断向量表也是在代码的最前面。

2024-06-03 21:53:33 416

原创 【ARMv7-A】——CP15 协处理器

这种机制有些类似于 ARM 中的寄存器,当处于不同的处理器模式时某些 ARM 寄存器可能有不同的物理寄存器,比如 SPSR 寄存器,每一种处理器模式下都对应一个独立的物理寄存器(用户模式和系统模式对应同样的物理寄存器,这是一个例外)MRC:将协处理器的寄存器中的数值传送到ARM处理器的寄存器中、如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断(例如在 USER 模式下操作协处理器)。下面的指令将协处理器 CP15 的寄存器 C0 寄存器的数据传送到 ARM 寄存器 R0 中。

2024-06-02 16:45:47 370

原创 【GIC400】—— PPI (Generic Timer)

Generic Timer 是 ARMv7-A 内核中的通用定时器,包括: A Non-secure physical timer, A Secure physical timer, A virtual timer。不同的扩展有不同的 timer.不同的扩展对应的 Timer 寄存器如下本文主要介绍 secure physical timer。

2024-06-02 16:17:19 225

原创 【ARMv7-A】——ATPCS(ARM-Thumb 过程调用标准)

ARMv7-A 的 ATPCS(ARM-Thumb Procedure Call Standard),也称为 AAPCS(ARM Architecture Procedure Call Standard),规定了 ARM 架构中函数调用的标准和约定。它定义了函数调用时寄存器的使用、参数传递、返回值、栈帧布局等规范。以下是对 ARMv7-A 的 ATPCS 的详细介绍。

2024-05-28 18:12:31 370

原创 【ARMv7-A】——WFE(wait for event)

WFI (Wait for interrupt) 和 WFE (Wait for event) 是两个让 ARM 核进入 low-power standby 模式的指令,由 ARM architecture 定义,由 ARM core 实现。ARM 架构中的 WFE 指令(Wait For Event,等待事件)是一种低功耗指令,用于使处理器进入低功耗状态,直到某个事件发生。WFE 指令的使用场景和 WFI(Wait For Interrupt)类似,但它能处理更广泛的事件,而不仅仅是中断。

2024-05-28 12:49:32 150

原创 【ARMv7-A】——WFI(wait for interrupt)

执行 WFI 指令后,处理器停止执行下一条指令并进入等待状态,只有在接收到中断请求或特定事件时,处理器才会退出等待状态并继续执行。其他相关的指令,除了 WFI,ARM 架构还提供了其他与低功耗相关的指令,如 WFE(Wait For Event),它类似于 WFI,但可以等待更广泛的事件而不仅仅是中断。WFI 是一种低功耗指令,用于在处理器处于空闲状态时降低功耗。通过正确使用 WFI 指令,可以显著降低嵌入式系统的功耗,延长设备的续航时间,同时保持系统在需要时能够迅速响应。ARM 架构中的指的是。

2024-05-27 21:30:30 230

原创 【ARMv7-A】——汇编与C相互调用

add.s文件中定义如下函数.text.arm.align 2对应的反汇编代码如下可以看到汇编中定义的函数被放在text段中\n");

2024-05-26 10:34:52 67

原创 【ARMv7-A】——内联汇编

使用内联汇编主要目的是为了提高效率,同时还是为了实现 C 语言无法实现的部分。asm volatile("汇编语句": 输出部分: 输入部分: 会被修改的部分);__asm__ __volatile__("汇编语句": 输出部分: 输入部分: 会被修改的部分);

2024-05-26 10:31:36 197

原创 input 驱动

Linux input 驱动

2024-05-21 21:24:12 288

原创 platform 总线(设备树)驱动

使用设备树实现 platform driver

2024-05-16 18:38:58 188

原创 timer 驱动

linux timer 驱动

2024-05-14 20:51:12 267

原创 platform 总线驱动

platform device 和 platform driver

2024-01-13 18:57:19 527

原创 IO——poll 函数

在单个线程中,select 函数能够监视的文件描述符数量有最大的限制,一般为 1024,可以修改内核将监视的文件描述符数量改大,但是这样会降低效率!这个时候就可以使用 poll 函数,poll 函数本质上和 select 没有太大的差别,但是 poll 函数没有最大文件描述符限制,虽然poll解决了select中监听fd的上限,但是poll中还是要遍历所有的FD,且如果fd监听过多会导致性能下降。要监视的文件描述符集合以及要监视的事件,为一个数组,数组元素都是结构体。poll 函数要监视的文件描述符数量。

2023-12-22 20:15:00 508

原创 IO——select 函数

在调用 select 函数后,可以通过检查 readfds,writefds 和 exceptfds 集合的状态,以确定哪些文件描述符准备好进行 I/O 操作。然后,程序可以根据文件描述符的状态来执行相应的读、写或异常处理操作。它们都是由 fd_set 类型表示的位图结构。

2023-12-22 12:51:48 684

原创 IO——非阻塞 IO(NIO)

程序使用时,阻塞 IO 和非阻塞 IO 的区别在于文件打开的时候是否使用了。所以驱动中需要判断文件打开标志是否支持非阻塞方式。文件打卡时,文件打开标志存放在文件结构体。,使用等待队列头实现了阻塞 IO。如果文件读取失败,循环读取。

2023-12-22 08:39:00 925

原创 IO——阻塞 IO(BIO)

等待队列以循环链表为基础结构,链表头和链表项分别为。等待队列是内核实现阻塞和唤醒的内核机制。宏一次性完成等待队列头的定义和初始化。整个等待队列由等待队列头进行管理。等待队列头的初始化有两种方法。等待队列头使用结构体。等待队列项使用结构体。

2023-12-21 21:42:31 540

原创 驱动私有数据

前面的程序中,都只申请了一个从设备号,这里使用。分配两个设备号,这两个设备共用。

2023-12-21 08:39:19 625

原创 杂项设备驱动

在 linux 中,将无法归类的设备定义为杂项设备。相对于字符设备来说,杂项设备的主设备号固定为 10,而字符设备不管是动态分配还是静态分配设备号,都会消耗一个主设备号,比较浪费主设备号。杂项设备会自己调用和来自动创建设备节点。所以可以将杂项设备看成是字符设备的一种。但是比平时写的字符设备降低了难度并节约了主设备号。杂项设备的次设备号 minor 一般使用宏,表示自动分配次设备号。杂项设备主要依赖次设备号来管理不同的杂项设备。杂项设备的头文件为。

2023-12-20 21:27:26 468

原创 音频——S/PDIF

双相符号编码(Biphase Mark Code),简称BMC,属于一种相位调制(phase modulation)的编码方法,是将时钟讯号和数据讯号混合在一起传输的编码方法。如果要传输的比特是逻辑 1,则符号的第二个状态与第一个状态不同。如果要传输的比特是逻辑 0,则符号的第二个状态与第一个状态相同。一个符号的第一个状态总是不同于前一个符号的第二个状态。每个要传输的比特由一个符号表示,该符号由。BMC 编码示例如下图。

2023-11-25 20:15:00 1060

原创 并发与竞争——原子操作

Linux 内核定义了叫做atomic_t的结构体来完成整型数据的原操作,在使用是使用原子变量来代替整型变量。此结构体定义在也可以在定义原子变量的时候给原子变量赋初值,如下所示相应的也提供了 64 位原子变量的操作 API 函数,和上表用法一样,只是将 atomic_ 前缀换为 atomic64_ 将 int 换为 long long。如果使用的是 64 位的 SOC,那么就要使用 64 位的原子操作函数。

2023-11-22 21:47:49 281

原创 音频——解析 PCM 数据

PCM 数据生成与解析

2023-11-11 12:53:34 939

原创 字符设备驱动——将模块编译进内核

前面两节介绍的驱动都是以模块的形式,需要手动加载,本节介绍如何将模块编译进内核。将上一节中的模块源码拷贝到。

2023-11-06 21:31:10 540

空空如也

空空如也

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

TA关注的人

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