reset子系统简介

复位模式

在硬件设备被置于复位模式时,通常会限制或禁止对设备寄存器的读写操作。这是为了确保在复位模式下设备能够以可控和可预测的方式进行初始化和复位操作。具体而言,当设备被置于复位模式时,其内部状态和寄存器值可能会被清零或设置为初始状态。此时,外部对设备的读写操作可能会受到限制或无效。
 

linux reset驱动框架

reset core操作函数

在drivers/reset/core.c中
struct reset_control_ops {
    int (*deassert)(struct reset_controller_dev *rcdev, unsigned long id);
    int (*assert)(struct reset_controller_dev *rcdev, unsigned long id);
    int (*reset)(struct reset_controller_dev *rcdev, unsigned long id);
    int (*status)(struct reset_controller_dev *rcdev, unsigned long id);
    int (*reset_check)(struct reset_controller_dev *rcdev, unsigned long id);
};

deassert() 函数指针用于解除复位控制器的复位信号。
assert() 函数指针用于触发复位控制器的复位信号。
reset() 函数指针用于执行硬件复位操作。reset()函数内部逻辑就是先assert()再deassert()
status() 函数指针用于查询复位控制器的状态。
reset_check() 函数指针用于检查复位控制器是否处于复位状态。
 

相关API函数

// 解析设备树,获取reset_control结构体指针
static inline struct reset_control *devm_reset_control_get_optional_shared(
                    struct device *dev, const char *id)    // 共享的复位
{
        return __devm_reset_control_get(dev, id, 0, true, true, false);
}

static inline struct reset_control *devm_reset_control_get_optional_exclusive(
                    struct device *dev, const char *id)    // 私有的复位
{
        return __devm_reset_control_get(dev, id, 0, false, true, true);
}
实际在芯片设计的时候,各个模块的复位寄存器肯定都是一对一的,使用私有的复位函数获取即可
static int my_driver_probe(struct platform_device *pdev)
{
    struct reset_control *rstc;

    rstc = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL);
    if (IS_ERR(rstc)) {
        dev_err(&pdev->dev, "Failed to get reset control\n");
        return PTR_ERR(rstc);
    }

    /* 在此处可以使用获取到的复位控制器进行操作 */

    return 0;
}

// 第二个参数是可选的复位控制器名称,如果设置为 NULL,则函数会根据设备的 struct device 结构体中的 of_node 或 fwnode 字段来查找复位控制器。
 
reset_control_deassert(rst);
reset_control_assert(rst);
reset_control_reset(rst);
这三个函数对应的就是reset core中操作函数
 
一般在probe函数中,使用reset_control_deassert函数来解除复位状态,让device可以正常工作
在remove函数中,使用reset_control_assert函数将设备置于复位状态
在restart函数中,使用reset_control_reset函数将设备复位
 

操作节点

在Linux的reset子系统中,以下是一些常用的节点文件:
/sys/class/reset/reset-xxx/state:表示一个复位控制器的状态,可以是asserted(激活)或deasserted(非激活)。
/sys/class/reset/reset-xxx/reset:表示一个复位控制器的重置操作。写入1会触发复位操作,写入0则会取消复位操作。
/sys/class/reset/reset-xxx/status:表示一个复位控制器的详细信息,如可用的复位信号数量、重置类型等。
/sys/bus/platform/devices/xxx/reset:表示与平台设备相关联的复位控制器。通过该节点文件可以实现对特定平台设备的复位控制。
以上节点文件名称中的和都是占位符,需要替换为具体的设备名称或标识符
posted @ 2024-03-23 23:21  lethe1203  阅读(98)  评论(0编辑  收藏  举报