当前位置: 首页 > article >正文

电源管理入门-4子系统reset

之前的文章电源管理入门-1关机重启详解介绍了整机SoC的重启也可以说是reset那么子系统的reset例如某个驱动网卡、USB等或者某个子系统NPU、ISP等运行在独立的M核或者R核上的AI系统这些零碎模块的reset就需要用另外一种机制Linux提供了reset framework框架我们可以使用这个框架对子系统reset然后操作硬件CRU寄存器进行硬件的reset操作。考虑到安全的因素对CRU寄存器的操作可以放在ATF里面的BL31通过SMC指令或者放到SCP里面通过Linux-SCMI-》SCP里面进行。本小节先介绍下Linux里面的通用reset框架下篇介绍arm-scmi到SCP进行CRU硬件操作的实现。1. 简介复杂SoC内部有很多具有独立功能的硬件模块例如CPU cores、GPU cores、USB控制器、MMC控制器、等等出于功耗、稳定性等方面的考虑有些SoC在内部为这些硬件模块设计了复位信号reset signals软件可通过寄存器一般1个bit控制1个硬件控制这些硬件模块的复位状态。例如有3个软件I2C/EMMC/IPC都有复位某个硬件模块的需求那么要写三个复位操作代码。这些代码可以进行抽象出来一个独立的软件框架-reset framework这样软件使用者consumer:I2C/EMMC/IPC直接使用硬件模块的名字就可以对硬件进行复位。一个模块硬件的复位实现为单独的reset driverprovider只用实现一次就可以了。再次说明了解决复杂问题的普遍方法就是抽象而Linux内核可以说是玩得一手好抽象也是操作系统的必备技能。2. consumer-驱动软件对于硬件驱动来的需求来说就是复位某个硬件在驱动代码里面可以通过硬件的名字进行复位这个名字对应设置放在了dts文件中例如i2c0: i2c0xA1006000{compatiblearch64,a10-i2c;reg00xA100600000x100;interrupt-parentgic;interrupts0324;clock-frequency24000000;resetsrst 0x5011;reset-namesi2c0;statusdisabled;};rst使用rst驱动0x50寄存器偏移11使用那个bit 进行复位的时候在驱动软件里面加上i2c_dev-i2c_rstdevm_reset_control_get(i2c_dev-dev,i2c0);static int i2c_reset_assert(struct reset_control *rstc){int rc0;rcreset_control_assert(rstc);if(rc0){pr_err(%s: failed\n, __func__);returnrc;}returnrc;}static int i2c_reset_assert(struct reset_control *rstc){int rc0;rcreset_control_assert(rstc);if(rc0){pr_err(%s: failed\n, __func__);returnrc;}returnrc;}static int i2c_hw_reset(struct i2c_dev *i2c_dev){i2c_reset_assert(i2c_dev-i2c_rst);udelay(1);i2c_reset_release(i2c_dev-i2c_rst);}i2c_dev-i2c_rst是一个reset_control的结构体struct reset_control{struct reset_controller_dev *rcdev;struct list_head list;unsigned intid;struct kref refcnt;bool acquired;bool shared;bool array;atomic_t deassert_count;atomic_t triggered_count;};上面i2c驱动作为consumer调用了reset framework提供的API函数include/linux/reset.h如下/* 通过reset_control_get或者devm_reset_control_get获得reset句柄 */ struct reset_control *reset_control_get(struct device *dev, const char *id);void reset_control_put(struct reset_control *rstc);struct reset_control *devm_reset_control_get(struct device *dev, const char *id);/* 通过reset_control_reset进行复位或者通过reset_control_assert使设备处于复位生效状态通过reset_control_deassert使复位失效 */ reset_control_deassert(struct reset_control *rstc)//解复位 reset_control_assert(struct reset_control *rstc)//复位 reset_control_reset(struct reset_control *rstc)//先复位延迟一会然后解复位3. provider-reset驱动3.1 整体介绍reset驱动是一个独立驱动为其他驱动提供硬件复位的服务。首先在dts里面设置.compatible这样驱动就可以加载了如下定义了rst驱动rst: reset-controller{compatiblearch64,a10-reset;#reset-cells 2;reg0x0 0x91000000 0x0 0x1000;};上述是一个reset控制器的节点0x91000000是寄存器基址0x1000是映射大小。#reset-cells代表引用该reset时需要的cells个数。然后就是reset驱动的实现reset驱动编写的基本步骤实现struct reset_control_ops结构体中的.reset、.assert、.deassert、.status函数分配struct reset_controller_dev结构体填充ops、owner、nr_resets等成员内容调用reset_controller_register函数注册reset设备首先定义platform_driver:static const struct of_device_id a10_reset_dt_ids[]{{.compatiblehobot,a10-reset,},{},};static struct platform_driver a10_reset_driver{.probea10_reset_probe, .driver{.nameKBUILD_MODNAME, .of_match_tablea10_reset_dt_ids,},};static int __init a10_reset_init(void){returnplatform_driver_register(a10_reset_driver);}系统初始化dts中配置了此reset驱动就会调用a10_reset_probestatic int a10_reset_probe(struct platform_device *pdev){struct a10_reset_data *data;struct resource *res;struct device *devpdev-dev;struct device_node *npdev-of_node;u32 modrst_offset;/* * The binding was mainlined without the required property. * Do not continue, when we encounter an old DT. */if(!of_find_property(pdev-dev.of_node,#reset-cells, NULL)){dev_err(pdev-dev,%s missing #reset-cells property\n, pdev-dev.of_node-full_name);return-EINVAL;}datadevm_kzalloc(pdev-dev, sizeof(*data), GFP_KERNEL);if(!data)return-ENOMEM;resplatform_get_resource(pdev, IORESOURCE_MEM,0);>membasedevm_ioremap_resource(pdev-dev, res);if(IS_ERR(data-membase))returnPTR_ERR(data-membase);spin_lock_init(data-lock);>rcdev.ownerTHIS_MODULE;>rcdev.nr_resetsa10_MAX_NR_RESETS;>rcdev.opsa10_reset_ops;>rcdev.of_nodepdev-dev.of_node;>rcdev.of_xlatea10_reset_of_xlate;>rcdev.of_reset_n_cells2;returndevm_reset_controller_register(dev,data-rcdev);}data-rcdev的定义如下struct reset_controller_dev{const struct reset_control_ops *ops;//复位控制操作函数 struct list_head list;//全局链表复位控制器注册后挂载到全局链表 struct list_head reset_control_head;//各个模块复位的链表头 struct device *devint of_reset_n_cells;//dts中引用时需要几个参数 //通过dts引用的参数解析复位控制器中相应的参数 int(*of_xlate)(struct reset_controller_dev *rcdev, const struct of_phandle_args *reset_spec)unsigned int nr_resets;//复位设备个数}ops提供reset操作的实现基本上是reset provider的所有工作量。of_xlate和of_reset_n_cells用于解析consumer device dts node中的“resets ; ”节点如果reset controller比较简单仅仅是线性的索引可以不实现使用reset framework提供的简单版本----of_reset_simple_xlate即可。nr_resets该reset controller所控制的reset信号的个数。a10_reset_ops定义了reset framework的回调函数对具体寄存器位进行操作//reset可控制设备完成一次完整的复位过程。 //assert和deassert分别控制设备reset状态的生效和失效。 static const struct reset_control_ops a10_reset_ops{.asserta10_reset_assert, .deasserta10_reset_deassert, .statusa10_reset_status,};static int a10_reset_assert(struct reset_controller_dev *rcdev, unsigned longid){void __iomem *regaddr;uint32_t reg_val, offset;unsigned long flags;u8 bit;struct a10_reset_data *datato_a10_reset_data(rcdev);if(rcdevNULL||id0)return-EINVAL;spin_lock_irqsave(data-lock, flags);offset(idRESET_REG_OFFSET_MASK)RESET_REG_OFFSET_SHIFT;regaddr>membase offset;reg_valreadl(regaddr);bit(idRESET_REG_BIT_MASK);reg_val|BIT(bit);writel(reg_val, regaddr);spin_unlock_irqrestore(data-lock, flags);return0;}static int a10_reset_deassert(struct reset_controller_dev *rcdev, unsigned longid){void __iomem *regaddr;uint32_t reg_val, offset;unsigned long flags;u8 bit;struct a10_reset_data *datato_a10_reset_data(rcdev);if(rcdevNULL||id0)return-EINVAL;spin_lock_irqsave(data-lock, flags);offset(idRESET_REG_OFFSET_MASK)RESET_REG_OFFSET_SHIFT;regaddr>membase offset;reg_valreadl(regaddr);bit(idRESET_REG_BIT_MASK);reg_val~(BIT(bit));writel(reg_val, regaddr);spin_unlock_irqrestore(data-lock, flags);return0;}static int a10_reset_status(struct reset_controller_dev *rcdev, unsigned longid){return0;}3.2 reset复位API说明devm_reset_control_getstruct reset_control *devm_reset_control_get(struct device *dev, const char *id)• 作用获取相应的reset句柄 • 参数 dev指向申请reset资源的设备句柄 id指向要申请的reset资源名字符串可以为NULL • 返回 成功返回reset句柄 失败返回NULLreset_control_deassertint reset_control_deassert(struct reset_control *rstc)• 作用对传入的reset资源进行解复位操作 • 参数 rstc指向申请reset资源的设备句柄 • 返回 成功返回0 失败返回错误码reset_control_assertint reset_control_assert(struct reset_control *rstc)• 作用对传入的reset资源进行复位操作。 参数和返回值与reset_control_deassert相同reset_control_resetint reset_control_reset(struct reset_control *rstc)• 作用对传入的reset资源先进行复位操作然后等待5us再进行解复位操作。 • 相当于执行了一遍reset_control_assert后然后delay一会再调用reset_control_deassert后记使用markdown写中文发现段落行首空格实在不好搞然后调研了很多牛人写的中文博客发现行首不用空格的很多咱们这里为了方便书写也不要行首空格了。毕竟工具是服务人的规则都是在变化的。后续文章先在稀土掘金首发写的快然后复制过来欢迎关注https://juejin.cn/user/2052111227697336电源管理可能很多人不喜欢看我分几次多篇一块发完。也欢迎大家把喜欢看的技术留言。电源管理这个专栏其实比较小众大伙并不是那么爱看我就先多写几篇存着到时一块推送避免公共资源的浪费节省点大家的时间。有时候我也划开微信看看直播和视频号发现很多无脑的直播比如河边钢筋磨石头、在家转大棍子什么科目三感觉这些都有人看这么无脑我就算写点垃圾文字也比这强的吧也有可能人看视频就是为了无脑休息下。“啥都懂一点啥都不精通干啥都能干干啥啥不是专业入门劝退堪称程序员杂家”。后续会继续更新纯干货分析欢迎分享给朋友欢迎评论交流公众号“那路谈OS与SoC嵌入式软件”欢迎关注个人文章汇总https://thatway1989.github.io

