- 博客(123)
- 收藏
- 关注
原创 CPU超频运行和电压
CPU超频运行导致死机问题分析及解决方案。问题表现为部分CPU在启动阶段出现死机,原因在于超频运行时供电电压不足(需1.0V但实际仅0.9V)。为解决该问题,将PMIC默认供电电压调整为1V,并修改了开机升频时序。调试过程中确认了CPU和TPU的标准频率与超频频率参数(CPU标准850M/超频1G,TPU标准500M/超频750M),通过配置CONFIG_OD_CLK_SEL宏实现超频控制。该案例揭示了超频运行时电压与频率匹配的重要性。
2026-03-06 08:29:15
25
原创 无线校准---
WiFi和蓝牙校准是生产过程中的关键环节,主要解决硬件差异导致的信号问题。由于元器件差异和天线布局等因素,设备可能出现频率偏移、功率不均、接收灵敏度不一致等问题。校准过程通过仪器测量偏差值并写入芯片,使设备工作时自动修正,确保每台设备的无线性能稳定一致。校准参数包括发射功率、频率精准度和接收灵敏度,保证通信质量并避免干扰。校准流程涉及研发调试、定频测试、频率/功率校准及认证等环节,最终实现量产设备的标准化生产。
2026-03-06 08:28:58
22
原创 射频电路---
本文介绍了一种2.4GHz Wi-Fi、5GHz Wi-Fi和蓝牙三合一的天线共用设计方案。该方案采用硬件电路实现三种信号共用一根天线,同时提供射频测试接口。关键点在于2.4GHz Wi-Fi和蓝牙不能同时工作,需通过软件切换,但二者均可与5GHz Wi-Fi同时工作。文中提供了详细的电路设计图和说明,展示了如何通过硬件设计实现多频段信号的有效复用,为无线通信设备的天线设计提供了实用解决方案。
2026-03-06 08:28:37
23
原创 FPGA编译仿真环境搭建
摘要:本文介绍了FPGA编译仿真环境的搭建过程,包括硬件设计、软件配置和调试方法。主要内容涵盖RTL代码(prj.v)和Testbench代码(tb_prj.v)的编写,以及使用Tcl脚本(sim.do)进行编译仿真的详细步骤。通过Modelsim工具实现了按键输入控制LED输出的简单功能验证,并提供了完整的配置文件(asic.f)和操作流程说明。文章还包含了相关操作界面的截图,为FPGA开发初学者提供了实用的参考指南。
2026-03-06 08:28:09
31
原创 电池保护芯片-CM1126B
CM1126B-WAC是一款具有船运模式的二合一单节电池保护芯片,主要用于锂电池的过充/放电/电流保护,并可在运输时进入2nA超低功耗状态。硬件设计上,首次上电或船运模式后需充电或短接VM-GND引脚激活。该芯片能有效减少电池静态损耗,确保产品运输后仍有充足电量。
2026-03-05 08:28:29
22
原创 LED控制器-HTR3310
HTR3310 LED控制器使用指南摘要:HTR3310是一款多功能LED控制器,支持blinking、fading等多种模式。通过I2C接口(地址0x5b)配置寄存器实现功能控制,包括设置呼吸模式(0x14)、选择blinking/fading(0x05)、调整淡入淡出时间(0x15)等。典型操作包括:启用breathing模式(i2cset 0x14 0x01)、设置blinking(i2cset 0x05 0x01)或fading模式(i2cset 0x05 0x00)。还支持GPIO模式直接控制LE
2026-03-05 08:28:04
16
原创 触摸芯片RM1015B基本使用方法
RM1015B触摸芯片使用指南:该芯片采用4通道设计(实际使用3通道),通过I2C接口通信(设备地址0x2B)。硬件设计需注意中断/复位引脚复用,需上拉处理。软件配置包括初始化、中断处理和定时器扫描,通过设置各通道阈值(0-300W)调节灵敏度,值越小越灵敏。调试时可调用rm1015B_debug_func()输出波形数据。典型应用场景包括接近检测和手势识别,中断触发后需在8ms内响应。特别注意不同通道的寄存器映射关系及校准流程,确保检测准确性。
2026-03-05 08:27:43
25
原创 思远耳机仓充电芯片SY8805芯片介绍
SY8805是一款耳机仓专用充电芯片,具有以下特点:1) COML/VOL和COMR/VOR引脚兼具充电和通信功能;2) HAL引脚连接霍尔传感器检测盒盖状态;3) 支持5V输入电压和500mA充电电流。该芯片采用QFN16封装,适用于TWS耳机充电仓设计,提供完善的充放电管理功能。
2026-03-05 08:27:21
25
原创 思远耳机充电芯片-SY5501-寄存器
本文介绍了SY5501耳机充电芯片的寄存器配置与调试方法。主要内容包括:1)通过i2cdump命令查看寄存器数值;2)关键寄存器解析,包括0x10、0x11、0x40和0x44寄存器;3)软件配置方法,包含启用TRX通信、充电控制等命令;4)私有指令的发送时序与实现代码;5)调试发现VSYS电压与BAT电压保持一致的现象。文章为SY5501芯片的寄存器操作和功能验证提供了实用指导。
2026-03-05 08:26:59
22
原创 CW32L010使用说明
本文介绍了CW32L010微控制器的使用方法。主要内容包括:1)Jlink配置,需修改JLinkDevices.xml文件并添加Flash烧录算法文件;2)Jlink和Keil两种烧录方式的具体操作步骤;3)硬件设计、软件配置、调试过程及功能验证等内容。通过详细说明配置文件和烧录步骤,为CW32L010的开发提供了实用指导。
2026-03-04 08:48:03
126
原创 芯片BES2700ZP的复位方式
BES2700ZP芯片提供两种复位方式:1)通过拉高RESET引脚实现硬件复位;2)通过VCHG引脚输入特定时序实现软件复位。硬件设计中,RESET引脚连接复位芯片,而实际应用多采用VCHARGE与POGOPIN连接,通过耳机仓指令触发复位。软件配置需设置相关寄存器宏定义。调试过程验证了两种复位方式的有效性,为芯片复位操作提供了灵活选择方案。
2026-03-04 08:47:44
172
原创 霍尔传感器的基本原理
霍尔传感器基于霍尔效应,当导体/半导体处于垂直磁场中时会产生电压差。其输出随磁场强度变化而翻转,常用于接近检测(如耳机仓开关检测)。硬件设计中,磁体靠近时霍尔芯片输出低电平,远离时输出高电平。软件配置需配合硬件状态变化进行电平检测,实现开盖/关盖的功能判断。调试过程需验证磁场阈值与电平翻转的对应关系,确保传感器可靠触发。该方案简单可靠,广泛应用于各类磁场检测场景。
2026-03-04 08:47:20
38
原创 BES芯片升级方式
BES芯片支持三种升级方式:1)双线TX/RX串口升级,适用于开发和生产;2)单线升级,通过POGO Pin连接特定串口板(含TS8107芯片)实现;3)蓝牙OTA升级,面向终端用户。硬件设计需注意单线升级需专用串口板进行信号转换。三种方式覆盖了从开发到量产的完整升级需求。
2026-03-04 08:46:56
43
原创 音频涉及算法介绍
本文介绍了音频处理中的关键算法及其应用。在录音端,重点阐述了3A算法(AGC、AEC、ANS/ENC)的功能与区别;在播放端,详细解析了动态EQ、DRC和ANC的工作原理,特别针对开放式耳机(OWS)的特殊需求进行说明。文章指出OWS耳机由于结构特性导致低频泄露,需依赖动态EQ补偿和DRC防破音,同时分析了OWS通常不需要ANC的原因。通过对比TWS与OWS耳机的差异,系统性地展示了不同音频算法在各类耳机中的应用场景和技术要点。
2026-03-04 08:46:10
292
原创 麦克风+触摸+喇叭在耳机中所处位置
本文介绍了耳机中麦克风、触摸模块和喇叭的硬件布局设计。耳机采用2个普通麦克风+1个骨传导麦克风组合,普通MIC位于电路板上,骨MIC紧贴外壳通过FPC连接;触摸区域同样贴附于外壳内侧并通过FPC连接;喇叭则位于耳机前端发声位置。文中配有多张原理图和实物位置示意图,清晰展示了各模块在耳机中的具体安装位置和连接方式。
2026-03-03 08:15:50
29
原创 双模蓝牙模组(同时支持BT和BLE)传输问题
摘要:本文分析了双模蓝牙模组(BT+BLE)的传输调度问题。通过时序图展示了BT音频流与BLE事件在时隙分配上的冲突,指出BLE传输必须等待BT接收时隙或协议预留的空闲窗口。研究揭示了双模蓝牙共存时的时间调度机制,为优化传输性能提供了理论基础。文末列出待查问题并附参考文档链接。
2026-03-03 08:15:15
125
原创 tws耳机语音同步
TWS耳机实现A2DP和HFP语音同步的关键在于主从耳机间的数据协调机制。当蓝牙传输时,主从耳机都会接收数据,但只有A2DP和HFP会进行语音同步处理,SPP和BLE传输则不会。具体实现上,主耳机负责接收蓝牙音频数据后,通过专用无线链路将数据同步给从耳机,确保双耳播放的时间差控制在毫秒级。这种同步机制涉及精确的时间戳对齐和缓冲管理,需要芯片厂商(如恒玄)在底层协议栈进行专门优化。
2026-03-03 08:14:20
430
原创 内核中dma相关操作
4.dma_sync_single_for_device与dma_sync_single_for_cpu的使用。dma_alloc_coherent作用。2.dma_map_single使用。
2026-03-03 08:12:58
157
原创 linux内核虚拟时钟驱动
本文介绍了Linux内核中虚拟时钟控制器驱动的实现方法。主要内容包括:1) 固定频率时钟的注册与使用,通过设备树配置晶振频率并使用clk_register_fixed_rate()注册;2) 门控时钟的实现,用于动态开关外设时钟以降低功耗;3) 倍频器与选择器的应用场景,如PLL锁相环和CPU时钟切换;4) 复合时钟的抽象,将MUX、分频器和门控打包成单一逻辑时钟。文章还提供了设备树配置示例和驱动代码片段,展示了如何获取时钟资源、准备和使能时钟的标准流程。
2026-03-03 08:11:58
14
原创 linux内核虚拟pinctrl驱动
@FilePath: \project\technology\sw\linux_drivers\内核pinctrl\内核中pinctrl驱动.md。
2026-03-02 08:07:10
606
原创 linux内核虚拟i2c控制器驱动
@FilePath: \project\technology\sw\linux_drivers\内核I2C\内核虚拟i2c控制器.md。
2026-03-02 08:06:42
268
原创 linux内核虚拟regulator驱动
本文介绍了Linux内核中regulator子系统的作用及实现。regulator子系统通过抽象电源管理硬件,为内核提供统一接口来管理系统中的电压和电流源。它解决了早期电源管理存在的代码重复、缺乏协调、硬件耦合等问题。系统包含consumer(设备驱动)和provider(电源硬件驱动)两个角色,通过引用计数机制实现资源共享,并支持动态电压调整(DVFS)。文中还提供了一个虚拟regulator驱动的实现示例,包含设备树定义和驱动代码,展示了如何通过回调函数控制regulator的启用状态和电压设置。该子系
2026-03-02 08:06:02
228
原创 linux内核多级虚拟中断控制器驱动
本文介绍了一个多级虚拟中断控制器的实现方案。主要内容包括: 设备树配置:定义虚拟中断控制器(VIC)和虚拟GPIO控制器,建立多级中断关系 一级中断控制器实现: 使用irq_domain管理中断映射 实现irq_chip操作集,包含mask/unmask等基本操作 提供xlate函数进行中断号转换 通过sysfs接口模拟中断触发 关键技术: 支持多级中断控制器级联 使用irq_domain管理硬件中断号到Linux中断号的映射 提供测试接口模拟硬件中断触发 该方案实现了完整的虚拟中断控制器功能,可用于驱动开
2026-03-02 08:02:09
141
原创 linux内核多参数虚拟中断控制器驱动
本文介绍了一个虚拟中断控制器的实现方案。该控制器支持传递多个参数,包括中断组、硬件中断号和触发类型。通过设备树配置中断信息(如<32 60 1>表示组32、中断号60、上升沿触发),并在驱动代码中实现自定义的.xlate回调函数来解析这些参数。控制器提供了基本的中断处理功能(屏蔽/取消屏蔽中断、设置触发类型等),并通过sysfs接口支持手动触发中断。关键点包括:1) 3-cell中断描述格式解析;2) 硬件中断号范围验证;3) 内部中断号映射机制。该实现可作为开发真实中断控制器的基础框架。
2026-03-02 07:53:57
169
原创 linux内核虚拟中断控制器驱动
本文描述了一个虚拟中断控制器(VIC)的实现方案。首先通过设备树定义了中断控制器和客户端节点,其中控制器使用两个cell来指定硬件中断号和类型。代码实现包括:1) 定义irq_chip操作集实现中断屏蔽/解屏蔽和类型设置;2) 创建irq_domain完成硬件中断号到Linux中断号的映射;3) 提供sysfs接口用于模拟中断触发。该方案支持最多100个虚拟中断,通过打印日志详细记录中断处理过程,包括映射关系、中断类型设置和触发事件。实现中特别注意了中断触发时的本地CPU中断状态管理。
2026-03-01 07:18:21
359
原创 linux内核虚拟GPIO控制器驱动
本文介绍了如何编写一个虚拟GPIO控制器驱动及使用GPIO子系统的方法。主要内容包括:1) 定义设备树节点,声明GPIO控制器属性;2) 实现驱动核心结构体,包含GPIO方向控制、值读写等回调函数;3) 使用自旋锁保护共享数据;4) 在probe函数中初始化GPIO芯片并注册到内核GPIO子系统。该驱动模拟了32个GPIO引脚,支持输入/输出方向设置和电平读写操作,通过打印日志信息跟踪GPIO状态变化,可作为开发真实GPIO控制器驱动的参考模板。
2026-03-01 07:17:43
302
原创 linux内核中虚拟地址管理
本文分析了Linux内核中虚拟内存管理的分区机制。在32位系统中,虚拟地址空间通常按1:3或2:2比例划分用户空间和内核空间。线性映射区(lowmem)直接映射物理内存,而高端内存(highmem)需要特殊映射机制。通过不同物理内存配置(512MB/1GB/2GB)的实例,展示了内核空间布局变化,包括vmalloc区域大小调整和highmem的出现条件。当物理内存超过线性映射区容量时,剩余内存被标记为highmem,需通过kmap等函数访问。内核通过这种灵活的内存管理机制,有效平衡了性能和内存使用效率。
2026-03-01 07:17:04
134
原创 linux内核中syscon框架的使用
@FilePath: \project\technology\sw\linux_drivers\内核中syscon\样本新.md* @FilePath: \project\technology\hw\proj\样本新.md。
2026-03-01 07:16:23
102
原创 linux内核中使用regmap替代write/read来操作外设
本文介绍了Linux内核中使用regmap机制模拟外设寄存器操作的方法。通过设备树配置预留内存区域,定义寄存器偏移地址,并实现基于regmap的读写操作。代码展示了如何配置regmap参数(32位地址/数据位宽),使用regmap_write/read进行寄存器读写,以及通过regmap_update_bits实现原子位操作。示例包含复位设备、使能控制和数据寄存器测试等典型操作,演示了如何替代传统的write/read操作来实现更安全高效的寄存器访问。
2026-03-01 07:15:40
123
原创 linux内核中使用普通内存内存来模拟外设
本文介绍了在Linux内核中模拟外部设备的两种方法:1) 通过设备树配置reserved-memory区域并引用;2) 直接使用reg属性配置地址。重点展示了第一种方法的实现代码,包括设备树配置和驱动程序实现。驱动程序使用ioremap将物理地址映射为虚拟地址,并演示了32位、16位和8位数据的读写操作。代码还展示了如何通过devm_ioremap_resource自动管理资源,并打印物理地址、虚拟地址和映射大小等信息。该方法为开发外设驱动提供了测试环境,无需实际硬件即可验证驱动功能。
2026-02-28 07:47:34
371
原创 linux内核虚拟SPI控制器驱动
本文介绍了一个虚拟SPI控制器驱动的实现方案。该驱动支持8位和16位数据传输模式,可配置时钟极性和相位,并模拟了SPI传输的基本功能。设备树配置包括内存区域分配和SPI客户端设备设置。驱动核心功能包括:setup()函数用于配置控制器参数,transfer_one()函数处理数据传输逻辑,支持环回测试和模拟收发数据。该虚拟驱动可作为真实SPI控制器开发的参考模板,通过打印日志信息帮助调试SPI通信参数和传输过程。
2026-02-28 07:47:06
258
原创 linux内核虚拟网卡驱动
本文介绍了Linux内核虚拟网卡驱动程序的开发要点。主要内容包括:1) 网卡驱动的基本架构,作为内核与硬件(MAC、PHY)的桥梁,负责数据收发和管理控制;2) 网络协议栈中各层数据包结构(MAC帧、IP/TCP/UDP/ICMP/ARP等)的图示说明;3) 关键代码实现,展示了虚拟网卡的初始化、开启/关闭接口,以及数据包处理逻辑,特别是对UDP和ICMP数据包的收发处理,包括地址交换和校验和计算。该驱动实现了网络设备的基本功能,为理解Linux网络子系统提供了实践参考。
2026-02-28 07:46:47
654
原创 linux内核中私有变量的设置与获取
本文介绍了Linux驱动程序中私有变量的设置与获取方法。通过分析dev_set_drvdata和platform_set_drvdata函数的等价性,展示了如何在平台驱动中使用这些API管理设备和驱动的私有数据。代码示例演示了从设备树获取属性、分配内存、设置/获取私有数据等关键步骤,包括设备私有数据使用devm自动管理,驱动私有数据手动释放的实现方式。最后提供了设备树匹配表和完整的驱动注册流程,为开发者处理驱动私有数据提供了实用参考。
2026-02-28 07:46:30
242
原创 linux内核中链表的基本使用
本文介绍了Linux内核中container_of宏的使用方法,该宏能够根据结构体成员的地址反推出整个结构体的起始地址。通过一个驱动程序示例演示了其基本用法:定义student结构体,分配内存并初始化后,使用container_of宏通过age成员地址获取结构体地址,验证了指针匹配性和数据一致性。该技术是内核链表实现的基础,广泛应用于内核数据结构操作。示例代码包含模块初始化、退出函数及基本使用演示,最后提供了模块信息说明。
2026-02-28 07:46:06
291
原创 linux内核中设备树基本操作
本文介绍了Linux内核中常用的设备树(of_)操作函数,主要包括:1)基础操作函数如节点遍历、属性读取;2)地址与中断处理函数;3)特殊类型处理函数。重点解析了字节序转换的必要性(设备树默认大端存储),并提供了设备树节点解析的完整代码示例,包括字符串、整型、数组等属性的读取方法,以及子节点遍历的实现。注意事项中特别强调了内存管理要点:for_each_child_of_node无需手动释放节点,而of_get_child_node需要手动释放。
2026-02-27 10:47:14
613
原创 linux内核驱动中内存管理和分配方式
本文介绍了Linux内核中物理内存分配的alloc_pages接口使用。通过示例代码展示了如何分配连续物理页(4页共16KB),并详细解析了各页的虚拟地址、物理地址和页帧号信息。关键点包括:1)GFP_KERNEL分配标志的使用;2)order参数控制分配页数(2^order);3)page_address/page_to_phys/page_to_pfn等转换函数;4)分配结果验证显示页帧号连续。最后强调page_address与page_to_virt的区别及适用场景,为内核开发提供实用参考。
2026-02-27 10:46:52
880
原创 linux内核驱动中预留内存的使用方法
本文分析了Linux内核驱动中预留内存的几种实现方式,包括通用性CMA、专用性CMA、早期预留内存、普通预留内存以及通过设备树和uboot参数预留内存的方法。重点展示了通用性CMA的实现代码示例,通过设备树定义CMA区域并在驱动中使用dma_alloc_coherent分配10MB和50MB内存块。文章还提供了内存测试函数来验证分配的内存是否可用,包括单值写入和块写入测试。这些方法为设备驱动开发中内存管理提供了灵活选择,可根据实际需求选用不同的预留内存策略。
2026-02-27 10:46:31
621
原创 linux的休眠与唤醒调试
本文介绍了Linux系统休眠与唤醒的调试方法。首先需要配置相关内核选项(CONFIG_PM_DEBUG等),然后通过设置sysfs参数启用调试功能:禁用控制台休眠日志、记录电源管理时间、调整内核日志级别。文中提供了查看休眠唤醒时间、结果和单元测试的方法,并通过代码案例说明wait_event_interruptible和wait_event_freezable的区别,指出后者能更好地处理系统休眠过程中的线程冻结问题,避免资源冲突导致的休眠失败。
2026-02-27 10:46:09
675
原创 linux内核中链表的基本使用
本文介绍了Linux内核链表的基本操作,包括使用LIST_HEAD宏定义链表头、list_add添加节点、list_for_each_entry遍历链表、list_del删除节点等核心功能。代码演示了如何创建链表、添加5个数据节点、遍历打印链表内容、删除指定数据节点,并在模块退出时安全释放所有节点内存。重点展示了list_for_each_entry_safe的安全遍历方法,适用于需要删除节点的场景,同时提供了详细的日志打印功能来跟踪链表状态变化。
2026-02-27 10:45:44
165
原创 linux内核中的各种锁的使用
本文介绍了Linux内核中锁机制的选择与使用。当保护简单整型变量时首选原子操作,保护复杂临界区时需使用锁。重点分析了自旋锁(spinlock)的特性:适用于多核环境短期持有锁的场景,获取不到时会循环等待。解释了自旋锁需要禁止本地中断的原因(防止死锁),以及在单CPU系统中的特殊处理(退化为禁止抢占)。提供了自旋锁的代码示例,展示如何通过spin_lock_irqsave()和spin_unlock_irqrestore()安全地保护共享数据。最后总结了不同场景下的锁选择策略。
2026-02-26 17:56:06
593
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