1. 程式人生 > >uboot原始碼——mmc驅動分析

uboot原始碼——mmc驅動分析

一、uboot與linux驅動

1、uboot是裸機程式

  • 狹義的驅動的概念:作業系統中用來具體操控硬體的那部分程式碼叫驅動
  • 裸機中沒有驅動的概念,因為沒有作業系統。
  • 裸機程式是直接操控硬體的,而作業系統中則是通過驅動來操控硬體。兩者的本質區別是分層

2、uboot的虛擬地址對硬體操作的影響

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

  • 這是裸機下和驅動中操控硬體的一個重要區別。

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

  • 查uboot中的虛擬地址對映表,發現除了0x30000000-0x3FFFFFFF對映到了0xC0000000-0xCFFFFFFF之外,其餘的虛擬地址空間全是原樣對映的。
  • 我們驅動中主要是操控硬體暫存器,而S5PV210的SFR都在0xExxxxxx地址空間,因此驅動中不必考慮虛擬地址

3、uboot移植了linux驅動

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

  • linux驅動本身和linux核心不是強耦合的,這是linux驅動可以被uboot移植的關鍵。

(2)uboot移植了linux驅動原始碼。

  • uboot是從原始碼級別去移植linux驅動的,這就是linux系統的開源性。

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

  • linux驅動本身有更復雜的框架,需要實現更多的附帶功能,而uboot本質上只是個裸機程式,uboot移植linux驅動時只是借用了linux驅動的一部分而已。

二、iNand/SD驅動解析

1、MMC驅動的初始化,是在start_armboot函式中,呼叫的是mmc_initialize函式


下面看一下mmc_initialize函式

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

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

  • SoC裡的MMC控制器初始化(MMC系統時鐘的初始化、SFR初始化);
  • SoC裡MMC相關的GPIO的初始化;
  • SD卡/iNand晶片的初始化。

(3)mmc_devices,連結串列全域性變數,用來記錄系統中所有已經註冊的SD/iNand裝置。




  • 向系統中插入一個SD卡/iNand裝置,則系統驅動就會向mmc_devices連結串列中插入一個數據結構表示這個裝置。

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


  • 這個struct mmc型別的結構體非常重要,我們說的驅動主要就是構建這個結構體;
  • 在這個結構體中構建了一些列變數、函式指標等;
  • 這些變數記錄了mmc的一些資訊,函式指標所指向的函式是用來向sd卡中傳送命令、或者傳送資料、直接操作最底層的特殊功能暫存器

下面看一下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型別的物件

  • 即定義了一個指標,給指標分配記憶體,然後填充它的各種成員,最後呼叫mmc_register函式來向驅動框架註冊這個mmc裝置驅動。

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

(4)在X210中定義了USE_MMC0和USE_MMC2

  • 因此在我們的uboot初始化時,會呼叫2次s3c_hsmmc_initialize函式,傳遞引數分別是0和2;
  • 因此完成之後系統中會註冊上2個mmc裝置,表示當前系統中有2個mmc通道在工作。平常我們說的通道0和通道2?

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

  • 傳送命令、傳送資料、初始化三個函式;
  • 這三個函式是最底層的、直接操作GPIO進而特殊功能暫存器的函式;
  • 這三個函式以及一些變數被封裝在struct mmc結構體中,因而作業系統對mmc裝置進行操作的時候,到封裝以後的這個結構體中進行操作即可;

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

下面看一下find_mmc_device函式


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

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

  • 通過遍歷mmc_devices連結串列,去依次尋找系統中註冊的mmc裝置,然後對比其裝置編號和我們當前要查詢的裝置編號,如果相同則就找到了要找的裝置。
  • 找到了後呼叫mmc_init函式來初始化它。

下面看一下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卡的目的。

  • 呼叫struct mmc 中的函式進行了一些時序操作

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

2、總結

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

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

  • SoC這一端的MMC控制器的初始化,SD卡這一端卡本身的初始化。
  • 前一步主要是在cpu_mmc_init函式中完成,後一部分主要是在mmc_init函式中完成。

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

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

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

  • 上述兩部分初始化之間用mmc結構體來連結的;
  • 初始化完了後對mmc卡的常規讀寫操作也是通過mmc結構體來連結的。

三、關於驅動的理解

