uboot原始碼 MMC分析

2021-08-26 15:18:54 字數 2975 閱讀 5943

(1)作業系統下,mmu是開啟的,即linux驅動使用的都是虛擬位址。純裸機程式不會開啟mmu,全部使用實體地址。

(2)uboot早期也是純實體地址工作,但是現在的uboot開啟了mmu做了虛擬位址對映。

(1)linux的驅動是模組化設計。

(2)uboot移植了linux驅動源**。

(3)uboot中的硬體驅動比linux簡單。

下面看一下mmc_initialize函式

(1)函式位於uboot/drivers/mmc/mmc.c。

(2)此函式主要是初始化開發板上mmc系統。

(3)mmc_devices,鍊錶全域性變數,用來記錄系統中所有已經註冊的sd/inand裝置。

(4)struct mmc型別的結構體指標

下面看一下cpu_mmc_init函式

(1)函式位於uboot/cpu/s5pc11x/cpu.c中,通過呼叫3個函式來完成。

(2)setup_hsmmc_clock,在uboot/cpu/s5pc11x/setup_hsmmc.c中,用來初始化soc中mmc控制器中的時鐘部分的。

(3)setup_hsmmc_cfg_gpio,在uboot/cpu/s5pc11x/setup_hsmmc.c中,用來配置soc中mmc控制器相關的gpio的。

下面看一下setup_hsmmc_clock函式,主要是選擇時鐘源、分頻

下面看一下setup_hsmmc_cfg_gpio函式,主要是初始化相關的gpio

下面看一下smdk_s3c_hsmmc_init函式

(1)函式位於:uboot/drivers/mmc/s3c_hsmmc.c中。

(2)函式內部通過巨集定義use_mmcx來決定是否呼叫s3c_hsmmc_initialize來進行具體的初始化操作。

下面看一下s3c_hsmmc_initialize函式

(1)函式位於:uboot/drivers/mmc/s3c_hsmmc.c中。

(2)定義並且例項化乙個struct mmc型別的物件

(3)mmc_register功能是進行mmc裝置的註冊,註冊方法其實就是將當前這個struct mmc使用鍊錶連線到mmc_devices這個全域性變數中去。

(4)在x210中定義了use_mmc0和use_mmc2

(5)真正的操作暫存器的函式是s3c_hsmmc_send_command、s3c_hsmmc_set_ios、s3c_hsmmc_init;

(6)至此cpu_mmc_init函式分析完成。

下面看一下find_mmc_device函式

(1)函式位於uboot/drivers/mmc/mmc.c中。

(2)通過mmc裝置編號來在系統中查詢對應的mmc裝置(struct mmc的物件,根據上面分析系統中有2個,編號分別是0和2)。

下面看一下mmc_init函式

(1)函式位於:drivers/mmc/mmc.c中。

(2)分析猜測這個函式應該要進行mmc卡的初始化了(前面已經進行了soc端控制器的初始化)

(3)函式的呼叫關係為:

mmc_init

mmc_go_idle

mmc_send_cmd

mmc_send_if_cond

mmc_send_cmd……

(4)分析可知,mmc_init函式通過依次向mmc卡傳送命令碼(cmd0、cmd2那些)來初始化sd卡/inand內部的控制器,以達到初始化sd卡的目的。

(5)send_cmd函式的細節找不到……

(1)至此整個mmc系統初始化結束。

(2)整個mmc系統初始化分為2大部分

(3)初始化完成後,使用sd卡/inand的操作方法和mmc_init函式中初始化sd卡的操作一樣的方式。讀寫sd卡時也是通過匯流排向sd卡傳送命令、讀取/寫入資料來完成的。

(4)順著操作追下去,到了mmc_send_cmd函式處就斷了,真正的向sd卡傳送命令的硬體操作的函式找不到。這就是學習驅動的麻煩之處。

(6)struct mmc結構體是關鍵。

(1)驅動的設計中有乙個關鍵資料結構。譬如mmc驅動的結構體就是struct mmc。

(2)乙個驅動工作時主要分兩部分

(1)分離思想,即在驅動中將操作方法和資料分開。

(2)操作方法就是函式,資料就是變數。

(1)分層思想,是指乙個整個的驅動分為好多個層次。

(2)以mmc驅動為例來分析各個檔案的作用

uboot/drivers/mmc/mmc.c

uboot/drivers/mmc/s3c_hsmmc.c:

由上分析可知

uboot原始碼分析(3)

正式開始了第二階段 relocate部分的 負責把u boot stage2的 從flash儲存器載入到記憶體,如下 163 ifndef config skip relocate uboot 164relocate 165 adr r0,start 獲取當前 存放位址 00000000 166 l...

u boot原始碼配置原理分析

華清遠見嵌入式學院講師。u boot的源 預設是不針對任何目標平台的,當我們要移植u boot到乙個特定的目標平台時,需要生成針對目標平台的配置檔案。u boot目前已經支援的晶元可以在include configs 下面找到。比如我們要編譯針對s3c2410晶元的u boot.bin,那麼我們就需...

u boot 原始碼分析 1 啟動過程分析

kbuild 啟動過程 第二階段 總結參考 對於uboot,我一直是雲裡霧裡的乙個狀態,這部分讓我感到自己很菜,不用縱向深入地掌握uboot整個細節,但是相對它有乙個整體流程上的把握,包括uboot的啟動啟動過程,在整個啟動過程中會涉及到哪些檔案,以此的呼叫過程是什麼?抱著這幾個問題,大量蒐集資料,...