新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Linux的便攜嵌入式設備電源管理解決方案

        基于Linux的便攜嵌入式設備電源管理解決方案

        作者: 時間:2012-04-05 來源:網絡 收藏


        通過Linux機制及上層應用實現對iPAQ和耗電量調節

        確定了要調控的對象和方法后,需要通過L inux的機制和上層應用軟件來實現對這些硬件設備的控制。這包括編寫CPU電源管理代碼、外設驅動程序及電源管理代碼、電源管理設備實現代碼和用戶空間控制應用代碼。

        (1)實現SA - 1110進入Sleep電源模式的代碼

        SA -1110有Normal, Idle, Sleep 等幾種電源模式,其中在Sleep模式下, SA -1110具有最小的電力消耗。由于SA -1110 進入Sleep 模式后,到外設和SDRAM的時鐘將停止,多數的寄存器信息將丟失。因此需要事先將重要的寄存器值保存到內存中,并將SDRAM設置為自刷新模式,以保持 SDRAM中的數據。當SA -1110 收到硬件中斷等喚醒源退出Sleep模式后不會接著執行先前未執行的指令,而是回到初始狀態去執行啟動代碼。因此為了讓CPU在喚醒后能夠持續的工作,需要將返回代碼的地址保存到PowerManager Scratch Pad Register ( PSPR)寄存器中,使得啟動代碼能讓CPU重新跳到返回代碼的地址處,執行返回代碼從而回到睡眠前的工作。

        SA - 1110進入Sleep模式的代碼片斷如下:
        extern void cpu_sa1110_resume ( void) ; /3 SA - 1110返回函
        數3 /
        extern int cpu_sa1110_do_suspend ( void) ; /3 SA - 1110睡眠
        函數3 /
        int sa1110_suspend ( void)
        {
        . . .
        cli ( ) ; /3 關閉中斷3 /
        sys_ctx. osmr0 = OSMR0; /3 保存重要的寄存器3 /
        . . .
        sys_ctx. p sdr = PSDR;
        . . .
        PSPR = virt_to_phys ( cpu_sa1100_resume) ; /3 設置返回函
        數地址3 /
        cpu_sa1110_do_suspend ( ) ; /3 進入睡眠3 /
        /3 退出睡眠3 /
        GPDR = sys_ctx. gpdr; /3 恢復寄存器3 /
        GRER = sys_ctx. grer;
        GFER = sys_ctx. gfer;
        GAFR = sys_ctx. gafr;
        . . .
        sti ( ) ; /3 啟動中斷3 /
        return 0;
        }

        (2)實現各個外設的電源管理代碼

        利用Linux內核提供電源管理子系統,可以將iPAQ中的每個需要實現電源管理的外部設備納入統一的管理。這需要在各個設備的驅動程序中使用電源管理子系統的接口函數(如2. 1所描述)和實際的硬件操作代碼,這里將以顯示設備為例:
        /3 SA - 1110 frame buffer電源管理請求處理函數3 /
        static int sa1110fb_pm_callback ( struct pm_dev 3 pm_dev, pm
        _request_t req, void 3 data)
        {
        struct sa1110fb_info 3 fbi = pm_dev - > data;
        if ( req = = PM_SUSPEND | | req = = PM_RESUME) {
        int state = ( int) data;
        if ( state = = 0) {
        set_ctrlr_ state ( fbi, C_ENABLE) ; /3 進入D0 模式,開啟
        LCD控制器3 /
        } else {
        set_ctrlr_state ( fbi, C_D ISABLE) ; /3 進入D1 - D3模式關
        閉LCD 控制器. 3 /
        } }
        return 0;
        }
        /3 SA - 1110 frame buffer驅動初始化函數3 /
        int __init sa1110fb_init ( void)
        {
        struct sa1110fb_info 3 fbi;
        int ret;
        . . .
        /3 在電源管理子系統中注冊3 /
        fbi - > pm = pm _ register ( PM _SYS_DEV, PM _SYS_VGA,
        sa1110fb_pm_callback) ;
        if ( fbi - > pm)
        fbi - > pm - > data = fbi; /3 設置私有數據3 / . . .
        return ret;
        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 策勒县| 那坡县| 景洪市| 进贤县| 龙井市| 怀安县| 隆化县| 汝州市| 白银市| 平定县| 宣武区| 涞源县| 东乌| 德令哈市| 新乐市| 临城县| 皮山县| 凤庆县| 六枝特区| 郁南县| 汾西县| 绵竹市| 岢岚县| 资兴市| 宁蒗| 五大连池市| 泰和县| 三河市| 长垣县| 洛浦县| 张家口市| 闽清县| 岑溪市| 皋兰县| 墨江| 临潭县| 格尔木市| 苏尼特左旗| 南阳市| 乐陵市| 平和县|