這一節(jié)講講UFS初始化。
初始化和啟動(dòng)包括三個(gè)階段:部分初始化,加載啟動(dòng)代碼(可選)和初始化完成。
部分初始化階段
這個(gè)階段開(kāi)始于上電或者設(shè)備重啟,它涉及到整個(gè)UFS棧的初始化。
這個(gè)初始化階段完成后,整個(gè)物理層(M-PHY)和數(shù)據(jù)鏈路層(UniPro)應(yīng)該被初始化好,傳輸層可以和主機(jī)交互Read命令和“TEST UNIT READY”命令(主機(jī)發(fā)該命令給設(shè)備,查詢?cè)O(shè)備是否準(zhǔn)備好),主機(jī)也可以通過(guò)設(shè)備管理器訪問(wèn)設(shè)備描述符(Device Descriptor),獲取設(shè)備配置信息。
加載啟動(dòng)代碼
如果啟動(dòng)代碼不是存儲(chǔ)在UFS設(shè)備上,則沒(méi)有這一階段。主機(jī)怎么知道啟動(dòng)代碼是不是存儲(chǔ)在UFS設(shè)備上呢?
經(jīng)過(guò)前一階段的初始化,主機(jī)可以訪問(wèn)設(shè)備描述符,獲得“bBootLunEn ”屬性,讀取該屬性可以知道啟動(dòng)代碼是否在UFS設(shè)備上,以及具體在哪個(gè)Boot LU 上面。
如果bBootLunEn = 01h或者02h,說(shuō)明啟動(dòng)代碼存儲(chǔ)在UFS設(shè)備上。由于Boot LU是映射到普通的LU上的,要讀取啟動(dòng)代碼,還需要知道Boot LU和存儲(chǔ)啟動(dòng)代碼LU的映射。主機(jī)可以通過(guò)讀取單元描述符(Unit Descriptor)知道,比如:
查找到具體存儲(chǔ)代碼的LU,主機(jī)就可以讀取該LU獲得啟動(dòng)代碼。
初始化完成
當(dāng)主機(jī)完成前面兩個(gè)階段,主機(jī)會(huì)通過(guò)設(shè)備管理器,給設(shè)備設(shè)置fDeviceInit = 1,這是一個(gè)標(biāo)志(flag),用以初始化。 主機(jī)設(shè)置了該標(biāo)志后,然后就一直在那查詢?cè)摌?biāo)志的值。
與此同時(shí),UFS設(shè)備的固件繼續(xù)完成自己的初始化,當(dāng)設(shè)備完成初始化,認(rèn)為可以響應(yīng)主機(jī)任何命令或者請(qǐng)求時(shí),就清掉fDeviceInit,即fDeviceInit = 0。
當(dāng)主機(jī)查詢到fDeviceInit =0,就可以發(fā)任何UFS協(xié)議中的任何命令或請(qǐng)求給UFS設(shè)備。
至此,整個(gè)UFS初始化和啟動(dòng)完成。
下圖具體展示了UFS初始化和啟動(dòng)過(guò)程(可選的,Opt):
再解釋一下這個(gè)啟動(dòng)過(guò)程:
主機(jī)給設(shè)備上電或者重啟設(shè)備,然后主機(jī)和設(shè)備端的物理層和數(shù)據(jù)鏈路層完成初始化,之后主機(jī)ping設(shè)備(通過(guò)NOP OUT UPIU),確認(rèn)設(shè)備雙方連接正常。設(shè)備收到NOP OUT UPIU,應(yīng)該回NOP IN UPIU,表明雙方連接沒(méi)有問(wèn)題。
加載啟動(dòng)代碼可選(上圖藍(lán)色方框中的步驟)。主機(jī)讀取UFS設(shè)備描述符,如果bDescrAccessEn = 0,設(shè)備描述符不可訪問(wèn),那么,即使啟動(dòng)代碼存儲(chǔ)在UFS設(shè)備上,我們也無(wú)法在該階段加載啟動(dòng)代碼,因?yàn)橹T如bBootEnable和bBootLunEn之類的信息無(wú)法獲取,主機(jī)就無(wú)法知道存儲(chǔ)代碼存儲(chǔ)在哪個(gè)LU上。因此,如果bDescrAccessEn = 0,加載啟動(dòng)代碼階段不應(yīng)該放在這里,而是在設(shè)備徹底初始化好后。
加載啟動(dòng)代碼階段,主機(jī)通過(guò)讀取設(shè)備描述符,獲得啟動(dòng)代碼在哪個(gè)LU上,然后發(fā)個(gè)試探性命令“TEST UNIT READY”給該LU,查看該LU是否準(zhǔn)備好。如果Boot LU準(zhǔn)備好,主機(jī)就通過(guò)發(fā)READ命令給設(shè)備,加載啟動(dòng)代碼。
然后,主機(jī)設(shè)置fDeviceInit = 1,然后一直輪詢?cè)摌?biāo)志,一旦fDeviceInit 變成0,標(biāo)志UFS設(shè)備初始化完成。
最后,再把設(shè)備初始化過(guò)程中,雙方交互的內(nèi)容做個(gè)總結(jié):
-
數(shù)據(jù)鏈路層
+關(guān)注
關(guān)注
0文章
58瀏覽量
12010 -
UFS
+關(guān)注
關(guān)注
6文章
104瀏覽量
24081
原文標(biāo)題:蛋蛋讀UFS之六:UFS設(shè)備初始化和啟動(dòng)
文章出處:【微信號(hào):SSDFans,微信公眾號(hào):SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論