日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

【ARM-Linux开发】内核3.x版本之后设备树机制

發(fā)布時(shí)間:2025/3/15 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【ARM-Linux开发】内核3.x版本之后设备树机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

內(nèi)核3.x版本之后設(shè)備樹(shù)機(jī)制

Based??on??Linux??3.10.24??source??code?

參考/documentation/devicetree/Booting-without-of.txt文檔

目錄

內(nèi)核3.x版本之后設(shè)備樹(shù)機(jī)制 1

一、設(shè)備樹(shù)(Device??Tree)基本概念及作用 3

二、設(shè)備樹(shù)的組成和使用 4

①DTS和DTSI 4

②DTC 4

③DTB 5

④Bootloader 5

三、設(shè)備樹(shù)中dts、dtsi文件的基本語(yǔ)法 5

㈠chosen?node 8

㈡aliases?node 8

㈢memory?node 9

㈣ 其他節(jié)點(diǎn) 10

四、DTB相關(guān)結(jié)構(gòu) 13

㈠Header 14

㈢字符串塊 16

㈣ memory?reserve?map 16

五、解析DTB的函數(shù)及相關(guān)數(shù)據(jù)結(jié)構(gòu) 17

㈠machine_desc結(jié)構(gòu) 17

㈡設(shè)備節(jié)點(diǎn)結(jié)構(gòu)體 18

㈢屬性結(jié)構(gòu)體 19

㈣ uboot下的相關(guān)結(jié)構(gòu)體 19

六、DTB加載及解析過(guò)程 21

七、OF的API接口 32


一、設(shè)備樹(shù)(Device??Tree)基本概念及作用

在內(nèi)核源碼中,存在大量對(duì)板級(jí)細(xì)節(jié)信息描述的代碼。這些代碼充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目錄,對(duì)內(nèi)核而言這些platform設(shè)備、resource、i2c_board_info、spi_board_info以及各種硬件的platform_data絕大多數(shù)純屬垃圾冗余代碼。為了解決這一問(wèn)題,ARM內(nèi)核版本3.x之后引入了原先在Power?PC等其他體系架構(gòu)已經(jīng)使用的Flattened?Device?Tree。

“A?data?structure?by?which?bootloaders?pass?hardware?layout?to?Linux?in?a?device-independent?manner,?simplifying?hardware?probing.”開(kāi)源文檔中對(duì)設(shè)備樹(shù)的描述是,一種描述硬件資源的數(shù)據(jù)結(jié)構(gòu),它通過(guò)bootloader將硬件資源傳給內(nèi)核,使得內(nèi)核和硬件資源描述相對(duì)獨(dú)立。

Device?Tree可以描述的信息包括CPU的數(shù)量和類(lèi)別、內(nèi)存基地址和大小、總線和橋、外設(shè)連接、中斷控制器和中斷使用情況、GPIO控制器和GPIO使用情況、Clock控制器和Clock使用情況。

另外,設(shè)備樹(shù)對(duì)于可熱插拔的熱備不進(jìn)行具體描述,它只描述用于控制該熱插拔設(shè)備的控制器。

設(shè)備樹(shù)的主要優(yōu)勢(shì):對(duì)于同一SOC的不同主板,只需更換設(shè)備樹(shù)文件.dtb即可實(shí)現(xiàn)不同主板的無(wú)差異支持,而無(wú)需更換內(nèi)核文件。

注:要使得3.x之后的內(nèi)核支持使用設(shè)備樹(shù),除了內(nèi)核編譯時(shí)需要打開(kāi)相對(duì)應(yīng)的選項(xiàng)外,bootloader也需要支持將設(shè)備樹(shù)的數(shù)據(jù)結(jié)構(gòu)傳給內(nèi)核。

二、設(shè)備樹(shù)的組成和使用

設(shè)備樹(shù)包含DTC(device?tree?compiler),DTS(device?tree?source和DTB(device?tree?blob)。其對(duì)應(yīng)關(guān)系如圖1-1所示:



圖1-1?DTS、DTC、DTB之間的關(guān)系

①DTS和DTSI

.dts文件是一種ASCII文本對(duì)Device?Tree的描述,放置在內(nèi)核的/arch/arm/boot/dts目錄。一般而言,一個(gè).dts文件對(duì)應(yīng)一個(gè)ARM的machine。

由于一個(gè)SOC可能有多個(gè)不同的電路板,而每個(gè)電路板擁有一個(gè)?.dts。這些dts勢(shì)必會(huì)存在許多共同部分,為了減少代碼的冗余,設(shè)備樹(shù)將這些共同部分提煉保存在.dtsi文件中,供不同的dts共同使用。.dtsi的使用方法,類(lèi)似于C語(yǔ)言的頭文件,在dts文件中需要進(jìn)行include?.dtsi文件。當(dāng)然,dtsi本身也支持include?另一個(gè)dtsi文件。

②DTC

DTC為編譯工具,它可以將.dts文件編譯成.dtb文件。DTC的源碼位于內(nèi)核的scripts/dtc目錄,內(nèi)核選中CONFIG_OF,編譯內(nèi)核的時(shí)候,主機(jī)可執(zhí)行程序DTC就會(huì)被編譯出來(lái)。?即scripts/dtc/Makefile中

hostprogs-y :=?dtc

always :=?$(hostprogs-y)?

在內(nèi)核的arch/arm/boot/dts/Makefile中,若選中某種SOC,則與其對(duì)應(yīng)相關(guān)的所有dtb文件都將編譯出來(lái)。在linux下,make?dtbs可單獨(dú)編譯dtb。以下截取了TEGRA平臺(tái)的一部分。

ifeq?($(CONFIG_OF),y)

dtb-$(CONFIG_ARCH_TEGRA)?+=?tegra20-harmony.dtb?\

tegra30-beaver.dtb?\

tegra114-dalmore.dtb?\

tegra124-ardbeg.dtb?

③DTB

DTC編譯.dts生成的二進(jìn)制文件(.dtb),bootloader在引導(dǎo)內(nèi)核時(shí),會(huì)預(yù)先讀取.dtb到內(nèi)存,進(jìn)而由內(nèi)核解析。

④Bootloader

Bootloader需要將設(shè)備樹(shù)在內(nèi)存中的地址傳給內(nèi)核。在ARM中通過(guò)bootm或bootz命令來(lái)進(jìn)行傳遞。bootm?[kernel_addr]?[initrd_address]?[dtb_address],其中kernel_addr為內(nèi)核鏡像的地址,initrd為initrd的地址,dtb_address為dtb所在的地址。若initrd_address為空,則用“-”來(lái)代替。

三、設(shè)備樹(shù)中dts、dtsi文件的基本語(yǔ)法

DTS的基本語(yǔ)法范例,如圖3-1?所示。

它包括一系列節(jié)點(diǎn),以及描述節(jié)點(diǎn)的屬性。

“/”為root節(jié)點(diǎn)。在一個(gè).dts文件中,有且僅有一個(gè)root節(jié)點(diǎn);在root節(jié)點(diǎn)下有“node1”,“node2”子節(jié)點(diǎn),稱(chēng)root為“node1”和“node2”的parent節(jié)點(diǎn),除了root節(jié)點(diǎn)外,每個(gè)節(jié)點(diǎn)有且僅有一個(gè)parent;其中子節(jié)點(diǎn)node1下還存在子節(jié)點(diǎn)“child-nodel1”和“child-node2”。

注:如果看過(guò)內(nèi)核/arch/arm/boot/dts目錄的讀者看到這可能有一個(gè)疑問(wèn)。在每個(gè).dsti和.dts中都會(huì)存在一個(gè)“/”根節(jié)點(diǎn),那么如果在一個(gè)設(shè)備樹(shù)文件中include一個(gè).dtsi文件,那么豈不是存在多個(gè)“/”根節(jié)點(diǎn)了么。其實(shí)不然,編譯器DTC在對(duì).dts進(jìn)行編譯生成dtb時(shí),會(huì)對(duì)node進(jìn)行合并操作,最終生成的dtb只有一個(gè)root?node。Dtc會(huì)進(jìn)行合并操作這一點(diǎn)從屬性上也可以得到驗(yàn)證。這個(gè)稍后做講解。

在節(jié)點(diǎn)的{}里面是描述該節(jié)點(diǎn)的屬性(property),即設(shè)備的特性。它的值是多樣化的:

1.它可以是字符串string,如①;也可能是字符串?dāng)?shù)組string-list,如②

