OpenWRT(九)DTS及串口

简介: OpenWRT教程

OpenWRT版本:17
 

一、DTS

DTS是Device Tree Source的缩写,它用来描述设备的硬件细节。说简单点就是开发板的配置文件。

二、分析OpenWRT的dts文件

以rt5350.dtsi作为分析

//DTS格式有点类似Json

/ {                                                            // "/"表示root节点
  //#address-cells和#size-cells分别决定reg属性的address和length字段的长度。比如reg<0x500 0x100>,0x500和0x100两个数值都是32位的
    #address-cells = <1>;         //地址长度为1个32位的整型
    #size-cells = <1>;            //length为1个32位的整型
    //ralink:厂商  rt5350-soc:具体的芯片型号
    compatible = "ralink,rt5350-soc";  //定义系统名称,compatible属性用于驱动和设备的绑定,属性值形式:<manufacturer>,<model>

    cpus {   //芯片中的所有cpu定义
        cpu@0 {    //cpu@0表示第一个cpu,如果还有其他cpu就依次定义为cpu@1 cpu@2 .....
            compatible = "mips,mips24KEc";   //mips的cpu内核,mips24KEc是具体型号
        };
    };

    chosen {
        bootargs = "console=ttyS0,57600"; //启动参数,定义了串口ttyS0为调试串口,波特率为57600
    };

    cpuintc: cpuintc@0 {
        #address-cells = <0>;
        #interrupt-cells = <1>;   //中断号长度
        interrupt-controller;
        compatible = "mti,cpu-interrupt-controller";
    };

    aliases {         //定义别名
        spi0 = &spi0;
        spi1 = &spi1;
        serial0 = &uartlite;   //uartlite的别名为serial0
    };

    palmbus@10000000 {  // @后面代表address
        compatible = "palmbus";
        reg = <0x10000000 0x200000>;         //address: 0x10000000   length:0x200000
        ranges = <0x0 0x10000000 0x1FFFFF>;  //地址转换表 :<子地址 父地址 子地址空间的映射大小>

        #address-cells = <1>;     //决定子节点reg的address字段长度
        #size-cells = <1>;        //决定子节点reg的length字段长度

        sysc@0 {
            compatible = "ralink,rt5350-sysc", "ralink,rt3050-sysc";   //兼容rt5350和rt3050
            reg = <0x0 0x100>;
        };

        timer@100 {
            compatible = "ralink,rt5350-timer", "ralink,rt2880-timer";
            reg = <0x100 0x20>;
            //在RT5350中,将GPIO设置为中断方式,当它触发中断时,CPU的中断控制器先获取中断,在这里叫一级中断。
            //判断它是GPIO中断,然后进入GPIO中断控制器判断是哪个GPIO产生的中断,这里叫二级中断,再进行中断处理。
            interrupt-parent = <&intc>;    //当上级发生intc中断时才来查询是否是该中断。
            interrupts = <1>;        //中断等级
        };

        watchdog@120 {
            compatible = "ralink,rt5350-wdt", "ralink,rt2880-wdt";
            reg = <0x120 0x10>;

            resets = <&rstctrl 8>;
            reset-names = "wdt";

            interrupt-parent = <&intc>;
            interrupts = <1>;
        };

        intc: intc@200 {
            compatible = "ralink,rt5350-intc", "ralink,rt2880-intc";
            reg = <0x200 0x100>;

            resets = <&rstctrl 19>;
            reset-names = "intc";

            interrupt-controller;
            #interrupt-cells = <1>;

            interrupt-parent = <&cpuintc>;
            interrupts = <2>;
        };

        memc@300 {
            compatible = "ralink,rt5350-memc", "ralink,rt3050-memc";
            reg = <0x300 0x100>;

            resets = <&rstctrl 20>;
            reset-names = "mc";

            interrupt-parent = <&intc>;
            interrupts = <3>;
        };

        uart@500 {
            compatible = "ralink,rt5350-uart", "ralink,rt2880-uart", "ns16550a";
            reg = <0x500 0x100>;

            resets = <&rstctrl 12>;
            reset-names = "uart";

            interrupt-parent = <&intc>;
            interrupts = <5>;

            reg-shift = <2>;

            status = "disabled";
        };

        gpio0: gpio@600 {
            compatible = "ralink,rt5350-gpio", "ralink,rt2880-gpio";
            reg = <0x600 0x34>;

            resets = <&rstctrl 13>;
            reset-names = "pio";

            interrupt-parent = <&intc>;
            interrupts = <6>;

            gpio-controller;
            #gpio-cells = <2>;

            ralink,gpio-base = <0>;
            ralink,num-gpios = <22>;
            ralink,register-map = [ 00 04 08 0c
                        20 24 28 2c
                        30 34 ];
        };

        gpio1: gpio@660 {
            compatible = "ralink,rt5350-gpio", "ralink,rt2880-gpio";
            reg = <0x660 0x24>;

            interrupt-parent = <&intc>;
            interrupts = <6>;

            gpio-controller;
            #gpio-cells = <2>;

            ralink,gpio-base = <22>;
            ralink,num-gpios = <6>;
            ralink,register-map = [ 00 04 08 0c
                        10 14 18 1c
                        20 24 ];

            status = "disabled";     //本模块状态
        };

        i2c@900 {
            compatible = "link,rt5350-i2c", "ralink,rt2880-i2c";
            reg = <0x900 0x100>;

            resets = <&rstctrl 16>;
            reset-names = "i2c";

            #address-cells = <1>;
            #size-cells = <0>;

            pinctrl-names = "default";
            pinctrl-0 = <&i2c_pins>;

            status = "disabled";
        };

        spi0: spi@b00 {
            compatible = "ralink,rt5350-spi", "ralink,rt2880-spi";
            reg = <0xb00 0x40>;

            resets = <&rstctrl 18>;
            reset-names = "spi";

            #address-cells = <1>;
            #size-cells = <1>;

            pinctrl-names = "default";
            pinctrl-0 = <&spi_pins>;

            status = "disabled";
        };

        spi1: spi@b40 {
            compatible = "ralink,rt5350-spi", "ralink,rt2880-spi";
            reg = <0xb40 0x60>;

            resets = <&rstctrl 18>;
            reset-names = "spi";

            #address-cells = <1>;
            #size-cells = <0>;

            pinctrl-names = "default";
            pinctrl-0 = <&spi_cs1>;

            status = "disabled";
        };

        uartlite: uartlite@c00 {
            compatible = "ralink,rt5350-uart", "ralink,rt2880-uart", "ns16550a";
            reg = <0xc00 0x100>;

            resets = <&rstctrl 19>;
            reset-names = "uartl";

            interrupt-parent = <&intc>;
            interrupts = <12>;

            pinctrl-names = "default";
            pinctrl-0 = <&uartlite_pins>;

            reg-shift = <2>;
        };

        systick@d00 {
            compatible = "ralink,rt5350-systick", "ralink,cevt-systick";
            reg = <0xd00 0x10>;

            interrupt-parent = <&cpuintc>;
            interrupts = <7>;
        };
    };

    pinctrl {  //引脚控制
        compatible = "ralink,rt2880-pinmux";

        pinctrl-names = "default";
        pinctrl-0 = <&state_default>;

        state_default: pinctrl0 {
        };

        spi_pins: spi {
            spi {
                ralink,group = "spi";
                ralink,function = "spi";
            };
        };

        i2c_pins: i2c {
            i2c {
                ralink,group = "i2c";
                ralink,function = "i2c";
            };
        };

        phy_led_pins: phy_led {
            phy_led {
                ralink,group = "led";
                ralink,function = "led";
            };
        };

        uartlite_pins: uartlite {
            uart {
                ralink,group = "uartlite";
                ralink,function = "uartlite";
            };
        };

        uartf_pins: uartf {
            uartf {
                ralink,group = "uartf";
                ralink,function = "uartf";
            };
        };

        spi_cs1: spi1 {
            spi1 {
                ralink,group = "spi_cs1";
                ralink,function = "spi_cs1";
            };
        };
    };

    rstctrl: rstctrl {
        compatible = "ralink,rt5350-reset", "ralink,rt2880-reset";
        #reset-cells = <1>;
    };

    usbphy: usbphy {
        compatible = "ralink,rt3352-usbphy";
        #phy-cells = <1>;

        resets = <&rstctrl 22 &rstctrl 25>;
        reset-names = "host", "device";
    };

    ethernet@10100000 {
        compatible = "ralink,rt5350-eth";
        reg = <0x10100000 0x10000>;

        resets = <&rstctrl 21 &rstctrl 23>;
        reset-names = "fe", "esw";

        interrupt-parent = <&cpuintc>;
        interrupts = <5>;

        mediatek,switch = <&esw>;
    };

    esw: esw@10110000 {
        compatible = "ralink,rt3050-esw";
        reg = <0x10110000 0x8000>;

        resets = <&rstctrl 23>;
        reset-names = "esw";

        interrupt-parent = <&intc>;
        interrupts = <17>;
    };

    wmac@10180000 {
        compatible = "ralink,rt5350-wmac", "ralink,rt2880-wmac";
        reg = <0x10180000 0x40000>;

        interrupt-parent = <&cpuintc>;
        interrupts = <6>;

        ralink,eeprom = "soc_wmac.eeprom";
    };

    ehci@101c0000 {
        compatible = "generic-ehci";
        reg = <0x101c0000 0x1000>;

        phys = <&usbphy 1>;
        phy-names = "usb";

        interrupt-parent = <&intc>;
        interrupts = <18>;
    };

    ohci@101c1000 {
        compatible = "generic-ohci";
        reg = <0x101c1000 0x1000>;

        phys = <&usbphy 1>;
        phy-names = "usb";

        interrupt-parent = <&intc>;
        interrupts = <18>;
    };
};

