.dts文件是一种ASCII 文本格式的Device
Tree描述,此文本格式非常人性化,适合人类的阅读习惯。基本上,在ARM
Linux在,一个。dts文件对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录。由于一个SoC可能对应多个machine(一个SoC可以对应多个产品和电路板),势必这些。dts文件需包含许多共同的部分,Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为。dtsi,类似于C语言的头文件。其他的machine对应的。dts就include这个。dtsi。譬如,对于VEXPRESS而言,vexpress-v2m.dtsi就被vexpress-v2p-ca9.dts所引用,
vexpress-v2p-ca9.dts有如下一行:
/include/
“vexpress-v2m.dtsi”
当然,和C语言的头文件类似,。dtsi也可以include其他的。dtsi,譬如几乎所有的ARM
SoC的。dtsi都引用了skeleton.dtsi。
.dts(或者其include的。dtsi)基本元素即为前文所述的结点和属性:
[plain] view
plaincopyprint?
/ {
node1 {
a-string-property = “A string”
a-string-list-property = “first string”, “second string”
a-byte-data-property = [0x01 0x23 0x34 0x56]
child-node1 {
first-child-property
second-child-property = <1>
a-string-property = “Hello, world”
}
child-node2 {
}
}
node2 {
an-empty-property
a-cell-property = <1 2 3 4>/* each number (cell) is a uint32 */
child-node1 {
}
}
}
/ {
node1 {
a-string-property = “A string”
a-string-list-property = “first string”, “second string”
a-byte-data-property = [0x01 0x23 0x34 0x56]
child-node1 {
first-child-property
second-child-property = <1>
a-string-property = “Hello, world”
}
child-node2 {
}
}
node2 {
an-empty-property
a-cell-property = <1 2 3 4>/* each number (cell) is a uint32 */
child-node1 {
}
}
}
上述。dts文件并没有什么真实的用途,但它基本表征了一个Device
Tree源文件的结构:
1个root结点“/”;
root结点下面含一系列子结点,本例中为“node1” 和
“node2”;
结点“node1”下又含有一系列子结点,本例中为“child-node1” 和
“child-node2”;
各结点都有一系列属性。这些属性可能为空,如“
an-empty-property”;可能为字符串,如“a-string-property”;可能为字符串数组,如“a-string-list-property”;可能为Cells(由u32整数组成),如“second-child-property”,可能为二进制数,如“a-byte-data-property”。
下面以一个最简单的machine为例来看如何写一个。dts文件。假设此machine的配置如下:
1个双核ARM
Cortex-A9 32位处理器;
ARM的local bus上的内存映射区域分布了2个串口(分别位于0x101F1000 和
0x101F2000)、GPIO控制器(位于0x101F3000)、SPI控制器(位于0x10170000)、中断控制器(位于0x10140000)和一个external
bus桥;
External bus桥上又连接了SMC SMC91111
Ethernet(位于0x10100000)、I2C控制器(位于0x10160000)、64MB NOR
Flash(位于0x30000000);
External bus桥上连接的I2C控制器所对应的I2C总线上又连接了Maxim
DS1338实时钟(I2C地址为0x58)。
其对应的。dts文件为:
[plain] view
plaincopyprint?
/ {
compatible = “acme,coyotes-revenge”
#address-cells = <1>
#size-cells = <1>
interrupt-parent = <&intc>
cpus {
#address-cells = <1>
#size-cells = <0>
cpu@0 {
compatible = “arm,cortex-a9”
reg = <0>
}
cpu@1 {
compatible = “arm,cortex-a9”
reg = <1>
}
}
serial@101f0000 {
compatible = “arm,pl011”
reg = <0x101f0000 0x1000 >
interrupts = <1 0 >
}
serial@101f2000 {
compatible = “arm,pl011”
reg = <0x101f2000 0x1000 >
interrupts = <2 0 >
}
gpio@101f3000 {
compatible = “arm,pl061”
reg = <0x101f3000 0x1000
0x101f4000 0x0010>
interrupts = <3 0 >
}
intc: interrupt-controller@10140000 {
compatible = “arm,pl190”
reg = <0x10140000 0x1000 >
interrupt-controller
#interrupt-cells = <2>
}
spi@10115000 {
compatible = “arm,pl022”
reg = <0x10115000 0x1000 >
interrupts = <4 0 >
}
external-bus {
#address-cells = <2>
#size-cells = <1>
ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
2 0 0x30000000 0x1000000>// Chipselect 3, NOR Flash
ethernet@0,0 {
compatible = “smc,smc91c111”
reg = <0 0 0x1000>
interrupts = <5 2 >
}
i2c@1,0 {
compatible = “acme,a1234-i2c-bus”
#address-cells = <1>
#size-cells = <0>
reg = <1 0 0x1000>
interrupts = <6 2 >
rtc@58 {
compatible = “maxim,ds1338”
reg = <58>
interrupts = <7 3 >
}
}
flash@2,0 {
compatible = “samsung,k8f1315ebm”, “cfi-flash”
reg = <2 0 0x4000000>
}
}
}
/ {
compatible = “acme,coyotes-revenge”
#address-cells = <1>
#size-cells = <1>
interrupt-parent = <&intc>
cpus {
#address-cells = <1>
#size-cells = <0>
cpu@0 {
compatible = “arm,cortex-a9”
reg = <0>
}
cpu@1 {
compatible = “arm,cortex-a9”
reg = <1>
}
}
serial@101f0000 {
compatible = “arm,pl011”
reg = <0x101f0000 0x1000 >
interrupts = <1 0 >
}
serial@101f2000 {
compatible = “arm,pl011”
reg = <0x101f2000 0x1000 >
interrupts = <2 0 >
}
gpio@101f3000 {
compatible = “arm,pl061”
reg = <0x101f3000 0x1000
0x101f4000 0x0010>
interrupts = <3 0 >
}
intc: interrupt-controller@10140000 {
compatible = “arm,pl190”
reg = <0x10140000 0x1000 >
interrupt-controller
#interrupt-cells = <2>
}
spi@10115000 {
compatible = “arm,pl022”
reg = <0x10115000 0x1000 >
interrupts = <4 0 >
}
external-bus {
#address-cells = <2>
#size-cells = <1>
ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
2 0 0x30000000 0x1000000>// Chipselect 3, NOR Flash
ethernet@0,0 {
compatible = “smc,smc91c111”
reg = <0 0 0x1000>
interrupts = <5 2 >
}
i2c@1,0 {
compatible = “acme,a1234-i2c-bus”
#address-cells = <1>
#size-cells = <0>
reg = <1 0 0x1000>
interrupts = <6 2 >
rtc@58 {
compatible = “maxim,ds1338”
reg = <58>
interrupts = <7 3 >
}
}
flash@2,0 {
compatible = “samsung,k8f1315ebm”, “cfi-flash”
reg = <2 0 0x4000000>
}
}
}
上述。dts文件中,root结点“/”的compatible 属性compatible =
“acme,coyotes-revenge”定义了系统的名称,它的组织形式为:<manufacturer>,<model>。Linux内核透过root结点“/”的compatible
属性即可判断它启动的是什么machine。
在。dts文件的每个设备,都有一个compatible
属性,compatible属性用户驱动和设备的绑定。compatible
属性是一个字符串的列表,列表中的第一个字符串表征了结点代表的确切设备,形式为“<manufacturer>,<model>”,其后的字符串表征可兼容的其他设备。可以说前面的是特指,后面的则涵盖更广的范围。如在arch/arm/boot/dts/vexpress-v2m.dtsi中的Flash结点:
[plain] view
plaincopyprint?
flash@0,00000000 {
compatible = “arm,vexpress-flash”, “cfi-flash”
reg = <0 0x00000000 0x04000000>,
<1 0x00000000 0x04000000>
bank-width = <4>
}
flash@0,00000000 {
compatible = “arm,vexpress-flash”, “cfi-flash”
reg = <0 0x00000000 0x04000000>,
<1 0x00000000 0x04000000>
bank-width = <4>
}
compatible属性的第2个字符串“cfi-flash”明显比第1个字符串“arm,vexpress-flash”涵盖的范围更广。
再比如,Freescale
MPC8349 SoC含一个串口设备,它实现了国家半导体(National Semiconductor)的ns16550
寄存器接口。则MPC8349串口设备的compatible属性为compatible = “fsl,mpc8349-uart”,
“ns16550”。其中,fsl,mpc8349-uart指代了确切的设备, ns16550代表该设备与National Semiconductor
的16550
UART保持了寄存器兼容。
接下来root结点“/”的cpus子结点下面又包含2个cpu子结点,描述了此machine上的2个CPU,并且二者的compatible
属性为“arm,cortex-a9”。
注意cpus和cpus的2个cpu子结点的命名,它们遵循的组织形式为:<name>[@<unit-address>],<>中的内容是必选项,[]中的则为可选项。name是一个ASCII字符串,用于描述结点对应的设备类型,如3com
Ethernet适配器对应的结点name宜为ethernet,而不是3com509。如果一个结点描述的设备有地址,则应该给出@unit-address。多个相同类型设备结点的name可以一样,只要unit-address不同即可,如本例中含有cpu@0、cpu@1以及serial@101f0000与serial@101f2000这样的同名结点。设备的unit-address地址也经常在其对应结点的reg属性中给出。ePAPR标准给出了结点命名的规范。
热电偶与热电阻均属于温度测量中的接触式测温,尽管其作用相同都是测量物体的温度,但是他们的原理与特点却不尽相同。.热电偶是温度测量中应用最广泛的温度器件,他的主要特点就是测量范围宽,性能比较稳定,同时结构简单,动态响应好,更能够远传4-20mA电信号,便于自动控制和集中控制。热电偶的测温原理是基于热电效应。将两种不同的导体或半导体连接成闭合回路,当两个接点处的温度不同时,回路中将产生热电势,这种现象称为热电效应,又称为塞贝克效应。闭合回路中产生的热电势有两种电势组成:温差电势和接触电势。
温差电势是指同一导体的两端因温度不同而产生的电势,不同的导体具有不同的电子密度,所以他们产生的电势也不相同,而接触电势顾名思义就是指两种不同的导体相接触时,因为他们的电子密度不同所以产生一定的电子扩散,当他们达到一定的平衡后所形成的电势,接触电势的大小取决于两种不同导体的材料性质以及他们接触点的温度。目前国际上应用的热电偶具有一个标准规范,国际上规定热电偶分为八个不同的分度,分别为B,R,S,K,N,E,J和T,其测量温度的最低可测零下270摄氏度,最高可达1800摄氏度,其中B,R,S属于铂系列的热电偶,由于铂属于贵重金属,所以他们又被称为贵金属热电偶而剩下的几个则称为廉价金属热电偶。
热电偶的结构有两种,普通型和铠装型。普通性热电偶一般由热电极,绝缘管,保护套管和接线盒等部分组成,而铠装型热电偶则是将热电偶丝,绝缘材料和金属保护套管三者组合装配后,经过拉伸加工而成的一种坚实的组合体。
热电偶的电信号需要一种特殊的导线来进行传递,这种导线我们称为补偿导线。不同的热电偶需要不同的补偿导线,其主要作用就是与热电偶连接,使热电偶的参比端远离电源,从而使参比端温度稳定。补偿导线又分为补偿型和延长型两种,延长导线的化学成分与被补偿的热电偶相同,但是实际中,延长型的导线也并不是用和热电偶相同材质的金属,一般采用和热电偶具有相同电子密度的导线代替。补偿导线的与热电偶的连线一般都是很明了,热电偶的正极连接补偿导线的红色线,而负极则连接剩下的颜色。一般的补偿导线的材质大部分都采用铜镍合金。
热电阻虽然在工业中应用也比较广泛,但是由于他的测温范围使他的应用受到了一定的限制,热电阻的测温原理是基于导体或半导体的电阻值随着温度的变化而变化的特性。其优点也很多,也可以远传电信号,灵敏度高,稳定性强,互换性以及准确性都比较好,但是需要电源激励,不能够瞬时测量温度的变化。
工业用热电阻一般采用Pt100,Pt10,Cu50,Cu100,铂热电阻的测温的范围一般为零下200-800摄氏度,铜热电阻为零下40到140摄氏度。热电阻和热电偶一样的区分类型,但是他却不需要补偿导线,而且比热点偶便宜。
参考资料:http://www.acmest.com/infoShow.asp?id=14
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)