欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

linuxdts的作用是什么

本文小編為大家詳細(xì)介紹“l(fā)inux dts的作用是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“l(fā)inux dts的作用是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

成都創(chuàng)新互聯(lián)公司提供高防主機(jī)、云服務(wù)器、香港服務(wù)器、四川雅安電信機(jī)房

在linux中,dts是設(shè)備樹源文件,用于描述設(shè)備信息的;設(shè)備樹技術(shù)將設(shè)備的硬件資源信息就寫在dts文件中。設(shè)備樹源文件dts被編譯成dtb二進(jìn)制,在bootloader運(yùn)行時傳遞給操作系統(tǒng),操作系統(tǒng)對其進(jìn)行解析展開,從而產(chǎn)生一個硬件設(shè)備的拓?fù)鋱D,有了這個拓?fù)鋱D,在編成過程可以直接通過系統(tǒng)提供的接口獲取到設(shè)備樹的節(jié)點(diǎn)和屬性信息。

1、什么是設(shè)備樹?

設(shè)備樹(dt:device tree)是linux內(nèi)核采用的參數(shù)表示和傳遞技術(shù),在系統(tǒng)引導(dǎo)啟動階段進(jìn)行設(shè)備初始化的時候,將設(shè)備樹中描述的硬件信息傳遞給操作系統(tǒng);

  • dts(device tree source):設(shè)備樹源文件,描述設(shè)備信息的;

    設(shè)備樹源文件dts被編譯成dtb二進(jìn)制,在bootloader運(yùn)行時傳遞給操作系統(tǒng),操作系統(tǒng)對其進(jìn)行解析展開,從而產(chǎn)生一個硬件設(shè)備的拓?fù)鋱D,有了這個拓?fù)鋱D,在編成過程可以直接通過系統(tǒng)提供的接口獲取到設(shè)備樹的節(jié)點(diǎn)和屬性信息

  • dtc(device tree compiler):設(shè)備樹編譯/反編譯/調(diào)試工具;

  • dtb(device tree binary):二進(jìn)制設(shè)備樹鏡像;

  • dtsi(device tree source include):功能類似設(shè)備樹文件的頭文件,可以被dts文件通過include引用,dtsi文件一般是描述共性部分;

2、設(shè)備樹解決什么問題

  • 在設(shè)備驅(qū)動源碼中,分為驅(qū)動代碼和設(shè)備代碼,驅(qū)動代碼是操作硬件的方法,設(shè)備代碼是硬件資源、數(shù)據(jù),當(dāng)驅(qū)動代碼和設(shè)備代碼匹配時就會調(diào)用驅(qū)動的probe函數(shù),probe函數(shù)會利用設(shè)備代碼的資源去初始化設(shè)備;

  • 設(shè)備樹之前,設(shè)備代碼都是直接寫在內(nèi)核源碼中的,以platform_device結(jié)構(gòu)體的形式存在,驅(qū)動代碼和設(shè)備代碼也是在platform總線上匹配,當(dāng)需要修改設(shè)備資源時,就需要修改內(nèi)核源碼;

  • 設(shè)備樹技術(shù)將設(shè)備的硬件資源信息就寫在dts文件中,需要修改就修改dts文件,不必在修改內(nèi)核源碼;

  • 不采用設(shè)備樹技術(shù):內(nèi)核源碼中會充斥大量設(shè)備硬件描述信息,導(dǎo)致內(nèi)核源碼不停增多,但是增多的硬件描述信息代碼和內(nèi)核功能并不相關(guān);

  • 采用設(shè)備樹技術(shù)之后:設(shè)備的硬件描述信息都在dts文件中,修改方便,但是內(nèi)核要增加解析dts文件格式的代碼;

3、設(shè)備樹怎么工作

