色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > uboot stage2 init_fnc_t *init_sequence[]代碼分析

          uboot stage2 init_fnc_t *init_sequence[]代碼分析

          作者: 時間:2016-11-29 來源:網(wǎng)絡 收藏
           今天總算是把uboot stage2看完了,哎,感受太深了一句話:看完了這些代碼,才知道什么叫代碼~~

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

          本文引用地址:http://cafeforensic.com/article/201611/323261.htm

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

           在init_fnc_t *init_sequence[]定義前有這樣一行:typedef int (init_fnc_t) (void)哎,這,最怕碰到這種定義了~~都是受譚老師的禍害啊~~自己的C語言基礎還是在大二的時候打下的,計算機專業(yè)學生學C語言用的居然是譚浩強的那本C搞的直到現(xiàn)在面對這個typedef int (init_fnc_t) (void)都還有點不敢確定。定義init_fnc_t為函數(shù)類型,該函數(shù)返回int型,無參數(shù)。而init_fnc_t *init_sequence[]則是定義一個init_fnc_t指針類型的數(shù)組。簡單的說就是定義了個函數(shù)指針數(shù)組,指向一系列cpu初始化函數(shù)。包括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函數(shù)。當然這些函數(shù)都是返回int并且無參數(shù)輸入型,有些還是static的。

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

           int cpu_init(void):該函數(shù)位于ubootcpus3c44b0cpu.c

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

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

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

           int board_init(void):函數(shù)實現(xiàn)位于ubootoarddaveB2B2.c。依次為初始化GPIO和中斷,把cpu體系號傳    送給gd->bd->bi_arch_number,把要傳送給系統(tǒng)內(nèi)核(uclinux)的參數(shù)的首地址給

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

           int interrupt_init(void):位于ubootcpus3c44b0interrupt.c

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

          int env_init(void):該函數(shù)位于ubootcommonenv_flash.c。

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

           int init_baudrate(void):函數(shù)位于ubootlib_armoard.c

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

              CONFIG_BAUDRATE宏定義位于ubootincludeconfigsB2.h

              #define CONFIG_BAUDRATE 115200

           int serial_init(void):函數(shù)位于ubootcommonserial.c。

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

          console_init_f():位于ubootcommonconsole.c。

              這個函數(shù)就這句:

                      gd->have_console = 1

              就是設置了一下相關的數(shù)據(jù)

          display_banner():位于ubootlib_arm_board.c

              用來打印當前的一些狀態(tài)

          dram_init():位于ubootcpudaveB2B2.c

              設置RAM的起始地址和大小,依據(jù)板子硬件設置。設置文件為ubootincludeconfigsB2.h

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

           display_dram_config():位于ubootlib_armoard.c

              打印RAM的相關信息,相關的宏定義都位于ubootincludeconfigsB2.h,當然都是依據(jù)板子實際來定    義的。



          關鍵詞: 代碼分

          評論


          技術專區(qū)

          關閉