OpenWRT(九)DTS及串口

来源:互联网 发布:residential 网络 编辑:程序博客网 时间:2024/05/21 06:42

一、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,即上面的文件。找到下面的内容:
这里写图片描述
将红色框框的内容去掉就使能了串口。

2、因为uart的配置在uartlite(调试串口)前面,所以uart会被初始化为ttyS0,而ttyS0之前却被配置为调试串口。
这里写图片描述
为了解决这个问题,我们将uart的配置放到uartlite后面就可以了!
这里写图片描述

3、串口引脚之前被配置为普通IO口,所以为了防止干扰需要把IO口中的配置去掉。打开openwrt/target/linux/ramips/dts/MPRA2.dts,找到下面内容
这里写图片描述
把红色框框的内容去掉。

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

0 0
原创粉丝点击