Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    【FAQ】全志D1芯片 如何在休眠唤醒过程中通过 sunxi_dump 读写外设寄存器?

    其它全志芯片讨论区
    d1 faq 技术支持
    1
    1
    1443
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • q1215200171
      budbool LV 9 last edited by q1215200171

      问题背景

      设备休眠唤醒出错 是在休眠唤醒问题中最常见的一种,因此需要在休眠过程中,读取设备寄存器信息,分析设备状态,成为一种常见的需求。

      sunxi_dump 是 AW 提供的一种通过控制台 dump 设备寄存器的模块,但由于在休眠唤醒过程中控制台不可用,因此需要一种在休眠唤醒过程中,可以直接dump设备寄存器的机制。

      因此,拓展了 sunxi_dump 的功能,使其支持通过休眠唤醒前的配置,在休眠过程中执行 dump。

      使用方法

      1, 使能休眠唤醒日志

      • 使控制台不休眠,必须
      echo N > /sys/module/printk/parameters/console_suspend
      
      • 使能 kernel 休眠打印 可选
      echo 1 > /sys/module/kernel/parameters/initcall_debug
      
      • 使能 设备休眠唤醒调用顺序 可选
      echo 1 > /sys/power/pm_print_times
      
      • 调整控制台打印级别 可选
      echo 8 > /proc/sys/kernel/printk
      
      • 也可以执行
      echo Y > /sys/module/printk/parameters/ignore_loglevel
      

      2, 根据需要,关闭异步休眠唤醒
      默认是并行休眠,可能出现多个核同时休眠设备,打印日志比较乱的情况

      echo 0 > /sys/power/pm_async # 关闭异步
      

      3, 设置休眠过程需要执行的动作
      /sys/class/sunxi_dump/standby_dump_ctrl 是为了方便在 standby 等流程中读写寄存器的值,增加的接口。

      其每个bit对应一个动作开关,目前支持一下控制位。 可以通过位操作同时使能多个动作。

      enum {
      	DUMP_CTRL_DEV_PREPARE = 0, // 在 device prepare 阶段执行dump
      	DUMP_CTRL_DEV_SUSPEND, // 在 device suspend 阶段执行dump
      	DUMP_CTRL_DEV_SUSPEND_LATE, // 在 device suspend_late 阶段执行dump
      	DUMP_CTRL_DEV_SUSPEND_NOIRQ, // 在休眠唤醒的 device suspend_noirq 阶段执行dump
      	DUMP_CTRL_SYSCORE_SUSPEND, // 在 syscore suspend 阶段执行dump
      
      
      	DUMP_CTRL_DEV_COMPLETE = 8, // 在 device complete 阶段执行dump
      	DUMP_CTRL_DEV_RESUME, // 在 device resume 阶段执行dump
      	DUMP_CTRL_DEV_RESUME_EARLY, // 在 device resume_early 阶段执行dump
      	DUMP_CTRL_DEV_RESUME_NOIRQ, // 在 device resume_noirq 阶段执行dump
      	DUMP_CTRL_SYSCORE_RESUME, // 在 syscore resume 阶段执行dump
      
      	DUMP_CTRL_SUSPEND_WRITE = 16, // 在 syscore suspend 阶段执行 write
      	DUMP_CTRL_RESUME_WRITE  = 17, // 在 syscore resume 阶段执行 write
      };
      

      例如

      # echo 0x11111 > /sys/class/sunxi_dump/standby_dump_ctrl
      [ 2750.841496] standby_dump_ctrl change to 0x00011111
      

      4, 按需要设置,需要读写的寄存器域

      • 读取一个区域
      echo 0x07090100,0x0709010c > /sys/class/sunxi_dump/dump
      
      • 写一个寄存器
      # echo 0x0709010c 0x12345678 > /sys/class/sunxi_dump/write
      [ 2783.442051] Will write it actually when suspend.
      

      5, 休眠即可

      注意实现

      1, 由于该模块在standby中被抽象为设备,因此需要注意该模块与目标设备执行先后顺序是不是满足要求。

      2, 由于有些设备会关闭自己的时钟,之后访问该设备寄存器可能存在 全 0 值。

      以上,可以调整执行的动作 来确认和规避。

      1 Reply Last reply Reply Quote Share 0
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策