2.它也可以是32?bit?unsigned?integers,如cell⑧,用<>表示

3.它也可以是binary?data,如③,用[]表示

4.它也可能是空,如⑦


圖3-1??DTS的基本語(yǔ)法范例

在/arch/arm/boot/dts/目錄中有一個(gè)文件skeleton.dtsi,該文件為各ARM?vendor共用的一些硬件定義信息。以下為skeleton.dtsi的全部?jī)?nèi)容。

/?{

#address-cells?=?<1>;

#size-cells?=?<1>;

chosen?{?};

aliases?{?};

memory?{?device_type?=?"memory";?reg?=?<0?0>;?};

};

如上,屬性#?address-cells的值為1,它代表以“/”根節(jié)點(diǎn)為parent的子節(jié)點(diǎn)中,reg屬性中存在一個(gè)address值;#size-cells的值為1,它代表以“\”?根節(jié)點(diǎn)為parent的子節(jié)點(diǎn)中,reg屬性中存在一個(gè)size值。即父節(jié)點(diǎn)的#?address-cells和#size-cells決定了子節(jié)點(diǎn)的address和size的長(zhǎng)度;Reg的組織形式為reg?=?

下面列舉例子,對(duì)一些典型節(jié)點(diǎn)進(jìn)行具體描述。

㈠chosen?node

chosen?{

bootargs?=?"tegraid=40.0.0.00.00?vmalloc=256M?video=tegrafb?console=ttyS0,115200n8?earlyprintk";

};

chosen?node?主要用來(lái)描述由系統(tǒng)指定的runtime?parameter,它并沒(méi)有描述任何硬件設(shè)備節(jié)點(diǎn)信息。原先通過(guò)tag?list傳遞的一些linux?kernel運(yùn)行的參數(shù),可以通過(guò)chosen節(jié)點(diǎn)來(lái)傳遞。如command?line可以通過(guò)bootargs這個(gè)property來(lái)傳遞。如果存在chosen?node,它的parent節(jié)點(diǎn)必須為“/”根節(jié)點(diǎn)。

㈡aliases?node

aliases?{

i2c6?=?&pca9546_i2c0;

i2c7?=?&pca9546_i2c1;

i2c8?=?&pca9546_i2c2;

i2c9?=?&pca9546_i2c3;

};

aliases?node用來(lái)定義別名,類(lèi)似C++中引用。上面是一個(gè)在.dtsi中的典型應(yīng)用,當(dāng)使用i2c6時(shí),也即使用pca9546_i2c0,使得引用節(jié)點(diǎn)變得簡(jiǎn)單方便。例:當(dāng).dts??include?該.dtsi時(shí),將i2c6的status屬性賦值為okay,則表明該主板上的pca9546_i2c0處于enable狀態(tài);反之,status賦值為disabled,則表明該主板上的pca9546_i2c0處于disenable狀態(tài)。如下是引用的具體例子:

&i2c6?{

status?=?"okay";

};

㈢memory?node

memory?{

device_type?=?"memory";

reg?=?<0x00000000?0x20000000>;?/*?512?MB?*/

};

對(duì)于memory?node,device_type必須為memory,由之前的描述可以知道該memory?node是以0x00000000為起始地址,以0x20000000為結(jié)束地址的512MB的空間。

一般而言,在.dts中不對(duì)memory進(jìn)行描述,而是通過(guò)bootargs中類(lèi)似521M@0x00000000的方式傳遞給內(nèi)核。

㈣ 其他節(jié)點(diǎn)

由于其他設(shè)備節(jié)點(diǎn)依據(jù)屬性進(jìn)行描述,具有類(lèi)似的形式。接下來(lái)的部分主要分析各種屬性的含義及作用,并結(jié)合相關(guān)的例子進(jìn)行闡述。

㈠?Reg屬性

在device?node?中,reg是描述memory-mapped?IO?register的offset和length。子節(jié)點(diǎn)的reg屬性address和length長(zhǎng)度取決于父節(jié)點(diǎn)對(duì)應(yīng)的#address-cells和#size-cells的值。例:

在上述的aips節(jié)點(diǎn)中,存在子節(jié)點(diǎn)spda。spda中的中reg為<0x70000000?0x40000?>,其0x700000000為address,0x40000為size。這一點(diǎn)在圖3-1下有作介紹。

這里補(bǔ)充的一點(diǎn)是:

設(shè)備節(jié)點(diǎn)的名稱(chēng)格式node-name@unit-address,節(jié)點(diǎn)名稱(chēng)用node-name唯一標(biāo)識(shí),為一個(gè)ASCII字符串。其中@unit-address為可選項(xiàng),可以不作描述。unit-address的具體格式和設(shè)備掛載在哪個(gè)bus上相關(guān)。如:cpuunit-address0開(kāi)始編址,以此加1;本例中,aips0x70000000

㈡?compatible屬性

在①中,compatible屬性為string?list,用來(lái)將設(shè)備匹配對(duì)應(yīng)的driver驅(qū)動(dòng),優(yōu)先級(jí)為從左向右。本例中spba的驅(qū)動(dòng)優(yōu)先考慮“fsl,aips-bus”驅(qū)動(dòng);若沒(méi)有“fsl,aips-bus”驅(qū)動(dòng),則用字符串“simple-bus”來(lái)繼續(xù)尋找合適的驅(qū)動(dòng)。即compatible實(shí)現(xiàn)了原先內(nèi)核版本3.x之前,platform_device中.name的功能,至于具體的實(shí)現(xiàn)方法,本文后面會(huì)做講解。

注:對(duì)于“/”root節(jié)點(diǎn),它也存在compatible屬性,用來(lái)匹配machine?type。具體說(shuō)明將在后面給出。

㈢?interrupts屬性

設(shè)備節(jié)點(diǎn)通過(guò)interrupt-parent來(lái)指定它所依附的中斷控制器,當(dāng)節(jié)點(diǎn)沒(méi)有指定interrupt-parent時(shí),則從parent節(jié)點(diǎn)中繼承。上面例子中,root節(jié)點(diǎn)的interrupt-parent?=?<&mic>。這里使用了引用,即mic引用了②中的inrerrupt-controller?@40008000;root節(jié)點(diǎn)的子節(jié)點(diǎn)并沒(méi)有指定interrupt-controller,如ahb、fab,它們均使用從根節(jié)點(diǎn)繼承過(guò)來(lái)的mic,即位于0x40008000的中斷控制器。

若子節(jié)點(diǎn)使用到中斷(中斷號(hào)、觸發(fā)方法等等),則需用interrupt屬性來(lái)指定,該屬性的數(shù)值長(zhǎng)度受中斷控制器中#inrerrupt-controller值③控制,即interrupt屬性<>中數(shù)值的個(gè)數(shù)為#inrerrupt-controller的值;本例中#inrerrupt-controller=<2>,因而④中interrupts的值為<0x3d?0>形式,具體每個(gè)數(shù)值的含義由驅(qū)動(dòng)實(shí)現(xiàn)決定。

㈣?ranges屬性

ranges屬性為地址轉(zhuǎn)換表,這在pcie中使用較為常見(jiàn),它表明了該設(shè)備在到parent節(jié)點(diǎn)中所對(duì)用的地址映射關(guān)系。ranges格式長(zhǎng)度受當(dāng)前節(jié)點(diǎn)#address-cell、parent節(jié)點(diǎn)#address-cells、當(dāng)前節(jié)點(diǎn)#size-cell所控制。順序?yàn)閞anges=<前節(jié)點(diǎn)#address-cell,?parent節(jié)點(diǎn)#address-cells?,?當(dāng)前節(jié)點(diǎn)#size-cell。在本例中,當(dāng)前節(jié)點(diǎn)#address-cell=<1>,對(duì)應(yīng)于⑤中的第一個(gè)0x20000000;parent節(jié)點(diǎn)#address-cells=<1>,對(duì)應(yīng)于⑤中的第二個(gè)0x20000000;當(dāng)前節(jié)點(diǎn)#size-cell=<1>,對(duì)應(yīng)于⑤中的0x30000000。即ahb0節(jié)點(diǎn)所占空間從0x20000000地址開(kāi)始,對(duì)應(yīng)于父節(jié)點(diǎn)的0x20000000地址開(kāi)始的0x30000000地址空間大小。

注:對(duì)于相同名稱(chēng)的節(jié)點(diǎn),dtc會(huì)根據(jù)定義的先后順序進(jìn)行合并,其相同屬性,取后定義的那個(gè)。

