打印
[嵌入式linux]

VS-RK3399 的android 7.1 内核的设备树资料介绍

[复制链接]
2880|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
timy@liao|  楼主 | 2018-1-16 18:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于linux kernel 4.4版本的DTB介绍,代码从深圳视壮科技有限公司官方下载
1.设备树(Device  Tree)基本概念及作用   在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data绝大多数纯属垃圾冗余代码。为了解决这一问题,ARM内核版本3.x之后引入了原先在Power PC等其他体系架构已经使用的Flattened Device Tree。
    “A data structure by which bootloaders pass hardware layout to Linux in a device-independent manner, simplifying hardware probing.”开源文档中对设备树的描述是,一种描述硬件资源的数据结构,它通过bootloader将硬件资源传给内核,使得内核和硬件资源描述相对独立。
    Device Tree可以描述的信息包括CPU的数量和类别、内存基地址和大小、总线和桥、外设连接、中断控制器和中断使用情况、GPIO控制器和GPIO使用情况、Clock控制器和Clock使用情况。
    另外,设备树对于可热插拔的热备不进行具体描述,它只描述用于控制该热插拔设备的控制器。
    设备树的主要优势:对于同一SOC的不同主板,只需更换设备树文件.dtb即可实现不同主板的无差异支持,而无需更换内核文件。

    注:要使得3.x之后的内核支持使用设备树,除了内核编译时需要打开相对应的选项外,bootloader也需要支持将设备树的数据结构传给内核



    2.设备树的组成和使用    设备树包含DTC(device tree compiler),DTS(device tree source和DTB(device tree blob)。其对应关系如图1-1所示:

    图1-1 DTS、DTC、DTB之间的关系



    2.1 DTS和DTSI(源文件)    .dts文件是一种ASCII文本对Device Tree的描述,放置在内核的/arch/arm/boot/dts目录。一般而言,一个.dts文件对应一个ARM的machine。
        由于一个SOC可能有多个不同的电路板,而每个电路板拥有一个 .dts。这些dts势必会存在许多共同部分,为了减少代码的冗余,设备树将这些共同部分提炼保存在.dtsi文件中,供不同的dts共同使用。.dtsi的使用方法,类似于C语言的头文件,在dts文件中需要进行include .dtsi文件。当然,dtsi本身也支持include 另一个dtsi文件。



    2.2 DTC (编译工具)    DTC为编译工具,它可以将.dts文件编译成.dtb文件。DTC的源码位于内核的scripts/dtc目录,内核选中CONFIG_OF,编译内核的时候,主机可执行程序DTC就会被编译出来。 即scripts/dtc/Makefile中

        hostprogs-y := dtc
        always := $(hostprogs-y) ​

        在内核的arch/arm/boot/dts/Makefile中,若选中某种SOC,则与其对应相关的所有dtb文件都将编译出来。在linux下,make dtbs可单独编译dtb。以下截取了TEGRA平台的一部分。
    dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-vr-android.dtb
    dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-videostrong-board-dulelcd.dtb
    dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-videostrong-board-mipi.dtb
    dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-videostrong-board-edp.dtb



    3.设备树中dts、dtsi文件的基本语法 vsgpio_set {
            compatible = "videostrong,gpio";
            pinctrl-names = "default";
            pinctrl-0 = <&b3G_gpio>;
            3G_power = <&gpio0 2 GPIO_ACTIVE_LOW>;
            3G_Spk_GP = <&gpio0 11 GPIO_ACTIVE_HIGH>;
            POWR_LED = <&gpio1 1 GPIO_ACTIVE_HIGH>;
            status = "okay";
        };        

      在\kernel\include\linux\of_fdt.h文件中有相关定义   


    首先我们看下uboot用于记录os、initrd、fdt信息的数据结构bootm_headers,其定义在/include/image.h中,这边截取了其中与dtb相关的一小部分。



    根据项目的dtb表,我们也做了测试,把所有的屏都开启,通过软件来控制开启一个屏,不在需要经过linux 内核kernel代码来编译修改了,
    例如:
    &dsi {
        status = "okay";
        panel {
            compatible ="simple-panel-dsi";
            reg = <0>;
            backlight = <&backlight>;
            enable-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
            dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
                    MIPI_DSI_MODE_VIDEO_SYNC_PULSE)>;
            dsi,format = <MIPI_DSI_FMT_RGB888>;
            dsi,lanes = <4>;
            status = "okay";

            display-timings {
                native-mode = <&timing0>;
                timing0: timing0 {
                    clock-frequency = <65000000>;
                    hactive = <1024>;
                    vactive = <600>;
                    hback-porch = <80>;
                    hfront-porch = <80>;
                    vback-porch = <20>;
                    vfront-porch = <12>;
                    hsync-len = <2>;
                    vsync-len = <3>;
                    hsync-active = <0>;
                    vsync-active = <0>;
                    de-active = <0>;
                    pixelclk-active = <0>;
                };
            };
        };
    };

    &edp {
        status = "okay";

        ports {
            edp_out: port@1 {
                reg = <1>;
                #address-cells = <1>;
                #size-cells = <0>;

                edp_out_panel: endpoint@0 {
                    reg = <0>;
                    remote-endpoint = <&panel_in_edp>;
                };
            };
        };
    };
    编译后,所以的屏都是status = "okay";都开启的,当客户需要mipi的屏是,edp ,hdmi 不需要的时候,我们可以通过我们的软件工具修改一下,我们可以把status = "okay";变成status = "disabled";这样系统运行的时候,只有EDP 屏是亮的。
    需要工具,通过回贴可以免费获取。

相关帖子

沙发
bzhao| | 2023-1-23 11:20 | 只看该作者
好的好的好的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

16

帖子

1

粉丝