目录
1. 简介
2. consumer-驱动软件
3. provider-reset驱动
3.1 整体介绍
3.2 reset复位API说明
之前的文章电源管理入门-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 driver(provider),只用实现一次就可以了。