BSP-设备树

设备树结构

 / {                                                    //根节点
	 node1 {                                            //node 1节点
    	 a-string-property = "A string";
	     a-string-list-property = "first string", "second string";
	     a-byte-data-property = [0x01 0x23 0x34 0x56];
	     child-node1 {                                  //子节点1
		     first-child-property;
		     second-child-property = <1>;
		     a-string-property = "Hello, world";
	     };
	     child-node2 {                                  //子节点2
	     };
     };
	 node2 {                                            //node 2节点
	     an-empty-property;
	     a-cell-property = <1 2 3 4>;
	     child-node1 {
	     };
	 };
 }

节点名

        节点名{};

        节点别名:节点名{};

        节点名可以写成XXXX@XXX类型 @后可以是地址,如axi_dma_0: axidma@40400000,这个地址一类是在芯片手册中查如spi: spi@7e204000{};另一类是根据外设芯片手册和原理图引脚接线来查如i2c的stlm75@49 {},phy类的ethernet_phy1: ethernet-phy@5 {}

        &节点名{};表示引用节点,如&gem1 {};gem1节点已经定义过,在这里引用修改部分值,或者增加子节点。

通用属性

        status; 硬件设备是否可用 ,如status = "okay";

        reg;设备起始地址和长度,如reg = <0x1C00000 0x100000>;“#” #并不表示注释。如 #address-cells ,#size-cells 用来决定reg属性的格式。

        compatible ;节点匹配信息,驱动根据该信息匹配设备树节点,如compatible = "xlnx,axi-vdma-s2mm-channel";

        

自定义属性

        xlnx,datawidth = <0x20>;

驱动

        设备获取设备树节点信息主要函数接口

        of_device_is_compatible(node, "xlnx,axi-vdma-s2mm-channel")

        of_property_read_u32(node, "xlnx,datawidth", &value);

        of_property_read_bool(node, "xlnx,genlock-mode");

        

/sys/firmware/devicetree/base里面是以目录结构呈现设备树,base是设备树根节点
/sys/firmware/fdt 原始dtb文件
/proc/device-tree -> /sys/firmware/devicetree/base  链接 文件 指向设备树

内核中设备树信息

linux-xlnx\Documentation\devicetree\bindings

设备树加载之后,内核会自动把设备树节点转换成 platform_device这种格式,同时把名字放到of_node这个地方。
 
 /sys/devices/platform       //系统中所有的platform_device设备,有来自设备树的,也有来自.c文件注册的。而对于来自设备树的platform_device,可以进入/sys/devices/platform/<设备名>/of_node查看它的设备树属性 ,有of_node节点说明来自于设备树的platform_device,此处的of_node ->链接指向
/sys/firmware/devicetree/base子目录

DTS编码规范:

[label:] node-name[@unit-address] {

        [properties definitions]

        [child nodes]

};

{

        memory_1: memory@30000000 {

                device_type = "memory";

                reg = <0x30000000 0x1000000>;

                child_node {};

        }

}

总线

MMC

mmc总线使用实例

broken-cd  表示没有热插拔探测引脚,使用轮询检测

cd-gpios  使用gpio管脚作为热插拔探测引脚

non-removable  表示不能进行热插拔,设备一直连接(比如eMMC)

上面三个选项用于指定热插拔探测选项,如果三个选项都没有指定,则使用主机自带的热插拔引脚sdcd

bus-width  数据总线位宽,默认值是<1>,也可以是<4>,<8>

wp-gpios 使用gpio管脚作为写保护引脚

max-frequency  表示mmc总线最大操作频率

cd-inverted  表示cd引脚是active high

wp-inverted  表示wp引脚是active high

no-1-8-v  该选项存在的话,表示该总线控制器不支持1.8v设备卡

         (即使该控制器硬件支持1.8v设备卡)

cap-power-off-card   关闭该卡电源很安全

cap-sdio-irq         使能SDIO总线 IRQ

full-pwr-cycle       支持设备卡的整个电源周期

cap-sd-highspeed    支持SD high-speed时序

cap-mmc-highspeed  支持MMC high-speed时序

sd-uhs-sdr12        支持SD UHS SDR12 speed

sd-uhs-sdr25        支持SD UHS SDR25 speed

sd-uhs-sdr50        支持SD UHS SDR50 speed