相关文章:

电源管理入门-4子系统reset

之前的文章电源管理入门-1关机重启详解介绍了整机SoC的重启也可以说是reset,那么子系统的reset,例如某个驱动(网卡、USB等)或者某个子系统(NPU、ISP等运行在独立的M核或者R核上的AI系统),这些零…...

迈瑞医疗营收超330亿,国际业务持续发力未来何在?

最近的财报季,各家上市公司的财报都牵动着每个人的心,就在最近迈瑞医疗的成绩单公布,营收超330亿,国际业务持续向好,这样的成绩单我们到底该怎么看待呢?一、迈瑞医疗业绩稳健向好据每日经济新闻的报道&…...

预制指标、宽表、SQL、本体ABC:真正决定长期成本的,是一次变更会波及多少层

企业做智能问数,最常见的比较题是:预制指标、宽表、人工 SQL、本体ABC,到底哪条路线维护成本更低?如果只给一个笼统答案,往往容易失真。因为真正决定长期成本的,不是“今天开发快不快”,也不是“…...

BetterNCM Installer:3步完成网易云音乐插件框架安装

BetterNCM Installer:3步完成网易云音乐插件框架安装 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer BetterNCM Installer 是一个专为网易云音乐PC版客户端设计的插件管理器…...

WebGL开发者必备:用RenderDoc旧版本抓帧调试的完整避坑指南(附DEBUG_CHROME.bat脚本)