四、DTB相關(guān)結(jié)構(gòu)

本節(jié)講下.dts編譯生成的dtb文件,其布局結(jié)構(gòu)。

DTB由三部分組成:頭(Header)、結(jié)構(gòu)塊(device-tree?structure)、字符串塊(string?block)。下面將詳細(xì)介紹這三部分的內(nèi)容。

㈠Header

在\kernel\include\linux\of_fdt.h文件中有相關(guān)定義


device-tree?structure


設(shè)備樹(shù)結(jié)構(gòu)塊是一個(gè)線性化的結(jié)構(gòu)體,是設(shè)備樹(shù)的主體,以節(jié)點(diǎn)的形式保存了主板上的設(shè)備信息。

在結(jié)構(gòu)塊中,以宏OF_DT_BEGIN_NODE標(biāo)志一個(gè)節(jié)點(diǎn)的開(kāi)始,以宏OF_DT_END_NODE標(biāo)識(shí)一個(gè)節(jié)點(diǎn)的結(jié)束,整個(gè)結(jié)構(gòu)塊以宏OF_DT_END?(0x00000009)結(jié)束。在\kernel\include\linux\of_fdt.h中有相關(guān)定義,我們把這些宏稱(chēng)之為token。

(1)FDT_BEGIN_NODE?(0x00000001)。該token描述了一個(gè)node的開(kāi)始位置,緊挨著該token的就是node?name(包括unit?address)

(2)FDT_END_NODE?(0x00000002)。該token描述了一個(gè)node的結(jié)束位置。

(3)FDT_PROP?(0x00000003)。該token描述了一個(gè)property的開(kāi)始位置,該token之后是兩個(gè)u32的數(shù)據(jù),分別是length和name?offset。length表示該property?value?data的size。name?offset表示該屬性字符串在device?tree?strings?block的偏移值。length和name?offset之后就是長(zhǎng)度為length具體的屬性值數(shù)據(jù)。

(4)FDT_NOP?(0x00000004)。

(5)FDT_END?(0x00000009)。該token標(biāo)識(shí)了一個(gè)DTB的結(jié)束位置。

一個(gè)節(jié)點(diǎn)的結(jié)構(gòu)如下:

(1)節(jié)點(diǎn)開(kāi)始標(biāo)志:一般為OF_DT_BEGIN_NODE(0x00000001)。

(2)節(jié)點(diǎn)路徑或者節(jié)點(diǎn)的單元名(version<3以節(jié)點(diǎn)路徑表示,version>=0x10以節(jié)點(diǎn)單元名表示)

(3)填充字段(對(duì)齊到四字節(jié))

(4)節(jié)點(diǎn)屬性。每個(gè)屬性以宏OF_DT_PROP(0x00000003)開(kāi)始,后面依次為屬性值的字節(jié)長(zhǎng)度(4字節(jié))、屬性名稱(chēng)在字符串塊中的偏移量(4字節(jié))、屬性值和填充(對(duì)齊到四字節(jié))。

(5)如果存在子節(jié)點(diǎn),則定義子節(jié)點(diǎn)。

(6)節(jié)點(diǎn)結(jié)束標(biāo)志OF_DT_END_NODE(0x00000002)。

㈢字符串塊

通過(guò)節(jié)點(diǎn)的定義知道節(jié)點(diǎn)都有若干屬性,而不同的節(jié)點(diǎn)的屬性又有大量相同的屬性名稱(chēng),因此將這些屬性名稱(chēng)提取出一張表,當(dāng)節(jié)點(diǎn)需要應(yīng)用某個(gè)屬性名稱(chēng)時(shí),直接在屬性名字段保存該屬性名稱(chēng)在字符串塊中的偏移量。

㈣?memory?reserve?map

這個(gè)區(qū)域包括了若干的reserve?memory描述符。每個(gè)reserve?memory描述符是由address和size組成。其中address和size都是用U64來(lái)描述。

有些系統(tǒng),我們也許會(huì)保留一些memory有特殊用途(例如DTB或者initrd?image),或者在有些DSP+ARM的SOC?platform上,有些memory被保留用于ARM和DSP進(jìn)行信息交互。這些保留內(nèi)存不會(huì)進(jìn)入內(nèi)存管理系統(tǒng)。

五、解析DTB的函數(shù)及相關(guān)數(shù)據(jù)結(jié)構(gòu)

㈠machine_desc結(jié)構(gòu)

內(nèi)核將機(jī)器信息記錄為machine_desc結(jié)構(gòu)體(該定義在/arch/arm/include/asm/mach/arch.h),并保存在_arch_info_begin到_arch_info_end之間(_arch_info_begin,_arch_info_end為虛擬地址,是編譯內(nèi)核時(shí)指定的,此時(shí)mmu還未進(jìn)行初始化。它其實(shí)通過(guò)匯編完成地址偏移操作)

machine_desc結(jié)構(gòu)體用宏MACHINE_START進(jìn)行定義,一般在/arch/arm/子目錄,與板級(jí)相關(guān)的文件中進(jìn)行成員函數(shù)及變量的賦值。由linker將machine_desc聚集在.arch.info.init節(jié)區(qū)形成列表。

bootloader引導(dǎo)內(nèi)核時(shí),ARM寄存器r2會(huì)將.dtb的首地址傳給內(nèi)核,內(nèi)核根據(jù)該地址,解析.dtb中根節(jié)點(diǎn)的compatible屬性,將該屬性與內(nèi)核中預(yù)先定義machine_desc結(jié)構(gòu)體的dt_compat成員做匹配,得到最匹配的一個(gè)machine_desc。

在代碼中,內(nèi)核通過(guò)在start_kernel->setup_arch中調(diào)用setup_machine_fdt來(lái)實(shí)現(xiàn)上述功能,該函數(shù)的具體實(shí)現(xiàn)可參見(jiàn)/arch/arm/kernel/devtree.c。?

㈡設(shè)備節(jié)點(diǎn)結(jié)構(gòu)體

1.

記錄節(jié)點(diǎn)信息的結(jié)構(gòu)體。.dtb經(jīng)過(guò)解析之后將以device_node列表的形式存儲(chǔ)節(jié)點(diǎn)信息。

㈢屬性結(jié)構(gòu)體

device_node結(jié)構(gòu)體中的成員結(jié)構(gòu)體,用于描述節(jié)點(diǎn)屬性信息。

㈣?uboot下的相關(guān)結(jié)構(gòu)體

首先我們看下uboot用于記錄os、initrd、fdt信息的數(shù)據(jù)結(jié)構(gòu)bootm_headers,其定義在/include/image.h中,這邊截取了其中與dtb相關(guān)的一小部分。

fit_hdr_fdt指向DTB設(shè)備樹(shù)鏡像的頭。

lmb為uboot下的一種內(nèi)存管理機(jī)制,全稱(chēng)為logical?memory?blocks。用于管理鏡像的內(nèi)存。lmb所記錄的內(nèi)存信息最終會(huì)傳遞給kernel。這里對(duì)lmb不做展開(kāi)描述。在/include/lmb.h和/lib/lmb.c中有對(duì)lmb的接口和定義的具體描述。有興趣的讀者可以看下,所包含的代碼量不多。

六、DTB加載及解析過(guò)程

先從uboot里的do_bootm出發(fā),根據(jù)之前描述,DTB在內(nèi)存中的地址通過(guò)bootm命令進(jìn)行傳遞。在bootm中,它會(huì)根據(jù)所傳進(jìn)來(lái)的DTB地址,對(duì)DTB所在內(nèi)存做一系列操作,為內(nèi)核解析DTB提供保證。上圖為對(duì)應(yīng)的函數(shù)調(diào)用關(guān)系圖。

在do_bootm中,主要調(diào)用函數(shù)為do_bootm_states,第四個(gè)參數(shù)為bootm所要處理的階段和狀態(tài)。?

在do_bootm_states中,bootm_start會(huì)對(duì)lmb進(jìn)行初始化操作,lmb所管理的物理內(nèi)存塊有三種方式獲取。起始地址,優(yōu)先級(jí)從上往下:

1.?環(huán)境變量“bootm_low”

2.?宏CONFIG_SYS_SDRAM_BASE(在tegra124中為0x80000000)

3.?gd->bd->bi_dram[0].start

大小:

1.?環(huán)境變量“bootm_size”

2.?gd->bd->bi_dram[0].size

