u-boot.2012.10——mini2440(二、啟動流程分析)
參考資料:https://blog.csdn.net/suiyuan19840208/article/details/7239949
1、第一階段功能
* 硬件設備初始化
* 加載u-boot第二段代碼到RAM空間
* 設置好棧
* 跳轉到第二段代碼入口
2、第二段代碼的功能
* 初始化本階段使用的硬件設備
* 檢測系統的內存映射
* 將內核從Flash讀到RAM中
* 為內核設置啟動參數
* 調用內核
3 、u-boot第一階段代碼分析
我們在編譯完成之後,觀察頂層目錄有個u-boot.lds的鏈接腳本
* 經過編譯之後,查看文件u-boot.lds鏈接腳本,可以看到第一個鏈接文件是start.S
4、start.S
* 設置異常向量
當一個異常產生時,CPU根據異常號在異常向量表中找到對應的異常向量,然後執行異常向量處的跳轉指令,,CPU跳轉到對應的異常處理程序執行。
其中復位異常向量的指令“b start_code”決定了啟動後將自動跳轉到標號"start_code"處執行。
* CPU進入SVC模式
從數據手冊上可以看到10011就是設置為管理模式
* 設置控制寄存器的地址
* 關閉看門狗
* 屏蔽中斷
*設置時鐘
CPU上電幾毫秒後,晶振輸出穩定,FCLK=Fin(晶振頻率),CPU開始執行指令。但實際上,FCLK可以高於Fin,為了提高系統時鐘,需要用軟件來啟用PLL。這就需要設置CLKDIVN,MPLLCON,UPLLCON這3個寄存器。
CLKDIVN寄存器,CLKDIVN寄存器用於設置FCLK,HCLK,PCLK三者間的比例
設置CLKDIVN為5,就將HDIVN設置為二進制的10,由於CAMDIVN[9]沒有被改變過,取默認值0,因此HCLK = FCLK/4。
PDIVN被設置為1,因此PCLK= HCLK/2。因此分頻比FCLK:HCLK:PCLK = 1:4:8 。
FCLK提供給ARM920T的時鐘
HCLK 是提供給用於 ARM920T,存儲器控制器,中斷控制器,LCD 控制器,DMA 和 USB 主機模塊的 AHB總線的時鐘
PCLK 是提供給用於外設如WDT,IIS,I2C,PWM 定時器,MMC/SD 接口,ADC,UART,GPIO,RTC 和SPI的 APB 總線的時鐘
FCLK與Fin的關系如下面公式:
MPLLCON寄存器用於設置FCLK與Fin的倍數。MPLLCON的位[19:12]稱為MDIV,位[9:4]稱為PDIV,位[1:0]稱為SDIV。
MPLLCON與UPLLCON的值可以根據參考:
MPLLCON=(0x7f<<12) | (0x02<<4) | (0x01) = 0x7f021
UPLLCON=(0x38<<12) | (0x02<<4) | (0x02) = 0x38022
u-boot.2012.10——mini2440(二、啟動流程分析)