DSP

SMP865X广告机之节能模式(power saving)

2019-07-13 12:12发布

作者 QQ: 35327864,msn: fgwf1@hotmail.com,mail: agooou@gmail.com
1,简介
    kernel2.6.25和2.6.22.19包含了频率变换特性。配合其他升级了的模块(各种microcodes,DSP的IRQ处理,RISC引擎,XPU),系统能在运行时动态改变DSP/CPU/XPU的频率。这样就实现了节能模式。
    目前,有支持2种节能模式。第一种模式,将频率降低到大概125MHz,将保持整个系统运行。所有的外设,视频解码器等,都工作(但可能处理不了高码率的流)。第二种模式,深度睡眠模式,将频率降低到大概54MHz或者27MHz。在这种模式下,大部分外设将不工作,只有一部分设备是活动的(如IR,前面板接口,Ethernet,HDMI CEC, GPIO pin monitoring),这些设备监听唤醒信号,然后进入全功能模式。
    Simga的8644/8654参考板,在54MHz的深度睡眠模式耗能为0.32W/0.25W,在126MHz的低耗能模式耗能为0.54W/0.41W,在标准模式下的idle状态耗能为1.14W/0.84W。在不同环境下可能会有不同。

2,proc接口
    在linux系统中,proc文件系统可以用来与内核内部交互,还包含一些其他的子系统和设备驱动,如设置kernel的网络处理参数,得到或者设置设备的状态(需要设备驱动支持)。
    处理器频率调节特性作为一个模拟的设备驱动来实现。一旦加载激活后,一些操作可以在user层进行。

3,准备工作
    这个功能由外部的模块实现,在系统源码树之外。源码在smp86xx_kernel_source_R2.6.22-35/proprietary/freqctrl中。可以在smp86xx_kernel_source_R2.6.22-35目录中make proprietary编译生成这个驱动。
    可以调整这个freqctrl目录下的Mackfile文件来允许或禁止某些特性(如通过Ethernet唤醒,通过HDMI CEC唤醒),改变参数(改变INPUT_TABLE_SIZE的值,可以改变buffer大小)。默认的,除了HDMI CEC,其他的唤醒方式都支持。Ethernet唤醒方法是发送Magic Packet,关于这个可以参考《 http://en.wikipedia.org/wiki/Wake-on-LAN#Magic_Packet 》。

4,开启特性
    一旦这些功能被打开,/proc下将会添加一些内容。
    /proc/tangoxfreq/freq. 只读
    /proc/tangoxfreq/mux 可读可写
        如,echo 3 > /proc/tangoxfreq/mux ,切换到3的那种频率。
    /proc/tangoxfreq/pll1
    /proc/tangoxfreq/pll2
    /proc/tangoxfreq/profile
    /proc/tangoxfreq/standby
        如,echo standby > /proc/tangoxfreq/standby
    /proc/tangoxfreq/ir_table
        如,echo "0x12345678 0x2223444 0x6789" > /proc/tangoxfreq/ir_table
    /proc/tangoxfreq/fip_table
    /proc/tangoxfreq/gpio_pins
        如,echo 0x00008010 > /proc/tangoxfreq/gpio_pins ,设置此gpio控制唤醒。
    /proc/tangoxfreq/cec_addr
        如,echo 0x00001000 > /proc/tangoxfreq/cec_addr

5,需要注意的问题
    在进入standby模式前,最好将外部文件系统umount,特别是热插拔设备,如USB和SATA,以及卸载他们的驱动。根据节能模式的不同,时钟可能会不可用,需要做小心的处理。

6,相关的XENV内容
    A)低耗能模式(low frequency mode)
# Tango3 Configuration used for power saving mode (e.g. low frequency mode)
a.ps.pll2 = 0x0101203b
a.ps.pll0 = 0x0
a.ps.mt3_hs = { 0x0100201b, 0x301, 0x401, 0x3514001a, 0x4565132b, 0x00010021, 0x3514001a, 0x4565132b, 0x00010021, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0c0c0c0c, 0x80808080, 0x7f7d7f7d, 0x05050505, 0x05050505, 0x0c0c0c0c, 0x80808080, 0x7a7a7c7c, 0x05050505, 0x05050505 }
    B)深度睡眠模式(standby mode)
# Tango3 Configuration used for standby mode (e.g. deep sleep mode)
a.standby.pll2 = 0x0
a.standby.pll0 = 0x0
a.standby.mt3_hs = { 0x0100602f, 0x301, 0x401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
a.standby.gpio_dir = 0x0
a.standby.gpio_data = 0x0