新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM-linux s3c2440 之時鐘分析

        ARM-linux s3c2440 之時鐘分析

        作者: 時間:2016-11-19 來源:網絡 收藏
        S3c2440 時鐘 & 電源管理時鐘由三部分組成: Clock control ,USB control, 和 Power control

        Clock control 部分可以產生時鐘FCLK,提供ARM內核,HCLK 提供 AHB 總線外設,還有 PLCK APB 總線外設。 s3c2440 有兩個內置的PLLS 鎖相環,一個提供給 FCLK,HCLK,和PCLK,另一個提供給USB時鐘(48MHZ)。Clock control 可以不使用PLL,而降低的時鐘,通過軟件設置,時能各中種外設,從而可以降低功耗

        本文引用地址:http://www.104case.com/article/201611/318127.htm

        Power control部分,用于電能管理,有四種工作模式:Normal mode, Slow mode, Idle mode, Sleep mode.

        linux 中 s3c2440 時鐘的初始化:


        1. MACHINE_START(S3C2440,"SMDK2440")
        2. /*Maintainer:BenDooks*/
        3. .phys_io=S3C2410_PA_UART,
        4. .io_pg_offst=(((u32)S3C24XX_VA_UART)>>18)&0xfffc,
        5. .boot_params=S3C2410_SDRAM_PA+0x100,
        6. .init_irq=s3c24xx_init_irq,
        7. .map_io=smdk2440_map_io,
        8. .init_machine=smdk2440_machine_init,
        9. .timer=&s3c24xx_timer,
        10. MACHINE_END

        linux 入口時,在start_kernel()中調用 setup_arch(), 會進行平臺體系相關初始化:


        1. smdk_2440_map_io()-->s3c24xx_init_io()-->s3c_init_cpu()->s3c244x_init_clocks()


        1. void__inits3c244x_init_clocks(intxtal)
        2. {
        3. /*initialisetheclockshere,toallowotherthingslikethe
        4. *consoletousethem,andtoaddnewonesaftertheinitialisation
        5. */
        6. s3c24xx_register_baseclocks(xtal);//向系統注冊基本時鐘:FCLK,HCLK,PCLK
        7. s3c244x_setup_clocks();//設置基本時鐘的參數
        8. s3c2410_baseclk_add();//添加其他外設的時鐘
        9. }

        系統將所有外設的時鐘通過一個叫做struct clk的結構體來進行描述:

        1. structclk{
        2. structlist_headlist;
        3. structmodule*owner;
        4. structclk*parent;
        5. constchar*name;
        6. intid;
        7. intusage;
        8. unsignedlongrate;
        9. unsignedlongctrlbit;
        10. int(*enable)(structclk*,intenable);
        11. int(*set_rate)(structclk*c,unsignedlongrate);
        12. unsignedlong(*get_rate)(structclk*c);
        13. unsignedlong(*round_rate)(structclk*c,unsignedlongrate);
        14. int(*set_parent)(structclk*c,structclk*parent);
        15. };

        將所有時鐘分成兩類,一類是開啟,一類關閉; 分別至于 兩個數組中

        1. structclkinit_clocks[];structclkinit_clocks_disable[];

        最后一一注冊

        注冊時鐘是通過這個函數注冊的

        1. /*initialisetheclocksystem*/
        2. ints3c24xx_register_clock(structclk*clk)
        3. {
        4. if(clk->enable==NULL)
        5. clk->enable=clk_null_enable;
        6. /*addtothelistofavailableclocks*/
        7. /*Quickchecktoseeifthisclockhasalreadybeenregistered.*/
        8. BUG_ON(clk->list.prev!=clk->list.next);
        9. spin_lock(&clocks_lock);
        10. list_add(&clk->list,&clocks);
        11. spin_unlock(&clocks_lock);
        12. return0;
        13. }




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 朝阳区| 清水河县| 环江| 长葛市| 广宁县| 开江县| 花垣县| 扎赉特旗| 桐柏县| 志丹县| 门头沟区| 石楼县| 德安县| 南平市| 胶南市| 益阳市| 柳江县| 习水县| 揭东县| 鱼台县| 桂阳县| 益阳市| 舒兰市| 高邑县| 石泉县| 亳州市| 宁波市| 马边| 于都县| 原平市| 云南省| 集贤县| 巴彦淖尔市| 田阳县| 福海县| 东至县| 南乐县| 托克逊县| 丹阳市| 岳池县| 昭通市|