這一節講講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設備初始化完成。
最后,再把設備初始化過程中,雙方交互的內容做個總結:
-
數據鏈路層
+關注
關注
0文章
58瀏覽量
12035 -
UFS
+關注
關注
6文章
105瀏覽量
24154
原文標題:蛋蛋讀UFS之六:UFS設備初始化和啟動
文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
RT-Thread自動初始化詳解
![RT-Thread自動<b class='flag-5'>初始化</b>詳解](https://file.elecfans.com//web2/M00/4D/5D/poYBAGK2552AP3IhAAERUWXJgTY466.png)
BPI啟動,Flash初始化失敗
手機模塊初始化向導
嵌入式開發復位和初始化詳細討論
![嵌入式開發復位和<b class='flag-5'>初始化</b>詳細討論](https://file.elecfans.com/web2/M00/4A/12/pYYBAGKhvJKAF9x0AAAnljRlsIw299.png)
ds1302時鐘芯片初始化,自動決定DS1302是否需要初始化程序
8253初始化程序分享_8253應用案例
![8253<b class='flag-5'>初始化</b>程序分享_8253應用案例](https://file.elecfans.com/web1/M00/51/5B/pIYBAFsFIM-AOYbQAAB9Mt_5ufc457.jpg)
在51平臺下初始化文件的引入導致全局變量無法初始化的問題如何解決
![在51平臺下<b class='flag-5'>初始化</b>文件的引入導致全局變量無法<b class='flag-5'>初始化</b>的問題如何解決](https://file.elecfans.com/web1/M00/A4/1F/pIYBAF1bWr6AW1IIAAqjwPD92Tk888.png)
單片機問題總結:MPU6050的DMP模塊初始化放在線程啟動之前
![單片機問題總結:MPU6050的DMP模塊<b class='flag-5'>初始化</b>放在線程<b class='flag-5'>啟動</b>之前](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread自動初始化機制
![RT-Thread自動<b class='flag-5'>初始化</b>機制](https://file.elecfans.com//web2/M00/4B/55/poYBAGKrLSKAcuheAAEs3dd2mrs036.png)
EE-359:ADSP-CM40x啟動時間優化和器件初始化
![EE-359:ADSP-CM40x<b class='flag-5'>啟動</b>時間優化和器件<b class='flag-5'>初始化</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論