久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

uboot stage2 init_fnc_t *init_sequence[]代碼分析

作者:佚名   來源:本站原創   點擊數:  更新時間:2010年12月25日   【字體:

 今天總算是把uboot stage2看完了,哎,感受太深了一句話:看完了這些代碼,才知道什么叫代碼~~

 uboot第二階段代碼是用C寫的,本來以為可以比第一階段的匯編好理解,畢竟對C更熟悉一點。可剛開始進入start_armboot()函數一看,就了~~哎,學習不到家啊~~ 所以,現在還不敢大談對第二階段有多理解吧,只是簡單記一下,大概理解的。

 本著理解代碼高于一切的原則,順著start_armboot()函數執行順序讀下去。前面的還是比較好理解的,現在就講講init_fnc_t *init_sequence[]吧。

 在init_fnc_t *init_sequence[]定義前有這樣一行:typedef int (init_fnc_t) (void)哎,這,最怕碰到這種定義了~~都是受譚老師的禍害啊~~自己的C語言基礎還是在大二的時候打下的,計算機專業學生學C語言用的居然是譚浩強的那本C搞的直到現在面對這個typedef int (init_fnc_t) (void)都還有點不敢確定。定義init_fnc_t為函數類型,該函數返回int型,無參數。而init_fnc_t *init_sequence[]則是定義一個init_fnc_t指針類型的數組。簡單的說就是定義了個函數指針數組,指向一系列cpu初始化函數。包括cpu_init,board_init,interupt_init,env_init,init_baudrate,serial_init,console_init_f,display_banner,dram_init,display_dram_config并且如果定義了CONFIG_VCMA9的話還有checkboard函數。當然這些函數都是返回int并且無參數輸入型,有些還是static的。

 現分別說說各個初始化函數吧:簡單的現在可以多講點,還有一些是現在還不太理解或是很長的,需要以后單獨列個日志來寫吧,打算是這樣,希望后面幾天能搞懂

 int cpu_init(void):該函數位于uboot\cpu\s3c44b0\cpu.c

    該函數只是調用icache_enable()函數實現cpu cache的初始化,然后返回0。

    void icache_enable(void)位于同一文本中。該函數首先調用s3c44b0_flush_cache(),通過向

    LRU RAM寫0來刷新cpu cache。刷新cpu cache之后,icache_enale()函數再設置兩個非緩沖區域寄    存器NCACHBE0和NCACHBE1 。最后通過設置SYSCFG寄存器來開啟cpu cache。

 int board_init(void):函數實現位于uboot\board\dave\B2\B2.c。依次為初始化GPIO和中斷,把cpu體系號傳    送給gd->bd->bi_arch_number,把要傳送給系統內核(uclinux)的參數的首地址給

    gd->bd-?bi_boot_params。完成后返回0。

 int interrupt_init(void):位于uboot\cpu\s3c44b0\interrupt.c

    初始化timer1相關寄存器,用于產生定時中斷信號。為什么是timer1呢??好像是timer5做為      uclinux的系統時鐘的。以后再研究吧

   int env_init(void):該函數位于uboot\common\env_flash.c。

    大概分為兩種情況:如果定義了CFG_ENV_ADDR_REDUND,即如果環境變量需要在SDRAM中有備    份的話,是一種env_init(),如果不需要備份的話,是另外一個env_init()。還是需要單列一篇記錄

 int init_baudrate(void):函數位于uboot\lib_arm\board.c

    如果參數中設置了波特率則利用參數用設置的波特率,否則利用默認的CONFIG_BAUDRATE(115200)

    CONFIG_BAUDRATE宏定義位于uboot\include\configs\B2.h

    #define CONFIG_BAUDRATE  115200

 int serial_init(void):函數位于uboot\common\serial.c。

    調用 serial_setbrg ()設置串口相關寄存器,包括FIFO寄存器、控制寄存器、列控制寄存器和波特率    約數寄存器等

   console_init_f():位于uboot\common\console.c。

    這個函數就這句:

            gd->have_console = 1

    就是設置了一下相關的數據

   display_banner():位于uboot\lib_arm_board.c

    用來打印當前的一些狀態

   dram_init():位于uboot\cpu\dave\B2\B2.c

    設置RAM的起始地址和大小,依據板子硬件設置。設置文件為uboot\include\configs\B2.h

    #define PHYS_SDRAM_1  0xc0000000 /* SDRAM Bank #1 */
    #define PHYS_SDRAM_1_SIZE 0x01000000 /* 16 MB */

 display_dram_config():位于uboot\lib_arm\board.c

    打印RAM的相關信息,相關的宏定義都位于uboot\include\configs\B2.h,當然都是依據板子實際來定    義的。
 

關閉窗口

相關文章

主站蜘蛛池模板: 国产区视频在线观看 | 91视频国产区 | 99re6在线视频精品免费 | 一级毛片在线播放 | 欧美日一区二区 | 黄色大片观看 | 国产一区二区三区在线免费 | 欧美一区二区在线播放 | 欧美成人精品 | 国产精品国产成人国产三级 | 欧美一区二区另类 | 国产精品久久久久久久久久免费看 | 国产一级特黄视频 | 成人久久18免费 | 麻豆亚洲| 日韩欧美综合在线视频 | av片免费| 一区二区在线不卡 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美精品久久久久久久久久 | 免费a网站 | 中文字幕在线不卡播放 | 精品一二区 | 日本成年免费网站 | 在线观看免费av片 | 中文字幕在线观看一区 | 精品一区二区三区在线观看 | 午夜小视频在线播放 | 日日操夜夜操天天操 | 中文字幕av在线一二三区 | 三级黄色大片网站 | 国产激情99 | 奇米四色影视 | 在线播放中文字幕 | 精品国产一区二区 | 成人性生交大片免费看r链接 | 日本午夜免费福利视频 | 亚洲成在线观看 | 中文字幕欧美一区二区 | 国产黄色大片 | 久久天天躁狠狠躁夜夜躁2014 |