sd-uhs-sdr104       支持SD UHS SDR104 speed

sd-uhs-ddr12        支持SD UHS DDR12 speed

mmc-ddr-1_8v       支持eMMC high-speed DDR(1.8v)

mmc-ddr-1_2v       支持eMMC high-speed DDR(1.2v)

mmc-hs200-1_8v     支持eMMC HS200 mode

mmc-hs200-1_2v     支持eMMC HS200 mode

mmc-hs400-1_8v     支持eMMC HS400 mode

mmc-hs400-1_2v     支持eMMC HS400 mode

keep-power-in-suspend 表示待机时不掉电

enable-sdio-wakeup    SDIO中断发生时允许唤醒主机系统

mmc-pwrseq  指定电源上电顺序

dsr  表示卡的DSR寄存器的值[从0x00 … 0xffff]

vmmc-supply  指向regulator设备树节点

mmc控制器存在子节点时,必须指定下面两个选项

#address-cells   值必须是1

#size-cells   值必须是0

MMC子节点属性

reg  该值必须是0~7,其中0表示SD卡,1~7表示SDIO设备

比如SDIO接口的WIFI芯片

第一个图描述mmc控制器的不变属性,比如mmc控制器的寄存器地址,中断,dma通道,一般定义在.dtsi文件中

第二个图描述mmc控制器的可变属性及其子节点属性,比如mmc控制器的引脚复用情况,总线位宽,一般定义在.dts文件中

注意:一般在公用的.dtsi文件中,添加不变属性(比如reg属性,中断,dma通道),在具体板卡的 .dts文件中添加可变属性(比如GPIO使用情况,引脚复用情况),以及子结点信息,这样使得.dtsi文件和.dts文件解耦

I2C

status  表示使能该总线控制器,enable或者disable

clock-frequency  设置i2c总线频率,一般为400KHZ或者100KHZ

i2c控制器节点存在子节点时,该控制器节点必须指定下面两个选项

#address-cells  值必须是1

#size-cells  值必须是0

由于I2C子节点属性比较简单,因此不进行任何讲解

 上面有两个图,都是用来定义i2c控制器节点属性

第一个描述i2c控制器的不变属性,比如i2c控制器的寄存器地址,中断,一般定义在.dtsi文件中

第二个描述子节点属性,一般定义在.dts文件中

SPI

status  表示使能该总线控制器,enable或者disable

cs-gpios  使用gpio管脚作为片选信号

num-cs  表示片选信号数量,包括原生片选信号和gpio片选信号

比如:cs-gpios = <0>  <0>  <&gpio1 18 GPIO_ACTIVE_LOW>

num-cs = <3>

上述spi控制器片选信号的映射关系如下图所示

spi控制器节点存在子节点时,该控制器节点必须指定下面两个选项

#address-cells  值必须是1

#size-cells  值必须是0

SPI子节点属性

spi-max-frequency  设置spi总线频率

spi-cs-high  表示spi子设备片选信号为高电平

spi-tx-bus-width  设置spi控制器输出总线位宽,默认为1(仅有一根数据线作为MOSI),QSPI(QUAD)总线位宽为4,spi-tx-bus-width = <4>

spi-rx-bus-width  设置spi控制器输入总线位宽,默认为1(仅有一根数据线作为MISO),QSPI(QUAD)总线位宽为4,spi-rx-bus-width = <4>

&ecspi3 {
	fsl,spi-num-chipselects = <1>;	/*一个片选信号*/
	cs-gpios = <&gpio1 20 GPIO_ACTIVE_LOW>;	/*软件片选引脚,低电平有效*/
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_ecspi3>;
	status = "okay";
 
	/*对应的spi子节点*/
	spidev0: icm20608@0 {	/*@后面的0表示spi芯片接到哪个硬件片选上,本实验硬件上接到了0,但使用的是软件片选*/
		reg = <0>;	/*required*/
		compatible = "alientek,icm20608";
		spi-max-frequency = <8000000>;	/*SPI时钟频率8MHZ*/
	};
};