1、驅動的關鍵資料結構

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

  • 這些結構體中包含一些變數和一些函式指標,變數用來記錄驅動相關的一些屬性,函式指標用來記錄驅動相關的操作方法。
  • 這些變數和函式指標加起來就構成了驅動。驅動就被抽象為這個結構體

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

  • 驅動構建(構建一個struct mmc然後填充它);
  • 驅動執行時(呼叫這些函式指標指標的函式和變數);

2、分離思想

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

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

  • 所謂操作方法和資料分離的意思就是,在不同的地方來儲存和管理驅動的操作方法和變數,這樣的優勢就是驅動便於移植。

3、分層思想

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

  • 簡單理解就是驅動分為很多個原始檔,放在很多個資料夾中
  • 譬如本課程講的mmc的驅動涉及到drivers/mmc下面的2個檔案、cpu/s5pc11x下的好幾個檔案。

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

uboot/drivers/mmc/mmc.c

  • 本檔案是和MMC卡操作有關的方法,譬如MMC卡設定空閒狀態的、卡讀寫資料等。
  • 本檔案中並沒有具體的硬體操作函式,操作最終指向的是struct mmc結構體中的函式指標,這些函式指標是在驅動構建的時候和真正硬體操作的函式掛接的(真正的硬體操作的函式在別的檔案中)。

uboot/drivers/mmc/s3c_hsmmc.c:

  • 本檔案是SoC內部MMC控制器的硬體操作的方法,譬如向SD卡傳送命令的函式(s3c_hsmmc_send_command),譬如和SD卡讀寫資料的函式(s3c_hsmmc_set_ios)
  • 這些函式是具體操作硬體的函式,即mmc.c中需要的那些硬體操作函式。這些函式在mmc驅動初始化構建時(s3c_hsmmc_initialize函式中)和struct mmc掛接起來。

由上分析可知

  • mmc.c和s3c_hsmmc.c構成了一個分層,mmc.c中呼叫了s3c_hsmmc.中的函式,所以mmc.c在上層,s3c_hsmmc.c在下層。
  • mmc.c中不涉及具體硬體的操作,s3c_hsmmc.c中不涉及驅動工程時的時序操作。
  • 如果我們要把這一套mmc驅動移植到別的SoC上,那麼mmc.c就不用動,修改s3c_hsmmc.c即可;
  • 如果SoC沒變但是SD卡升級了,這時候只需要更換mmc.c,不需要更換s3c_hsmm。

相關推薦

uboot原始碼——mmc驅動分析

一、uboot與linux驅動 1、uboot是裸機程式 狹義的驅動的概念:作業系統中用來具體操控硬體的那部分程式碼叫驅動。裸機中沒有驅動的概念,因為沒有作業系統。裸機程式是直接操控硬體的,而作業

UBOOT——MMC驅動分析

1:MMC驅動初始化是在start_armboot函式中 #if defined(CONFIG_X210) #if defined(CONFIG_GENERIC_MMC) puts ("SD/MMC: "); ///* //lqm masked mm

uboot原始碼-MMC分析

一、uboot與linux驅動 1、uboot是裸機程式 狹義的驅動的概念:作業系統中用來具體操控硬體的那部分程式碼叫驅動。 裸機中沒有驅動的概念,因為沒有作業系統。 裸機程式是直接操控硬體的,而作業系統中則是通過驅動來操控硬體。兩者的本質區別是分層。 2、uboot

uboot原始碼第一階段分析(感性認識)

原始碼位置 cpu/arm920t/start.S 這個檔案我們一般稱之為 uboot的第一階段程式碼,是 ARM GNU 彙編寫成的,我們如何理解程式碼構思思路 以現實社會中的

《2.uboot和系統移植-第6部分-2.6.uboot原始碼分析2-啟動第二階段》

《2.uboot和系統移植-第6部分-2.6.uboot原始碼分析2-啟動第二階段》 第一部分、章節目錄 2.6.1.start_armboot函式簡介 2.6.2.start_armboot解析1 2.6.3.記憶體使用排布 2.6.4.start_armboot解析2 2.6.5.s

《2.uboot和系統移植-第5部分-2.5.uboot原始碼分析1-啟動第一階段》

《2.uboot和系統移植-第5部分-2.5.uboot原始碼分析1-啟動第一階段》 第一部分、章節目錄 2.5.1.start.S引入 2.5.2.start.S解析1 2.5.3.start.S解析2 2.5.4.start.S解析3 2.5.5.start.S解析4 2.5.6.s