linux dts的作用是什么

  • 驅(qū)動開發(fā)者根據(jù)硬件編寫/修改dts文件,使得將來驅(qū)動代碼能匹配到合適的設(shè)備硬件信息;

  • 編譯內(nèi)核時,kernel會先編譯出dtc,然后再用dtc將dts文件編譯成dtb;

  • uboot啟動kernel時,將內(nèi)核鏡像和dtb都重定位到內(nèi)存,并告訴內(nèi)核dtb的所在內(nèi)存地址;

  • 內(nèi)核啟動初期調(diào)用內(nèi)部函數(shù)解析dtb,得到硬件信息后再組裝成硬件函數(shù),最后去和驅(qū)動代碼進(jìn)行匹配;

4、設(shè)備樹源碼dts文件格式講解

4.1、dts文件在內(nèi)核源碼中的存放位置

arm架構(gòu):arch/arm/boot/dts目錄中

4.2、dts文件格式簡介

  • 注釋用/* */,注意#開頭的不是注釋

  • 分號是段落塊之間的分隔符,{}和[]和<>是段落塊的封裝符號,和C語言語言類

  • /dts-v1/節(jié)點(diǎn),表示dts的版本號,目前都是v1

  • /{}是根節(jié)點(diǎn)root node,理論上只應(yīng)該有一個根節(jié)點(diǎn),有說法dtc會合并所有root node為同一個

  • dts是樹狀的多節(jié)點(diǎn)組織,基本單元是node,除root外其他node都有parent,還可以有child

4.3、節(jié)點(diǎn)格式

4.3.1、格式定義

[label:] <node-name> [@<unit-address>]{
  [property]
  [child nodes]
  [child nodes]
  ......
};

4.3.2、格式解讀

  • []:表示該項可以省略,<>:表示不可省略;

    [label:]:label是標(biāo)簽名,為了方便訪問節(jié)點(diǎn),后面可以直接通過&label來訪問該節(jié)點(diǎn)。

  • node-name:節(jié)點(diǎn)名稱。根節(jié)點(diǎn)的名稱必須是/

  • [@unit-address]:unit-address是設(shè)備地址,如cpu node就是0、1這種,reg node就是0x12010000這種;

4.3.3、示例代碼

cpus {
	/* 下面三項是cpus節(jié)點(diǎn)的屬性 */
	#address-cells = <1>;
	#size-cells = <0>;
	enable-method = "hisilicon,hi3516dv300";

	/* 下面是子節(jié)點(diǎn) */
	cpu@0 {
		device_type = "cpu";
		compatible = "arm,cortex-a7";
		clock-frequency = <HI3516DV300_FIXED_1000M>;
		reg = <0>;
	};
};

  • cpus是cpu的父節(jié)點(diǎn),從形式來能直觀的看出來,cpu節(jié)點(diǎn)是被cpus節(jié)點(diǎn)的大括號括起來的;

  • cpus節(jié)點(diǎn)省略了標(biāo)簽名和設(shè)備地址,只有節(jié)點(diǎn)名稱;

5、節(jié)點(diǎn)屬性分析

5.1、GPIO屬性格式

/{
	gpx1:gpx1{
		controller;
		#gpio-cells=<2>;
	};
	
	key@11400c24{
		compatible="fs4412,key";
		reg=<0x11400c24 0x4>;
		intn-key=<&gpx1 2 2>;
	}
}

  • gpio-controller:說明該節(jié)點(diǎn)描述的是一個gpio控制器;

  • #gpio-cells:描述gpio使用節(jié)點(diǎn)的屬性一個cell的內(nèi)容;

5.2、compatible屬性格式

uart0: uart@120a0000 {
	compatible = "arm,pl011", "arm,primecell";
	reg = <0x120a0000 0x1000>;
	interrupts = <0 6 4>;
	clocks = <&clock HI3516DV300_UART0_CLK>;
	clock-names = "apb_pclk";
	status = "disabled";
};

/* 在驅(qū)動中對應(yīng)的結(jié)構(gòu)體*/

//struct device_driver->of_match_table->compatible

struct of_device_id {
	char	name[32];
	char	type[32];
	char	compatible[128];
	const void *data;
};