三、OpenWRT串口的使用

以RT5350进行举例:
1、进入openwrt/target/linux/ramips/dts目录,打开rt5350.dtsi,即上面的文件。找到下面的内容:
1.png

将红色框框的内容去掉就使能了串口。

2、因为uart的配置在uartlite(调试串口)前面,所以uart会被初始化为ttyS0,而ttyS0之前却被配置为调试串口。
2.png

为了解决这个问题,我们将uart的配置放到uartlite后面就可以了!
3.png

3、串口引脚之前被配置为普通IO口,所以为了防止干扰需要把IO口中的配置去掉。打开openwrt/target/linux/ramips/dts/MPRA2.dts,找到下面内容
4.png

把红色框框的内容去掉。

4、重新编译就OK了! 将编译好的固件下载到开发板后启动系统后,在/dev/目录下会多出ttyS1这个设备。这个就是我们添加的串口设备。

相关文章
|
21小时前
|
Linux SoC
Linux设备树(DTS)
Dts:DTS即Device Tree Source,是一个文本形式的文件,用于描述硬件信息。一般都是固定信息,无法变更,无法overlay。 设备树由来 linux内核源码中,之前充斥着大量的平台相关(platform Device)配置,而这些代码大多是杂乱且重复的,这使得ARM体系结构的代码维护者和内核维护者在发布一个新的版本的时候有大量的工作要做,以至于LinusTorvalds 在2011年3月17日的ARM Linux邮件列表中宣称“Gaah.Guys,this whole ARM thing is a f*cking pain in the ass”这使得整个ARM社区不得不
8 0
|
30天前
|
Linux SoC
Linux设备树(DTS)介绍
**设备树(DTS)是Linux中用于描述硬件信息的文本文件,旨在减少内核与平台相关代码的耦合。DTS文件包含静态硬件配置,不支持动态变更。它被编译成DTB二进制文件,供内核在启动时解析以了解硬件布局。设备树解决了ARM体系结构代码维护的复杂性问题,通过解耦实现vendor修改的独立和共二进制目标。设备树overlay允许对配置进行增量修改,遵循特定规则,如dts覆盖dtsi,先引用后修改。调试时,可使用内置工具反编译dtb或dtbo映像为dts文本以检查内容。**
79 7
|
1月前
|
芯片
STM32CubeMX 串口数据收发
STM32CubeMX 串口数据收发
23 2
|
3月前
|
定位技术 vr&ar 内存技术
|
11月前
|
Linux Shell
Linux系统调试篇——stty修改串口波特率
Linux系统调试篇——stty修改串口波特率
|
存储 芯片 UED
【STM32】单片机模式配置&FlyMcu串口下载固件&STLINK Utility
【STM32】单片机模式配置&FlyMcu串口下载固件&STLINK Utility
445 0
OpenWrt-Wifi断流配置
OpenWrt-Wifi断流配置
885 0
OpenWrt-Wifi断流配置
|
API 芯片 开发者
使用RTT代替UART,把你的JLink变成串口调试助手~
不知道大家在单片机开发中是如何打印调试信息的,大多数应该是用串口调试打印吧,在大多数的情况下,一般在制板和写代码时都会预留串口1做为调试打印用。
1072 0
使用RTT代替UART,把你的JLink变成串口调试助手~
|
Linux SoC
DTS中如何配置设备相关的pinctrl
进行嵌入式Linux驱动开发时,不可避免的会涉及到DTS相关的编写工作,而其中,最为重要的一项工作就是pinctrl相关的配置,这包括pins的功能选择(作为普通IO,还是作为外围控制器的pins)以及pins的配置(pull-up/pull-down、驱动能力、三态等)。 内核中的pinctrl子系统抽象了不同SoC中关于pins的管理方式,Linux内核之pinctrl子系统对于pinctrl子系统进行了简要的概述,如果想要了解pinctrl子系统,可以参考这篇博文。
536 0
|
Linux
Linux串口驱动程序(3)-打开设备
Linux串口驱动程序(3)-打开设备先来分析一下串口打开的过程: 1、用户调用open函数打开串口设备文件;2、在内核中通过tty子系统,把open操作层层传递到串口驱动程序中;3、在串口驱动程序中的xx_open最终实现这个操作。
1110 0