經(jīng)過(guò)初始化之后,這塊內(nèi)存就歸lmb所管轄。接著,調(diào)用bootm_find_os進(jìn)行kernel鏡像的相關(guān)操作,這里不具體闡述。

還記得之前講過(guò)bootm的三個(gè)參數(shù)么,第一個(gè)參數(shù)內(nèi)核地址已經(jīng)被bootm_find_os處理,而接下來(lái)的兩個(gè)參數(shù)會(huì)在bootm_find_other中執(zhí)行操作。

首先,bootm_find_other根據(jù)第二個(gè)參數(shù)找到ramdisk的地址,得到ramdisk的鏡像;然后根據(jù)第三個(gè)參數(shù)得到DTB鏡像,同檢查kernel和ramdisk鏡像一樣,檢查DTB鏡像也會(huì)進(jìn)行一系列的校驗(yàn)工作,如果校驗(yàn)錯(cuò)誤,將無(wú)法正常啟動(dòng)內(nèi)核。另外,uboot在確認(rèn)DTB鏡像無(wú)誤之后,會(huì)將該地址保存在環(huán)境變量“fdtaddr”中。

接著,uboot會(huì)把DTB鏡像reload一次,使得DTB鏡像所在的物理內(nèi)存歸lmb所管理:①boot_fdt_add_mem_rsv_regions會(huì)將原先的內(nèi)存DTB鏡像所在的內(nèi)存置為reserve,保證該段內(nèi)存不會(huì)被其他非法使用,保證接下來(lái)的reload數(shù)據(jù)是正確的;②boot_relocate_fdt會(huì)在bootmap區(qū)域中申請(qǐng)一塊未被使用的內(nèi)存,接著將DTB鏡像內(nèi)容復(fù)制到這塊區(qū)域(即歸lmb所管理的區(qū)域)

注:若環(huán)境變量中,指定“fdt_high”參數(shù),則會(huì)根據(jù)該值,調(diào)用lmb_alloc_base函數(shù)來(lái)分配DTB鏡像reload的地址空間。若分配失敗,則會(huì)停止bootm操作。因而,不建議設(shè)置fdt_high參數(shù)。

接下來(lái),do_bootm會(huì)根據(jù)內(nèi)核的類(lèi)型調(diào)用對(duì)應(yīng)的啟動(dòng)函數(shù)。與linux對(duì)應(yīng)的是do_bootm_linux。

①?boot_prep_linux

為啟動(dòng)后的kernel準(zhǔn)備參數(shù)

②?boot_jump_linux

以上是boot_jump_linux的片段代碼,可以看出:若使用DTB,則原先用來(lái)存儲(chǔ)ATAG的寄存器R2,將會(huì)用來(lái)存儲(chǔ).dtb鏡像地址。

boot_jump_linux最后將調(diào)用kernel_entry,將.dtb鏡像地址傳給內(nèi)核。


下面我們來(lái)看下內(nèi)核的處理部分:

在arch/arm/kernel/head.S中,有這樣一段:

_vet_atags定義在/arch/arm/kernel/head-common.S中,它主要對(duì)DTB鏡像做了一個(gè)簡(jiǎn)單的校驗(yàn)。

真正解析處理dbt的開(kāi)始部分,是setup_arch->setup_machine_fdt。這部分的處理在第五部分的machine_mdesc中有提及。

如圖,是setup_machine_fdt中的解析過(guò)程。

解析chosen節(jié)點(diǎn)將對(duì)boot_command_line進(jìn)行初始化。

解析根節(jié)點(diǎn)的{size,address}將對(duì)dt_root_size_cells,dt_root_addr_cells進(jìn)行初始化。為之后解析memory等其他節(jié)點(diǎn)提供依據(jù)。

解析memory節(jié)點(diǎn),將會(huì)把節(jié)點(diǎn)中描述的內(nèi)存,加入memory的bank。為之后的內(nèi)存初始化提供條件。


解析設(shè)備樹(shù)在函數(shù)unflatten_device_tree中完成,它將.dtb解析成device_node結(jié)構(gòu)(第五部分有其定義),并構(gòu)成單項(xiàng)鏈表,以供OF的API接口使用。

下面主要結(jié)合代碼分析:/drivers/of/fdt.c


















總的歸納為:

①?kernel入口處獲取到uboot傳過(guò)來(lái)的.dtb鏡像的基地址

②?通過(guò)early_init_dt_scan()函數(shù)來(lái)獲取kernel初始化時(shí)需要的bootargs和cmd_line等系統(tǒng)引導(dǎo)參數(shù)。

③?調(diào)用unflatten_device_tree函數(shù)來(lái)解析dtb文件,構(gòu)建一個(gè)由device_node結(jié)構(gòu)連接而成的單向鏈表,并使用全局變量of_allnodes保存這個(gè)鏈表的頭指針。

④?內(nèi)核調(diào)用OF的API接口,獲取of_allnodes鏈表信息來(lái)初始化內(nèi)核其他子系統(tǒng)、設(shè)備等。


七、OF的API接口

OF的接口函數(shù)在/drivers/of/目錄下,有of_i2c.c、of_mdio.c、of_mtd.c、Adress.c等等

這里將列出幾個(gè)常用的API接口。


1.?用來(lái)查找在dtb中的根節(jié)點(diǎn)

unsigned?long?__init?of_get_flat_dt_root(void)


2.?根據(jù)deice_node結(jié)構(gòu)的full_name參數(shù),在全局鏈表of_allnodes中,查找合適的device_node

struct?device_node?*of_find_node_by_path(const?char?*path)

例如:

struct?device_node?*cpus;

cpus=of_find_node_by_path("/cpus");


3.?若from=NULL,則在全局鏈表of_allnodes中根據(jù)name查找合適的device_node

struct?device_node?*of_find_node_by_name(struct?device_node?*from,const?char?*name)

例如:

struct?device_node?*np;

np?=?of_find_node_by_name(NULL,"firewire");


4.?根據(jù)設(shè)備類(lèi)型查找相應(yīng)的device_node

struct?device_node?*of_find_node_by_type(struct?device_node?*from,const?char?*type)

例如:

struct?device_node?*tsi_pci;

tsi_pci=?of_find_node_by_type(NULL,"pci");


5.?根據(jù)compatible字符串查找device_node

struct?device_node?*of_find_compatible_node(struct?device_node?*from,const?char?*type,?const?char?*compatible)


6.?根據(jù)節(jié)點(diǎn)屬性的name查找device_node

struct?device_node?*of_find_node_with_property(struct?device_node?*from,const?char?*prop_name)


7.?根據(jù)phandle查找device_node

struct?device_node?*of_find_node_by_phandle(phandle?handle)


8.?根據(jù)alias的name獲得設(shè)備id號(hào)

int?of_alias_get_id(struct?device_node?*np,?const?char?*stem)


9.?device?node計(jì)數(shù)增加/減少

struct?device_node?*of_node_get(struct?device_node?*node)

void?of_node_put(struct?device_node?*node)


10.?根據(jù)property結(jié)構(gòu)的name參數(shù),在指定的device?node中查找合適的property

struct?property?*of_find_property(const?struct?device_node?*np,const?char?*name,int?*lenp)


11.?根據(jù)property結(jié)構(gòu)的name參數(shù),返回該屬性的屬性值

const?void?*of_get_property(const?struct?device_node?*np,?const?char?*name,int?*lenp)


12.?根據(jù)compat參數(shù)與device?node的compatible匹配,返回匹配度

int?of_device_is_compatible(const?struct?device_node?*device,const?char?*compat)


13.?獲得父節(jié)點(diǎn)的device?node

struct?device_node?*of_get_parent(const?struct?device_node?*node)


14.?將matches數(shù)組中of_device_id結(jié)構(gòu)的name和type與device?node的compatible和type匹配,返回匹配度最高的of_device_id結(jié)構(gòu)

const?struct?of_device_id?*of_match_node(const?struct?of_device_id?*matches,const?struct?device_node?*node)


15.?根據(jù)屬性名propname,讀出屬性值中的第index個(gè)u32數(shù)值給out_value

int?of_property_read_u32_index(const?struct?device_node?*np,const?char?*propname,u32?index,?u32?*out_value)


16.?根據(jù)屬性名propname,讀出該屬性的數(shù)組中sz個(gè)屬性值給out_values

int?of_property_read_u8_array(const?struct?device_node?*np,const?char?*propname,?u8?*out_values,?size_t?sz)