(1)compatible屬性是用于設(shè)備節(jié)點(diǎn)和設(shè)備驅(qū)動匹配用的,在內(nèi)核描述驅(qū)動的structdevice_driver結(jié)構(gòu)體中,compatible變量中就會保存用于匹配的字符串,當(dāng)設(shè)備節(jié)點(diǎn)和驅(qū)動的

compatible相同時就匹配成功;

(2)compatible后面可以有多個字符串,優(yōu)先匹配靠前的字符串,靠前的字符串匹配不上才會匹配后面的字符串;

5.3、model屬性格式

/ {
	model = "Tyr DEMO Board";
	compatible = "hisilicon,hi3516dv300";

	memory {
		device_type = "memory";
		reg = <0x82000000 0x20000000>;
	};};

(1)model是描述模塊信息的,一般只有根節(jié)點(diǎn)才有,標(biāo)明設(shè)備樹文件對應(yīng)的開發(fā)板的名稱;

(2)在內(nèi)核的啟動打印中可以看到model的值:“OF: fdt:Machine model: Tyr DEMO Board”;

5.4、status屬性格式

&uart0 {
	status = "okay";
};

狀態(tài)值含義
okey表示設(shè)備是可操作的
disabled表示當(dāng)前不可操作,但是后續(xù)是可以更改為可操作性的
fail、failed表示有嚴(yán)重錯誤,幾乎不可能再可操作了

(1)status描述設(shè)備信息狀態(tài),在設(shè)備樹文件中可以根據(jù)需求設(shè)置模塊的狀態(tài),功能就是開啟/關(guān)閉某個模塊;

(2)在dtsi文件中,默認(rèn)都是關(guān)閉模塊的,在開發(fā)板對應(yīng)的dts文件中自己去打開需要的模塊;

5.5、reg屬性格式

clock: clock@12010000 {
	compatible = "hisilicon,hi3516dv300-clock";
	#address-cells = <1>;	/* 表示reg里面的數(shù)據(jù)address占用一個字長*/
	#size-cells = <1>;		/* 表示reg里面的數(shù)據(jù)size占用一個字長,注意字長不是字節(jié)*/
	#clock-cells = <1>;
	#reset-cells = <2>;
	reg = <0x12010000 0x1000>;	/*起始地址是0x12010000,長度是0x1000*/
};

  • reg屬性:配置某個硬件模塊對應(yīng)的地址范圍信息;

  • #address-cells屬性:表示reg里面的數(shù)據(jù)address占用的字長,注意字長不是字節(jié);

  • #size-cells:表示reg里面的數(shù)據(jù)size占用的字長,注意字長不是字節(jié);

  • reg = <address1 length2 address2 length3 …>:address一般用來表示起始地址,length一般表示持續(xù)長度;

5.6、中斷屬性格式

gic: interrupt-controller@10300000 {
	compatible = "arm,cortex-a7-gic";
	#interrupt-cells = <3>;	/*表示interrupts用三個cell來描述中斷*/
	#address-cells = <0>;
	interrupt-controller;	/*標(biāo)明gic節(jié)點(diǎn)是中斷控制器*/
	/* gic dist base, gic cpu base , no virtual support */
	reg = <0x10301000 0x1000>, <0x10302000 0x100>;
 };
	
ipcm: ipcm@045E0000 {
	compatible = "hisilicon,ipcm-interrupt";
	interrupt-parent = <&gic>;	/*父節(jié)點(diǎn)是gic節(jié)點(diǎn)*/
	interrupts = <0 10 4>;	/*<中斷域 中斷 觸發(fā)方式>*/
	reg = <0x10300000 0x4000>;	
	status = "okay";
};

(1)interrupt-controller:無值屬性,表示這是個中斷控制器node
(2)#interrupt-cells:這是中斷控制器節(jié)點(diǎn)的屬性,用來標(biāo)識這個控制器需要幾個cell做中斷描述符
(3)interrupt-parent:標(biāo)識此設(shè)備節(jié)點(diǎn)屬于哪一個中斷控制器,如果沒有這個屬性,會自動依附父節(jié)點(diǎn)
(4)interrupts :一個中斷標(biāo)識符列表,表示每一個中斷輸出信號

