UFS系列6 UFS裝置初始化和啟動

2021-10-10 13:38:51 字數 1697 閱讀 4712

這一節講講ufs初始化。

初始化和啟動包括三個階段:部分初始化,載入啟動**(可選)和初始化完成。

這個階段開始於上電或者裝置重啟,它涉及到整個ufs棧的初始化。

這個初始化階段完成後,整個物理層(m-phy)和資料鏈路層(unipro)應該被初始化好,傳輸層可以和主機互動read命令和「test unit ready」命令(主機發該命令給裝置,查詢裝置是否準備好),主機也可以通過裝置管理器訪問裝置描述符(device descriptor),獲取裝置配置資訊。

如果啟動**不是儲存在ufs裝置上,則沒有這一階段。主機怎麼知道啟動**是不是儲存在ufs裝置上呢?

經過前一階段的初始化,主機可以訪問裝置描述符,獲得「bbootlunen 」屬性,讀取該屬性可以知道啟動**是否在ufs裝置上,以及具體在哪個boot lu 上面。

如果bbootlunen  = 01h或者02h,說明啟動**儲存在ufs裝置上。由於boot lu是對映到普通的lu上的,要讀取啟動**,還需要知道boot lu和儲存啟動**lu的對映。主機可以通過讀取單元描述符(unit descriptor)知道,比如:

查詢到具體儲存**的lu,主機就可以讀取該lu獲得啟動**。

當主機完成前面兩個階段,主機會通過裝置管理器,給裝置設定fdeviceinit = 1,這是乙個標誌(flag),用以初始化。 主機設定了該標誌後,然後就一直在那查詢該標誌的值。

與此同時,ufs裝置的韌體繼續完成自己的初始化,當裝置完成初始化,認為可以響應主機任何命令或者請求時,就清掉fdeviceinit,即fdeviceinit = 0。

當主機查詢到fdeviceinit =0,就可以發任何ufs協議中的任何命令或請求給ufs裝置。

至此,整個ufs初始化和啟動完成。

下圖具體展示了ufs初始化和啟動過程(可選的,opt):

再解釋一下這個啟動過程:

主機給裝置上電或者重啟裝置,然後主機和裝置端的物理層和資料鏈路層完成初始化,之後主機ping裝置(通過nop out upiu),確認裝置雙方連線正常。裝置收到nop out upiu,應該回nop in upiu,表明雙方連線沒有問題。

載入啟動**可選(上圖藍色方框中的步驟)。主機讀取ufs裝置描述符,如果bdescraccessen = 0,裝置描述符不可訪問,那麼,即使啟動**儲存在ufs裝置上,我們也無法在該階段載入啟動**,因為諸如bbootenable和bbootlunen之類的資訊無法獲取,主機就無法知道儲存**儲存在哪個lu上。因此,如果bdescraccessen = 0,載入啟動**階段不應該放在這裡,而是在裝置徹底初始化好後。

載入啟動**階段,主機通過讀取裝置描述符,獲得啟動**在哪個lu上,然後發個試探性命令「test unit ready」給該lu,檢視該lu是否準備好。如果boot lu準備好,主機就通過發read命令給裝置,載入啟動**。

然後,主機設定fdeviceinit = 1,然後一直輪詢該標誌,一旦fdeviceinit 變成0,標誌ufs裝置初始化完成。

最後,再把裝置初始化過程中,雙方互動的內容做個總結:

4 裝置註冊和初始化

裝置的驅動程式在載入的時候首先需要呼叫入口函式init module 該函式最重要的乙個工作就是向核心註冊該裝置,對於字元裝置呼叫register chrdev 完成註冊。register chrdev 的定義為 int register chrdev unsignedint major,const...

C 字元陣列初始化和未初始化等系列問題分析

1.字元陣列未初始化裡面元素值為多少 1 字元陣列定義在main函式外面,s i 的值為 0 即為null i 0,1,2,3 int s i 的值為0。2 字元陣列定義在main函式裡面,輸出結果表現為亂碼,int s i 的值為隨機數。2.字元陣列在部分初始化後,後面的元素自動賦值為 0 inc...

Linux對裝置的識別和初始化

一。系統裝置初始化 二。pci裝置掃瞄和驅動載入 三。usb裝置掃瞄和驅動載入 一。anchor nbe1 系統裝置初始化 系統對裝置模型的初始化見檔案drivers base init.c中的函式driver init。1。裝置模型的初始化 首先是進行device subsys bus subsy...