int?of_property_read_u16_array(const?struct?device_node?*np,const?char?*propname,?u16?*out_values,?size_t?sz)

int?of_property_read_u32_array(const?struct?device_node?*np,const?char?*propname,?u32?*out_values,size_t?sz)


17.?根據(jù)屬性名propname,讀出該屬性的u64屬性值

int?of_property_read_u64(const?struct?device_node?*np,?const?char?*propname,u64?*out_value)


18.?根據(jù)屬性名propname,讀出該屬性的字符串屬性值

int?of_property_read_string(struct?device_node?*np,?const?char?*propname,const?char?**out_string)


19.?根據(jù)屬性名propname,讀出該字符串屬性值數(shù)組中的第index個(gè)字符串

int?of_property_read_string_index(struct?device_node?*np,?const?char?*propname,int?index,?const?char?**output)


20.?讀取屬性名propname中,字符串屬性值的個(gè)數(shù)

int?of_property_count_strings(struct?device_node?*np,?const?char?*propname)


21.?讀取該設(shè)備的第index個(gè)irq號(hào)

unsigned?int?irq_of_parse_and_map(struct?device_node?*dev,?int?index)


22.?讀取該設(shè)備的第index個(gè)irq號(hào),并填充一個(gè)irq資源結(jié)構(gòu)體

int?of_irq_to_resource(struct?device_node?*dev,?int?index,?struct?resource?*r)


23.?獲取該設(shè)備的irq個(gè)數(shù)

int?of_irq_count(struct?device_node?*dev)


24.?獲取設(shè)備寄存器地址,并填充寄存器資源結(jié)構(gòu)體

int?of_address_to_resource(struct?device_node?*dev,?int?index,struct?resource?*r)

const?__be32?*of_get_address(struct?device_node?*dev,?int?index,?u64?*size,unsigned?int?*flags)


25.?獲取經(jīng)過(guò)映射的寄存器虛擬地址

void?__iomem?*of_iomap(struct?device_node?*np,?int?index)


24.?根據(jù)device_node查找返回該設(shè)備對(duì)應(yīng)的platform_device結(jié)構(gòu)

struct?platform_device?*of_find_device_by_node(struct?device_node?*np)


25.?根據(jù)device?node,bus?id以及父節(jié)點(diǎn)創(chuàng)建該設(shè)備的platform_device結(jié)構(gòu)

struct?platform_device?*of_device_alloc(struct?device_node?*np,const?char?*bus_id,struct?device?*parent)

static?struct?platform_device?*of_platform_device_create_pdata(struct?device_node?*np,const?char?*bus_id,

void?*platform_data,struct?device?*parent)


26.?遍歷of_allnodes中的節(jié)點(diǎn)掛接到of_platform_bus_type總線上,由于此時(shí)of_platform_bus_type總線上還沒(méi)有驅(qū)動(dòng),所以此時(shí)不進(jìn)行匹配

int?of_platform_bus_probe(struct?device_node?*root,const?struct?of_device_id?*matches,struct?device?*parent)

轉(zhuǎn)載于:https://www.cnblogs.com/huty/p/8517543.html

總結(jié)

以上是生活随笔為你收集整理的【ARM-Linux开发】内核3.x版本之后设备树机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