6、特殊節(jié)點(diǎn)

6.1、chosen子節(jié)點(diǎn)

6.1.1、chosen子節(jié)點(diǎn)功能介紹

chosen {
	stdout-path = "serial0:115200n8";
};

(1)chosen子節(jié)點(diǎn)不對應(yīng)真實的設(shè)備,是用來描述內(nèi)核啟動參數(shù)的,對應(yīng)于uboot啟動內(nèi)核時傳遞的bootargs參數(shù);
(2)上面是摘抄的內(nèi)核dts文件中的chosen子節(jié)點(diǎn),里面只設(shè)置了stdout-path屬性,也就是把輸出設(shè)置成串口0,波特率是115200;
(3)dts文件中設(shè)置的屬性會被覆蓋點(diǎn),具體就是uboot在啟動內(nèi)核時,會將bootargs啟動參數(shù)轉(zhuǎn)換成chosen子節(jié)點(diǎn)的屬性,替換掉dts文件中設(shè)置的屬性;

6.1.2、chosen子節(jié)點(diǎn)在內(nèi)核中的體現(xiàn)

~ # ls /proc/device-tree/chosen/
bootargs  name
~ # 
~ # cat /proc/device-tree/chosen/bootargs 
mem=1408M console=ttyS0,115200 root=/dev/mmcblk0p7 rootfstype=squashfs rootwait
~ # 
~ # cat /proc/device-tree/chosen/name 
chosen
~ #

6.2、aliases子節(jié)點(diǎn)

	aliases {
		serial0 = &uart0;
		gpio0 = &gpio_chip0;
		gpio1 = &gpio_chip1;
		gpio2 = &gpio_chip2;
		······	
	};

aliases就是別名的意思,aliases節(jié)點(diǎn)主要功能就是給節(jié)點(diǎn)定義別名,為了方便訪問節(jié)點(diǎn)。不過我們在節(jié)點(diǎn)命名的時候可以加上label標(biāo)簽,直接通過&label引用標(biāo)簽來訪問也很方便,aliases節(jié)點(diǎn)內(nèi)部其實也是通過引用標(biāo)簽名來定義別名;

7、節(jié)點(diǎn)相關(guān)操作

7.1、節(jié)點(diǎn)引用和內(nèi)容替換

gpio_chip1: gpio_chip@120d1000 {
	compatible = "arm,pl061", "arm,primecell";
	reg = <0x120d1000 0x1000>;
	interrupts = <0 17 4>;
	clocks = <&clock  HI3516DV300_SYSAPB_CLK>;
	clock-names = "apb_pclk";
	#gpio-cells = <2>;
	status = "disabled";
};

/*引用gpio_chip1節(jié)點(diǎn)*/
&gpio_chip1 {
	status = "okay";	/*替換status屬性內(nèi)容*/
};

對于已經(jīng)定義好的節(jié)點(diǎn),我們通過引用節(jié)點(diǎn)的方式,重新定義某些屬性,效果上看就是替換掉某些屬性的值;

7.2、合并節(jié)點(diǎn)內(nèi)容

/{
	node{
		key1=value1;
	}
}

/{
	node{
		key2=value2;
	}
}

//合并的結(jié)果
/{
	node{
		key1=value1;
		key2=value2;
	}
}

有時候我們需要增加硬件描述的信息,這時候就可以在后面創(chuàng)新定義該節(jié)點(diǎn),最后解析的時候會把同名節(jié)點(diǎn)不同的部分進(jìn)行合并。

讀到這里,這篇“l(fā)inux dts的作用是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章題目:linuxdts的作用是什么
新聞來源:http://www.chinadenli.net/article10/jdgego.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名響應(yīng)式網(wǎng)站微信小程序網(wǎng)站內(nèi)鏈網(wǎng)站維護(hù)搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)