WebGL开发者必备:用RenderDoc旧版本抓帧调试的完整避坑指南(附DEBUG_CHROME.bat脚本) 最近在WebGL开发中遇到一个棘手问题:最新版RenderDoc已经禁止了对Chrome等浏览器的抓帧功能。这对于正在学习图形学课程(比如GAMES…...

PowerBI进阶:除了DATEADD,这3种方法也能玩转同比环比(附场景选择指南)

PowerBI时间智能函数深度对比:突破DATEADD局限的实战指南 当你已经能熟练使用DATEADD计算同比环比,却发现报表加载速度越来越慢,或是遇到非标准财年分析需求时,是时候重新审视PowerBI的时间智能函数工具箱了。本文将带你深入剖析四…...

一套万能的异步处理方案!(珍藏版)

前言 良好的系统设计必须要做到开闭原则,随着业务的不断迭代更新,核心代码也会被不断改动,出错的概率也会大大增加。但是大部分增加的功能都是在扩展原有的功能,既要保证性能又要保证质量,我们往往都会使用异步线程池…...

SpringBoot+Tess4j:轻松实现OCR功能

一、引言二、功能演示三、功能实现1. 描述2. 编码实现四、源码五、结束语一、引言你是否曾遇到过这样的情况:看到一段有用的文本,想要快速复制下来,却只能眼巴巴地盯着屏幕,手动输入?其实,Java 也可以轻松实…...

手把手教你学Simulink——基于Simulink的无差拍控制三相整流器高精度电流跟踪

目录 手把手教你学Simulink ——基于Simulink的无差拍控制三相整流器高精度电流跟踪 一、问题背景 二、系统建模与控制原理 1. 三相整流器拓扑 2. dq 轴数学模型(同步旋转坐标系) 3. 无差拍控制律推导 三、整体控制架构 四、Simulink 建模步骤 第一步:搭建三相整流…...

FreeRtos——24、STM32中断处理体系及软件定时器按键消抖

第一节:STM32中断处理体系结构1.中断处理路径:2.NVIC中断控制器的中断优先级:2.1 中断号:在NVIC中对于硬件产生的任何一个中断都分配了一个中断号,中断号是一个唯一的标识符,用于识别每个外设设备的中断。NVIC使用中断号来配置中断…...

手把手教你学Simulink——基于Simulink的模型预测控制(MPC)PFC整流器快速动态响应

目录 手把手教你学Simulink ——基于Simulink的模型预测控制(MPC)PFC整流器快速动态响应 一、问题背景 二、系统建模与控制目标 1. 单相 Boost PFC 拓扑 2. 动态方程(αβ 静止坐标系) 3. 控制目标 三、有限控制集 MPC(FCS-MPC)设计 1. 预测模型(离散化) 2. 代…...

ViT图像分类-中文-日常物品完整指南:4090D单卡环境配置与中文类别映射说明

ViT图像分类-中文-日常物品完整指南:4090D单卡环境配置与中文类别映射说明 想试试用AI模型来识别你手机里的照片吗?比如,拍一张桌上的水杯、键盘或者零食,让模型告诉你它是什么。今天要介绍的这个工具,就能帮你轻松实…...

微信小程序语音交互实战:长按录制与点击播放的完整实现方案

1. 微信小程序语音交互功能概述 语音交互已经成为现代移动应用不可或缺的功能之一。在微信小程序中实现语音录制与播放,能够极大提升用户体验,特别适合社交、教育、工具类小程序。我最近在一个社交类小程序项目中实现了完整的语音交互模块,踩…...

用STM32F103C8T6和F9P模组DIY一台RTK无人车:从蓝牙遥控到自主导航的保姆级教程

用STM32F103C8T6和F9P模组打造高精度RTK无人车:从零构建到自主导航全流程解析 在创客圈子里,能够自主导航的智能小车一直是热门项目。但传统基于普通GPS的方案定位精度往往在米级徘徊,难以实现真正的精准控制。而将RTK(实时动态定…...

终极Cursor Pro解锁指南:免费体验AI编程助手的完整解决方案

终极Cursor Pro解锁指南:免费体验AI编程助手的完整解决方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached you…...

小白友好!Stable Diffusion v1.5单卡运行多个服务,详细步骤+避坑指南

小白友好!Stable Diffusion v1.5单卡运行多个服务,详细步骤避坑指南 1. 为什么需要单卡多服务? 很多刚接触Stable Diffusion的朋友都会遇到这样的困扰:团队里几个人共用一台服务器,但GPU卡只有一张。一个人用的时候还…...

ai辅助硬件设计:让快马智能解析并生成db9接口与mcu连接的完整原理图与代码

在硬件开发中,DB9接口的设计与连接是个常见但容易出错的环节。最近我在一个嵌入式项目里需要实现STM32与DB9接口的RS-232通信,发现传统设计流程存在几个痛点: 引脚定义容易混淆 DB9公头和母头的引脚定义是相反的,比如母头的2号引脚…...

VoxCPM-1.5-WEBUI问题解决:部署常见错误与一键启动脚本详解

VoxCPM-1.5-WEBUI问题解决:部署常见错误与一键启动脚本详解 1. 快速入门指南 1.1 镜像部署准备 在开始使用VoxCPM-1.5-WEBUI之前,您需要确保具备以下条件: 支持CUDA的NVIDIA显卡(建议RTX 3060及以上)至少16GB系统内…...

深入解析cufftPlanMany:从参数配置到高效FFT实现

1. 为什么需要cufftPlanMany? 第一次接触CUDA FFT时,很多人都是从cufftPlan1d、cufftPlan2d这些基础接口开始的。但当你真正处理实际工程问题时,会发现这些简单接口远远不够用。比如要处理批量信号、非连续内存数据、子区域FFT计算等场景时&a…...

告别手动处理:用快马AI一键生成你的专属批量链接效率工具

最近在整理项目文档时,经常需要处理大量杂乱无章的链接。手动一个个检查、格式化这些链接不仅耗时耗力,还容易出错。于是我开始寻找更高效的解决方案,最终在InsCode(快马)平台上快速实现了一个批量链接处理工具,整个过程比想象中简…...

QMCDecode:让音乐自由播放的开源格式转换工具

QMCDecode:让音乐自由播放的开源格式转换工具 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换结果存…...

Gemma-3-270m内网穿透部署方案

Gemma-3-270m内网穿透部署方案:安全打通企业AI服务 想象一下这个场景:你们公司的研发团队刚刚在内部服务器上部署了轻量高效的Gemma-3-270m模型,准备用它来优化客服工单分类、自动生成产品文档。模型跑起来了,效果也不错&#xf…...

4个维度解析Lenovo Legion Toolkit:游戏本性能管理的轻量革命

4个维度解析Lenovo Legion Toolkit:游戏本性能管理的轻量革命 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit 1.…...

LFM2.5-1.2B-Thinking-GGUF算法解析应用:图解经典算法与复杂度分析

LFM2.5-1.2B-Thinking-GGUF算法解析应用:图解经典算法与复杂度分析 1. 算法可视化教学新范式 算法学习一直是计算机科学教育中的难点。传统的教科书讲解方式往往让初学者感到抽象难懂,而LFM2.5-1.2B-Thinking-GGUF模型为算法教学带来了全新的可视化解决…...

如何用开源工具实现3D打印钥匙自由?从参数测量到模型生成的实践路径

如何用开源工具实现3D打印钥匙自由?从参数测量到模型生成的实践路径 【免费下载链接】keygen OpenSCAD tools for generating physical keys 项目地址: https://gitcode.com/gh_mirrors/ke/keygen 在数字化制造蓬勃发展的今天,3D打印技术正逐步走…...

龙虾agent-browser获得chromium包问题

小龙虾非常火爆,在装agent-browser的时候,普通人往往被chromium的安装堵死了。网上的跨域安装方法一大堆,包括用镜像站点,国内所有的镜像站点都不行。但是真正能走通的,我到最后也没有试出来。最后只能自己想出一种手动…...

Obsidian图像转换:提升笔记效率的格式优化解决方案

Obsidian图像转换:提升笔记效率的格式优化解决方案 【免费下载链接】obsidian-image-converter ⚡️ Convert, compress, resize, annotate, markup, draw, crop, rotate, flip, align images directly in Obsidian. Drag-resize, rename with variables, batch pro…...

Realistic Vision V5.1效果展示:这些惊艳的人像作品都是AI生成的

Realistic Vision V5.1效果展示:这些惊艳的人像作品都是AI生成的 1. 当AI画师遇上专业摄影师 你有没有见过这样的AI生成人像?皮肤纹理清晰到能看见毛细血管,发丝在阳光下呈现自然的半透明质感,眼神光的位置精准符合物理反射规律…...

Path of Building PoE2:零基础掌握流放之路2角色规划工具实战指南

Path of Building PoE2:零基础掌握流放之路2角色规划工具实战指南 【免费下载链接】PathOfBuilding-PoE2 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2 你是否曾遇到这样的困境:花费数小时规划的角色build&#xff0c…...

一站式屏幕神器eSearch:如何5分钟打造你的智能工作流?

一站式屏幕神器eSearch:如何5分钟打造你的智能工作流? 【免费下载链接】eSearch 截屏 离线OCR 搜索翻译 以图搜图 贴图 录屏 万向滚动截屏 屏幕翻译 Screenshot Offline OCR Search Translate Search for picture Paste the picture on the screen Scree…...