spi0: spi@e0006000 {
	compatible = "xlnx,zynq-spi-r1p6";
	reg = <0xe0006000 0x1000>;
	status = "disabled";
	interrupt-parent = <&intc>;
	interrupts = <0 26 4>;
	clocks = <&clkc 25>, <&clkc 34>;
	clock-names = "ref_clk", "pclk";
	#address-cells = <1>;
	#size-cells = <0>;
};
spi1: spi@e0007000 {
	compatible = "xlnx,zynq-spi-r1p6";
	reg = <0xe0007000 0x1000>;
	status = "disabled";
	interrupt-parent = <&intc>;
	interrupts = <0 49 4>;
	clocks = <&clkc 26>, <&clkc 35>;
	clock-names = "ref_clk", "pclk";
	#address-cells = <1>;
	#size-cells = <0>;
};


&spi1 {
	status = "okay";
	num-cs = <4>;
	xxx@0 {
		compatible = "yyy";
		reg = <0x0>;
		spi-max-frequency = <50000000>;
		spi-cpol;
		spi-cpha;
		spi-cs-high;
	};
};

GPIO模拟SPI

253         zed_oled {
254             compatible = "dglnt,pmodoled-gpio";
255             /* GPIO Pins */
256             vbat-gpio = <&gpiops 55 0>;
257             vdd-gpio = <&gpiops 56 0>;
258             res-gpio = <&gpiops 57 0>;
259             dc-gpio = <&gpiops 58 0>;
260             /* SPI-GPIOs */
261             spi-bus-num = <2>;
262             spi-speed-hz = <4000000>;
263             spi-sclk-gpio = <&gpiops 59 0>;
264             spi-sdin-gpio = <&gpiops 60 0>;
265         };  

        interrupt-parent = <&intc>;
        interrupts = <0 29 1>,//time slot 1 = low-to-high edge triggered 2 = high-to-low edge triggered 4 = active high 8 = active low
            <0 31 1>,//req_rx
            <0 34 1>,//broc
            <0 35 1>,//attn
            <0 36 1>;//srio

base address

		spi: spi@7e204000 {
			compatible = "brcm,bcm2835-spi";
			reg = <0x7e204000 0x1000>;
			interrupts = <2 22>;
			clocks = <&clk_spi>;
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";
		};

芯片datasheet The base address of this SPI0 interface is 0x7E204000.

interrupts = <2 22>

中断号在芯片datasheet ARM peripherals interrupts table.

注:手册中的中断与设备树的值相差32

QSPI

 
 48 &qspi {
 49     status = "okay";
 50     is-dual = <0>;
 51     num-cs = <1>;
 52     xlnx,fb-clk = <0x1>;
 53     xlnx,qspi-mode = <0x0>;
 54     flash@0 {
 55         compatible = "n25q128";
 56         reg = <0x0>;
 57         spi-tx-bus-width = <1>;                                                                                                                                                       
 58         spi-rx-bus-width = <4>;
 59         spi-max-frequency = <50000000>;
 60         #address-cells = <1>;
 61         #size-cells = <1>;
 62         partition@qspi-boot {
 63             label = "qspi-boot";
 64             reg = <0x0 0x080000>;
 65         };
 66         partition@qspi-bootenv {
 67             label = "qspi-bootenv";
 68             reg = <0x080000 0x020000>;
 69         };      
 70         partition@qspi-bitstream {
 71             label = "qspi-bitstream";
 72             reg = <0x0A0000 0x460000>;
 73         };      
 74         partition@qspi-kernel {
 75             label = "qspi-kernel";
 76             reg = <0x500000 0x480000>;
 77         };
 78         partition@qspi-devicetree {
 79             label = "qspi-devicetree";
 80             reg = <0x980000 0x010000>;
 81         };
 82         partition@qspi-rootfs {
 83             label = "qspi-rootfs";
 84             reg = <0x990000 0x600000>;
 85         };
 86         partition@qspi-data {
 87             label = "data";
 88             reg = <0xF90000 0x070000>;
 89         };
 90     };
 91 };
Z-turn# cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00080000 00001000 "qspi-boot"
mtd1: 00020000 00001000 "qspi-bootenv"
mtd2: 00460000 00001000 "qspi-bitstream"
mtd3: 00480000 00001000 "qspi-kernel"
mtd4: 00010000 00001000 "qspi-devicetree"
mtd5: 00600000 00001000 "qspi-rootfs"
mtd6: 00070000 00001000 "data"

PCI

PCI总线上的设备可以通过枚举查询设备,所以不需要设备树

x86上的设备一般是挂到pcie总线上的,设备可以通过pcie的枚举机制枚举到。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值