十.linux開發之uboot移植(十)——uboot原始碼分析4-uboot的命令體系

一、uboot命令體系簡介 1、uboot命令體系實現程式碼在哪裡 uboot命令體系的實現程式碼在uboot/common/cmd_xxx.c中。有若干個.c檔案和命令體系有關。(還有command.c main.c也是和命令有關的)。 uboot實

基於OK6410開發板Uboot原始碼簡單分析

2018-04-07 OK6410開發板是基於三星S3C6410晶片設計的一款開發板,資源比較豐富,可是想要使用這些資源就需要編寫相應的啟動載入程式,即BootLoader。當然,想要自己憑空寫出BootLoader那簡直就是天方夜譚,所以我們需要參考行業中現有的BootLoader,在其

Linux SD/MMC/SDIO驅動分析

一、SD/MMC/SDIO概念區分 SD(SecureDigital)與 MMC(MultimediaCard) SD 是一種 flash memory card 的標準,也就是一般常見的 SD 記憶卡,而 MMC 則是較早的一種記憶卡標準,目前已經被 SD 標準所取代。

uboot原始碼中主Makefile的具體分析

/**************************************************************************************     2018.10下旬     針對三星官方為210移植過的uboot和kernel內Makef

uboot原始碼及啟動過程分析

#include #include /*  *************************************************************************  *  * Jump vector table as in table 3.1 in [1]  *  *

使用Windows上SourceInsight工具建立分析Linux下uboot原始碼工程

SourceInsight軟體可以說是分析查閱大型原始碼工程檔案的神器!介面不錯!功能強大! 第一步:安裝好SourceInsight後開啟軟體 點選上面的Project--->new pro

UBOOT原始碼分析(詳細)

@可知start.S的流程為:異常向量——上電覆位後進入復位異常向量——跳到啟動程式碼處——設定處理器進入管理模式——關閉看門狗——關閉中斷——設定時鐘分頻——關閉MMU和CACHE——進入lowlever_init.S——檢查當前程式碼所處的位置,如果在FLASH中就將程

基於友善之臂ARM-tiny4412--uboot原始碼分析

/* * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core * * Copyright (c) 2004 Texas Instruments <[email protected]>

七.linux開發之uboot移植(七)——uboot原始碼分析2-啟動第二階段之start_armboot函式分析1

一.uboot啟動第二階段之start_armboot函式簡介 1.start_armboot函式簡介 (1)這個函式在uboot/lib_arm/board.c的第444行開始到908行結束。 (2)、即一個函式組成uboot第二階段 2、

UBOOT原始碼詳細分析之主Makefile

注:本文是由瘋仔整理的筆記,基於uboot-1.3.4和s5pc11x分析。 話不多說直接上程式碼 (1)uboot的版本號分3個級別: VERSION:主機板本號 PATCHLEVEL:次版本號

Linux MMC 驅動子系統簡述(原始碼剖析)

1. Linux MMC 驅動子系統 塊裝置是Linux系統中的基礎外設之一,而 MMC/SD 儲存裝置是一種典型的塊裝置。Linux核心設計了 MMC子系統,用於管理 MMC/SD 裝置。 MMC 子系統的框架結構如下圖所示,其中core layer根據MMC/SD裝置協議標準實現了協議。card

uboot中rtc頂層分析

number ssi clas software printf one int lar app uboot一般不會要求開啟rtc,只是還是支持rtc以備特殊需求的。底層驅動移植前面兩篇已經介紹。這裏介紹頂層的調用過程。頂層在uboot/common/cm

為什麽要有uboot?帶你全面分析嵌入式linux系統啟動過程中uboot的作用

統一 一次 fail 進入 是我 臺式機 平板 配置 webp 1.為什麽要有uboot 1.1、計算機系統的主要部件 (1)計算機系統就是以CPU為核心來運行的系統。典型的計算機系統有:PC機(臺式機+筆記本)、嵌入式設備(手機、平板電腦、遊戲機)、單片機(家用電器像

19.Linux-USB總線驅動分析

kmalloc 開發 硬件 ctrl 地址 allow end 處理 interface 如下圖所示,以windows為例,我們插上一個沒有USB設備驅動的USB,就會提示你安裝驅動程序 為什麽一插上就有會提示信息? 是因為windows自帶了USB總線驅動程序