天天爱天天操天天干 | 看片网站黄 | 97视频在线观看免费 | 国产视频在线观看免费 | www.夜色321.com| 日韩在线观看视频免费 | 久久久精品影视 | 国产精品免费人成网站 | 97精品国产一二三产区 | 国产精品久久久久久久久久久杏吧 | 亚洲高清视频在线播放 | 高清不卡一区二区三区 | 五月激情站| 黄色一级免费网站 | 少妇bbb搡bbbb搡bbbb′ | 福利精品在线 | 91精品国 | 久久99国产精品自在自在app | 国内久久久 | 天天操月月操 | 91爱爱网址| 天天爱天天干天天爽 | 亚洲一区二区视频在线 | 国产精品久久久久久久久搜平片 | 久久精品九色 | 九九热视频在线 | 亚洲国产精品影院 | 日韩在线高清免费视频 | 国产品久精国精产拍 | 久草视频在线看 | 一级片视频在线 | 久久精品一区二区三区中文字幕 | 91日韩在线视频 | 国产在线一区观看 | 人人干狠狠操 | 婷婷丁香狠狠爱 | 国产破处精品 | 一级电影免费在线观看 | 91av蜜桃 | 伊人电影在线观看 | 成人av手机在线 | 99精品在线免费观看 | 久久视频网址 | 久久视频免费 | 99国产在线视频 | 成人一级在线观看 | 天天拍天天色 | 日本黄色大片免费 | 天天躁日日 | 日本中文字幕在线看 | 亚洲欧美激情精品一区二区 | 中文字幕欧美日韩va免费视频 | 一区中文字幕 | 中文字幕在线观看第三页 | 色综合婷婷久久 | 黄色毛片一级片 | 久久五月情影视 | 黄色av网站在线免费观看 | 欧美日韩中文字幕视频 | 欧美精品在线观看 | 欧美日韩国产一区 | 亚洲综合成人婷婷小说 | 午夜av网站 | 色综合久久久久久久久五月 | 欧美一级片免费观看 | 午夜精品久久久久久久99无限制 | 日韩视频在线播放 | 日韩精品免费一区二区三区 | 久久精品国产精品亚洲 | 久久久久一区二区三区四区 | 18国产精品白浆在线观看免费 | 91视频啪 | 一本—道久久a久久精品蜜桃 | 91亚洲狠狠婷婷综合久久久 | 日韩久久精品一区 | 手机在线小视频 | 亚洲精品在线国产 | 久久久精品影视 | 五月天久久 | 狠狠色丁香久久婷婷综合五月 | 天天做天天爱天天综合网 | 黄色1级毛片 | 黄色在线观看污 | av在线免费观看不卡 | 久久久国产成人 | 黄a在线观看| 九月婷婷色 | 国产尤物一区二区三区 | 91成人久久 | 国产一在线精品一区在线观看 | 日韩一区二区免费在线观看 | 中文字幕丝袜一区二区 | 日韩精品短视频 | 亚洲午夜精品电影 | 欧美精品国产综合久久 | 韩日在线一区 | 9999在线视频 | 99久久综合国产精品二区 | 日韩精品视频免费专区在线播放 | 日日草夜夜操 | 亚洲永久字幕 | 久久视频在线 | 国产1区在线观看 | 啪啪免费视频网站 | 黄色网址a | 国产精品白丝jk白祙 | 欧美性黑人 | 成人av电影免费在线观看 | 免费av网站在线 | 欧美极品一区二区三区 | 日韩精品中文字幕在线播放 | 国产精品都在这里 | 超碰人人av | 国产在线精品一区 | 99热在线免费观看 | 亚洲女人天堂成人av在线 | 久草国产在线观看 | 在线免费观看欧美日韩 | 中文字幕资源网在线观看 | 日韩欧美精品在线观看视频 | 久久久久成人精品亚洲国产 | 欧美另类交在线观看 | 国产精品午夜av | 久久久久久久久免费视频 | 国产精品理论片在线观看 | 在线小视频 | 国产丝袜一区二区三区 | 在线视频福利 | 99热精品国产一区二区在线观看 | 亚洲精品高清在线 | 福利电影久久 | 国内精品毛片 | 免费色视频网址 | 国产99久久精品一区二区300 | 日本在线观看一区 | 国产美女无遮挡永久免费 | 国产欧美最新羞羞视频在线观看 | 国产在线观看91 | 亚洲综合精品视频 | 97色婷婷成人综合在线观看 | 午夜精品一区二区三区在线播放 | 国产成人一区二区三区电影 | 91.麻豆视频| 99精品视频在线观看 | 欧美日韩国产一区二区在线观看 | 91免费黄视频 | 国产精品美女久久久久久久久 | 久久神马影院 | 欧美成a人片在线观看久 | 片网站 | 免费黄在线看 | 久久婷婷五月综合色丁香 | 免费视频一区 | 国产中文字幕第一页 | 国产色婷婷精品综合在线手机播放 | 免费一级片视频 | 二区三区在线视频 | 色www.| 狠色狠色综合久久 | 亚洲精品乱码久久久久久按摩 | 亚洲 综合 国产 精品 | 国产一区在线视频播放 | 亚洲三级性片 | 久久久亚洲网站 | 国产精品成人免费 | 日韩精品中文字幕在线播放 | 久久久久久久久久久网 | 日韩黄色免费电影 | 国产精品一区二区三区在线 | 国产视频2区 | 久久久精品 一区二区三区 国产99视频在线观看 | 日韩精品中文字幕av | 国产成人精品av在线 | 国产午夜在线观看视频 | 欧美日韩另类在线观看 | 欧美激情视频一区 | 国产一区免费在线 | 色综合久久88色综合天天免费 | 久久草网站| 在线你懂 | 久久一区二区三区超碰国产精品 | 最新日韩在线 | 午夜精品一区二区三区视频免费看 | 国产精品乱码久久久久久1区2区 | 国产精品美女 | 天天综合网在线观看 | 久久桃花网 | 91网站免费观看 | 久久涩涩网站 | 亚洲理论片在线观看 | 91av在线视频免费观看 | 最近2019年日本中文免费字幕 | 亚洲精品一区二区18漫画 | 在线观看涩涩 | 黄色在线观看www | 一级成人在线 | 亚洲 成人 一区 | 中文在线免费视频 | 亚洲第一香蕉视频 | 国产精久久久久久妇女av | 中文字幕 婷婷 | 亚洲最新av在线 | 香蕉色综合| 91精选在线| 日韩有色 | 色综合久久天天 | 国产精品完整版 | 丁香视频五月 | 免费福利视频网 | 国产不卡精品 | 欧美亚洲国产精品久久高清浪潮 | 亚洲最新av在线网址 | 中日韩三级视频 | 91麻豆网| av一级久久 | 精品久久美女 | 日本精品一区二区三区在线观看 | 日韩中文在线观看 | 日韩高清在线观看 | 久久久久久久久久网 | 99国产一区| 91亚洲精 | 日韩高清片 | 国产成人精品久 | 国产精品99久久久久久久久 | 日韩有码在线观看视频 | 久草在线费播放视频 | 日韩av一区二区在线影视 | 一区二区三区在线播放 | 日韩高清免费观看 | 欧美综合在线视频 | 99精品一区二区 | 天天操夜夜干 | 亚洲免费av片| 99精品视频在线播放观看 | 国产日韩欧美在线影视 | 亚洲欧洲视频 | 中文字幕资源网在线观看 | 在线 视频 一区二区 | 狠狠色丁香婷婷综合视频 | 国产在线国偷精品产拍 | 99在线视频播放 | 国产高清免费在线观看 | 天天天干天天射天天天操 | 亚洲精品2区 | 国产日韩高清在线 | 丁香六月网 | 九色91在线 | 国产精品乱码一区二区视频 | 91精品国产91热久久久做人人 | 成人资源网 | 久久国语露脸国产精品电影 | 日韩精品一区二区在线视频 | 黄色一级网 | 免费观看国产精品 | 黄色av电影在线 | 夜夜操天天 | 91麻豆传媒 | 天天干,天天插 | 乱男乱女www7788 | www操操| 中文日韩在线 | 国产天天爽 | 免费看一级一片 | 亚洲伦理一区二区 | 久精品视频免费观看2 | 国产一区在线免费观看视频 | 在线播放日韩 | 99免费在线观看 | 在线观看完整版免费 | 91视频免费| 久久午夜羞羞影院 | 中文一区二区三区在线观看 | 欧美日韩午夜在线 | 国产一区在线免费观看 | 久久精品国产99 | 极品久久久久 | 国偷自产视频一区二区久 | 99国产成+人+综合+亚洲 欧美 | 久久久精品小视频 | 婷婷电影在线观看 | 国产一级片一区二区三区 | 亚洲九九九在线观看 | 97综合视频 | 亚洲欧洲一区二区在线观看 | 婷婷av电影 | 99免费国产 | 五月婷香蕉久色在线看 | 日一日操一操 | 91精品久久香蕉国产线看观看 | 亚洲精品视频一 | 亚洲 欧美 综合 在线 精品 | 色综合咪咪久久网 | 天天人人综合 | 中文字幕久久网 | 久久久久久影视 | a爱爱视频| 婷婷激情五月综合 | 成人黄色大片 | 婷婷六月色 | 日韩理论电影在线 | 四虎国产 | 天天舔天天射天天操 | 黄色小说免费在线观看 | 国产r级在线观看 | bbb搡bbb爽爽爽 | 国产一级在线视频 | 天天色天天射天天综合网 | 中文字幕 影院 | 免费在线播放视频 | 国产最新在线观看 | 国产精品久久网站 | 欧美一级片免费在线观看 | 国产精品一区二区久久国产 | 综合精品久久久 | 亚洲色图美腿丝袜 | 久久国产免 | 五月天开心| 久久日本视频 | 亚洲另类在线视频 | 国产精品一区二区免费视频 | 日本三级人妇 | 午夜精品久久一牛影视 | 欧美精品v国产精品v日韩精品 | 国产色视频网站2 | 久草在线视频在线观看 | 国产精品欧美在线 | 国产91av视频在线观看 | 天天草天天色 | 日韩欧美不卡 | 欧美福利视频一区 | 午夜精品三区 | 国产精品影音先锋 | 日韩免费b | 亚洲一区二区三区毛片 | av在线激情 | 91麻豆精品一区二区三区 | 91免费高清观看 | 久久论理 | 美女久久网站 | 操操日日 | 色搞搞| 99精品在线免费观看 | 91精品啪 | 亚洲九九九在线观看 | 91久久奴性调教 | 中文字幕在线色 | 日韩成人精品一区二区 | 国产美女精品人人做人人爽 | 黄色的视频网站 | 日韩区欠美精品av视频 | 久久久久亚洲精品男人的天堂 | 最新成人av | 国产精品久久久久久欧美 | 欧美一区二区精品在线 | 亚洲日韩欧美一区二区在线 | 最新国产在线视频 | 91视频亚洲| 五月天狠狠操 | 日韩电影在线观看中文字幕 | 九九免费在线观看视频 | 亚洲另类视频在线观看 | 国产黄色精品视频 | 亚洲午夜激情网 | 国产一区二区久久精品 | 国产色区 | 在线影视 一区 二区 三区 | 韩国av免费在线观看 | 97高清免费视频 | 国产一二区免费视频 | 精品国产乱码久久久久久三级人 | 不卡精品视频 | 国产视频导航 | 五月天久久久久 | 中文字幕资源网在线观看 | 日韩av电影免费在线观看 | 免费视频a | av网站在线观看免费 | 成人国产精品免费 | 黄色亚洲精品 | 欧美在线a视频 | 国产天天综合 | 国产黄色免费在线观看 | 一区二区精品在线观看 | 黄色小说在线免费观看 | 九色激情网 | 精品国产三级 | 999热视频 | 在线视频 国产 日韩 | 国语久久| 亚洲不卡123 | 在线中文字幕网站 | 欧美精品久久久久久久 | 天天干天天操天天做 | 日韩精品在线看 | 欧美一级大片在线观看 | 国产夫妻性生活自拍 | 免费男女网站 | 亚洲激情在线视频 | 91手机在线看片 | 亚洲免费高清视频 | 精品免费99久久 | 日韩va在线观看 | 国产福利av | 国产精品亚洲成人 | 精品嫩模福利一区二区蜜臀 | 欧美日一级片 | 久久视讯 | 国产日韩精品一区二区 | 国产精品观看在线亚洲人成网 | 国产又粗又猛又爽又黄的视频免费 | 国产精品观看视频 | 国产一级精品在线观看 | 国产福利一区二区在线 | 日本激情动作片免费看 | 热99久久精品 | 色视频网址| 成人全视频免费观看在线看 | 日本不卡一区二区三区在线观看 | 日韩中文字幕一区 | 久九视频 | 成人精品一区二区三区中文字幕 | 91视频大全 | 国产日韩欧美网站 | 色噜噜日韩精品欧美一区二区 | 亚洲3级| 婷婷丁香自拍 | 欧美精品v国产精品 | 成人在线免费av | 久久在线精品视频 | av一区在线| 人成电影网| av在线播放不卡 | 91成人免费观看视频 | 久久免费视频在线观看 | 久久久蜜桃 | 中文字幕一区二区三区四区久久 | 日韩电影一区二区在线观看 | 久久tv视频 | 国产人成免费视频 | 久久精品视频2 | 国产在线 一区二区三区 | 久久国产美女 | 国产精品视频地址 | 97在线播放| a爱爱视频| 久久艹国产视频 | 日韩激情视频在线观看 | 久久综合久久久久88 | 亚洲午夜精品久久久久久久久 | 久久男人中文字幕资源站 | 99精品免费在线观看 | 中文字幕999| 亚洲黄色小说网址 | 在线免费观看国产黄色 | 99r在线观看 | 国产精品露脸在线 | 中文字幕成人在线观看 | 久久香蕉影视 | 久久精品人人做人人综合老师 | .精品久久久麻豆国产精品 亚洲va欧美 | 精品国产免费一区二区三区五区 | 最近中文字幕高清字幕免费mv | 久久久久久久久久免费视频 | 91传媒视频在线观看 | 在线免费高清 | 天天做日日做天天爽视频免费 | 婷婷在线看 | 日韩av资源在线观看 | 久久久免费看视频 | 成人小视频免费在线观看 | 亚洲综合欧美激情 | 久久久久久国产精品999 | 香蕉影视app | 在线免费黄色av | 93久久精品日日躁夜夜躁欧美 | 欧美九九九| 中午字幕在线观看 | 成人一级片视频 | 最新av在线播放 | 人人澡人人添人人爽一区二区 | 欧美激精品| 国内99视频| 国产成人久久精品77777 | 国产精品一区二区免费在线观看 | 在线免费观看黄网站 | 激情黄色av | 精品不卡视频 | 国产高清无线码2021 | 992tv在线观看 | 国产69精品久久久久久久久久 | 国产成人久久精品一区二区三区 | 国产美女在线精品免费观看 | 日色在线视频 | 亚洲在线观看av | 超碰人人av| 色婷婷a| 九九热免费视频在线观看 | 97精品国产91久久久久久久 | 天天干天天插伊人网 | 在线看一区 | 97碰在线视频 | 久久久精品一区二区三区 | 天堂在线成人 | 亚洲国产欧洲综合997久久, | 日韩在线视频网址 | 免费在线国产黄色 | 在线观看成人国产 | www.天天色 | 亚洲欧美日韩中文在线 | 国产精品系列在线观看 | 久久欧美视频 | 国内精品久久久久影院日本资源 | 日韩综合一区二区三区 | 国产成人在线网站 | 亚洲91精品在线观看 | 日韩中文幕 | 欧美极度另类 | 91亚洲免费| 欧美孕妇与黑人孕交 | 伊人国产女 | 成全免费观看视频 | av在线收看| 91超在线 | 免费国产在线精品 | 中文字幕一二 | 久久亚洲国产精品 | 国产精品涩涩屋www在线观看 | 成人毛片100免费观看 | 91成人免费观看视频 | 久久av在线 | 亚洲欧美婷婷六月色综合 | 久久免费观看少妇a级毛片 久久久久成人免费 | 最近日本字幕mv免费观看在线 | 久久tv | 日韩av影片在线观看 | 色99色| 亚洲精品2区 | 丝袜美腿av | 免费的黄色av | 青青河边草观看完整版高清 | 五月婷婷另类国产 | 在线免费视频a | 久久神马影院 | 日韩精品一卡 | 亚洲资源在线 | 色国产精品 | 天天操天天摸天天干 | 99在线热播 | 成人久久久精品国产乱码一区二区 | 日韩综合在线观看 | 精品国产一区二区三区久久 | 日韩素人在线观看 | 91精品办公室少妇高潮对白 | 国产在线视频一区 | 国产麻豆剧果冻传媒视频播放量 | 午夜精品福利在线 | 免费在线黄色av | 日p视频在线观看 | 欧美日韩视频在线观看免费 | 亚洲成av人片在线观看www | 四虎影视成人永久免费观看视频 | 99精品视频中文字幕 | 国产视频一区二区在线播放 | 亚洲国产日韩在线 | 欧美日韩在线网站 | 久久国产欧美日韩精品 | 日本公妇在线观看高清 | 日韩一二三区不卡 | 免费看毛片在线 | 亚洲综合视频在线 | 亚洲第一av在线 | 天天做天天射 | 激情网五月婷婷 | 色综合久久88色综合天天6 | 激情五月播播久久久精品 | 一区二区三区精品久久久 | 色吧av色av | 狠狠色狠狠色综合日日92 | 欧美91av| 久草www| 亚洲国产精品一区二区尤物区 | 九九热中文字幕 | 国产精品成人免费 | 国产高清在线免费视频 | 欧美激情第八页 | 色婷丁香| 在线免费观看视频一区二区三区 | 91香蕉视频在线 | 1024在线看片| 九精品 | 精品v亚洲v欧美v高清v | 伊人天堂av| 超碰97人人干 | 黄色网在线播放 | 日韩有码专区 | 99欧美视频 | 久久精品观看 | 色www.| 国产亚洲欧洲 | av丝袜天堂| 欧美91视频 | 999久久国精品免费观看网站 | 99视频精品在线 | 人人干人人草 | 日韩手机在线观看 | 91在线免费播放视频 | 成人在线播放网站 | 精品亚洲va在线va天堂资源站 | 日韩手机在线 | 国产精品一区二区三区在线播放 | 果冻av在线 | 日韩xxxx视频| 免费男女羞羞的视频网站中文字幕 | 成人一区不卡 | 亚洲精品三级 | 天海冀一区二区三区 | 精品日韩中文字幕 | 毛片888| 久久只有精品 | 最新超碰| 97久久久免费福利网址 | 97电院网手机版 | 特级免费毛片 | 国产在线不卡 | 精品久久精品久久 | 在线一二三四区 | 午夜成人免费影院 | 九九久久影视 | 精品福利av| 激情综合五月婷婷 | 一区二区三区在线播放 | 国产精品国产亚洲精品看不卡 | 亚洲人成在线电影 | 六月色丁 | 在线观看一级视频 | 免费情趣视频 | 国产精品久久久久久欧美 | 中文字幕一区2区3区 | 四虎永久免费在线观看 | 丁香婷婷激情啪啪 | 中文字幕 国产视频 | 亚洲视频1区2区 | 免费在线色视频 | 91c网站色版视频 | 欧美va日韩va | 精品久久久久久久久久久久久久久久久久 | 久久精品久久精品久久39 | 精品理论片 | 色天堂在线视频 | 激情综合色综合久久 | 国产黄色观看 | 黄色官网在线观看 | 久碰视频在线观看 | 国产精品久久久久久久7电影 | 免费观看91视频大全 | 在线观看国产日韩欧美 | 成在线播放 | 国产精品18久久久久久久 | 在线免费观看欧美日韩 | 日韩欧美在线视频一区二区 | 在线中文视频 | 欧美成人精品欧美一级乱 | 欧美日韩精品在线免费观看 | 最近2019中文免费高清视频观看www99 | www黄色软件| 91女神的呻吟细腰翘臀美女 | 日韩精品欧美精品 | 91高清免费观看 | 伊人伊成久久人综合网小说 | 手机av在线不卡 | 欧美日韩一二三四区 | 一区 在线 影院 | 久久免费久久 | 丁香综合激情 | 99国产在线 | 国产精品18久久久久久首页狼 | 国偷自产中文字幕亚洲手机在线 | 久久成年视频 | 97在线观 | 激情自拍av | 久久精品影视 | 麻豆视屏 | 99操视频 | 欧美成人中文字幕 | 伊人电影天堂 | 国产精品麻豆三级一区视频 | 国产又粗又硬又爽视频 | 97精品国产一二三产区 | 国产精品av在线 | 婷婷六月综合网 | 我要色综合天天 | 天天操操 | 欧美日韩高清一区 | 国产一区福利 | 五月婷婷丁香激情 | 91大神精品视频在线观看 | 国产99久久久国产精品免费二区 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 日韩有码在线观看视频 | 人人澡人人添人人爽一区二区 | 在线 视频 一区二区 | 日日夜夜狠狠干 | 久久96国产精品久久99软件 | 久久久这里有精品 | 成人av中文字幕 | 国产啊v在线观看 | 一区精品久久 | av免费电影在线 | 超碰资源在线 | 亚洲 欧洲 国产 日本 综合 | 全黄色一级片 | 蜜臀av性久久久久蜜臀av | 操操操com | www.久久99| 亚洲国产精品一区二区尤物区 | 美女免费电影 | 免费电影一区二区三区 | 精品视频中文字幕 | 国产一级视频在线免费观看 | 在线www色| 干干操操| 亚洲一级电影视频 | 国产麻豆视频在线观看 | 亚洲欧美视频在线播放 | 毛片网站在线观看 | 在线视频日韩欧美 | 菠萝菠萝蜜在线播放 | 亚洲美女视频在线观看 | 黄色在线观看污 | 亚洲视频免费在线看 | 热久久在线视频 | 欧美成人精品三级在线观看播放 | 国产精品原创视频 | 韩国在线视频一区 | 一级a性色生活片久久毛片波多野 | 999国产精品视频 | 日本在线观看中文字幕无线观看 | 91最新在线 | 国产精品2020 | 亚洲 中文 欧美 日韩vr 在线 | 国产日韩精品一区二区三区 | 婷婷日日 | 综合久久一本 | 亚洲免费a | 韩国精品在线 | 国产一区成人在线 | 欧美天天干 | 亚洲日本成人 | 成人h视频 | 特级毛片在线 | 麻豆国产精品一区二区三区 | 久久综合九九 | 欧美精品久久人人躁人人爽 | 在线观看国产成人av片 | 最近中文字幕免费大全 | 丁香婷婷久久久综合精品国产 | 黄污在线看 | 亚洲精品ww | av在线激情 | 国产999精品久久久久久麻豆 | 日韩av高清在线观看 | 又黄又刺激的视频 | 色网站国产精品 | 亚洲桃花综合 | 精品自拍sae8—视频 | 福利视频导航网址 | 国产午夜三级一区二区三桃花影视 | 视频在线观看一区 | 中文字幕 二区 | 久久看毛片 | 深爱婷婷久久综合 | 中文字幕日韩无 | 欧美精品免费视频 | 夜夜操天天操 | 欧美色久 | av线上看 | 日韩视频中文字幕在线观看 | 久操视频在线播放 | 久久成人在线视频 | 国内视频 | 中文字幕大全 | 国产精品aⅴ | 麻豆国产精品一区二区三区 | 97在线观看免费观看高清 | 五月婷婷视频在线观看 | 久久久久久久久久久久av | 天天色天天爱天天射综合 | 国产在线播放观看 | 91成人看片 | www操操| 亚洲综合色站 | a午夜电影| 国产伦精品一区二区三区免费 | 日韩在线免费播放 | 免费不卡中文字幕视频 | 久久久久久久久久久影院 | 久久综合久久综合久久综合 | 国产精品女同一区二区三区久久夜 | 国产一区二区三区高清播放 | 最新色视频 | 99热99| 久久久久久久久国产 | 激情综合五月网 | 免费观看mv大片高清 | 欧美精品一区二区三区一线天视频 | av福利在线免费观看 | 国产亚洲精品综合一区91 | 天天躁日日躁狠狠躁av中文 | 黄色av成人在线 | 精品一区欧美 | 欧美 日韩 国产 成人 在线 | 超碰人人国产 | 欧美久久电影 | 狠狠干成人 | 天天干天天射天天爽 | 国产一区二区三区久久久 | 久久九九久久精品 | 欧美日韩高清 | 欧美成年人在线视频 | 毛片视频网址 | 欧美日韩视频在线观看一区二区 | 美女在线免费观看视频 | 日韩av一区二区在线 | 成人免费在线网 | 久久一视频 | 国产精品成人久久久久久久 | 色婷婷天天干 | 91在线蜜桃臀 | 欧美日韩精品在线 | 丁香视频 | 欧美日韩精品在线视频 | 亚洲一区二区黄色 | 国产精品网址在线观看 | 欧美99热 | 国产午夜在线观看 | 欧美aaaxxxx做受视频 | 在线成人一区二区 | 免费亚洲一区二区 | 最近中文字幕视频网 | 国产视频一区在线播放 | 国产精品国产三级国产aⅴ无密码 | 成人黄色小说在线观看 | www.久久视频 | 99精品视频在线播放观看 | 国产成人精品av久久 | 国产一区二区久久精品 | 亚洲自拍av在线 | 日韩欧美亚州 | 国产精品九九久久久久久久 | 国产精品精品国产 | 亚洲午夜精品久久久久久久久久久久 | 国产一区久久 | 麻豆国产露脸在线观看 | 天天色婷婷 | 美女久久久久久久久久 | 婷婷深爱网| 久久久综合电影 | 国产免费人人看 | 密桃av在线 | 国产精品欧美精品 | 婷婷六月丁香激情 | 伊人亚洲精品 | 久久久久久欧美二区电影网 | 日本巨乳在线 | 五月婷婷丁香六月 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 波多野结衣最新 | 久久看片 | www.久久色| 日韩精品中文字幕在线不卡尤物 | 911精品视频| 九色最新网址 | 97超碰资源总站 | 久久亚洲日本 | 91视频91自拍 | 国产精品久久久久久a | 日韩在线第一区 | a天堂最新版中文在线地址 久久99久久精品国产 | 色综合天天综合 | 婷婷免费在线视频 | 在线观看91| 九九久久在线看 | 亚洲一区二区视频在线播放 | 国产视频在线播放 | 亚洲免费成人av电影 | 欧美一级性生活 | 国产一级a毛片视频爆浆 | 中文字幕在线观看第三页 | 免费在线播放视频 | 日韩午夜在线观看 | 五月激情天 | 久久99久久99精品免观看软件 | 久久99热精品这里久久精品 | 一区二区三区免费在线播放 | 久热免费在线观看 | 免费看黄色毛片 | 日韩资源在线播放 | 国产在线精品一区 | 国内精品视频久久 | 国产精品久久久久久久久久新婚 | 国产香蕉视频在线观看 | 国产精品免费一区二区三区 | 亚洲理论在线 | 久久久国产99久久国产一 | 日韩精品在线免费观看 | 久久久久国产a免费观看rela | 中文字幕第一页在线播放 | 狠狠久久 | 国产少妇在线观看 | 99精品视频在线观看播放 | 天天操天天舔天天干 | 91桃色在线免费观看 | 午夜12点| 国产91成人在在线播放 | 日韩中文字幕视频在线观看 | 亚洲精品视频一 | 99精品在这里 | 99产精品成人啪免费网站 | 欧美三级高清 | 国产高清不卡一区二区三区 | 一级一级一片免费 | av色综合| 国产黄a三级三级三级三级三级 | 日韩免费电影一区二区三区 | 91九色视频在线 | 狠狠干狠狠操 | 3d黄动漫免费看 | 久久久这里有精品 | 成人一级片视频 | 国产精品国产三级国产aⅴ入口 | 国产手机在线播放 | 国产破处在线播放 | 日韩网站中文字幕 | 国产拍在线| 欧美在线free | 九九热.com | 中文字幕之中文字幕 | av免费网站 | 婷婷伊人五月天 | 国产无吗一区二区三区在线欢 | 久久99精品久久久久久秒播蜜臀 | 精品国产成人在线 | 中文字幕影视 | 国产69精品久久久久9999apgf | 黄色a视频免费 | 亚洲91网站| 1区2区3区在线观看 三级动图 | 婷婷伊人五月天 | 在线视频久久 | 国产精品一区二区免费视频 | www.婷婷com| www.伊人网| 婷婷精品视频 | 免费网站v | 久久国产女人 | 人人爽久久涩噜噜噜网站 | 国产精品av在线免费观看 | 在线看片中文字幕 | 91精品入口| 精品久久一 | 精品乱码一区二区三四区 | 亚洲国产欧洲综合997久久, | 久久综合精品一区 | 中文字幕丝袜一区二区 | 美女啪啪图片 | www.国产视频| 亚洲精品白浆高清久久久久久 | 91久久精品一区二区三区 | 91丨九色丨91啦蝌蚪老版 | 最近中文字幕久久 | 西西www4444大胆视频 | 一区二区三区 亚洲 | 在线观看91网站 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 亚洲狠狠丁香婷婷综合久久久 | 国产视频精品网 | 中文字幕在线观看一区二区 | 国产日韩视频在线播放 | 中文字幕av全部资源www中文字幕在线观看 | 成人av免费看 | 97在线观看免费 | 国产精品一区二区在线观看免费 | 中文字幕在线免费观看 | 午夜在线免费视频 | 久久精品看 | 欧美精品久久久久久久免费 | 天天操天天弄 | 黄色小视频在线观看免费 | 91精品免费在线 | 美女啪啪图片 | 日韩一区二区在线免费观看 | 91精品视频在线免费观看 | 久久综合色综合88 | 久久久免费观看视频 | 国产黄色片久久久 | www.在线看片.com| www天天干|